2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-12-22 10:58:58 +00:00
qpdf/ChangeLog
Jay Berkenbilt e2dedde4bd Don't require stream data provider to know length in advance
Breaking API change: length parameter has disappeared from the
StreamDataProvider version of QPDFObjectHandle::replaceStreamData
since it is no longer necessary to compute it in advance.  This
breaking change is justified by the fact that removing the length
parameter provides the caller an opportunity to simplify the calling
code.
2012-07-07 17:33:45 -04:00

573 lines
20 KiB
Plaintext

2012-07-07 Jay Berkenbilt <ejb@ql.org>
* NOTE: BREAKING API CHANGE. Remove previously required length
parameter from the version QPDFObjectHandle::replaceStreamData
that uses a stream data provider. Prior to qpdf 3.0.0, you had to
compute the stream length in advance so that qpdf could internally
verify that the stream data had the same length every time the
provider was invoked. Now this requirement is enforced a
different way, and the length parameter is no longer required.
Note that I take API-breaking changes very seriously and only did
it in this case since the lack of need to know length in advance
could significantly simplify people's code. If you were
previously going to a lot of trouble to compute the length of the
new stream data in advance, you now no longer have to do that.
You can just drop the length parameter and remove any code that
was previously computing the length. Thanks to Tobias Hoffmann
for pointing out how annoying the original interface was.
2012-07-05 Jay Berkenbilt <ejb@ql.org>
* Add QPDFWriter methods to write to an already open stdio FILE*.
Implementation and idea area based on contributions from Tobias
Hoffmann.
2012-07-04 Jay Berkenbilt <ejb@ql.org>
* Accept changes from Tobias Hoffmann: add public method
QPDF::pushInheritedAttributesToPage including warnings for
non-inherited keys that may be discarded from /Pages by
non-conformant PDF files when the /Pages tree is flattened.
2012-06-27 Jay Berkenbilt <ejb@ql.org>
* Add Pl_Concatenate pipeline for stream concatenation also
implemented by Tobias Hoffmann. Also added test code
(libtests/concatenate.cc).
* Add new methods implemented by Tobias Hoffmann:
QPDFObjectHandle::newReal(double) and
QPDFObjectHandle::newStream(QPDF*, std::string const&).
2012-06-26 Jay Berkenbilt <ejb@ql.org>
* Minor changes so that support for PDF files larger than 4GB
works well with 32-bit and 64-bit Linux and also with 32-bit and
64-bit Windows with both MSVC and mingw.
* Rework internal methods for doing recovery of the cross
reference tables for much greater efficiency both in terms of time
and memory usage.
2012-06-24 Jay Berkenbilt <ejb@ql.org>
* Support PDF files larger than 4 GB. This involved many changes
to the ABI to increase the size of integer types used in various
places as well as increasing the amount of padding used when
creating linearized files. Automated tests for large files are
disabled by default. Run ./configure --help for information on
enabling them. Running the tests requires 11 GB of free disk
space and takes several minutes.
2012-06-22 Jay Berkenbilt <ejb@ql.org>
* examples/pdf-create.cc: Provide an example of creating a PDF
from scratch. This simple PDF has a single page with some text
and an image.
* Add empty QPDFObjectHandle factories for array and dictionary.
With PDF-from-scratch capability, it is useful to be able to
create empty arrays and dictionaries and add keys to them.
Updated pdf_from_scratch.cc to use these interfaces.
2012-06-21 Jay Berkenbilt <ejb@ql.org>
* Add QPDF::emptyPDF() to create an empty QPDF object suitable for
adding pages and other objects to. pdf_from_scratch.cc is test
code that exercises it.
* make/libtool.mk: Place user-specified CPPFLAGS and LDFLAGS later
in the compilation so that if a user installs things in a
non-standard place that they have to tell the build about, earlier
versions of qpdf installed there won't break the build. Thanks to
Macports for reporting this. (Fixes bug 3468860.)
* Instead of using off_t in the public APIs, use qpdf_offset_t
instead. This is defined as long long in qpdf/Types.h. If your
system doesn't support long long, you can redefine it.
* Add pkg-config files
* QPDFObjectHandle: add shallowCopy() method
* QPDF: add new APIs for adding and removing pages. This includes
addPage(), addPageAt(), and removePage(). Also a method
updateAllPagesCache() is now available to force update of the
internal pages cache if you should modify the pages structure
manually.
* QPDF: new processFile method that takes an open FILE*
instead of a filename.
2012-06-20 Jay Berkenbilt <ejb@ql.org>
* Add new array mutation routines to QPDFObjectHandle.
Implemented by Tobias Hoffmann.
* Rework APIs that use size_t, off_t, and primative integer types
so that size_t is used for sizes of memory and off_t is used for
file offsets. Also set _FILE_OFFSET_BITS so that large files can
be supported on 32-bit UNIX/Linux platforms. The code assumes in
places that sizeof(off_t) >= sizeof(size_t). This resulted in
non-compatible ABI changes and hopefully clears the way for QPDF
to work with files that are larger than 4 GiB in size.
* Add support for versioned symbols on ELF platforms.
* Various fixes for gcc 4.7
2011-04-06 Jay Berkenbilt <ejb@ql.org>
* Fix PCRE to stop using deprecated (and now dropped) interfaces.
2011-12-28 Jay Berkenbilt <ejb@ql.org>
* 2.3.1: release
* include <stdint.h> if available to support MSVC 2010
* Since PCRE is not necessarily thread safe, don't declare any
PCRE objects to be static.
* Disregard stderr output from ghostscript when using it to
compare images in the test suite; see comments in qpdf.test for
details.
* Fixed a few documentation errors.
2011-08-11 Jay Berkenbilt <ejb@ql.org>
* 2.3.0: release
* include/qpdf/qpdf-c.h ("C"): add new methods
qpdf_init_write_memory, qpdf_get_buffer_length, and
qpdf_get_buffer to support writing to memory from the C API.
* include/qpdf/qpdf-c.h ("C"): add new methods qpdf_get_info_key
and qpdf_set_info_key for manipulating text fields of the /Info
dictionary.
2011-08-10 Jay Berkenbilt <ejb@ql.org>
* libqpdf/QPDFWriter.cc (copyEncryptionParameters): preserve
whether metadata is encryption. This fixes part of bug 3173659:
the password becomes invalid if qpdf copies an encrypted file with
cleartext-metadata.
* include/qpdf/QPDFWriter.hh: add a new constructor that takes
only a QPDF reference and leaves specification of output for
later. Add methods setOutputFilename() to set the output to a
filename or stdout, and setOutputMemory() to indicate that output
should go to a memory buffer. Add method getBuffer() to retrieve
the buffer used if output was saved to a memory buffer.
* include/qpdf/QPDF.hh: add methods replaceObject() and
swapObjects() to allow replacement of an object and swapping of
two objects by object ID.
* include/qpdf/QPDFObjectHandle.hh: add new methods getDictAsMap()
and getArrayAsVector() for returning the elements of a dictionary
or an array as a map or vector.
2011-06-25 Jay Berkenbilt <ejb@ql.org>
* 2.2.4: release
2011-06-23 Jay Berkenbilt <ejb@ql.org>
* make/libtool.mk (install): Do not strip executables and shared
libraries during installation. Leave that up to the packager.
* configure.ac: disable -Werror by default.
2011-05-07 Jay Berkenbilt <ejb@ql.org>
* libqpdf/QPDF_linearization.cc (isLinearized): remove unused
offset variable, found by a gcc 4.6 warning.
2011-04-30 Jay Berkenbilt <ejb@ql.org>
* 2.2.3: release
* libqpdf/QPDF.cc (readObjectInternal): Accept the case of the
stream keyword being followed by carriage return by itself. While
this is not permitted by the specification, there are PDF files
that do this, and other readers can read them.
* libqpdf/Pl_QPDFTokenizer.cc (processChar): When an inline image
is detected, suspend normalization only up to the end of the
inline image rather than for the remainder of the content stream.
(Fixes qpdf-Bugs 3152169.)
2011-01-31 Jay Berkenbilt <ejb@ql.org>
* libqpdf/QPDF.cc (readObjectAtOffset): use -1 rather than 0 when
reading an object at a given to indicate that no object number is
expected. This allows xref recovery to proceed even if a file
uses the invalid object number 0 as a regular object.
* libqpdf/QPDF_linearization.cc (isLinearized): use -1 rather than
0 as a sentintel for not having found the first object in the
file. Since -1 can never match the regular expression, this
prevents an infinite loop when checking a file that starts with
(erroneous) 0 0 obj. (Fixes qpdf-Bugs-3159950.)
2010-10-04 Jay Berkenbilt <ejb@ql.org>
* 2.2.2: release
* include/qpdf/qpdf-c.h: Add qpdf_read_memory to C API to call
QPDF::processMemoryFile.
2010-10-01 Jay Berkenbilt <ejb@ql.org>
* 2.2.1: release
* include/qpdf/QPDF.hh: Add setOutputStreams method to allow
redirection of library-generated output/error to alternative
streams.
* include/qpdf/QPDF.hh: Add processMemoryFile method for
processing a PDF file from a memory buffer instead of a file.
2010-09-24 Jay Berkenbilt <ejb@ql.org>
* libqpdf/QPDF.cc: change private "file" method to be a
PointerHolder<InputSource> to prepare qpdf for being able to work
with PDF files loaded into memory in addition to working with
files on disk.
* include/qpdf/PointerHolder.hh: add operator* and operator->
methods so that PointerHolder objects can be used like pointers.
This is consistent with the smart pointer objects in the next
revision of C++.
2010-09-05 Jay Berkenbilt <ejb@ql.org>
* libqpdf/QPDF.cc (readObjectInternal): Recognize empty objects
and treat them as null.
* libqpdf/QPDF_Stream.cc (filterable): Handle inline image filter
abbreviations as stream filter abbreviations. Although this is
not technically allowed by the PDF specification, table H.1 in the
pre-ISO spec indicates that Adobe's readers accept them. Thanks
to Jian Ma <stronghorse@tom.com> for bringing this to my
attention.
2010-08-14 Jay Berkenbilt <ejb@ql.org>
* 2.2.0: release
* Rename README.windows to README-windows.txt and convert its line
endings to Windows-style line endings. Also mention Jian Ma's VC6
port in the manual and README-windows.txt.
2010-08-09 Jay Berkenbilt <ejb@ql.org>
* Add QPDFObjectHandle::getRawStreamData to return raw
(unfiltered) stream data.
2010-08-08 Jay Berkenbilt <ejb@ql.org>
* 2.2.rc1: release
2010-08-05 Jay Berkenbilt <ejb@ql.org>
* Add QPDFObjectHandle::addPageContents, a convenience routine for
appending or prepending new streams to a page's content streams.
The "pdf-double-page-size" example illustrates its use.
* Add new methods to QPDFObjectHandle: replaceStreamData and
newStream. These methods allow users of the qpdf library to add
new streams and to replace data of existing streams. The
"pdf-double-page-size" and "pdf-invert-images" examples illustrate
their use.
2010-06-06 Jay Berkenbilt <ejb@ql.org>
* Fix memory leak for QPDF objects whose underlying PDF objects
contain circular references. Thanks to Jian Ma
<stronghorse@tom.com> for calling my attention to the memory leak.
2010-04-25 Jay Berkenbilt <ejb@ql.org>
* 2.1.5: release
* libqpdf/QPDF_encryption.cc (compute_encryption_key): remove
restrictions on length of file identifier string. (Fixes
qpdf-Bugs-2991412.)
2010-04-18 Jay Berkenbilt <ejb@ql.org>
* 2.1.4: release
* libqpdf/QPDFWriter.cc (writeLinearized): the padding calculation
fix in 2.1.2 was applied in only one place but it was needed in
two places since there are actually two cross reference streams in
a linearized file. The new padding calculation is now used for
both streams. Hopefully this should put an end to linearization
padding problems. (Fixes qpdf-Bugs-2979219.)
2010-04-10 Jay Berkenbilt <ejb@ql.org>
* qpdf/qpdf.cc (main): Since qpdf --check only checks syntax and
stream encoding without doing any semantic checks, make the output
clearer when no errors around found. This is inspired by
qpdf-Bugs-2983225.
2010-03-27 Jay Berkenbilt <ejb@ql.org>
* 2.1.3: release
* libqpdf/QPDF_optimization.cc (flattenScalarReferences): Flatten
scalar references for unreferenced objects as well as those seen
during traversal of the file. This matters when preserving object
streams that contain unreferenced objects with indirect scalars.
(Fixes qpdf-Bugs-2974522.) Updated TODO with a description of a
possibly better fix involving removal of flattenScalarReferences.
* libqpdf/Pl_AES_PDF.cc (finish): Don't complain if an AES input
buffer is not a multiple of 16 bytes. Instead, just pad with
nulls and hope for the best. PDF files have been encountered "in
the wild" that contain AES buffers that aren't a multiple of 16
bytes.
2010-01-24 Jay Berkenbilt <ejb@ql.org>
* 2.1.2: release
* libqpdf/QPDFWriter.cc: fix logic error in padding calculation.
When writing linearized files with cross reference streams, the
padding calculation failed to take differences in sizes of
compressed data between pass 1 and pass 2 into consideration.
2009-12-14 Jay Berkenbilt <ejb@ql.org>
* 2.1.1: release
* qpdf/qtest/qpdf.test: improve test for acroread to make sure it
actually works and is not just present in the path.
2009-12-13 Jay Berkenbilt <ejb@ql.org>
* libqpdf/qpdf/Pl_AES_PDF.hh: include <stdint.h>, if available, so
we have valid definitions of uint32_t.
2009-10-30 Jay Berkenbilt <ejb@ql.org>
* 2.1: release
* libqpdf/QPDF.cc: be more forgiving of extraneous whitespace in
the xref table and while recovering from error conditions.
2009-10-26 Jay Berkenbilt <ejb@ql.org>
* Work around failure of PCRE test case; this test case exercises
an aspect of PCRE that qpdf does not use, and the test fails with
the version of PCRE on Red Hat Enterprise Linux 5, so we ignore
failure on this particular test case.
* Fix RPM .spec file to include "C" examples
2009-10-24 Jay Berkenbilt <ejb@ql.org>
* 2.1.rc1: release
* Provide interfaces for getting qpdf's own version number
2009-10-19 Jay Berkenbilt <ejb@ql.org>
* include/qpdf/QPDF.hh (QPDF): getWarnings now returns a list of
QPDFExc rather than a list of strings. This way, warnings may be
inspected in more detail.
* Include information about the last object read in most error
messages. Most of the time, this will provide a good hint as to
which object contains the error, but it's possible that the last
object read may not necessarily be the one that has the error if
the erroneous object was previously read and cached.
2009-10-18 Jay Berkenbilt <ejb@ql.org>
* If forcing version, disable object stream creation and/or
encryption if previous specifications are incompatible with new
version. It is still possible that PDF content, compression
schemes, etc., may be incompatible with the new version, but at
least this way, older viewers will at least have a chance.
* libqpdf/QPDFWriter.cc (unparseObject): avoid compressing
Metadata streams if possible.
2009-10-13 Jay Berkenbilt <ejb@ql.org>
* Upgrade embedded qtest to version 1.4, which allows the test
suite to be run in Windows with MSYS and ActiveState Perl rather
than requiring Cygwin perl.
2009-10-04 Jay Berkenbilt <ejb@ql.org>
* Implement support AES encrypt and crypt filters. Implementation
is not fully tested due to lack of test data but has been tested
for several cases.
2009-10-04 Jay Berkenbilt <ejb@ql.org>
* Add methods to QPDFWriter and corresponding command line
arguments to qpdf to set the minimum output PDF version and also
to force the version to a particular value.
* libqpdf/QPDF.cc (processXRefStream): warn and ignore extra xref
stream entries when stream is larger than reported size. This
used to be a fatal error. (Fixes qpdf-Bugs-2872265.)
2009-09-27 Jay Berkenbilt <ejb@ql.org>
* Add several methods to query permissions controlled by the
encryption dictionary. Note that qpdf does not enforce these
permissions even though it allows the user to query them.
* The function QPDF::getUserPassword returned the user password
with the required padding as specified by the PDF specification.
This is seldom useful to users. This function has been replaced
by QPDF::getPaddedUserPassword. Call the new
QPDF::getTrimmedUserPassword to retreive the user password in a
human-readable format.
* qpdf/qpdf.cc (main): qpdf --check now prints the PDF version
number in addition to its other output.
2009-09-26 Jay Berkenbilt <ejb@ql.org>
* Removed all references to QEXC; now using std::runtime_error and
std::logic_error and their subclasses for all exceptions.
2009-05-03 Jay Berkenbilt <ejb@ql.org>
* 2.0.6: release
* libqpdf/QPDF_Stream.cc (filterable): ignore /DecodeParms if it's
not a type we recognize. (Fixes qpdf-Bugs-2779746.)
2009-03-10 Jay Berkenbilt <ejb@ql.org>
* 2.0.5: release
2009-03-09 Jay Berkenbilt <ejb@ql.org>
* libqpdf/Pl_LZWDecoder.cc: adjust LZWDecoder full table
detection, now having been able to adequately test boundary
conditions both and with and without early code change. Also
compared implementation with other LZW decoders.
2009-03-08 Jay Berkenbilt <ejb@ql.org>
* qpdf/fix-qdf (write_ostream): Adjust offsets while writing
object streams to account for changes in the length of the
dictionary and offset tables.
* qpdf/qpdf.cc (main): In check mode, in addition to checking
structure of file, attempt to decode all stream data.
* libqpdf/QPDFWriter.cc (QPDFWriter::writeObject): In QDF mode,
write a comment to the QDF file before each object that indicates
the object ID of the corresponding object from the original file.
Add --no-original-object-ids flag to qpdf and
setSuppressOriginalObjectIDs() method to QPDFWriter to turn this
behavior off.
* libqpdf/QPDF.cc (QPDF::pipeStreamData): Issue a warning instead
of failing if there is a problem found while decoding stream.
* qpdf/qpdf.cc: Exit with a status of 3 if warnings were found
regardless of what mode we're in.
2009-02-21 Jay Berkenbilt <ejb@ql.org>
* 2.0.4: release
2009-02-20 Jay Berkenbilt <ejb@ql.org>
* Fix many typos in comments and strings.
* qpdf/qpdf.cc: in --check mode, if there are warnings but no
errors, exit with a status of 3.
* libqpdf/QPDF.cc (QPDF::insertXrefEntry): when recovering the
cross-reference table, have objects we encounter later in the file
supersede those we found earlier. This improves the chances of
being able to recover appended files with damaged cross-reference
tables.
2009-02-19 Jay Berkenbilt <ejb@ql.org>
* libqpdf/Pl_LZWDecoder.cc: correct logic error for previously
untested case of running the LZW decoder without the "early code
change" flag. Thanks to a bug report from "Atom Smasher", I
finally was able to obtain an input stream compressed in this way.
2009-02-15 Jay Berkenbilt <ejb@ql.org>
* 2.0.3: release
2008-12-11 Jay Berkenbilt <ejb@ql.org>
* qpdf/qpdf.cc (main): Accept -help and -version as well as --help
and --version
2008-11-23 Jay Berkenbilt <ejb@ql.org>
* Include stdio.h in a few files for proper compilation with (yet
to be released) gcc 4.4
* updated embedded qtest to version 1.3
* libqpdf/QPDF_String.cc (QPDF_String::getUTF8Val): handle
UTF-16BE properly rather than just treating the string as a string
of 16-bit characters.
2008-06-30 Jay Berkenbilt <ejb@ql.org>
* 2.0.2: release
* updated embedded qtest to version 1.2 (includes previous
changes)
2008-06-07 Jay Berkenbilt <ejb@ql.org>
* qpdf/qtest/qpdf/diff-encrypted: change == to = so that the test
suite passes when /bin/sh is not bash
2008-05-07 Jay Berkenbilt <ejb@ql.org>
* qtest/bin/qtest-driver (run_test): increase timeout for qtest to
be more tolerant of slow machines
2008-05-06 Jay Berkenbilt <ejb@ql.org>
* 2.0.1: release
* make/rules.mk: fix logic with .dep generation for .lo files so
that dependencies work properly with libtool
2008-05-05 Jay Berkenbilt <ejb@ql.org>
* libqpdf/qpdf/MD5.hh: fix header to be 64-bit clean
* configure.ac: add tests for sized integer types
2008-05-04 Jay Berkenbilt <ejb@ql.org>
* libqpdf/QPDF_encryption.cc: do not assume size_t is unsigned int
* qpdf/qtest/qpdf.test: removed locale-specific tests. These were
really to check bugs in perl 5.8.0 and are obsolete now. They
also make the test suite fail in some environments that don't have
all the locales fully configured.
* various: updated several files for gcc 4.3 by adding missing
includes (string.h, stdlib.h)
2008-04-26 Jay Berkenbilt <ejb@ql.org>
* 2.0: initial public release