2017-09-15  Jay Berkenbilt  <ejb@ql.org>

	* 7.0.0: release

2017-09-12  Jay Berkenbilt  <ejb@ql.org>

	* Relicense qpdf under version 2.0 of the Apache License rather
	than version 2.0 of the Artistic License. Both are fine, but the
	Apache License is in more widespread use, and I like it a little
	better than Artistic-2.0. It is my intention that there be no
	change in what you can or can't do with qpdf. Versions of qpdf
	prior to version 7 were released under the terms of version 2.0 of
	the Artistic License. At your option, you may continue to consider
	qpdf to be licensed under those terms. Please see the manual for
	additional information.

	* Improve the error message that is issued when QPDFWriter
	encounters a stream that can't be decoded. In particular, mention
	that the stream will be copied without filtering to avoid data
	loss.

	* Add new methods to the C API to correspond to new additions to
	QPDFWriter:
	- qpdf_set_compress_streams
	- qpdf_set_decode_level
	- qpdf_set_preserve_unreferenced_objects
	- qpdf_set_newline_before_endstream

2017-08-25  Jay Berkenbilt  <ejb@ql.org>

	* Re-implement parser iteratively to avoid stack overflow on very
	deeply nested arrays and dictionaries. Fixes #146.

	* Detect infinite loop while finding additional xref tables. Fixes
	#149.

2017-08-22  Jay Berkenbilt  <ejb@ql.org>

	* 7.0.b1: release

	* Convert all README files to markdown. Names changed as follows:
	  - README --> README.md
	  - README.hardening --> README-hardening.md
	  - README.maintainer --> README-maintainer.md
	  - README-what-to-download.txt --> README-what-to-download.md
	  - README-windows.txt --> README-windows.md
	  The file README-windows-install.txt remains a text file.

2017-08-21  Jay Berkenbilt  <ejb@ql.org>

	* Add support for writing PCLm files. Most of the work was done by
	Sahil Arora <sahilarora.535@gmail.com> as part of a Google Summer
	of Code project in 2017. PCLm support is useful only for clients
	that specifically know how to create PCLm files. Support in qpdf
	is just for ensuring that objects are written in the correct order
	and for including some additional material in the output that is
	required by the PCLm standard.

2017-08-19  Jay Berkenbilt  <ejb@ql.org>

	* Remove --precheck-streams. This is enabled by default now
	without any efficiency cost. This feature was never released.

	* Update pdf-create example to illustrate use of additional image
	compression filters.

	* Add support for /RunLengthDecode and /DCTDecode:
	  - New pipeline types Pl_RunLength and Pl_DCT
	  - New command-line flags --compress-streams and --decode-level
	    to replace/enhance --stream-data
	  - New QPDFWriter::setCompressStreams and
 	    QPDFWriter::setDecodeLevel methods
	  Please see documentation, header files, and help messages for
	  details on these new features.

2017-08-12  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFObjectHandle::rotatePage to apply rotation to a page
	object. Add --rotate option to qpdf to specify page rotation from
	the command line.

	* Provide --verbose option that causes qpdf to print an indication
	of what files it is writing.

	* Change --single-pages to --split-pages and make it take an
	optional argument specifying the number of pages per file.

2017-08-11  Jay Berkenbilt  <ejb@ql.org>

	* Fix --newline-before-endstream to always add a newline before
	endstream even if the last character was already a newline. This
	is actually what's required by PDF/A. Fixes #133.

	* Handle encrypted files whose encryption parameters are too
	short. Fixes #96.

2017-08-10  Jay Berkenbilt  <ejb@ql.org>

	* Remove dependency on libpcre.

	* Be more forgiving of certain types of errors in the xref table
	that don't interfere with interpreting the table.

	* Remove unused "tracing" parameter from PointerHolder's
	(T*, bool) constructor. This change breaks source code
	compatibility, but since this argument to PointerHolder has not
	used for a long time and the presence of a boolean parameter in
	the primary constructor makes it too easy to use that by mistake
	when trying to use PointerHolder for arrays, it seems like it's
	finally time to take it out. If you have a compile error because
	of this change, please check to see whether you intended to use
	the (bool, T*) version of the constructor instead. If not, just
	remove the second parameter.

