From c0edbad2005361cc08f2a0829adc0c5c66b1ff1d Mon Sep 17 00:00:00 2001 From: GangHeok Kim Date: Wed, 7 Aug 2013 16:18:21 +0900 Subject: [PATCH] Sync with private and rsa Change-Id: I6316ce05e583969ce8a2e698b3ce85b68e03fa3e --- debian/changelog | 8 + doc/qpdf-manual.html | 2050 ++++++++++++++++++++++++++++++ doc/qpdf-manual.pdf | Bin 0 -> 146522 bytes libqpdf/qpdf/qpdf-config.h.in | 95 ++ make/libtool.mk | 4 +- qpdf.manifest => packaging/qpdf.manifest | 1 - packaging/qpdf.spec | 83 +- 7 files changed, 2182 insertions(+), 59 deletions(-) create mode 100644 doc/qpdf-manual.html create mode 100644 doc/qpdf-manual.pdf create mode 100644 libqpdf/qpdf/qpdf-config.h.in rename qpdf.manifest => packaging/qpdf.manifest (98%) diff --git a/debian/changelog b/debian/changelog index d59b119..2d767bd 100644 --- a/debian/changelog +++ b/debian/changelog @@ -1,3 +1,11 @@ +qpdf (3.0.2_3) unstable; urgency=low + + * Sync with private and rsa + * Git: external/qpdf + * Tag: qpdf_3.0.2_3 + + -- GangHeok Kim Wed, 07 Aug 2013 15:39:24 +0900 + qpdf (3.0.2-2slp2) unstable; urgency=low * Added spec file and smack manifest file diff --git a/doc/qpdf-manual.html b/doc/qpdf-manual.html new file mode 100644 index 0000000..060d6e9 --- /dev/null +++ b/doc/qpdf-manual.html @@ -0,0 +1,2050 @@ + + +QPDF Manual

QPDF Manual

For QPDF Version 3.0.2, September 6, 2012

Jay Berkenbilt


General Information

+ QPDF is a program that does structural, content-preserving + transformations on PDF files. QPDF's website is located at http://qpdf.sourceforge.net/. + QPDF's source code is hosted on github at https://github.com/qpdf/qpdf. +

+ QPDF has been released under the terms of Version + 2.0 of the Artistic License, a copy of which appears in the + file Artistic-2.0 in the source distribution. +

+ QPDF was originally created in 2001 and modified periodically + between 2001 and 2005 during my employment at Apex CoVantage. Upon my + departure from Apex, the company graciously allowed me to take + ownership of the software and continue maintaining as an open + source project, a decision for which I am very grateful. I have + made considerable enhancements to it since that time. I feel + fortunate to have worked for people who would make such a decision. + This work would not have been possible without their support. +

Chapter 1. What is QPDF?

+ QPDF is a program that does structural, content-preserving + transformations on PDF files. It could have been called something + like pdf-to-pdf. It also provides many useful + capabilities to developers of PDF-producing software or for people + who just want to look at the innards of a PDF file to learn more + about how they work. +

+ With QPDF, it is possible to copy objects from one PDF file into + another and to manipulate the list of pages in a PDF file. This + makes it possible to merge and split PDF files. The QPDF library + also makes it possible for you to create PDF files from scratch. + In this mode, you are responsible for supplying all the contents of + the file, while the QPDF library takes care off all the syntactical + representation of the objects, creation of cross references tables + and, if you use them, object streams, encryption, linearization, + and other syntactic details. You are still responsible for + generating PDF content on your own. +

+ QPDF has been designed with very few external dependencies, and it + is intentionally very lightweight. QPDF is + not a PDF content creation library, a PDF + viewer, or a program capable of converting PDF into other formats. + In particular, QPDF knows nothing about the semantics of PDF + content streams. If you are looking for something that can do + that, you should look elsewhere. However, once you have a valid + PDF file, QPDF can be used to transform that file in ways perhaps + your original PDF creation can't handle. For example, many + programs generate simple PDF files but can't password-protect them, + web-optimize them, or perform other transformations of that type. +

Chapter 2. Building and Installing QPDF

+ This chapter describes how to build and install qpdf. Please see + also the README and + INSTALL files in the source distribution. +

2.1. System Requirements

+ The qpdf package has relatively few external dependencies. In + order to build qpdf, the following packages are required: +

  • + zlib: http://www.zlib.net/ +

  • + pcre: http://www.pcre.org/ +

  • + gnu make 3.81 or newer: http://www.gnu.org/software/make +

  • + perl version 5.8 or newer: + http://www.perl.org/; + required for fix-qdf and the test suite. +

  • + GNU diffutils (any version): http://www.gnu.org/software/diffutils/ + is required to run the test suite. Note that this is the + version of diff present on virtually all GNU/Linux systems. + This is required because the test suite uses diff + -u. +

  • + A C++ compiler that works well with STL and has the long + long type. Most modern C++ compilers should fit the + bill fine. QPDF is tested with gcc and Microsoft Visual C++. +

+

+ Part of qpdf's test suite does comparisons of the contents PDF + files by converting them images and comparing the images. The + image comparison tests are disabled by default. Those tests are + not required for determining correctness of a qpdf build if you + have not modified the code since the test suite also contains + expected output files that are compared literally. The image + comparison tests provide an extra check to make sure that any + content transformations don't break the rendering of pages. + Transformations that affect the content streams themselves are off + by default and are only provided to help developers look into the + contents of PDF files. If you are making deep changes to the + library that cause changes in the contents of the files that qpdf + generates, then you should enable the image comparison tests. + Enable them by running configure with the + --enable-test-compare-images flag. If you enable + this, the following additional requirements are required by the + test suite. Note that in no case are these items required to use + qpdf. +

+ If you do not enable this, then you do not need to have tiff and + ghostscript. +

+ If Adobe Reader is installed as acroread, some + additional test cases will be enabled. These test cases simply + verify that Adobe Reader can open the files that qpdf creates. + They require version 8.0 or newer to pass. However, in order to + avoid having qpdf depend on non-free (as in liberty) software, the + test suite will still pass without Adobe reader, and the test + suite still exercises the full functionality of the software. +

