#14707: qpdf-10.2.0
-------------------------+-----------------------
Reporter: bdubbs | Owner: renodr
Type: enhancement | Status: assigned
Priority: normal | Milestone: 10.2
Component: BOOK | Version: SVN
Severity: normal | Resolution:
Keywords: |
-------------------------+-----------------------
Comment (by renodr):
{{{
10.2.0: February 23, 2021
CLI Behavior Changes
Operations that work on combining pages are much better about
protecting form fields. In particular, --split-pages and --pages now
preserve interaction form functionality by copying the relevant form field
information from the original files. Additionally, if you use --pages to
select only some pages from the original input file, unused form fields
are removed, which prevents lots of unused annotations from being
retained.
By default, qpdf no longer allows creation of encrypted PDF
files whose user password is non-empty and owner password is empty when a
256-bit key is in use. The --allow-insecure option, specified inside the
--encrypt options, allows creation of such files. Behavior changes in the
CLI are avoided when possible, but an exception was made here because this
is security-related. qpdf must always allow creation of weird files for
testing purposes, but it should not default to letting users unknowingly
create insecure files.
Library Behavior Changes
Note: the changes in this section cause differences in output
in some cases. These differences change the syntax of the PDF but do not
change the semantics (meaning). I make a strong effort to avoid gratuitous
changes in qpdf's output so that qpdf changes don't break people's tests.
In this case, the changes significantly improve the readability of the
generated PDF and don't affect any output that's generated by simple
transformation. If you are annoyed by having to update test files, please
rest assured that changes like this have been and will continue to be rare
events.
QPDFObjectHandle::newUnicodeString now uses whichever of
ASCII, PDFDocEncoding, of UTF-16 is sufficient to encode all the
characters in the string. This reduces needless encoding in UTF-16 of
strings that can be encoded in ASCII. This change may cause qpdf to
generate different output than before when form field values are set using
QPDFFormFieldObjectHelper but does not change the meaning of the output.
The code that places form XObjects and also the code that
flattens rotations trim trailing zeroes from real numbers that they
calculate. This causes slight (but semantically equivalent) differences in
generated appearance streams and form XObject invocations in
overlay/underlay code or in user code that calls the methods that place
form XObjects on a page.
CLI Enhancements
Add new command line options for listing, saving, adding,
removing, and and copying file attachments. See Section 3.7, “Embedded
Files/Attachments Options” for details.
Page splitting and merging operations, as well as --flatten-
rotation, are better behaved with respect to annotations and interactive
form fields. In most cases, interactive form field functionality and
proper formatting and functionality of annotations is preserved by these
operations. There are still some cases that aren't perfect, such as when
functionality of annotations depends on document-level data that qpdf
doesn't yet understand or when there are problems with referential
integrity among form fields and annotations (e.g., when a single form
field object or its associated annotations are shared across multiple
pages, a case that is out of spec but that works in most viewers anyway).
The option --password-file=filename can now be used to read
the decryption password from a file. You can use - as the file name to
read the password from standard input. This is an easier/more obvious way
to read passwords from files or standard input than using @file for this
purpose.
Add some information about attachments to the json output, and
added attachments as an additional json key. The information included here
is limited to the preferred name and content stream and a reference to the
file spec object. This is enough detail for clients to avoid the hassle of
navigating a name tree and provides what is needed for basic enumeration
and extraction of attachments. More detailed information can be obtained
by following the reference to the file spec object.
Add numeric option to --collate. If --collate=n is given, take
pages in groups of n from the given files.
It is now valid to provide --rotate=0 to clear rotation from a
page.
Library Enhancements
This release includes numerous additions to the API. Not all
changes are listed here. Please see the ChangeLog file in the source
distribution for a comprehensive list. Highlights appear below.
Add QPDFObjectHandle::ditems() and QPDFObjectHandle::aitems()
that enable C++-style iteration, including range-for iteration, over
dictionary and array QPDFObjectHandles. See comments in
include/qpdf/QPDFObjectHandle.hh and examples/pdf-name-number-tree.cc for
details.
Add QPDFObjectHandle::copyStream for making a copy of a stream
within the same QPDF instance.
Add new helper classes for supporting file attachments, also
known as embedded files. New classes are QPDFEmbeddedFileDocumentHelper,
QPDFFileSpecObjectHelper, and QPDFEFStreamObjectHelper. See their
respective headers for details and examples/pdf-attach-file.cc for an
example.
Add a version of QPDFObjectHandle::parse that takes a QPDF
pointer as context so that it can parse strings containing indirect object
references. This is illustrated in examples/pdf-attach-file.cc.
Re-implement QPDFNameTreeObjectHelper and
QPDFNumberTreeObjectHelper to be more efficient, add an iterator-based
API, give them the capability to repair broken trees, and create methods
for modifying the trees. With this change, qpdf has a robust read/write
implementation of name and number trees.
Add new versions of QPDFObjectHandle::replaceStreamData that
take std::function objects for cases when you need something between a
static string and a full-fledged StreamDataProvider. Using this with
QUtil::file_provider is a very easy way to create a stream from the
contents of a file.
The QPDFMatrix class, formerly a private, internal class, has
been added to the public API. See include/qpdf/QPDFMatrix.hh for details.
This class is for working with transformation matrices. Some methods in
QPDFPageObjectHelper make use of this to make information about
transformation matrices available. For an example, see examples/pdf-
overlay-page.cc.
Several new methods were added to QPDFAcroFormDocumentHelper
for adding, removing, getting information about, and enumerating form
fields.
Add method QPDFAcroFormDocumentHelper::transformAnnotations,
which applies a transformation to each annotation on a page.
Add QPDFPageObjectHelper::copyAnnotations, which copies
annotations and, if applicable, associated form fields, from one page to
another, possibly transforming the rectangles.
Build Changes
A C++-14 compiler is now required to build qpdf. There is no
intention to require anything newer than that for a while. C++-14 includes
modest enhancements to C++-11 and appears to be supported about as widely
as C++-11.
Bug Fixes
The --flatten-rotation option applies transformations to any
annotations that may be on the page.
If a form XObject lacks a resources dictionary, consider any
names in that form XObject to be referenced from the containing page. This
is compliant with older PDF versions. Also detect if any form XObjects
have any unresolved names and, if so, don't remove unreferenced resources
from them or from the page that contains them. Unfortunately this has the
side effect of preventing removal of unreferenced resources in some cases
where names appear that don't refer to resources, such as with tagged PDF.
This is a bit of a corner case that is not likely to cause a significant
problem in practice, but the only side effect would be lack of removal of
shared resources. A future version of qpdf may be more sophisticated in
its detection of names that refer to resources.
Properly handle strings if they appear in inline image
dictionaries while externalizing inline images.
}}}
--
Ticket URL: <http://wiki.linuxfromscratch.org/blfs/ticket/14707#comment:2>
BLFS Trac <http://wiki.linuxfromscratch.org/blfs>
Beyond Linux From Scratch
--
http://lists.linuxfromscratch.org/listinfo/blfs-book
FAQ: http://www.linuxfromscratch.org/blfs/faq.html
Unsubscribe: See the above information page