Welcome to Etherpad!

This pad text is synchronized as you type, so that everyone viewing this page sees the same text. This allows you to collaborate seamlessly on documents!

Get involved with Etherpad at http://etherpad.org
On merging & thinning & adjusting pdfs



4 up of each page of the pdf
======================
http://pdfbooklet.sourceforge.net/
x copies / row: 2
no change + autoscale (otherwise it goes into A2 or bad quality reduction)

Merge pdf's in sharp quality
=====================
Considering that pdfunite is part of poppler it has a higher chance to be installed, usage is also simpler than pdftk:
pdfunite in-1.pdf in-2.pdf in-n.pdf out.pdf


4UP with psnup
================
pdf2ps photos.ebook.pdf - | \
psnup -p a4 -4 | \
ps2pdf - photos.4up.pdf


Changing the resolution of images in a PDF (to match an output device)
==========================================
SOURCE: http://tech-vaults.blogspot.be/2012/01/resampling-jpegs-inside-pdf-to.html

ebook is very a good setting for screen (better than the actual "screen" setting as it allows a little zooming in still)

In short, use ghostscript:

    gs -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=output.pdf input.pdf

The PDFSETTINGS presets equate to the following resolutions:

    /screen ... screen-view-only quality, 72 dpi images 
    /ebook ... low quality, 150 dpi images
    /printer ... high quality, 300 dpi images 
    /prepress ... high quality, color preserving, 300 dpi images
    /default ... similar to /screen

Other suggested command line arguments made various places:

    -dCompatibilityLevel=1.4 
    -dColorImageResolution=38 -dColorImageDownsampleType=/Average -dGrayImageDownsampleType=/Average -dGrayImageResolution=38 -dMonoImageResolution=38 -dMonoImageDownsampleType=/Average -dOptimize=true -dDownsampleColorImages=true -dDownsampleGrayImages=true -dDownsampleMonoImages=true -dUseCIEColor -dColorConversionStrategy=/sRGB
    -dMaxSubsetPct=100

More tips (very useful page)
http://www.peteryu.ca/tutorials/publishing/pdf_manipulation_tips


PHotobooks with Python + FLAT
=============================
Flat is a great pure python library that can make PDFs. NB: The resulting PDFs are not *exactly* Adobe standard compliant -- using the ghostscript resolution fix above is useful to "cleanup" / fix the outputs of these scripts.

First get FLAT:
    
   pip install flat

======================================
photobook.py
=====================================
from argparse import ArgumentParser
from flat import rgb, font, shape, strike, document, image
import glob

p = ArgumentParser("create a photo book pdf")
p.add_argument("--width", default=210, type=int, help="width in mm, default: 210 (A4)")
p.add_argument("--height", default=297, type=int, help="width in mm, default: 297 (A4)")
p.add_argument("--border", default=10, type=int, help="border in mm, default: 10")
p.add_argument("--input", help="input filenames in a text file")
p.add_argument("--output", default="output.pdf", help="output filename for PDF file, default: output.pdf")
p.add_argument("input", nargs="+", default=[], help="image filenames")
args = p.parse_args()

w = args.width # 210
h = args.height # 297
border = args.border # 10
d = document(w, h, 'mm')
hh = args.height / 2
page = None

paths = args.input
paths.sort()

def fitbox (image, placed, w, h):
        fit_h =  image.height * (float(w) / image.width)
        if fit_h > h:
                placed.fitheight(h)
        else:
                placed.fitwidth(w)

for impath in paths:
        print impath
        im = image.open(impath)
        if im.height > im.width:
                page = d.addpage()
                placed = page.place(im).frame(border, border, w-(border*2), h-(border*2))
                fitbox(im, placed, w-(border*2), h-(border*2))
                # placed.fitheight(h-(border*2))
                page = None
        else:
                # place in partial frame
                if page == None:
                        page = d.addpage()
                        placed = page.place(im).frame(border, border, w-(border*2), hh-(border*2))
                        fitbox(im, placed, w-(border*2), hh-(border*2))
                        # placed.fitheight(hh-(border*2))
                else:
                        placed = page.place(im).frame(border, hh+border, w-(border*2), hh-(border*2))
                        fitbox(im, placed, w-(border*2), hh-(border*2))
                        # placed.fitheight(hh-(border*2))
                        page = None