+ Pre-built documentation is distributed with qpdf, so you should + generally not need to rebuild the documentation. In order to + build the documentation from its docbook sources, you need the + docbook XML style sheets (http://downloads.sourceforge.net/docbook/). + To build the PDF version of the documentation, you need Apache fop + (http://xml.apache.org/fop/) + version 0.94 or higher. +

2.2. Build Instructions

+ Building qpdf on UNIX is generally just a matter of running + +

./configure
+make
+

+ You can also run make check to run the test + suite and make install to install. Please run + ./configure --help for options on what can be + configured. You can also set the value of + DESTDIR during installation to install to a + temporary location, as is common with many open source packages. + Please see also the README and + INSTALL files in the source distribution. +

+ Building on Windows is a little bit more complicated. For + details, please see README-windows.txt in the + source distribution. You can also download a binary distribution + for Windows. There is a port of qpdf to Visual C++ version 6 in + the contrib area generously contributed by + Jian Ma. This is also discussed in more detail in + README-windows.txt. +

+ There are some other things you can do with the build. Although + qpdf uses autoconf, it does not use + automake but instead uses a + hand-crafted non-recursive Makefile that requires gnu make. If + you're really interested, please read the comments in the + top-level Makefile. +

Chapter 3. Running QPDF

+ This chapter describes how to run the qpdf program from the command + line. +

3.1. Basic Invocation

+ When running qpdf, the basic invocation is as follows: + +

qpdf [ options ] infilename [ outfilename ]
+

+ This converts PDF file infilename to PDF file + outfilename. The output file is functionally + identical to the input file but may have been structurally + reorganized. Also, orphaned objects will be removed from the + file. Many transformations are available as controlled by the + options below. In place of infilename, the + parameter --empty may be specified. This causes + qpdf to use a dummy input file that contains zero pages. The only + normal use case for using --empty would be if you + were going to add pages from another source, as discussed in Section 3.4, “Page Selection Options”. +

+ outfilename does not have to be seekable, even + when generating linearized files. Specifying + “-” as outfilename + means to write to standard output. However, you can't specify the + same file as both the input and the output because qpdf reads data + from the input file as it writes to the output file. +

+ Most options require an output file, but some testing or + inspection commands do not. These are specifically noted. +

3.2. Basic Options

+ The following options are the most common ones and perform + commonly needed transformations. +

--password=password

+ Specifies a password for accessing encrypted files. +

--linearize

+ Causes generation of a linearized (web-optimized) output file. +

--copy-encryption=file

+ Encrypt the file using the same encryption parameters, + including user and owner password, as the specified file. Use + --encrypt-file-password to specify a password + if one is needed to open this file. Note that copying the + encryption parameters from a file also copies the first half + of /ID from the file since this is part of + the encryption parameters. +

--encrypt-file-password=password

+ If the file specified with --copy-encryption + requires a password, specify the password using this option. + Note that only one of the user or owner password is required. + Both passwords will be preserved since QPDF does not + distinguish between the two passwords. It is possible to + preserve encryption parameters, including the owner password, + from a file even if you don't know the file's owner password. +

--encrypt options --

+ Causes generation an encrypted output file. Please see Section 3.3, “Encryption Options” for details on how to + specify encryption parameters. +

--decrypt

+ Removes any encryption on the file. A password must be + supplied if the file is password protected. +

--pages options --

+ Select specific pages from one or more input files. See Section 3.4, “Page Selection Options” for details on how to do page + selection (splitting and merging). +

+

+ Password-protected files may be opened by specifying a password. + By default, qpdf will preserve any encryption data associated with + a file. If --decrypt is specified, qpdf will + attempt to remove any encryption information. If + --encrypt is specified, qpdf will replace the + document's encryption parameters with whatever is specified. +

+ Note that qpdf does not obey encryption restrictions already + imposed on the file. Doing so would be meaningless since qpdf can + be used to remove encryption from the file entirely. This + functionality is not intended to be used for bypassing copyright + restrictions or other restrictions placed on files by their + producers. +

+ In all cases where qpdf allows specification of a password, care + must be taken if the password contains characters that fall + outside of the 7-bit US-ASCII character range to ensure that the + exact correct byte sequence is provided. It is possible that a + future version of qpdf may handle this more gracefully. For + example, if a password was encrypted using a password that was + encoded in ISO-8859-1 and your terminal is configured to use + UTF-8, the password you supply may not work properly. There are + various approaches to handling this. For example, if you are + using Linux and have the iconv executable (part of the ICU + package) installed, you could pass --password=`echo + password | iconv -t + iso-8859-1` to qpdf where + password is a password specified in + your terminal's locale. A detailed discussion of this is out of + scope for this manual, but just be aware of this issue if you have + trouble with a password that contains 8-bit characters. +

3.3. Encryption Options

+ To change the encryption parameters of a file, use the --encrypt + flag. The syntax is + +

--encrypt user-password owner-password key-length [ restrictions ] --
+

+ Note that “--” terminates parsing of + encryption flags and must be present even if no restrictions are + present. +

+ Either or both of the user password and the owner password may be + empty strings. +

+ The value for + key-length may be 40 + or 128. The restriction flags are dependent upon key length. + When no additional restrictions are given, the default is to be + fully permissive. +

+ If key-length is 40, + the following restriction options are available: +

--print=[yn]

+ Determines whether or not to allow printing. +

--modify=[yn]

+ Determines whether or not to allow document modification. +

--extract=[yn]

+ Determines whether or not to allow text/image extraction. +

--annotate=[yn]

+ Determines whether or not to allow comments and form fill-in + and signing. +

+ If key-length is 128, + the following restriction options are available: +

--accessibility=[yn]

+ Determines whether or not to allow accessibility to visually + impaired. +

--extract=[yn]

+ Determines whether or not to allow text/graphic extraction. +

--print=print-opt

+ Controls printing access. + print-opt may be + one of the following: +

  • + full: allow full printing +

  • + low: allow low-resolution printing only +

  • + none: disallow printing +

+

--modify=modify-opt

+ Controls modify access. + modify-opt may be + one of the following, each of which implies all the options + that follow it: +

  • + all: allow full document modification +

  • + annotate: allow comment authoring and form operations +

  • + form: allow form field fill-in and signing +

  • + assembly: allow document assembly only +

  • + none: allow no modifications +

+

--cleartext-metadata

+ If specified, any metadata stream in the document will be left + unencrypted even if the rest of the document is encrypted. + This also forces the PDF version to be at least 1.5. +

--use-aes=[yn]

+ If --use-aes=y is specified, AES encryption + will be used instead of RC4 encryption. This forces the PDF + version to be at least 1.6. +

--force-V4

+ Use of this option forces the /V and + /R parameters in the document's encryption + dictionary to be set to the value 4. As + qpdf will automatically do this when required, there is no + reason to ever use this option. It exists primarily for use + in testing qpdf itself. This option also forces the PDF + version to be at least 1.5. +

+ The default for each permission option is to be fully permissive. +

3.4. Page Selection Options

+ Starting with qpdf 3.0, it is possible to split and merge PDF + files by selecting pages from one or more input files. Whatever + file is given as the primary input file is used as the starting + point, but its pages are replaced with pages as specified. + +

--pages input-file [ --password=password ] page-range [ ... ] --
+

+ Multiple input files may be specified. Each one is given as the + name of the input file, an optional password (if required to open + the file), and the range of pages. Note that + “--” terminates parsing of page + selection flags. +

+ For each file that pages should be taken from, specify the file, a + password needed to open the file (if any), and a page range. The + password needs to be given only once per file. If any of the + input files are the same as the primary input file or the file + used to copy encryption parameters (if specified), you do not need + to repeat the password here. The same file can be repeated + multiple times. If a file that is repeated has a password, the + password only has to be given the first time. All non-page data + (info, outlines, page numbers, etc.) are taken from the primary + input file. To discard these, use --empty as the + primary input. +

+ It is not presently possible to specify the same page from the + same file directly more than once, but you can make this work by + specifying two different paths to the same file (such as by + putting ./ somewhere in the path). This can + also be used if you want to repeat a page from one of the input + files in the output file. This may be made more convenient in a + future version of qpdf if there is enough demand for this feature. +

+ The page range is a set of numbers separated by commas, ranges of + numbers separated dashes, or combinations of those. The character + “z” represents the last page. Pages can appear in any + order. Ranges can appear with a high number followed by a low + number, which causes the pages to appear in reverse. Repeating a + number will cause an error, but you can use the workaround + discussed above should you really want to include the same page + twice. +

+ Example page ranges: +

  • + 1,3,5-9,15-12: pages 1, 2, 3, 5, 6, 7, 8, + 9, 15, 14, 13, and 12. +

  • + z-1: all pages in the document in reverse +

+

+ Note that qpdf doesn't presently do anything special about other + constructs in a PDF file that may know about pages, so semantics + of splitting and merging vary across features. For example, the + document's outlines (bookmarks) point to actual page objects, so + if you select some pages and not others, bookmarks that point to + pages that are in the output file will work, and remaining + bookmarks will not work. On the other hand, page labels (page + numbers specified in the file) are just sequential, so page labels + will be messed up in the output file. A future version of + qpdf may do a better job at handling these + issues. (Note that the qpdf library already contains all of the + APIs required in order to implement this in your own application + if you need it.) In the mean time, you can always use + --empty as the primary input file to avoid + copying all of that from the first file. For example, to take + pages 1 through 5 from a infile.pdf while + preserving all metadata associated with that file, you could use + +

qpdf infile.pdf --pages infile.pdf 1-5 -- outfile.pdf
+

+ If you wanted pages 1 through 5 from + infile.pdf but you wanted the rest of the + metadata to be dropped, you could instead run + +

qpdf --empty --pages infile.pdf 1-5 -- outfile.pdf
+

+ If you wanted to take pages 1–5 from + file1.pdf and pages 11–15 from + file2.pdf in reverse, you would run + +

qpdf file1.pdf --pages file1.pdf 1-5 file2.pdf 15-11 -- outfile.pdf
+

+ If, for some reason, you wanted to take the first page of an + encrypted file called encrypted.pdf with + password pass and repeat it twice in an output + file, and if you wanted to drop metadata (like page numbers and + outlines) but preserve encryption, you would use + +

qpdf --empty --copy-encryption=encrypted.pdf --encryption-file-password=pass
+--pages encrypted.pdf --password=pass 1 ./encrypted.pdf --password=pass 1 --
+outfile.pdf
+

+ Note that we had to specify the password all three times because + giving a password as --encryption-file-password + doesn't count for page selection, and as far as qpdf is concerned, + encrypted.pdf and + ./encrypted.pdf are separated files. These + are all corner cases that most users should hopefully never have + to be bothered with. +

3.5. Advanced Transformation Options

+ These transformation options control fine points of how qpdf + creates the output file. Mostly these are of use only to people + who are very familiar with the PDF file format or who are PDF + developers. The following options are available: +

--stream-data=option

+ Controls transformation of stream data. The value of + option may be one + of the following: +

  • + compress: recompress stream data when + possible (default) +

  • + preserve: leave all stream data as is +

  • + uncompress: uncompress stream data when + possible +

+

--normalize-content=[yn]

+ Enables or disables normalization of content streams. +

--suppress-recovery

+ Prevents qpdf from attempting to recover damaged files. +

--object-streams=mode

+ Controls handing of object streams. The value of + mode may be one of + the following: +

  • + preserve: preserve original object streams + (default) +

  • + disable: don't write any object streams +

  • + generate: use object streams wherever + possible +

+

--ignore-xref-streams

+ Tells qpdf to ignore any cross-reference streams. +

--qdf

+ Turns on QDF mode. For additional information on QDF, please + see Chapter 4, QDF Mode. +

--min-version=version

+ Forces the PDF version of the output file to be at least + version. In other words, if the + input file has a lower version than the specified version, the + specified version will be used. If the input file has a + higher version, the input file's original version will be + used. It is seldom necessary to use this option since qpdf + will automatically increase the version as needed when adding + features that require newer PDF readers. +

--force-version=version

+ This option forces the PDF version to be the exact version + specified even when the file may have content that + is not supported in that version. In some cases, + forcing the output file's PDF version to be lower than that of + the input file will cause qpdf to disable certain features of + the document. Specifically, AES encryption is disabled if the + version is less than 1.6, cleartext metadata and object + streams are disabled if less than 1.5, 128-bit encryption keys + are disabled if less than 1.4, and all encryption is disabled + if less than 1.3. Even with these precautions, qpdf won't be + able to do things like eliminate use of newer image + compression schemes, transparency groups, or other features + that may have been added in more recent versions of PDF. +

+ As a general rule, with the exception of big structural things + like the use of object streams or AES encryption, PDF viewers + are supposed to ignore features in files that they don't + support from newer versions. This means that forcing the + version to a lower version may make it possible to open your + PDF file with an older version, though bear in mind that some + of the original document's functionality may be lost. +

+

+ By default, when a stream is encoded using non-lossy filters that + qpdf understands and is not already compressed using a good + compression scheme, qpdf will uncompress and recompress streams. + Assuming proper filter implements, this is safe and generally + results in smaller files. This behavior may also be explicitly + requested with --stream-data=compress. +

+ When --stream-data=preserve is specified, qpdf + will never attempt to change the filtering of any stream data. +

+ When --stream-data=uncompress is specified, qpdf + will attempt to remove any non-lossy filters that it supports. + This includes /FlateDecode, + /LZWDecode, /ASCII85Decode, + and /ASCIIHexDecode. This can be very useful + for inspecting the contents of various streams. +

+ When --normalize-content=y is specified, qpdf + will attempt to normalize whitespace and newlines in page content + streams. This is generally safe but could, in some cases, cause + damage to the content streams. This option is intended for people + who wish to study PDF content streams or to debug PDF content. + You should not use this for “production” PDF files. +

+ Ordinarily, qpdf will attempt to recover from certain types of + errors in PDF files. These include errors in the cross-reference + table, certain types of object numbering errors, and certain types + of stream length errors. Sometimes, qpdf may think it has + recovered but may not have actually recovered, so care should be + taken when using this option as some data loss is possible. The + --suppress-recovery option will prevent qpdf from + attempting recovery. In this case, it will fail on the first + error that it encounters. +

+ Object streams, also known as compressed objects, were introduced + into the PDF specification at version 1.5, corresponding to + Acrobat 6. Some older PDF viewers may not support files with + object streams. qpdf can be used to transform files with object + streams to files without object streams or vice versa. As + mentioned above, there are three object stream modes: + preserve, disable, and + generate. +

+ In preserve mode, the relationship to objects and + the streams that contain them is preserved from the original file. + In disable mode, all objects are written as + regular, uncompressed objects. The resulting file should be + readable by older PDF viewers. (Of course, the content of the + files may include features not supported by older viewers, but at + least the structure will be supported.) In + generate mode, qpdf will create its own object + streams. This will usually result in more compact PDF files, + though they may not be readable by older viewers. In this mode, + qpdf will also make sure the PDF version number in the header is + at least 1.5. +

+ Ordinarily, qpdf reads cross-reference streams when they are + present in a PDF file. If --ignore-xref-streams + is specified, qpdf will ignore any cross-reference streams for + hybrid PDF files. The purpose of hybrid files is to make some + content available to viewers that are not aware of cross-reference + streams. It is almost never desirable to ignore them. The only + time when you might want to use this feature is if you are testing + creation of hybrid PDF files and wish to see how a PDF consumer + that doesn't understand object and cross-reference streams would + interpret such a file. +

+ The --qdf flag turns on QDF mode, which changes + some of the defaults described above. Specifically, in QDF mode, + by default, stream data is uncompressed, content streams are + normalized, and encryption is removed. These defaults can still + be overridden by specifying the appropriate options as described + above. Additionally, in QDF mode, stream lengths are stored as + indirect objects, objects are laid out in a less efficient but + more readable fashion, and the documents are interspersed with + comments that make it easier for the user to find things and also + make it possible for fix-qdf to work properly. + QDF mode is intended for people, mostly developers, who wish to + inspect or modify PDF files in a text editor. For details, please + see Chapter 4, QDF Mode. +

3.6. Testing, Inspection, and Debugging Options

+ These options can be useful for digging into PDF files or for use + in automated test suites for software that uses the qpdf library. + When any of the options in this section are specified, no output + file should be given. The following options are available: +

--static-id

+ Causes generation of a fixed value for /ID. This is intended + for testing only. Never use it for production files. +

--static-aes-iv

+ Causes use of a static initialization vector for AES-CBC. + This is intended for testing only so that output files can be + reproducible. Never use it for production files. This option + in particular is not secure since it significantly weakens the + encryption. +

--no-original-object-ids

+ Suppresses inclusion of original object ID comments in QDF + files. This can be useful when generating QDF files for test + purposes, particularly when comparing them to determine + whether two PDF files have identical content. +

-show-encryption

+ Shows document encryption parameters. Also shows the + document's user password if the owner password is given. +

-check-linearization

+ Checks file integrity and linearization status. +

-show-linearization

+ Checks and displays all data in the linearization hint tables. +

-show-xref

+ Shows the contents of the cross-reference table in a + human-readable form. This is especially useful for files with + cross-reference streams which are stored in a binary format. +

-show-object=obj[,gen]

+ Show the contents of the given object. This is especially + useful for inspecting objects that are inside of object + streams (also known as “compressed objects”). +

-raw-stream-data

+ When used along with the --show-object + option, if the object is a stream, shows the raw stream data + instead of object's contents. +

-filtered-stream-data

+ When used along with the --show-object + option, if the object is a stream, shows the filtered stream + data instead of object's contents. If the stream is filtered + using filters that qpdf does not support, an error will be + issued. +

-show-pages

+ Shows the object and generation number for each page + dictionary object and for each content stream associated with + the page. Having this information makes it more convenient to + inspect objects from a particular page. +

-with-images

+ When used along with --show-pages, also shows + the object and generation numbers for the image objects on + each page. (At present, information about images in shared + resource dictionaries are not output by this command. This is + discussed in a comment in the source code.) +

-check

+ Checks file structure and well as encryption, linearization, + and encoding of stream data. A file for which + --check reports no errors may still have + errors in stream data content but should otherwise be + structurally sound. If --check any errors, + qpdf will exit with a status of 2. There are some recoverable + conditions that --check detects. These are + issued as warnings instead of errors. If qpdf finds no errors + but finds warnings, it will exit with a status of 3 (as of + version 2.0.4). +

+

+ The --raw-stream-data and + --filtered-stream-data options are ignored unless + --show-object is given. Either of these options + will cause the stream data to be written to standard output. In + order to avoid commingling of stream data with other output, it is + recommend that these objects not be combined with other + test/inspection options. +

+ If --filtered-stream-data is given and + --normalize-content=y is also given, qpdf will + attempt to normalize the stream data as if it is a page content + stream. This attempt will be made even if it is not a page + content stream, in which case it will produce unusable results. +

Chapter 4. QDF Mode

+ In QDF mode, qpdf creates PDF files in what we call QDF + form. A PDF file in QDF form, sometimes called a QDF + file, is a completely valid PDF file that has + %QDF-1.0 as its third line (after the pdf header + and binary characters) and has certain other characteristics. The + purpose of QDF form is to make it possible to edit PDF files, with + some restrictions, in an ordinary text editor. This can be very + useful for experimenting with different PDF constructs or for + making one-off edits to PDF files (though there are other reasons + why this may not always work). +

+ It is ordinarily very difficult to edit PDF files in a text editor + for two reasons: most meaningful data in PDF files is compressed, + and PDF files are full of offset and length information that makes + it hard to add or remove data. A QDF file is organized in a manner + such that, if edits are kept within certain constraints, the + fix-qdf program, distributed with qpdf, is able + to restore edited files to a correct state. The + fix-qdf program takes no command-line + arguments. It reads a possibly edited QDF file from standard input + and writes a repaired file to standard output. +

+ The following attributes characterize a QDF file: +

  • + All objects appear in numerical order in the PDF file, including + when objects appear in object streams. +

  • + Objects are printed in an easy-to-read format, and all line + endings are normalized to UNIX line endings. +

  • + Unless specifically overridden, streams appear uncompressed + (when qpdf supports the filters and they are compressed with a + non-lossy compression scheme), and most content streams are + normalized (line endings are converted to just a UNIX-style + linefeeds). +

  • + All streams lengths are represented as indirect objects, and the + stream length object is always the next object after the stream. + If the stream data does not end with a newline, an extra newline + is inserted, and a special comment appears after the stream + indicating that this has been done. +

  • + If the PDF file contains object streams, if object stream + n contains k objects, + those objects are numbered from n+1 through + n+k, and the object number/offset pairs + appear on a separate line for each object. Additionally, each + object in the object stream is preceded by a comment indicating + its object number and index. This makes it very easy to find + objects in object streams. +

  • + All beginnings of objects, stream tokens, + endstream tokens, and + endobj tokens appear on lines by themselves. + A blank line follows every endobj token. +

  • + If there is a cross-reference stream, it is unfiltered. +

  • + Page dictionaries and page content streams are marked with + special comments that make them easy to find. +

  • + Comments precede each object indicating the object number of the + corresponding object in the original file. +

+

+ When editing a QDF file, any edits can be made as long as the above + constraints are maintained. This means that you can freely edit a + page's content without worrying about messing up the QDF file. It + is also possible to add new objects so long as those objects are + added after the last object in the file or subsequent objects are + renumbered. If a QDF file has object streams in it, you can always + add the new objects before the xref stream and then change the + number of the xref stream, since nothing generally ever references + it by number. +

+ It is not generally practical to remove objects from QDF files + without messing up object numbering, but if you remove all + references to an object, you can run qpdf on the file (after + running fix-qdf), and qpdf will omit the + now-orphaned object. +

+ When fix-qdf is run, it goes through the file + and recomputes the following parts of the file: +

  • + the /N, /W, and + /First keys of all object stream dictionaries +

  • + the pairs of numbers representing object numbers and offsets of + objects in object streams +

  • + all stream lengths +

  • + the cross-reference table or cross-reference stream +

  • + the offset to the cross-reference table or cross-reference + stream following the startxref token +

+

Chapter 5. Using the QPDF Library

+ The source tree for the qpdf package has an + examples directory that contains a few + example programs. The qpdf/qpdf.cc source + file also serves as a useful example since it exercises almost all + of the qpdf library's public interface. The best source of + documentation on the library itself is reading comments in + include/qpdf/QPDF.hh, + include/qpdf/QDFWriter.hh, and + include/qpdf/QPDFObjectHandle.hh. +

+ All header files are installed in the include/qpdf directory. It + is recommend that you use #include + <qpdf/QPDF.hh> rather than adding + include/qpdf to your include path. +

+ When linking against the qpdf static library, you may also need to + specify -lpcre -lz on your link command. If + your system understands how to read libtool + .la files, this may not be necessary. +

+ The qpdf library is safe to use in a multithreaded program, but no + individual QPDF object instance (including + QPDF, QPDFObjectHandle, or + QPDFWriter) can be used in more than one thread at a + time. Multiple threads may simultaneously work with different + instances of these and all other QPDF objects. +

Chapter 6. Design and Library Notes

6.1. Introduction

+ This section was written prior to the implementation of the qpdf + package and was subsequently modified to reflect the + implementation. In some cases, for purposes of explanation, it + may differ slightly from the actual implementation. As always, + the source code and test suite are authoritative. Even if there + are some errors, this document should serve as a road map to + understanding how this code works. +

+ In general, one should adhere strictly to a specification when + writing but be liberal in reading. This way, the product of our + software will be accepted by the widest range of other programs, + and we will accept the widest range of input files. This library + attempts to conform to that philosophy whenever possible but also + aims to provide strict checking for people who want to validate + PDF files. If you don't want to see warnings and are trying to + write something that is tolerant, you can call + setSuppressWarnings(true). If you want to fail + on the first error, you can call + setAttemptRecovery(false). The default + behavior is to generating warnings for recoverable problems. Note + that recovery will not always produce the desired results even if + it is able to get through the file. Unlike most other PDF files + that produce generic warnings such as “This file is + damaged,”, qpdf generally issues a detailed error message + that would be most useful to a PDF developer. This is by design + as there seems to be a shortage of PDF validation tools out + there. (This was, in fact, one of the major motivations behind + the initial creation of qpdf.) +

6.2. Design Goals

+ The QPDF package includes support for reading and rewriting PDF + files. It aims to hide from the user details involving object + locations, modified (appended) PDF files, the + directness/indirectness of objects, and stream filters including + encryption. It does not aim to hide knowledge of the object + hierarchy or content stream contents. Put another way, a user of + the qpdf library is expected to have knowledge about how PDF files + work, but is not expected to have to keep track of bookkeeping + details such as file positions. +

+ A user of the library never has to care whether an object is + direct or indirect. All access to objects deals with this + transparently. All memory management details are also handled by + the library. +

+ The PointerHolder object is used internally + by the library to deal with memory management. This is basically + a smart pointer object very similar in spirit to the Boost + library's shared_ptr object, but predating + it by several years. This library also makes use of a technique + for giving fine-grained access to methods in one class to other + classes by using public subclasses with friends and only private + members that in turn call private methods of the containing class. + See QPDFObjectHandle::Factory as an + example. +

+ The top-level qpdf class is QPDF. A + QPDF object represents a PDF file. The + library provides methods for both accessing and mutating PDF + files. +

+ QPDFObject is the basic PDF Object class. + It is an abstract base class from which are derived classes for + each type of PDF object. Clients do not interact with Objects + directly but instead interact with + QPDFObjectHandle. +

+ QPDFObjectHandle contains + PointerHolder<QPDFObject> and + includes accessor methods that are type-safe proxies to the + methods of the derived object classes as well as methods for + querying object types. They can be passed around by value, + copied, stored in containers, etc. with very low overhead. + Instances of QPDFObjectHandle always + contain a reference back to the QPDF object + from which they were created. A + QPDFObjectHandle may be direct or indirect. + If indirect, the QPDFObject the + PointerHolder initially points to is a null + pointer. In this case, the first attempt to access the underlying + QPDFObject will result in the + QPDFObject being resolved via a call to the + referenced QPDF instance. This makes it + essentially impossible to make coding errors in which certain + things will work for some PDF files and not for others based on + which objects are direct and which objects are indirect. +

+ Instances of QPDFObjectHandle can be + directly created and modified using static factory methods in the + QPDFObjectHandle class. There are factory + methods for each type of object as well as a convenience method + QPDFObjectHandle::parse that creates an + object from a string representation of the object. Existing + instances of QPDFObjectHandle can also be + modified in several ways. See comments in + QPDFObjectHandle.hh for details. +

+ When the QPDF class creates a new object, + it dynamically allocates the appropriate type of + QPDFObject and immediately hands the + pointer to an instance of QPDFObjectHandle. + The parser reads a token from the current file position. If the + token is a not either a dictionary or array opener, an object is + immediately constructed from the single token and the parser + returns. Otherwise, the parser is invoked recursively in a + special mode in which it accumulates objects until it finds a + balancing closer. During this process, the + “R” keyword is recognized and an + indirect QPDFObjectHandle may be + constructed. +

+ The QPDF::resolve() method, which is used to + resolve an indirect object, may be invoked from the + QPDFObjectHandle class. It first checks a + cache to see whether this object has already been read. If not, + it reads the object from the PDF file and caches it. It the + returns the resulting QPDFObjectHandle. + The calling object handle then replaces its + PointerHolder<QDFObject> with the one + from the newly returned QPDFObjectHandle. + In this way, only a single copy of any direct object need exist + and clients can access objects transparently without knowing + caring whether they are direct or indirect objects. Additionally, + no object is ever read from the file more than once. That means + that only the portions of the PDF file that are actually needed + are ever read from the input file, thus allowing the qpdf package + to take advantage of this important design goal of PDF files. +

+ If the requested object is inside of an object stream, the object + stream itself is first read into memory. Then the tokenizer reads + objects from the memory stream based on the offset information + stored in the stream. Those individual objects are cached, after + which the temporary buffer holding the object stream contents are + discarded. In this way, the first time an object in an object + stream is requested, all objects in the stream are cached. +

+ An instance of QPDF is constructed by using + the class's default constructor. If desired, the + QPDF object may be configured with various + methods that change its default behavior. Then the + QPDF::processFile() method is passed the name + of a PDF file, which permanently associates the file with that + QPDF object. A password may also be given for access to + password-protected files. QPDF does not enforce encryption + parameters and will treat user and owner passwords equivalently. + Either password may be used to access an encrypted file. + [1] + QPDF will allow recovery of a user password + given an owner password. The input PDF file must be seekable. + (Output files written by QPDFWriter need + not be seekable, even when creating linearized files.) During + construction, QPDF validates the PDF file's + header, and then reads the cross reference tables and trailer + dictionaries. The QPDF class keeps only + the first trailer dictionary though it does read all of them so it + can check the /Prev key. + QPDF class users may request the root + object and the trailer dictionary specifically. The cross + reference table is kept private. Objects may then be requested by + number of by walking the object tree. +

+ When a PDF file has a cross-reference stream instead of a + cross-reference table and trailer, requesting the document's + trailer dictionary returns the stream dictionary from the + cross-reference stream instead. +

+ There are some convenience routines for very common operations + such as walking the page tree and returning a vector of all page + objects. For full details, please see the header file + QPDF.hh. +

+ The following example should clarify how + QPDF processes a simple file. +

  • + Client constructs QPDF + pdf and calls + pdf.processFile("a.pdf");. +

  • + The QPDF class checks the beginning of + a.pdf for + %!PDF-1.[0-9]+. It then reads the cross + reference table mentioned at the end of the file, ensuring that + it is looking before the last %%EOF. After + getting to trailer keyword, it invokes the + parser. +

  • + The parser sees “<<”, so + it calls itself recursively in dictionary creation mode. +

  • + In dictionary creation mode, the parser keeps accumulating + objects until it encounters + “>>”. Each object that is + read is pushed onto a stack. If + “R” is read, the last two + objects on the stack are inspected. If they are integers, they + are popped off the stack and their values are used to construct + an indirect object handle which is then pushed onto the stack. + When “>>” is finally read, + the stack is converted into a + QPDF_Dictionary which is placed in a + QPDFObjectHandle and returned. +

  • + The resulting dictionary is saved as the trailer dictionary. +

  • + The /Prev key is searched. If present, + QPDF seeks to that point and repeats + except that the new trailer dictionary is not saved. If + /Prev is not present, the initial parsing + process is complete. +

    + If there is an encryption dictionary, the document's encryption + parameters are initialized. +

  • + The client requests root object. The + QPDF class gets the value of root key + from trailer dictionary and returns it. It is an unresolved + indirect QPDFObjectHandle. +

  • + The client requests the /Pages key from root + QPDFObjectHandle. The + QPDFObjectHandle notices that it is + indirect so it asks QPDF to resolve it. + QPDF looks in the object cache for an + object with the root dictionary's object ID and generation + number. Upon not seeing it, it checks the cross reference + table, gets the offset, and reads the object present at that + offset. It stores the result in the object cache and returns + the cached result. The calling + QPDFObjectHandle replaces its object + pointer with the one from the resolved + QPDFObjectHandle, verifies that it a + valid dictionary object, and returns the (unresolved indirect) + QPDFObject handle to the top of the + Pages hierarchy. +

    + As the client continues to request objects, the same process is + followed for each new requested object. +

+

6.3. Encryption

+ Encryption is supported transparently by qpdf. When opening a PDF + file, if an encryption dictionary exists, the + QPDF object processes this dictionary using + the password (if any) provided. The primary decryption key is + computed and cached. No further access is made to the encryption + dictionary after that time. When an object is read from a file, + the object ID and generation of the object in which it is + contained is always known. Using this information along with the + stored encryption key, all stream and string objects are + transparently decrypted. Raw encrypted objects are never stored + in memory. This way, nothing in the library ever has to know or + care whether it is reading an encrypted file. +

+ An interface is also provided for writing encrypted streams and + strings given an encryption key. This is used by + QPDFWriter when it rewrites encrypted + files. +

6.4. Adding and Removing Pages

+ While qpdf's API has supported adding and modifying objects for + some time, version 3.0 introduces specific methods for adding and + removing pages. These are largely convenience routines that + handle two tricky issues: pushing inheritable resources from the + /Pages tree down to individual pages and + manipulation of the /Pages tree itself. For + details, see addPage and surrounding methods + in QPDF.hh. +

6.5. Reserving Object Numbers

+ Version 3.0 of qpdf introduced the concept of reserved objects. + These are seldom needed for ordinary operations, but there are + cases in which you may want to add a series of indirect objects + with references to each other to a QPDF + object. This causes a problem because you can't determine the + object ID that a new indirect object will have until you add it to + the QPDF object with + QPDF::makeIndirectObject. The only way to + add two mutually referential objects to a + QPDF object prior to version 3.0 would be + to add the new objects first and then make them refer to each + other after adding them. Now it is possible to create a + reserved object using + QPDFObjectHandle::newReserved. This is an + indirect object that stays “unresolved” even if it is + queried for its type. So now, if you want to create a set of + mutually referential objects, you can create reservations for each + one of them and use those reservations to construct the + references. When finished, you can call + QPDF::replaceReserved to replace the reserved + objects with the real ones. This functionality will never be + needed by most applications, but it is used internally by QPDF + when copying objects from other PDF files, as discussed in Section 6.6, “Copying Objects From Other PDF Files”. For an example of how to use + reserved objects, search for newReserved in + test_driver.cc in qpdf's sources. +

6.6. Copying Objects From Other PDF Files

+ Version 3.0 of qpdf introduced the ability to copy objects into a + QPDF object from a different + QPDF object, which we refer to as + foreign objects. This allows arbitrary + merging of PDF files. The qpdf command-line + tool provides limited support for basic page selection, including + merging in pages from other files, but the library's API makes it + possible to implement arbitrarily complex merging operations. The + main method for copying foreign objects is + QPDF::copyForeignObject. This takes an + indirect object from another QPDF and + copies it recursively into this object while preserving all object + structure, including circular references. This means you can add + a direct object that you create from scratch to a + QPDF object with + QPDF::makeIndirectObject, and you can add an + indirect object from another file with + QPDF::copyForeignObject. The fact that + QPDF::makeIndirectObject does not + automatically detect a foreign object and copy it is an explicit + design decision. Copying a foreign object seems like a + sufficiently significant thing to do that it should be done + explicitly. +

+ The other way to copy foreign objects is by passing a page from + one QPDF to another by calling + QPDF::addPage. In contrast to + QPDF::makeIndirectObject, this method + automatically distinguishes between indirect objects in the + current file, foreign objects, and direct objects. +

6.7. Writing PDF Files

+ The qpdf library supports file writing of + QPDF objects to PDF files through the + QPDFWriter class. The + QPDFWriter class has two writing modes: one + for non-linearized files, and one for linearized files. See Chapter 7, Linearization for a description of linearization + is implemented. This section describes how we write + non-linearized files including the creation of QDF files (see + Chapter 4, QDF Mode. +

+ This outline was written prior to implementation and is not + exactly accurate, but it provides a correct “notional” + idea of how writing works. Look at the code in + QPDFWriter for exact details. +

  • + Initialize state: +

    • + next object number = 1 +

    • + object queue = empty +

    • + renumber table: old object id/generation to new id/0 = empty +

    • + xref table: new id -> offset = empty +

    +

  • + Create a QPDF object from a file. +

  • + Write header for new PDF file. +

  • + Request the trailer dictionary. +

  • + For each value that is an indirect object, grab the next object + number (via an operation that returns and increments the + number). Map object to new number in renumber table. Push + object onto queue. +

  • + While there are more objects on the queue: +

    • + Pop queue. +

    • + Look up object's new number n in the + renumbering table. +

    • + Store current offset into xref table. +

    • + Write n 0 obj. +

    • + If object is null, whether direct or indirect, write out + null, thus eliminating unresolvable indirect object + references. +

    • + If the object is a stream stream, write stream contents, + piped through any filters as required, to a memory buffer. + Use this buffer to determine the stream length. +

    • + If object is not a stream, array, or dictionary, write out + its contents. +

    • + If object is an array or dictionary (including stream), + traverse its elements (for array) or values (for + dictionaries), handling recursive dictionaries and arrays, + looking for indirect objects. When an indirect object is + found, if it is not resolvable, ignore. (This case is + handled when writing it out.) Otherwise, look it up in the + renumbering table. If not found, grab the next available + object number, assign to the referenced object in the + renumbering table, and push the referenced object onto the + queue. As a special case, when writing out a stream + dictionary, replace length, filters, and decode parameters + as required. +

      + Write out dictionary or array, replacing any unresolvable + indirect object references with null (pdf spec says + reference to non-existent object is legal and resolves to + null) and any resolvable ones with references to the + renumbered objects. +

    • + If the object is a stream, write + stream\n, the stream contents (from the + memory buffer), and \nendstream\n. +

    • + When done, write endobj. +

    +

+

+ Once we have finished the queue, all referenced objects will have + been written out and all deleted objects or unreferenced objects + will have been skipped. The new cross-reference table will + contain an offset for every new object number from 1 up to the + number of objects written. This can be used to write out a new + xref table. Finally we can write out the trailer dictionary with + appropriately computed /ID (see spec, 8.3, File Identifiers), the + cross reference table offset, and %%EOF. +

6.8. Filtered Streams

+ Support for streams is implemented through the + Pipeline interface which was designed for + this package. +

+ When reading streams, create a series of + Pipeline objects. The + Pipeline abstract base requires + implementation write() and + finish() and provides an implementation of + getNext(). Each pipeline object, upon + receiving data, does whatever it is going to do and then writes + the data (possibly modified) to its successor. Alternatively, a + pipeline may be an end-of-the-line pipeline that does something + like store its output to a file or a memory buffer ignoring a + successor. For additional details, look at + Pipeline.hh. +

+ QPDF can read raw or filtered streams. + When reading a filtered stream, the QPDF + class creates a Pipeline object for one of + each appropriate filter object and chains them together. The last + filter should write to whatever type of output is required. The + QPDF class has an interface to write raw or + filtered stream contents to a given pipeline. +



[1] + As pointed out earlier, the intention is not for qpdf to be used + to bypass security on files. but as any open source PDF consumer + may be easily modified to bypass basic PDF document security, + and qpdf offers may transformations that can do this as well, + there seems to be little point in the added complexity of + conditionally enforcing document security. +

Chapter 7. Linearization

+ This chapter describes how QPDF and + QPDFWriter implement creation and processing + of linearized PDFS. +

7.1. Basic Strategy for Linearization

+ To avoid the incestuous problem of having the qpdf library + validate its own linearized files, we have a special linearized + file checking mode which can be invoked via qpdf + --check-linearization (or qpdf + --check). This mode reads the linearization parameter + dictionary and the hint streams and validates that object + ordering, parameters, and hint stream contents are correct. The + validation code was first tested against linearized files created + by external tools (Acrobat and pdlin) and then used to validate + files created by QPDFWriter itself. +

7.2. Preparing For Linearization

+ Before creating a linearized PDF file from any other PDF file, the + PDF file must be altered such that all page attributes are + propagated down to the page level (and not inherited from parents + in the /Pages tree). We also have to know + which objects refer to which other objects, being concerned with + page boundaries and a few other cases. We refer to this part of + preparing the PDF file as optimization, + discussed in Section 7.3, “Optimization”. Note the, in + this context, the term optimization is a + qpdf term, and the term linearization is a + term from the PDF specification. Do not be confused by the fact + that many applications refer to linearization as optimization or + web optimization. +

+ When creating linearized PDF files from optimized PDF files, there + are really only a few issues that need to be dealt with: +

  • + Creation of hints tables +

  • + Placing objects in the correct order +

  • + Filling in offsets and byte sizes +

+

7.3. Optimization

+ In order to perform various operations such as linearization and + splitting files into pages, it is necessary to know which objects + are referenced by which pages, page thumbnails, and root and + trailer dictionary keys. It is also necessary to ensure that all + page-level attributes appear directly at the page level and are + not inherited from parents in the pages tree. +

+ We refer to the process of enforcing these constraints as + optimization. As mentioned above, note + that some applications refer to linearization as optimization. + Although this optimization was initially motivated by the need to + create linearized files, we are using these terms separately. +

+ PDF file optimization is implemented in the + QPDF_optimization.cc source file. That file + is richly commented and serves as the primary reference for the + optimization process. +

+ After optimization has been completed, the private member + variables obj_user_to_objects and + object_to_obj_users in + QPDF have been populated. Any object that + has more than one value in the + object_to_obj_users table is shared. Any + object that has exactly one value in the + object_to_obj_users table is private. To find + all the private objects in a page or a trailer or root dictionary + key, one merely has make this determination for each element in + the obj_user_to_objects table for the given + page or key. +

+ Note that pages and thumbnails have different object user types, + so the above test on a page will not include objects referenced by + the page's thumbnail dictionary and nothing else. +

7.4. Writing Linearized Files

+ We will create files with only primary hint streams. We will + never write overflow hint streams. (As of PDF version 1.4, + Acrobat doesn't either, and they are never necessary.) The hint + streams contain offset information to objects that point to where + they would be if the hint stream were not present. This means + that we have to calculate all object positions before we can + generate and write the hint table. This means that we have to + generate the file in two passes. To make this reliable, + QPDFWriter in linearization mode invokes + exactly the same code twice to write the file to a pipeline. +

+ In the first pass, the target pipeline is a count pipeline chained + to a discard pipeline. The count pipeline simply passes its data + through to the next pipeline in the chain but can return the + number of bytes passed through it at any intermediate point. The + discard pipeline is an end of line pipeline that just throws its + data away. The hint stream is not written and dummy values with + adequate padding are stored in the first cross reference table, + linearization parameter dictionary, and /Prev key of the first + trailer dictionary. All the offset, length, object renumbering + information, and anything else we need for the second pass is + stored. +

+ At the end of the first pass, this information is passed to the + QPDF class which constructs a compressed + hint stream in a memory buffer and returns it. + QPDFWriter uses this information to write a + complete hint stream object into a memory buffer. At this point, + the length of the hint stream is known. +

+ In the second pass, the end of the pipeline chain is a regular + file instead of a discard pipeline, and we have known values for + all the offsets and lengths that we didn't have in the first pass. + We have to adjust offsets that appear after the start of the hint + stream by the length of the hint stream, which is known. Anything + that is of variable length is padded, with the padding code + surrounding any writing code that differs in the two passes. This + ensures that changes to the way things are represented never + results in offsets that were gathered during the first pass + becoming incorrect for the second pass. +

+ Using this strategy, we can write linearized files to a + non-seekable output stream with only a single pass to disk or + wherever the output is going. +

7.5. Calculating Linearization Data

+ Once a file is optimized, we have information about which objects + access which other objects. We can then process these tables to + decide which part (as described in “Linearized PDF Document + Structure” in the PDF specification) each object is + contained within. This tells us the exact order in which objects + are written. The QPDFWriter class asks for + this information and enqueues objects for writing in the proper + order. It also turns on a check that causes an exception to be + thrown if an object is encountered that has not already been + queued. (This could happen only if there were a bug in the + traversal code used to calculate the linearization data.) +

7.6. Known Issues with Linearization

+ There are a handful of known issues with this linearization code. + These issues do not appear to impact the behavior of linearized + files which still work as intended: it is possible for a web + browser to begin to display them before they are fully + downloaded. In fact, it seems that various other programs that + create linearized files have many of these same issues. These + items make reference to terminology used in the linearization + appendix of the PDF specification. +

  • + Thread Dictionary information keys appear in part 4 with the + rest of Threads instead of in part 9. Objects in part 9 are + not grouped together functionally. +

  • + We are not calculating numerators for shared object positions + within content streams or interleaving them within content + streams. +

  • + We generate only page offset, shared object, and outline hint + tables. It would be relatively easy to add some additional + tables. We gather most of the information needed to create + thumbnail hint tables. There are comments in the code about + this. +

+

7.7. Debugging Note

+ The qpdf --show-linearization command can show + the complete contents of linearization hint streams. To look at + the raw data, you can extract the filtered contents of the + linearization hint tables using qpdf --show-object=n + --filtered-stream-data. Then, to convert this into a + bit stream (since linearization tables are bit streams written + without regard to byte boundaries), you can pipe the resulting + data through the following perl code: + +

use bytes;
+binmode STDIN;
+undef $/;
+my $a = <STDIN>;
+my @ch = split(//, $a);
+map { printf("%08b", ord($_)) } @ch;
+print "\n";
+

+

Chapter 8. Object and Cross-Reference Streams

+ This chapter provides information about the implementation of + object stream and cross-reference stream support in qpdf. +

8.1. Object Streams

+ Object streams can contain any regular object except the + following: +

  • + stream objects +

  • + objects with generation > 0 +

  • + the encryption dictionary +

  • + objects containing the /Length of another stream +

+ In addition, Adobe reader (at least as of version 8.0.0) appears + to not be able to handle having the document catalog appear in an + object stream if the file is encrypted, though this is not + specifically disallowed by the specification. +

+ There are additional restrictions for linearized files. See Section 8.3, “Implications for Linearized Files”for details. +

+ The PDF specification refers to objects in object streams as + “compressed objects” regardless of whether the object + stream is compressed. +

+ The generation number of every object in an object stream must be + zero. It is possible to delete and replace an object in an object + stream with a regular object. +

+ The object stream dictionary has the following keys: +

  • + /N: number of objects +

  • + /First: byte offset of first object +

  • + /Extends: indirect reference to stream that + this extends +

+

+ Stream collections are formed with /Extends. + They must form a directed acyclic graph. These can be used for + semantic information and are not meaningful to the PDF document's + syntactic structure. Although qpdf preserves stream collections, + it never generates them and doesn't make use of this information + in any way. +

+ The specification recommends limiting the number of objects in + object stream for efficiency in reading and decoding. Acrobat 6 + uses no more than 100 objects per object stream for linearized + files and no more 200 objects per stream for non-linearized files. + QPDFWriter, in object stream generation + mode, never puts more than 100 objects in an object stream. +

+ Object stream contents consists of N pairs of + integers, each of which is the object number and the byte offset + of the object relative to the first object in the stream, followed + by the objects themselves, concatenated. +

8.2. Cross-Reference Streams

+ For non-hybrid files, the value following + startxref is the byte offset to the xref stream + rather than the word xref. +

+ For hybrid files (files containing both xref tables and + cross-reference streams), the xref table's trailer dictionary + contains the key /XRefStm whose value is the + byte offset to a cross-reference stream that supplements the xref + table. A PDF 1.5-compliant application should read the xref table + first. Then it should replace any object that it has already seen + with any defined in the xref stream. Then it should follow any + /Prev pointer in the original xref table's + trailer dictionary. The specification is not clear about what + should be done, if anything, with a /Prev + pointer in the xref stream referenced by an xref table. The + QPDF class ignores it, which is probably + reasonable since, if this case were to appear for any sensible PDF + file, the previous xref table would probably have a corresponding + /XRefStm pointer of its own. For example, if a + hybrid file were appended, the appended section would have its own + xref table and /XRefStm. The appended xref + table would point to the previous xref table which would point the + /XRefStm, meaning that the new + /XRefStm doesn't have to point to it. +

+ Since xref streams must be read very early, they may not be + encrypted, and the may not contain indirect objects for keys + required to read them, which are these: +

  • + /Type: value /XRef +

  • + /Size: value n+1: where + n is highest object number (same as + /Size in the trailer dictionary) +

  • + /Index (optional): value + [n count ...] + used to determine which objects' information is stored in this + stream. The default is [0 /Size]. +

  • + /Prev: value + offset: byte offset of previous xref + stream (same as /Prev in the trailer + dictionary) +

  • + /W [...]: sizes of each field in the xref + table +

+

+ The other fields in the xref stream, which may be indirect if + desired, are the union of those from the xref table's trailer + dictionary. +

8.2.1. Cross-Reference Stream Data

+ The stream data is binary and encoded in big-endian byte order. + Entries are concatenated, and each entry has a length equal to + the total of the entries in /W above. Each + entry consists of one or more fields, the first of which is the + type of the field. The number of bytes for each field is given + by /W above. A 0 in /W + indicates that the field is omitted and has the default value. + The default value for the field type is + “1”. All other default values are + “0”. +

+ PDF 1.5 has three field types: +

  • + 0: for free objects. Format: 0 obj + next-generation, same as the free table in a + traditional cross-reference table +

  • + 1: regular non-compressed object. Format: 1 offset + generation +

  • + 2: for objects in object streams. Format: 2 + object-stream-number index, the number of object + stream containing the object and the index within the object + stream of the object. +

+

+ It seems standard to have the first entry in the table be + 0 0 0 instead of 0 0 ffff + if there are no deleted objects. +

8.3. Implications for Linearized Files

+ For linearized files, the linearization dictionary, document + catalog, and page objects may not be contained in object streams. +

+ Objects stored within object streams are given the highest range + of object numbers within the main and first-page cross-reference + sections. +

+ It is okay to use cross-reference streams in place of regular xref + tables. There are on special considerations. +

+ Hint data refers to object streams themselves, not the objects in + the streams. Shared object references should also be made to the + object streams. There are no reference in any hint tables to the + object numbers of compressed objects (objects within object + streams). +

+ When numbering objects, all shared objects within both the first + and second halves of the linearized files must be numbered + consecutively after all normal uncompressed objects in that half. +

8.4. Implementation Notes

+ There are three modes for writing object streams: + disable, preserve, and + generate. In disable mode, we do not generate + any object streams, and we also generate an xref table rather than + xref streams. This can be used to generate PDF files that are + viewable with older readers. In preserve mode, we write object + streams such that written object streams contain the same objects + and /Extends relationships as in the original + file. This is equal to disable if the file has no object streams. + In generate, we create object streams ourselves by grouping + objects that are allowed in object streams together in sets of no + more than 100 objects. We also ensure that the PDF version is at + least 1.5 in generate mode, but we preserve the version header in + the other modes. The default is preserve. +

+ We do not support creation of hybrid files. When we write files, + even in preserve mode, we will lose any xref tables and merge any + appended sections. +

Appendix A. Release Notes

+ For a detailed list of changes, please see the file + ChangeLog in the source distribution. +

3.0.2: September 6, 2012
  • + Bug fix: QPDFWriter::setOutputMemory did + not work when not used with + QPDFWriter::setStaticID, which made it + pretty much useless. This has been fixed. +

  • + New API call + QPDFWriter::setExtraHeaderText inserts + additional text near the header of the PDF file. The intended + use case is to insert comments that may be consumed by a + downstream application, though other use cases may exist. +

3.0.1: August 11, 2012
  • + Version 3.0.0 included addition of files for + pkg-config, but this was not mentioned in + the release notes. The release notes for 3.0.0 were updated + to mention this. +

  • + Bug fix: if an object stream ended with a scalar object not + followed by space, qpdf would incorrectly report that it + encountered a premature EOF. This bug has been in qpdf since + version 2.0. +

3.0.0: August 2, 2012
  • + Acknowledgment: I would like to express gratitude for the + contributions of Tobias Hoffmann toward the release of qpdf + version 3.0. He is responsible for most of the implementation + and design of the new API for manipulating pages, and + contributed code and ideas for many of the improvements made + in version 3.0. Without his work, this release would + certainly not have happened as soon as it did, if at all. +

  • + Non-compatible API change: The version of + QPDFObjectHandle::replaceStreamData that + uses a StreamDataProvider no longer + requires (or accepts) a length parameter. + See Appendix C, Upgrading to 3.0 for an explanation. + While care is taken to avoid non-compatible API changes in + general, an exception was made this time because the new + interface offers an opportunity to significantly simplify + calling code. +

  • + Support has been added for large files. The test suite + verifies support for files larger than 4 gigabytes, and manual + testing has verified support for files larger than 10 + gigabytes. Large file support is available for both 32-bit + and 64-bit platforms as long as the compiler and underlying + platforms support it. +

  • + Support for page selection (splitting and merging PDF files) + has been added to the qpdf command-line + tool. See Section 3.4, “Page Selection Options”. +

  • + Options have been added to the qpdf + command-line tool for copying encryption parameters from + another file. See Section 3.2, “Basic Options”. +

  • + New methods have been added to the QPDF + object for adding and removing pages. See Section 6.4, “Adding and Removing Pages”. +

  • + New methods have been added to the QPDF + object for copying objects from other PDF files. See Section 6.6, “Copying Objects From Other PDF Files” +

  • + A new method QPDFObjectHandle::parse has + been added for constructing + QPDFObjectHandle objects from a string + description. +

  • + Methods have been added to QPDFWriter + to allow writing to an already open stdio FILE* + addition to writing to standard output or a named file. + Methods have been added to QPDF to be + able to process a file from an already open stdio + FILE*. This makes it possible to read and write + PDF from secure temporary files that have been unlinked prior + to being fully read or written. +

  • + The QPDF::emptyPDF can be used to allow + creation of PDF files from scratch. The example + examples/pdf-create.cc illustrates how it + can be used. +

  • + Several methods to take + PointerHolder<Buffer> can now + also accept std::string arguments. +

  • + Many new convenience methods have been added to the library, + most in QPDFObjectHandle. See + ChangeLog for a full list. +

  • + When building on a platform that supports ELF shared libraries + (such as Linux), symbol versions are enabled by default. They + can be disabled by passing + --disable-ld-version-script to + ./configure. +

  • + The file libqpdf.pc is now installed to + support pkg-config. +

  • + Image comparison tests are off by default now since they are + not needed to verify a correct build or port of qpdf. They + are needed only when changing the actual PDF output generated + by qpdf. You should enable them if you are making deep + changes to qpdf itself. See README for + details. +

  • + Large file tests are off by default but can be turned on with + ./configure or by setting an environment + variable before running the test suite. See + README for details. +

  • + When qpdf's test suite fails, failures are not printed to the + terminal anymore by default. Instead, find them in + build/qtest.log. For packagers who are + building with an autobuilder, you can add the + --enable-show-failed-test-output option to + ./configure to restore the old behavior. +

2.3.1: December 28, 2011
  • + Fix thread-safety problem resulting from non-thread-safe use + of the PCRE library. +

  • + Made a few minor documentation fixes. +

  • + Add workaround for a bug that appears in some versions of + ghostscript to the test suite +

  • + Fix minor build issue for Visual C++ 2010. +

2.3.0: August 11, 2011
  • + Bug fix: when preserving existing encryption on encrypted + files with cleartext metadata, older qpdf versions would + generate password-protected files with no valid password. + This operation now works. This bug only affected files + created by copying existing encryption parameters; explicit + encryption with specification of cleartext metadata worked + before and continues to work. +

  • + Enhance QPDFWriter with a new + constructor that allows you to delay the specification of the + output file. When using this constructor, you may now call + QPDFWriter::setOutputFilename to specify + the output file, or you may use + QPDFWriter::setOutputMemory to cause + QPDFWriter to write the resulting PDF + file to a memory buffer. You may then use + QPDFWriter::getBuffer to retrieve the + memory buffer. +

  • + Add new API call QPDF::replaceObject for + replacing objects by object ID +

  • + Add new API call QPDF::swapObjects for + swapping two objects by object ID +

  • + Add QPDFObjectHandle::getDictAsMap and + QPDFObjectHandle::getArrayAsVector to + allow retrieval of dictionary objects as maps and array + objects as vectors. +

  • + Add functions qpdf_get_info_key and + qpdf_set_info_key to the C API for + manipulating string fields of the document's + /Info dictionary. +

  • + Add functions qpdf_init_write_memory, + qpdf_get_buffer_length, and + qpdf_get_buffer to the C API for writing + PDF files to a memory buffer instead of a file. +

2.2.4: June 25, 2011
  • + Fix installation and compilation issues; no functionality + changes. +

2.2.3: April 30, 2011
  • + Handle some damaged streams with incorrect characters + following the stream keyword. +

  • + Improve handling of inline images when normalizing content + streams. +

  • + Enhance error recovery to properly handle files that use + object 0 as a regular object, which is specifically disallowed + by the spec. +

2.2.2: October 4, 2010
  • + Add new function qpdf_read_memory + to the C API to call + QPDF::processMemoryFile. This was an + omission in qpdf 2.2.1. +

2.2.1: October 1, 2010
  • + Add new method QPDF::setOutputStreams + to replace std::cout and + std::cerr with other streams for generation + of diagnostic messages and error messages. This can be useful + for GUIs or other applications that want to capture any output + generated by the library to present to the user in some other + way. Note that QPDF does not write to + std::cout (or the specified output stream) + except where explicitly mentioned in + QPDF.hh, and that the only use of the + error stream is for warnings. Note also that output of + warnings is suppressed when + setSuppressWarnings(true) is called. +

  • + Add new method QPDF::processMemoryFile + for operating on PDF files that are loaded into memory rather + than in a file on disk. +

  • + Give a warning but otherwise ignore empty PDF objects by + treating them as null. Empty object are not permitted by the + PDF specification but have been known to appear in some actual + PDF files. +

  • + Handle inline image filter abbreviations when the appear as + stream filter abbreviations. The PDF specification does not + allow use of stream filter abbreviations in this way, but + Adobe Reader and some other PDF readers accept them since they + sometimes appear incorrectly in actual PDF files. +

  • + Implement miscellaneous enhancements to + PointerHolder and + Buffer to support other changes. +

2.2.0: August 14, 2010
  • + Add new methods to QPDFObjectHandle + (newStream and + replaceStreamData for creating new + streams and replacing stream data. This makes it possible to + perform a wide range of operations that were not previously + possible. +

  • + Add new helper method in + QPDFObjectHandle + (addPageContents) for appending or + prepending new content streams to a page. This method makes + it possible to manipulate content streams without having to be + concerned whether a page's contents are a single stream or an + array of streams. +

  • + Add new method in QPDFObjectHandle: + replaceOrRemoveKey, which replaces a + dictionary key + with a given value unless the value is null, in which case it + removes the key instead. +

  • + Add new method in QPDFObjectHandle: + getRawStreamData, which returns the raw + (unfiltered) stream data into a buffer. This complements the + getStreamData method, which returns the + filtered (uncompressed) stream data and can only be used when + the stream's data is filterable. +

  • + Provide two new examples: + pdf-double-page-size and + pdf-invert-images that illustrate the newly + added interfaces. +

  • + Fix a memory leak that would cause loss of a few bytes for + every object involved in a cycle of object references. Thanks + to Jian Ma for calling my attention to the leak. +

2.1.5: April 25, 2010
  • + Remove restriction of file identifier strings to 16 bytes. + This unnecessary restriction was preventing qpdf from being + able to encrypt or decrypt files with identifier strings that + were not exactly 16 bytes long. The specification imposes no + such restriction. +

2.1.4: April 18, 2010
  • + Apply the same padding calculation fix from version 2.1.2 to + the main cross reference stream as well. +

  • + Since qpdf --check only performs limited + checks, clarify the output to make it clear that there still + may be errors that qpdf can't check. This should make it less + surprising to people when another PDF reader is unable to read + a file that qpdf thinks is okay. +

2.1.3: March 27, 2010
  • + Fix bug that could cause a failure when rewriting PDF files + that contain object streams with unreferenced objects that in + turn reference indirect scalars. +

  • + Don't complain about (invalid) AES streams that aren't a + multiple of 16 bytes. Instead, pad them before decrypting. +

2.1.2: January 24, 2010
  • + Fix bug in padding around first half cross reference stream in + linearized files. The bug could cause an assertion failure + when linearizing certain unlucky files. +

2.1.1: December 14, 2009
  • + No changes in functionality; insert missing include in an + internal library header file to support gcc 4.4, and update + test suite to ignore broken Adobe Reader installations. +

2.1: October 30, 2009
  • + This is the first version of qpdf to include Windows support. + On Windows, it is possible to build a DLL. Additionally, a + partial C-language API has been introduced, which makes it + possible to call qpdf functions from non-C++ environments. I + am very grateful to Zarko Gagic (http://delphi.about.com/) + for tirelessly testing numerous pre-release versions of this + DLL and providing many excellent suggestions on improving the + interface. +

    + For programming to the C interface, please see the header file + qpdf/qpdf-c.h and the example + examples/pdf-linearize.c. +

  • + Zarko Gajic has written a Delphi wrapper for qpdf, which can + be downloaded from qpdf's download side. Zarko's Delphi + wrapper is released with the same licensing terms as qpdf + itself and comes with this disclaimer: “Delphi wrapper + unit qpdf.pas created by Zarko Gajic + (http://delphi.about.com/). + Use at your own risk and for whatever purpose you want. No + support is provided. Sample code is provided.” +

  • + Support has been added for AES encryption and crypt filters. + Although qpdf does not presently support files that use + PKI-based encryption, with the addition of AES and crypt + filters, qpdf is now be able to open most encrypted files + created with newer versions of Acrobat or other PDF creation + software. Note that I have not been able to get very many + files encrypted in this way, so it's possible there could + still be some cases that qpdf can't handle. Please report + them if you find them. +

  • + Many error messages have been improved to include more + information in hopes of making qpdf a more useful tool for PDF + experts to use in manually recovering damaged PDF files. +

  • + Attempt to avoid compressing metadata streams if possible. + This is consistent with other PDF creation applications. +

  • + Provide new command-line options for AES encrypt, cleartext + metadata, and setting the minimum and forced PDF versions of + output files. +

  • + Add additional methods to the QPDF + object for querying the document's permissions. Although qpdf + does not enforce these permissions, it does make them + available so that applications that use qpdf can enforce + permissions. +

  • + The --check option to qpdf + has been extended to include some additional information. +

  • + There have been a handful of non-compatible API changes. For + details, see Appendix B, Upgrading from 2.0 to 2.1. +

2.0.6: May 3, 2009
  • + Do not attempt to uncompress streams that have decode + parameters we don't recognize. Earlier versions of qpdf would + have rejected files with such streams. +

2.0.5: March 10, 2009
  • + Improve error handling in the LZW decoder, and fix a small + error introduced in the previous version with regard to + handling full tables. The LZW decoder has been more strongly + verified in this release. +

2.0.4: February 21, 2009
  • + Include proper support for LZW streams encoded without the + “early code change” flag. Special thanks to Atom + Smasher who reported the problem and provided an input file + compressed in this way, which I did not previously have. +

  • + Implement some improvements to file recovery logic. +

2.0.3: February 15, 2009
  • + Compile cleanly with gcc 4.4. +

  • + Handle strings encoded as UTF-16BE properly. +

2.0.2: June 30, 2008
  • + Update test suite to work properly with a + non-bash /bin/sh and + with Perl 5.10. No changes were made to the actual qpdf + source code itself for this release. +

2.0.1: May 6, 2008
  • + No changes in functionality or interface. This release + includes fixes to the source code so that qpdf compiles + properly and passes its test suite on a broader range of + platforms. See ChangeLog in the source + distribution for details. +

2.0: April 29, 2008
  • + First public release. +

Appendix B. Upgrading from 2.0 to 2.1

+ Although, as a general rule, we like to avoid introducing + source-level incompatibilities in qpdf's interface, there were a + few non-compatible changes made in this version. A considerable + amount of source code that uses qpdf will probably compile without + any changes, but in some cases, you may have to update your code. + The changes are enumerated here. There are also some new + interfaces; for those, please refer to the header files. +

  • + QPDF's exception handling mechanism now uses + std::logic_error for internal errors and + std::runtime_error for runtime errors in + favor of the now removed QEXC classes used + in previous versions. The QEXC exception + classes predated the addition of the + <stdexcept> header file to the C++ + standard library. Most of the exceptions thrown by the qpdf + library itself are still of type QPDFExc + which is now derived from + std::runtime_error. Programs that caught + an instance of std::exception and + displayed it by calling the what() method + will not need to be changed. +

  • + The QPDFExc class now internally + represents various fields of the error condition and provides + interfaces for querying them. Among the fields is a numeric + error code that can help applications act differently on (a small + number of) different error conditions. See + QPDFExc.hh for details. +

  • + Warnings can be retrieved from qpdf as instances of + QPDFExc instead of strings. +

  • + The nested QPDF::EncryptionData class's + constructor takes an additional argument. This class is + primarily intended to be used by + QPDFWriter. There's not really anything + useful an end-user application could do with it. It probably + shouldn't really be part of the public interface to begin with. + Likewise, some of the methods for computing internal encryption + dictionary parameters have changed to support + /R=4 encryption. +

  • + The method QPDF::getUserPassword has been + removed since it didn't do what people would think it did. There + are now two new methods: + QPDF::getPaddedUserPassword and + QPDF::getTrimmedUserPassword. The first one + does what the old QPDF::getUserPassword + method used to do, which is to return the password with possible + binary padding as specified by the PDF specification. The second + one returns a human-readable password string. +

  • + The enumerated types that used to be nested in + QPDFWriter have moved to top-level + enumerated types and are now defined in the file + qpdf/Constants.h. This enables them to be + shared by both the C and C++ interfaces. +

Appendix C. Upgrading to 3.0

+ For the most part, the API for qpdf version 3.0 is backward + compatible with versions 2.1 and later. There are two exceptions: +

  • + The method + QPDFObjectHandle::replaceStreamData that + uses a StreamDataProvider to provide the + stream data no longer takes a length + parameter. While it would have been easy enough to keep the + parameter for backward compatibility, in this case, the + parameter was removed since this provides the user an + opportunity to simplify the calling code. This method was + introduced in version 2.2. At the time, the + length parameter was required in order to + ensure that calls to the stream data provider returned the same + length for a specific stream every time they were invoked. In + particular, the linearization code depends on this. Instead, + qpdf 3.0 and newer check for that constraint explicitly. The + first time the stream data provider is called for a specific + stream, the actual length is saved, and subsequent calls are + required to return the same number of bytes. This means the + calling code no longer has to compute the length in advance, + which can be a significant simplification. If your code fails + to compile because of the extra argument and you don't want to + make other changes to your code, just omit the argument. +

  • + Many methods take long long instead of other + integer types. Most if not all existing code should compile + fine with this change since such parameters had always + previously been smaller types. This change was required to + support files larger than two gigabytes in size. +

+

diff --git a/doc/qpdf-manual.pdf b/doc/qpdf-manual.pdf new file mode 100644 index 0000000000000000000000000000000000000000..75f62234d6a23b0825af3957ccb191e6c4ff5208 GIT binary patch literal 146522 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%0D6nw<`WQ0-V4_+!oZo<{{bST4t_s6$NxZJxjg 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 header file. */ +#undef HAVE_DLFCN_H + +/* Define to 1 if fseeko (and presumably ftello) exists and is declared. */ +#undef HAVE_FSEEKO + +/* Define to 1 if you have the `fseeko64' function. */ +#undef HAVE_FSEEKO64 + +/* Define to 1 if you have the header file. */ +#undef HAVE_INTTYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_MEMORY_H + +/* Whether printf supports %ll */ +#undef HAVE_PRINTF_LL + +/* Define to 1 if you have the `random' function. */ +#undef HAVE_RANDOM + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDINT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STDLIB_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRINGS_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_STRING_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_STAT_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_SYS_TYPES_H + +/* Define to 1 if you have the header file. */ +#undef HAVE_UNISTD_H + +/* Define to the sub-directory in which libtool stores uninstalled libraries. + */ +#undef LT_OBJDIR + +/* Define to the address where bug reports for this package should be sent. */ +#undef PACKAGE_BUGREPORT + +/* Define to the full name of this package. */ +#undef PACKAGE_NAME + +/* Define to the full name and version of this package. */ +#undef PACKAGE_STRING + +/* Define to the one symbol short name of this package. */ +#undef PACKAGE_TARNAME + +/* Define to the home page for this package. */ +#undef PACKAGE_URL + +/* Define to the version of this package. */ +#undef PACKAGE_VERSION + +/* Define to 1 if you have the ANSI C header files. */ +#undef STDC_HEADERS + +/* Enable large inode numbers on Mac OS X 10.5. */ +#ifndef _DARWIN_USE_64_BIT_INODE +# define _DARWIN_USE_64_BIT_INODE 1 +#endif + +/* Number of bits in a file offset, on hosts where this is settable. */ +#undef _FILE_OFFSET_BITS + +/* Define to 1 to make fseeko visible on some hosts (e.g. glibc 2.2). */ +#undef _LARGEFILE_SOURCE + +/* Define for large files, on AIX-style hosts. */ +#undef _LARGE_FILES + +/* Define for Solaris 2.5.1 so the uint32_t typedef from , + , or is not used. If the typedef were allowed, the + #define below would cause a syntax error. */ +#undef _UINT32_T + +/* Define to the type of an unsigned integer type of width exactly 16 bits if + such a type exists and the standard includes do not define it. */ +#undef uint16_t + +/* Define to the type of an unsigned integer type of width exactly 32 bits if + such a type exists and the standard includes do not define it. */ +#undef uint32_t diff --git a/make/libtool.mk b/make/libtool.mk index 8112c2c..e3cf7a1 100644 --- a/make/libtool.mk +++ b/make/libtool.mk @@ -127,7 +127,7 @@ install: all cp include/qpdf/*.h $(DESTDIR)$(includedir)/qpdf cp include/qpdf/*.hh $(DESTDIR)$(includedir)/qpdf cp doc/stylesheet.css $(DESTDIR)$(docdir) -# cp doc/qpdf-manual.html $(DESTDIR)$(docdir) -# cp doc/qpdf-manual.pdf $(DESTDIR)$(docdir) + cp doc/qpdf-manual.html $(DESTDIR)$(docdir) + cp doc/qpdf-manual.pdf $(DESTDIR)$(docdir) cp doc/*.1 $(DESTDIR)$(mandir)/man1 cp libqpdf.pc $(DESTDIR)$(libdir)/pkgconfig diff --git a/qpdf.manifest b/packaging/qpdf.manifest similarity index 98% rename from qpdf.manifest rename to packaging/qpdf.manifest index 81ace0c..97e8c31 100644 --- a/qpdf.manifest +++ b/packaging/qpdf.manifest @@ -3,4 +3,3 @@ - diff --git a/packaging/qpdf.spec b/packaging/qpdf.spec index a9c20c3..09828f4 100644 --- a/packaging/qpdf.spec +++ b/packaging/qpdf.spec @@ -1,17 +1,14 @@ -%define _unpackaged_files_terminate_build 0 - -Summary: Command-line tools and library for transforming PDF files -Name: qpdf -Version: 3.0.2 -Release: 2 -License: Artistic -Group: System Environment/Libraries -URL: http://qpdf.sourceforge.net/ -Source: %{name}-%{version}.tar.gz -Buildroot: %{_tmppath}/%{name}-%{version}-%{release}-root -BuildRequires: zlib-devel -BuildRequires: libpcre-devel -#BuildRequires: pcre +Name: qpdf +Version: 3.0.2_3 +Release: 1 +License: Artistic-2.0 +Summary: Command-line tools and library for transforming PDF files +Url: http://qpdf.sourceforge.net/ +Group: System/Libraries +Source: %{name}-%{version}.tar.gz +Source1: %{name}.manifest +BuildRequires: pkgconfig(libpcre) +BuildRequires: pkgconfig(zlib) %description QPDF is a program that does structural, content-preserving @@ -28,78 +25,52 @@ from other PDF files or to inspect or extract information from existing PDF files. %package devel -Summary: Development files for qpdf PDF manipulation library -Group: Development/Libraries -Requires: %{name} = %{version}-%{release} zlib-devel libpcre-devel +Summary: Development files for qpdf PDF manipulation library +Group: Development/System +Requires: %{name} = %{version} +Requires: pkgconfig(libpcre) +Requires: pkgconfig(zlib) %description devel The qpdf-devel package contains header files and libraries necessary for developing programs using the qpdf library. -%package static -Summary: Static QPDF library -Group: Development/Libraries -Requires: %{name}-devel = %{version}-%{release} - -%description static -The qpdf-static package contains the static qpdf library. %prep %setup -q +cp %{SOURCE1} . %build ./autogen.sh %configure --without-docdir -# --docdir='${datarootdir}'/doc/%{name}-%{version} make %{?_smp_mflags} + +%check make check %install -rm -rf $RPM_BUILD_ROOT -%makeinstall -# %doc below clobbers our docdir, so we have to copy it to a safe -# place so we can install it using %doc. We should still set docdir -# properly when configuring so that it gets substituted properly by -# autoconf. -#cp -a $RPM_BUILD_ROOT%{_datadir}/doc/%{name}-%{version} install-docs -#mkdir -p install-examples/examples -#cp -p examples/*.cc examples/*.c install-examples/examples -# Red Hat doesn't ship .la files. -#rm -f $RPM_BUILD_ROOT%{_libdir}/libqpdf.la +%make_install +rm -rf %{buildroot}/%{_datadir}/doc/qpdf mkdir -p %{buildroot}/usr/share/license cp %{_builddir}/%{buildsubdir}/Artistic-2.0 %{buildroot}/usr/share/license/%{name} +%post -p /sbin/ldconfig -%post -/sbin/ldconfig - -%postun -/sbin/ldconfig +%postun -p /sbin/ldconfig %files -%manifest qpdf.manifest -%defattr(-,root,root) -#README TODO Artistic-2.0 install-docs/* +%manifest %{name}.manifest /usr/share/license/%{name} %exclude %{_bindir}/* -%{_libdir}/libqpdf*.so.* %exclude %{_mandir}/man1/* +%{_libdir}/libqpdf*.so.* %files devel -%defattr(-,root,root) -#install-examples/examples +%manifest %{name}.manifest %{_includedir}/* %{_libdir}/libqpdf*.so -%{_libdir}/pkgconfig - -%files static -%defattr(-,root,root) -%{_libdir}/libqpdf*.a +%{_libdir}/pkgconfig/*.pc -%clean -rm -rf $RPM_BUILD_ROOT %changelog -* Mon Apr 28 2008 Jay Berkenbilt - 2.0-1 -- Initial packaging -- 2.7.4