2017-08-09  Jay Berkenbilt  <ejb@ql.org>

	* When recovering stream length, find endobj without endstream as
	well as just looking for endstream. Be a little more lax about
	where we allow it to be found.

2017-08-05  Jay Berkenbilt  <ejb@ql.org>

	* Add --single-pages option to cause output to be written to a
	separate file for each page rather than one big file.

	* Process --pages options earlier so that certain inspection
	options, like --show-pages, can show the state after the merging
	operations.

2017-08-02  Jay Berkenbilt  <ejb@ql.org>

	* Fix off-by-one error in parsing pages options. Fixes #129.

2017-07-29  Jay Berkenbilt  <ejb@ql.org>

	* Support @filename and @- in the qpdf command-line tool to read
	command-line arguments, one per line, from the named file. @-
	reads from standard input. Fixes #16.

	* Detect when input file and output file are the same and exit to
	avoid overwriting and losing input file. Fixes #29.

	* When passing multiple inspection arguments, run --check first,
	and defer exit until after all the checks have been run. This
	makes it possible to force operations such as --show-xref to be
	delayed until after recovery attempts have been made. For example,
	if you have a file with a syntactically valid xref table that has
	some offsets that are incorrect, running qpdf --check --show-xref
	on that file will first recover the xref and the dump the
	recovered xref, while just running qpdf --show-xref will show the
	xref table as present in the file. Fixes #42.

	* When recovering stream length, indicate the recovered length.
	Fixes #44.

	* Add --newline-before-endstream command-line option and
	setNewlineBeforeEndstream method to QPDFWriter. This forces qpdf
	to always add a newline before the endstream keyword. It is a
	necessary but not sufficient condition for PDF/A compliance. Fixes
	#103.

	* Handle zlib data errors when decoding streams. Fixes #106.

	* Improve handling of files where the "stream" keyword is not
	followed by proper line terminators. Fixes #104.

	* Fix content stream parsing to handle cases of structures within
	the stream split across stream boundaries. Fixes #73.

2017-07-28  Jay Berkenbilt  <ejb@ql.org>

	* Add --preserve-unreferenced command-line option and
	setPreserveUnreferencedObjects method to QPDFWriter. This option
	causes QPDFWriter to write all objects from the input file to the
	output file regardless of whether the objects are referenced.
	Objects are written to the output file in numerical order from the
	input file. This option has no effect for linearized files.

2017-07-27  Jay Berkenbilt  <ejb@ql.org>

	* Add --precheck-streams command-line option and setStreamPrecheck
	method to QPDFWriter to tell QPDFWriter to attempt decoding a
	stream fully before deciding whether to filter it or not.

	* Recover gracefully from streams that aren't filterable because
	the filter parameters are invalid in the stream dictionary or the
	dictionary itself is invalid.

	* Significantly improve recoverability from invalid qpdf objects.
	Most conditions in basic object parsing that used to cause qpdf to
	exit are now warnings. There are still many more opportunities for
	improvements of this sort beyond just object parsing.

2017-07-26  Jay Berkenbilt  <ejb@ql.org>

	* Fixes to infinite loops below also fix problems reported in
	other issues and cover CVE-2017-11624, CVE-2017-11625,
	CVE-2017-11626, and CVE-2017-11627.

	* Don't attempt to interpret syntactic keywords (like R and
	endobj) found while parsing content streams.

	* Detect infinite loops while resolving objects. This could happen
	if something inside an object that had to be resolved during
	parsing, such as a stream length, recursively referenced the
	object being resolved.

	* CVE-2017-9208: Handle references to and appearance of object 0
	as a special case. Object 0 is not allowed, and qpdf was using it
	internally to represent direct objects.

	* CVE-2017-9209: Fix infinite loop caused by attempting to
	reconstruct the xref table while already in the process of
	reconstructing the xref table.

	* CVE-2017-9210: Fix infinite loop caused by attempting to unparse
	an object for inclusion in the text of an exception.

