Chapter 2
Merging and Splitting

cpdf -merge in1.pdf [<range>] in2.pdf [<range>] [<more names/ranges>]
     [-collate] [-retain-numbering] [-remove-duplicate-fonts]
     [-merge-add-bookmarks [-merge-add-bookmarks-use-titles]]
     -o out.pdf

cpdf -split in.pdf -o <format> [-chunk <chunksize>]

cpdf -split-bookmarks <level> in.pdf [-utf8] -o <format>

2.1 Merging

The -merge operation allow the merging of several files into one. Ranges can be used to select only a subset of pages from each input file in the output. The output file consists of the concatenation of all the input pages in the order specified on the command line. Actually, the -merge can be omitted, since this is the default operation of cpdf.

cpdf -merge a.pdf 1 b.pdf 2-end -o out.pdf

Take page one of a.pdf and all but the first page of b.pdf, merge them and produce out.pdf.

cpdf -merge -idir files -o out.pdf

Merge all files from directory files, producing out.pdf.

Merge maintains bookmarks, named destinations, and name dictionaries.

PDF features which cannot be merged are retained if they are from the document which first exhibits that feature.

The -collate option collates pages: that is to say, it takes the first page from the first document and its range, then the first page from the second document and its range and so on. When all first pages have been taken, it begins on the second from each range, and so on.

The -retain-numbering option keeps the PDF page numbering labels of each document intact, rather than renumbering the output pages from 1.

The -remove-duplicate-fonts option ensures that fonts used in more than one of the inputs only appear once in the output.

The -merge-add-bookmarks option adds a top-level bookmark for each file, using the filename. Any existing bookmarks are retained. The -merge-add-bookmarks-use-titles, when used in conjunction with -merge-add-bookmarks, will use the title from each PDF’s metadata instead of the filename.

2.2 Splitting

The -split operation splits a PDF file into a number of parts which are written to file, their names being generated from a format. The optional -chunk option allows the number of pages written to each output file to be set.

cpdf -split a.pdf -o out%%%.pdf

Split a.pdf to the files out001.pdf, out002.pdf etc.

cpdf a.pdf even AND -split -chunk 10 -o dir/out%%%.pdf

Split the even pages of a.pdf to the files out001.pdf, out002.pdf etc. with at most ten pages in each file. The directory (folder) dir must exist.

If the output format does not provide enough numbers for the files generated, the result is unspecified. The following format operators may be used:

%, %%,  %%% etc.   Sequence num berpadded to thenum berofpercentsign s
               @F  O riginalfilen am e withou textension
               @N  Sequence num berwithoutpadding zeroes
               @S  Startpageofthischunk
               @E  En dpage ofthischu nk
               @B  Bo okmark name atthispage

Numbers padded to a fixed width field by zeroes may be obtained for @S and @E by following them with more @ signs e.g @E@@@ for a fixed width of three.

2.3 Splitting on Bookmarks

The -split-bookmarks <level> operation splits a PDF file into a number of parts, according to the page ranges implied by the document’s bookmarks. These parts are then written to file with names generated from the given format.

Level 0 denotes the top-level bookmarks, level 1 the next level (sub-bookmarks) and so on. So -split-bookmarks 1 creates breaks on level 0 and level 1 boundaries.

cpdf -split-bookmarks 0 a.pdf -o out%%%.pdf

Split a.pdf to the files out001.pdf, out002.pdf on bookmark boundaries.

Now, there may be many bookmarks on a single page (for instance, if paragraphs are bookmarked or there are two subsections on one page). The splits calculated by -split-bookmarks ensure that each page appears in only one of the output files. It is possible to use the @ operators above, including operator @B which expands to the text of the bookmark:

cpdf -split-bookmarks 0 a.pdf -o @B.pdf

Split a.pdf on bookmark boundaries, using the bookmark text as the filename.

The bookmark text used for a name is converted from unicode to 7 bit ASCII, and the following characters are removed, in addition to any character with ASCII code less than 32:

 / ? < > '  : * | " ˆ + =

To prevent this process, and convert bookmark names to UTF8 instead, add -utf8 to the command.

2.4 Encrypting with Split and Split Bookmarks

The encryption parameters described in Chapter 4 may be added to the command line to encrypt each split PDF. Similarly, the -recrypt switch described in Chapter 1 may by given to re-encrypt each file with the existing encryption of the source PDF.

Java Interface

/* CHAPTER 2. Merging and Splitting */ 
/** Given an array of PDFs, merges the documents into a new one, which is 
returned. */ 
public native Pdf mergeSimple(Pdf[] pdfs) throws CpdfError; 
/** Merges the PDFs. If <code>retain_numbering</code> is true page labels 
are not rewritten. If <code>remove_duplicate_fonts</code> is true, 
duplicate fonts are merged. This is useful when the source documents for 
merging originate from the same source. 
@param pdfs array of PDF documents 
@param retain_numbering retain page numbering in output 
@param remove_duplicate_fonts remove duplicate font data by merging */ 
public native Pdf merge(Pdf[] pdfs, boolean retain_numbering, 
                        boolean remove_duplicate_fonts) 
    throws CpdfError; 
/** Merges PDFs when one or more are drawn from the same document. It has 
an additional argument - a list of page ranges. This is used to select the 
pages to pick from each PDF. This avoids duplication of information when 
multiple discrete parts of a source PDF are included. 
@param pdfs array of PDF documents 
@param retain_numbering retain page numbering in output 
@param remove_duplicate_fonts remove duplicate font data by merging 
@param ranges array of ranges, one for each PDF*/ 
public native Pdf mergeSame(Pdf[] pdfs, boolean retain_numbering, 
                            boolean remove_duplicate_fonts, Range[] ranges) 
    throws CpdfError; 
/** Returns a new document with just those pages in the page range. 
 *  @param pdf PDF document 
 *  @param range range*/ 
public native Pdf selectPages(Pdf pdf, Range range) throws CpdfError;