d.pdf(args.output)


======================================
photobook2.py (2x2 grid)
=====================================
from argparse import ArgumentParser
from flat import rgb, font, shape, strike, document, image
import glob
from random import shuffle

p = ArgumentParser("create a photo book pdf")
p.add_argument("--width", default=210, type=int, help="width in mm, default: 210 (A4)")
p.add_argument("--height", default=297, type=int, help="width in mm, default: 297 (A4)")
p.add_argument("--border", default=10, type=int, help="border in mm, default: 10")
p.add_argument("--input", help="input filenames in a text file")
p.add_argument("--output", default="output.pdf", help="output filename for PDF file, default: output.pdf")
p.add_argument("--shuffle", default=False, action="store_true", help="shuffle the order, default: False")
p.add_argument("input", nargs="+", default=[], help="image filenames")
args = p.parse_args()

w = args.width # 210
h = args.height # 297
border = args.border # 10
d = document(w, h, 'mm')
hw = args.width / 2.0
hh = args.height / 2.0
page = None

paths = args.input
paths.sort()
if args.shuffle:
        shuffle(paths)

def fitbox (image, placed, w, h):
        fit_h =  image.height * (float(w) / image.width)
        if fit_h > h:
                placed.fitheight(h)
        else:
                placed.fitwidth(w)

x, y = 0, 0

def newline():
        global page, x, y
        y += 1
        x = 0
        if y == 2:
                y = 0
                page = None

def ensurepage():
        global page
        if page == None:
                page = d.addpage()

border2 = 2*args.border

for impath in paths:
        print impath
        im = image.open(impath)

        if im.width > im.height:
                # place across 2 cells
                if x != 0:
                        newline()
                # px = x * hw
                py = y * hh
                ensurepage()
                placed = page.place(im).frame(0 + border, py + border, w - border2, hh - border2)
                fitbox(im, placed, w - border2, hh - border2)
                newline()
        else:
                px = x * hw
                py = y * hh
                ensurepage()
                placed = page.place(im).frame(px + border, py+border, hw-border2, hh-border2)
                fitbox(im, placed, hw-border2, hh-border2)

                x += 1
                if x == 2:
                        newline()

d.pdf(args.output)


makefile
=============
all: screenshots.prepress.pdf bookpdfs.prepress.pdf bookphotos.prepress.pdf

photobooks:
        python photobook.py pictures/photos/* --output photos.raw.pdf
        python photobook2.py pictures/bookphotos/* --shuffle --output bookphotos.raw.pdf
        python photobook2.py pictures/bookpdfs/*.jpg --shuffle --output bookpdfs.raw.pdf
        python photobook2.py pictures/screenshots/* --shuffle --output screenshots.raw.pdf

%.prepress.pdf: %.raw.pdf
        gs -sDEVICE=pdfwrite -dPDFSETTINGS=/prepress -dNOPAUSE -dQUIET -dBATCH -sOutputFile=$@ $<

%.ebook.pdf: %.raw.pdf
        gs -sDEVICE=pdfwrite -dPDFSETTINGS=/ebook -dNOPAUSE -dQUIET -dBATCH -sOutputFile=$@ $<

%.4up.pdf: %.ebook.pdf
        pdf2ps $< - | \
        psnup -p a4 -4 | \
        ps2pdf - $@

%.screen.pdf: %.pdf
        gs -sDEVICE=pdfwrite -dPDFSETTINGS=/screen -dNOPAUSE -dQUIET -dBATCH -sOutputFile=$@ $<