2015-11-10  Jay Berkenbilt  <ejb@ql.org>

	* 6.0.0: release

	* No changes from 5.2.0. The 5.2.0 release broke binary
	compatibility and was withdrawn.

2015-10-31  Jay Berkenbilt  <ejb@ql.org>

	* 5.2.0: release

	* libqpdf/QPDF.cc (read_xrefTable): Be tolerant of some malformed
	xref tables that don't have the required trailing space after each
	line.

2015-10-29  Jay Berkenbilt  <ejb@ql.org>

	* Implement QPDFWriter::setDeterministicID and --deterministic-id
	commandline-flag to qpdf to request generation of a deterministic
	/ID for non-encrypted files.

2015-05-24  Jay Berkenbilt  <ejb@ql.org>

	* 5.1.3: release

	* Bug fix: fix-qdf was not handling object streams with more than
	255 objects in them.

	* Handle Microsoft crypt provider initialization properly for case
	where no keys have been previously created, such as in a fresh
	Windows installation.

	* Include time.h in QUtil.hh for time_t

2015-02-21  Jay Berkenbilt  <ejb@ql.org>

	* Detect loops in Pages structure. Thanks to Gynvael Coldwind and
	Mateusz Jurczyk of the Google Security Team for providing a sample
	file with this problem.

	* Prevent buffer overrun when converting a password to an
	encryption key. Thanks to Gynvael Coldwind and Mateusz Jurczyk of
	the Google Security Team for providing a sample file with this
	problem.

	* Ensure that arguments to "R" when parsing the file are direct
	objects before trying to resolve them. This prevents specially
	crafted files from causing qpdf to crash with a stack overflow.
	Thanks to Gynvael Coldwind and Mateusz Jurczyk of the Google
	Security Team for providing a sample file with this problem.

2014-12-01  Jay Berkenbilt  <ejb@ql.org>

	* Some broken PDF files lack the required /Type key for /Page and
	/Pages nodes in the page dictionary. QPDF now uses other methods
	to figure out what kind of node it is looking at so that it can
	handle those files. Original reported at
	https://bugs.launchpad.net/ubuntu/+source/qpdf/+bug/1397413

2014-11-14  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: QPDFObjectHandle::getPageContents() no longer throws an
	exception when called on a page that has no /Contents key in its
	dictionary. This is allowed by the spec, and some software
	packages generate files like this for pages that are blank in the
	original.

2014-06-07  Jay Berkenbilt  <ejb@ql.org>

	* 5.1.2: release

	* MS Visual C++ build: explicitly target Windows 5.0.1 (XP)

	* New example program: pdf-split-pages: efficiently split PDF
	files into individual pages.

	* Bug fix: don't fail on files that contain streams where /Filter
	or /DecodeParms references a stream. Before, qpdf would try to
	convert these to direct objects, which would fail because of the
	stream.

2014-02-22  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: if the last object in the first part of a linearized
	file had an offset that was below 65536 by less than the size of
	the hint stream, the xref stream was invalid and the resulting file
	is not usable.  This is now fixed.

2014-01-14  Jay Berkenbilt  <ejb@ql.org>

	* 5.1.1: release

2013-12-26  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: when copying foreign objects (which occurs during page
	splitting among other cases), avoid traversing the same object
	more than once if it appears more than once in the same direct
	object.  This bug is performance-only and does not affect the
	actual output.

2013-12-17  Jay Berkenbilt  <ejb@ql.org>

	* 5.1.0: release

2013-12-16  Jay Berkenbilt  <ejb@ql.org>

	* Document and make explicit that passing null to
	QUtil::setRandomDataProvider() resets the random data provider.

	* Provide QUtil::getRandomDataProvider().

2013-12-14  Jay Berkenbilt  <ejb@ql.org>

	* Allow anyspace rather than just newline to follow xref header.
	This allows qpdf to read a wider range of damaged files.

