Chapter 12
File Attachments

cpdf -attach-file <filename> [-to-page <page number>] in.pdf -o out.pdf

cpdf -list-attached-files in.pdf

cpdf -remove-files in.pdf -o out.pdf

cpdf -dump-attachments in.pdf -o <directory>

PDF supports adding attachments (files of any kind, including other PDFs) to an existing file. The cpdf tool supports adding and removing document-level attachments — that is, ones which are associated with the document as a whole rather than with an individual page, and also page-level attachments, associated with a particular page.

12.1 Adding Attachments

To add an attachment, use the -attach-file operation. For instance,

cpdf -attach-file sheet.xls in.pdf -o out.pdf

attaches the Excel spreadsheet sheet.xls to the input file. If the file already has attachments, the new file is added to their number. You can specify multiple files to be attached by using -attach-file multiple times. They will be attached in the given order.

The -to-page option can be used to specify that the files will be attached to the given page, rather than at the document level. The -to-page option may be specified at most once.

12.2 Listing Attachments

To list all document- and page-level attachments, use the -list-attached-files operation. The page number and filename of each attachment is given, page 0 representing a document-level attachment.

$cpdf -list-attached-files 14psfonts.pdf
0 utility.ml
0 utility.mli
4 notes.xls

12.3 Removing Attachments

To remove all document-level and page-level attachments from a file, use the -remove-files operation:

cpdf -remove-files in.pdf -o out.pdf

12.4 Dumping Attachments to File

The -dump-attachments operation, when given a PDF file and a directory path as the output, will write each attachment under its filename (as displayed by -list-attached-files to that directory. The directory must exist prior to the call.

cpdf -dump-attachments in.pdf -o /home/fred/attachments

Unless the -raw option is given, the filenames are stripped of dubious special characters before writing. It 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:

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

C Interface

 
/* CHAPTER 12. File Attachments */ 
 
/* 
 * cpdf_attachFile(filename, pdf) attaches a file to the pdf. It is attached 
 * at document level. 
 */ 
void cpdf_attachFile(const char[], int); 
 
/* 
 * cpdf_attachFileToPage(filename, pdf, pagenumber) attaches a file, given 
 * its file name, pdf, and the page number to which it should be attached. 
 */ 
void cpdf_attachFileToPage(const char[], int, int); 
 
/* 
 * cpdf_attachFileFromMemory(memory, length, filename, pdf) attaches from 
 * memory, just like cpdf_attachFile. 
 */ 
void cpdf_attachFileFromMemory(void *, int, const char[], int); 
 
/* 
 * cpdf_attachFileToPageFromMemory(memory, length, filename, pdf, pagenumber) 
 * attaches from memory, just like cpdf_attachFileToPage. 
 */ 
void cpdf_attachFileToPageFromMemory(void *, int, const char[], int, int); 
 
/* Remove all page- and document-level attachments from a document */ 
void cpdf_removeAttachedFiles(int); 
 
/* 
 * List information about attachments. Call cpdf_startGetAttachments(pdf) 
 * first, then cpdf_numberGetAttachments to find out how many there are. Then 
 * cpdf_getAttachmentName to return each one 0...(n - 1). Finally, call 
 * cpdf_endGetAttachments to clean up. 
 */ 
void cpdf_startGetAttachments(int); 
 
/* Get the number of attachments. */ 
int cpdf_numberGetAttachments(void); 
 
/* Get the name of the attachment. */ 
char *cpdf_getAttachmentName(int); 
 
/* Gets the page number. 0 = document level. */ 
int cpdf_getAttachmentPage(int); 
 
/* 
 * cpdf_getAttachmentData(serial number, &length) returns a pointer to the 
 * data, and its length. 
 */ 
void *cpdf_getAttachmentData(int, int *); 
 
/* Clean up after getting attachments. */ 
void cpdf_endGetAttachments(void);