2013-11-30  Jay Berkenbilt  <ejb@ql.org>

	* Allow user-supplied random data provider to be used in place of
	OS-provided or insecure random number generation.  See
	documentation for 5.1.0 for details.

	* Add configure option --enable-os-secure-random (enabled by
	default).  Pass --disable-os-secure-random or define
	SKIP_OS_SECURE_RANDOM to avoid attempts to use the operating
	system-provided secure random number generation.  This can be
	especially useful on Windows if you wish to avoid any dependency
	on Microsoft's cryptography system.

2013-11-29  Jay Berkenbilt  <ejb@ql.org>

	* If NO_GET_ENVIRONMENT is #defined, for Windows only,
	QUtil::get_env will always return false.  This was added to
	support a user who needs to avoid calling GetEnvironmentVariable
	from the Windows API.  QUtil::get_env is not used for any
	functionality in qpdf and exists only to support the test suite
	including test coverage support with QTC (part of qtest).

	* Add /FS to msvc builds to allow parallel builds to work with
	Visual C++ 2013.

	* Add missing #include <algorithm> in some files that use std::min
	and std::max.

2013-11-21  Jay Berkenbilt  <ejb@ql.org>

	* Change image comparison tests, which are disabled by default, to
	use tiff files with 8 bits per sample rather than 4.  This works
	around a bug in tiffcmp but also increases time and disk space for
	image comparison tests.

2013-10-28  Jay Berkenbilt  <ejb@ql.org>

	* Fix MacOS compilation errors by adding a missing #include
	<string> in a header file.

2013-10-18  Jay Berkenbilt  <ejb@ql.org>

	* 5.0.1: release

	* Warn when -accessibility=n is specified with a modern encryption
	format (R > 3).  Also, accept this flag (and ignore with warning)
	with 256-bit encryption.  qpdf has always ignored the
	accessibility setting with R > 3, but it previously did so
	silently.

2013-10-05  Jay Berkenbilt  <ejb@ql.org>

	* Replace operator[] in std::string and std::vector with "at" in
	order to get bounds checking.  This reduces the chances that
	incorrect code will result in data exposure or buffer overruns.
	See README.hardening for additional notes.

	* Use cryptographically secure random number generation when
	available.  See additional notes in README.

	* Replace some assert() calls with std::logic_error exceptions.
	Ideally there shouldn't be assert() calls outside of testing.
	This change may make a few more potential code errors in handling
	invalid data recoverable.

	* Security fix: In places where std::vector<T>(size_t) was used,
	either validate that the size parameter is sane or refactor code
	to avoid the need to pre-allocate the vector.  This reduces the
	likelihood of allocating a lot of memory in response to invalid
	data in linearization hint streams.

	* Security fix: sanitize /W array in cross reference stream to
	avoid a potential integer overflow in a multiplication.  It is
	unlikely that any exploits were possible from this bug as
	additional checks were also performed.

	* Security fix: avoid buffer overrun that could be caused by bogus
	data in linearization hint streams.  The incorrect code could only
	be triggered when checking linearization data, which must be
	invoked explicitly.  qpdf does not check linearization data when
	reading or writing linearized files, but the qpdf --check command
	does check linearization data.

	* Security fix: properly handle empty strings in
	QPDF_Name::normalizeName.  The empty string is not a valid name
	and would never be parsed as a name, so there were no known
	conditions where this method could be called with an empty string.

	* Security fix: perform additional argument sanity checks when
	reading bit streams.

	* Security fix: in QUtil::toUTF8, change bounds checking to avoid
	having a pointer point temporarily outside the bounds of an
	array.  Some compiler optimizations could have made the original
	code unsafe.

2013-07-10  Jay Berkenbilt  <ejb@ql.org>

	* 5.0.0: release

	* 4.2.0 turned out to be binary incompatible on some platforms
	even though there were no changes to the public API.  Therefore
	the 4.2.0 release has been withdrawn, and is being replaced with a
	5.0.0 release that acknowledges the ABI change and also removes
	some problematic methods from the public API.

	* Remove methods from public API that were only intended to be
	used by QPDFWriter and really didn't make sense to call from
	anywhere else as they required internal knowledge that only
	QPDFWriter had:
	   - QPDF::getLinearizedParts
	   - QPDF::generateHintStream
	   - QPDF::getObjectStreamData
	   - QPDF::getCompressibleObjGens
	   - QPDF::getCompressibleObjects

2013-07-07  Jay Berkenbilt  <ejb@ql.org>

	* 4.2.0: release [withdrawn]

	* Ignore error case of a stream's decode parameters having invalid
	length when there are no stream filters.

	* qpdf: add --show-npages command-line option, which causes the
	number of pages in the input file to be printed on a line by
	itself.

	* qpdf: allow omission of range in --pages.  If range is omitted
	such that an argument that is supposed to be a range is an invalid
	range and a valid file name, the range of 1-z is assumed.  This
	makes it possible to merge a bunch of files with something like
	qpdf --empty out.pdf --pages *.pdf --

2013-06-15  Jay Berkenbilt  <ejb@ql.org>

	* Handle some additional broken files with missing /ID in trailer
	for encrypted files and with space rather than newline after xref.

2013-06-14  Jay Berkenbilt  <ejb@ql.org>

	* Detect and correct /Outlines dictionary being a direct object
	when linearizing files.  This is not allowed by the spec but has
	been seen in the wild.  Prior to this change, such a file would
	cause an internal error in the linearization code, which assumed
	/Outlines was indirect.

	* Add /Length key to crypt filter dictionary for encrypted files.
	This key is optional, but some version of MacOS reportedly fail to
	open encrypted PDF files without this key.

	* Bug fix: properly handle object stream generation when the
	original file has some compressible objects with generation != 0.

	* Add QPDF::getCompressibleObjGens() and deprecate
	QPDF::getCompressibleObjects(), which had a flaw in its logic.

	* Add new QPDFObjectHandle::getObjGen() method and indiciate in
	comments that its use is favored over getObjectID() and
	getGeneration() for most cases.

	* Add new QPDFObjGen object to represent an object ID/generation
	pair.

2013-04-14  Jay Berkenbilt  <ejb@ql.org>

	* 4.1.0: release

2013-03-25  Jay Berkenbilt  <ejb@ql.org>

	* manual/qpdf-manual.xml: Document the casting policy that is
	followed in qpdf's implementation.

2013-03-11  Jay Berkenbilt  <ejb@ql.org>

	* When creating Windows binary distributions, make sure to only
	copy DLLs of the correct type.  The ensures that the 32-bit
	distributions contain 32-bit DLLs and the 64-bit distributions
	contain 64-bit DLLs.

2013-03-07  Jay Berkenbilt  <ejb@ql.org>

	* Use ./install-sh (already present) instead of "install -c" to
	install executables to fix portability problems against different
	UNIX variants.

2013-03-03  Jay Berkenbilt  <ejb@ql.org>

	* Add protected terminateParsing method to
	QPDFObjectHandle::ParserCallbacks that implementor can call to
	terminate parsing of a content stream.

2013-02-28  Jay Berkenbilt  <ejb@ql.org>

	* Favor fopen_s and strerror_s on MSVC to avoid CRT security
	warnings.  This is useful for people who may want to use qpdf in
	an application that is Windows 8 certified.

	* New method QUtil::safe_fopen to wrap calls to fopen.  This is
	less cumbersome than calling QUtil::fopen_wrapper.

	* Remove all calls to sprintf

	* New method QUtil::int_to_string_base to convert to octal or
	hexademical (or decimal) strings without using sprintf

2013-02-26  Jay Berkenbilt  <ejb@ql.org>

	* Rewrite QUtil::int_to_string and QUtil::double_to_string to
	remove internal length limits but to remain backward compatible
	with the old versions for valid inputs.

2013-02-23  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: properly handle overridden compressed objects.  When
	caching objects from an object stream, only cache objects that,
	based on the xref table, would actually be resolved into this
	stream.  Prior to this fix, if an object stream A contained an
	object B that was overridden by an appended section of the file,
	qpdf would cache the old value of B if any non-overridden member
	of A was accessed before B.  This commit fixes that bug.

2013-01-31  Jay Berkenbilt  <ejb@ql.org>

	* Do not remove libtool's .la file during the make install step.
	Note to packagers: if your distribution wants to you remove the
	.la file, you will have to do that yourself now.

2013-01-25  Jay Berkenbilt  <ejb@ql.org>

	* New method QUtil::hex_encode to encode binary data as a
	hexadecimal string

	* qpdf --check was exiting with status 0 in some rare cases even
	when errors were found.  It now always exits with one of the
	document error codes (0 for success, 2 for errors, 3 or warnings).

2013-01-24  Jay Berkenbilt  <ejb@ql.org>

	* Make --enable-werror work for MSVC, and generally handle warning
	options better for that compiler.  Warning flags for that compiler
	were previous hard-coded into the build with /WX enabled
	unconditionally.

	* Split warning flags into WFLAGS in autoconf.mk to make them
	easier to override.  Before they were repeated in CFLAGS and
	CXXFLAGS and were commingled with other compiler flags.

	* qpdf --check now does syntactic checks all pages' content
	streams as well as checking overall document structure.  Semantic
	errors are still not checked, and there are no plans to add
	semantic checks.

2013-01-22  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFObjectHandle::getTypeCode().  This method returns a
	unique integer (enumerated type) value corresponding to the object
	type of the QPDFObjectHandle.  It can be used as an alternative to
	the QPDFObjectHandle::is* methods for type testing, particularly
	where there is a desire to use a switch statement or optimize for
	performance when testing object types.

	* Add QPDFObjectHandle::getTypeName().  This method returns a
	string literal describing the object type.  It is useful for
	testing and debugging.

2013-01-20  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFObjectHandle::parseContentStream, which parses the
	objects in a content stream and calls handlers in a callback
	class.  The example pdf-parse-content illustrates it use.

	* Add QPDF_Operator and QPDF_InlineImage types along with
	appropriate wrapper methods in QPDFObjectHandle.  These new object
	types are to facilitate content stream parsing.

2013-01-17  Jay Berkenbilt  <ejb@ql.org>

	* 4.0.1: release

	* Add clarifying comment in QPDF.hh for methods that return the
	user password to state that it is no longer possible with newer
	encryption formats to recover the user password knowing the owner
	password.

	* Fix detection of binary attachments in the test suite.  This
	resolves false test failures on some platforms.  No changes to the
	actual QPDF code were made.

2012-12-31  Jay Berkenbilt  <ejb@ql.org>

	* 4.0.0: release

	* Add new methods qpdf_get_pdf_extension_level,
	qpdf_set_r5_encryption_parameters,
	qpdf_set_r6_encryption_parameters,
	qpdf_set_minimum_pdf_version_and_extension, and
	qpdf_force_pdf_version_and_extension to support new functionality
	from the C API.

2012-12-30  Jay Berkenbilt  <ejb@ql.org>

	* Fix long-standing bug that could theoretically have resulted in
	possible misinterpretation of decode parameters in streams.  As
	far as I can tell, it is extremely unlikely that files with the
	characteristics that would have triggered the bug actually exist
	in cases that qpdf versions prior to 4.0.0 could have read.
	Unencrypted files with encrypted attachments would have triggered
	this bug, but qpdf versions prior to 4.0.0 already refused to open
	such files.

	* Fix long-standing bug in which a stream that used a crypt
	filter and was otherwise not filterable by qpdf would be decrypted
	properly but would retain the crypt filter indication in the
	file.  There are no known ways to create files like this, so it is
	unlikely that anyone ever hit this bug.

2012-12-29  Jay Berkenbilt  <ejb@ql.org>

	* Add read/write support for both the deprecated Acrobat IX
	encryption format and the Acrobat X/PDF 2.0 encryption format
	using 256-bit AES keys.  Using the Acrobat IX format (R=5) forces
	the version of the file to 1.7 with extension level 3.  Using the
	PDF 2.0 format (R=6) forces it to 1.7 extension level 8.

	* Add new method QPDF::getEncryptionKey to return the actual
	encryption key used for encryption of data in the file.  The key
	is returned as a std::string.

	* Non-compatible API change: change signature of
	QPDF::compute_data_key to take the R and V values from the
	encryption dictionary.  There is no reason for any application
	code to call this method since handling of encryption is done
	automatically by the qpdf libary.  It is used internally by
	QPDFWriter.

	* Support reading and decryption of files whose main text is not
	encrypted but whose attachments are.  More generally, support the
	case of files and streams encrypted differently with some
	limitations, described in the documentation.  This was not
	previously supported due to lack of test files, but I created test
	files using a trial version of Acrobat XI to fully implement this
	case.

	* Incorporate sha2 code from sphlib 3.0.  See README for
	licensing.  Create private pipeline class for computing hashes
	with sha256, sha384, and sha512.

	* Allow specification of initialization vector when using AES
	filtering.  This is required to compute the hash used in /R=6 (PDF
	2.0) encryption.

2012-12-28  Jay Berkenbilt  <ejb@ql.org>

	* Add random number generation functions to QUtil.

	* Fix old bug that could cause an infinite loop if user password
	recovery methods were called and a password contained the "("
	character (which happens to be the first byte of padding used by
	older PDF encryption formats).  This bug was noticed while reading
	code and would not happen under ordinary usage patterns even if
	the password contained that character.

2012-12-27  Jay Berkenbilt  <ejb@ql.org>

	* Add awareness of extension level to PDF Version methods for both
	reading and writing.  This includes adding method
	QPDF::getExtensionLevel and new versions of
	QPDFWriter::setMinimumPDFVersion and QPDFWriter::forcePDFVersion
	that support extension levels.  The qpdf command-line tool
	interprets version numbers of the form x.y.z as version x.y at
	extension level z.

	* Update AES classes to support use of 256-bit keys.

	* Non-compatible API change: Removed public method
	QPDF::flattenScalarReferences.  Instead, just flatten the scalar
	references we actually need to flatten.  Flattening scalar
	references was a wrong decision years ago and has occasionally
	caused other problems, among which were that it caused qpdf to
	visit otherwise unreferenced and possibly erroneous objects in the
	file when it didn't have to.  There's no reason that any
	non-internal code would have had to call this.

	* Non-compatible API change: Removed public method
	QPDF::decodeStreams which was previously used by qpdf --check but
	is no longer used.  The decodeStreams method could generate false
	positives since it would attempt to access all objects in the file
	including those that were not referenced.  There's no reason that
	any non-internal code would have had to call this.

	* Non-compatible API change: Removed public method
	QPDF::trimTrailerForWrite, which was only intended for use by
	QPDFWriter and which is no longer used.

2012-12-26  Jay Berkenbilt  <ejb@ql.org>

	* Add new fields to QPDF::EncryptionData to support newer
	encryption formats (V=5, R=5 and R=6)

	* Non-compatible API change: Change public nested class
	QPDF::EncryptionData to make all member fields private and to add
	method calls.  This is a non-compatible API change, but changing
	EncryptionData is necessary to support newer encryption formats,
	and making this change will prevent the need from making a
	non-compatible change in the future if new fields are added.  A
	public nested class should never have had public members to begin
	with.

2012-12-25  Jay Berkenbilt  <ejb@ql.org>

	* Allow PDF header to appear anywhere in the first 1024 bytes of
	the file as recommended in the implementation notes of the Adobe
	version of the PDF spec.

2012-11-20  Jay Berkenbilt  <ejb@ql.org>

	* Add zlib and libpcre to Requires.private in the pkg-config file
	to support static linking.  Thanks Tobias Hoffmann for pointing
	out the omission.

	* Ignore (with warning) non-freed objects in the xref table whose
	offset is 0.  Some PDF producers (incorrectly) do this.  See
	https://bugs.linuxfoundation.org/show_bug.cgi?id=1081.

2012-09-23  Jay Berkenbilt  <ejb@ql.org>

	* Add public methods QPDF::processInputSource and
	QPDFWriter::setOutputPipeline to allow users to read from custom
	input sources and to write to custom pipelines.  This allows the
	maximum flexibility in sources for reading and writing PDF files.

2012-09-06  Jay Berkenbilt  <ejb@ql.org>

	* 3.0.2: release

	* Add new method QPDFWriter::setExtraHeaderText to add extra text,
	such as application-specific comments, to near the beginning of a
	PDF file.  For linearized files, this appears after the
	linearization parameter dictionary.  For non-linearized files, it
	appears right after the PDF header and non-ASCII comment.

	* Make it possible to write the same QPDF object with two
	different QPDFWriter objects that have both called
	setLinearization(true) by making private method
	QPDF::calculateLinearizationData() properly initialize its state.

	* Bug fix: Writing after calling QPDFWriter::setOutputMemory()
	would cause a segmentation fault because of an internal field not
	being initialized, rendering that method useless.  This has been
	corrected.

2012-08-11  Jay Berkenbilt  <ejb@ql.org>

	* 3.0.1: release

	* Bug fix: let EOF terminate a literal token as well as
	whitespace or comments.

2012-07-31  Jay Berkenbilt  <ejb@ql.org>

	* 3.0.0: release

2012-07-29  Jay Berkenbilt  <ejb@ql.org>

	* 3.0.rc1: release

2012-07-25  Jay Berkenbilt  <ejb@ql.org>

	* From Tobias: add QPDFObjectHandle::replaceStreamData that takes
	a std::string analogous to the QPDFObjectHandle::newStream that
	takes a string that was added earlier.

2012-07-21  Jay Berkenbilt  <ejb@ql.org>

	* Change configure to have image comparison tests disabled by
	default.  Update README and README.maintainer with information
	about running them.

	* Add --pages command-line option to qpdf to enable page-based
	merging and splitting.

	* Add new method QPDFObjectHandle::replaceDict to replace a
	stream's dictionary.  Use with caution; see comments in
	QPDFObjectHandle.hh.

	* Add new method QPDFObjectHandle::parse for creation of
	QPDFObjectHandle objects from string representations of the
	objects.  Thanks to Tobias Hoffmann for the idea.

2012-07-15  Jay Berkenbilt  <ejb@ql.org>

	* add new QPDF::isEncrypted method that returns some additional
	information beyond other versions.

	* libqpdf/QPDFWriter.cc: fix copyEncryptionParameters to fix the
	minimum PDF version based on other file's encryption needs.  This
	is a fix to code added on 2012-07-14 and did not impact previously
	released code.

	* libqpdf/QPDFWriter.cc (copyEncryptionParameters): Bug fix: qpdf
	was not preserving whether or not AES encryption was being used
	when copying encryption parameters.  The file would still have
	been properly encrypted, but a file that started off encrypted
	with AES could have become encrypted with RC4.

2012-07-14  Jay Berkenbilt  <ejb@ql.org>

	* QPDFWriter: add public copyEncryptionParameters to allow copying
	encryption parameters from another file.

	* QPDFWriter: detect if the user has inserted an indirect object
	from another QPDF object and throw an exception directing the user
	to copyForeignObject.

2012-07-11  Jay Berkenbilt  <ejb@ql.org>

	* Added new APIs to copy objects from one QPDF to another.  This
	includes letting QPDF::addPage() (and QPDF::addPageAt()) accept a
	page object from another QPDF and adding
	QPDF::copyForeignObject().  See QPDF.hh for details.

	* Add method QPDFObjectHandle::getOwningQPDF() to return the QPDF
	object associated with an indirect QPDFObjectHandle.

	* Add convenience methods to QPDFObjectHandle: assertIndirect(),
	isPageObject(), isPagesObject()

	* Cache when QPDF::pushInheritedAttributesToPage() has been called
	to avoid traversing the pages trees multiple times.  This state is
	cleared by QPDF::updateAllPagesCache() and ignored by
	QPDF::flattenPagesTree().

2012-07-08  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFObjectHandle::newReserved to create a reserved object
	and QPDF::replaceReserved to replace it with a real object.
	QPDFObjectHandle::newReserved reserves an object ID in a QPDF
	object and ensures that any references to it remain unresolved.
	When QPDF::replaceReserved is later called, previous references to
	the reserved object will properly resolve to the replaced object.

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
