2025-02-19  Jay Berkenbilt  <ejb@ql.org>

        * END USE OF ChangeLog. From this point forward, please consult
        the release notes for important changes and version control
        history for detailed changes.

2025-02-15  Jay Berkenbilt  <ejb@ql.org>

	* 11.10.1: release

	* Detect cygwin as Windows for fix-qdf tests that don't work on
	Windows. The perl used for the test runner in GitHub Actions
	changed. This was causing some non-Windows tests to fail and also
	causing path canonicalization to fail for absolute paths with
	drive letters.

	* Detect zopfli by looking for <zopfli/zopfli.h> rather than just
	<zopfli.h>

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

	* 11.10.0: release

2025-02-02  Jay Berkenbilt  <ejb@ql.org>

	* Add support for the zopfli compression library. See manual for
	details. Fixes #1323.

	* Have fix-qdf accept a second argument, interpreted as the output
	file. Fixes #1330.

2024-02-01  M Holger  <m.holger@qpdf.org>

	* Bug fix: in qpdf CLI / QPDFJob throw a QPDFUsage exception if a
	parameter is given for a flag. Previously the parameter was ignored and
	e.g. --encrypt=n was treated as --encrypt. Fixes #1329.

2024-09-20  Chao Li  <mslichao@outlook.com>

	* Add C API function qpdf_oh_free_buffer to release memory allocated
	by stream data functions.

2024-09-19  M Holger  <m.holger@qpdf.org>

	* Bug fix: QPDFWriter stream DecodeLevel incorrectly defaulted to
	none instead of generalized. Fixes #1286.

2024-08-25  M Holger  <m.holger@qpdf.org>

	* Add new command-line arguments --remove-metadata and --remove-info
	to exclude document metadata and information from the output PDF
	file. Partially fixes #1145.

2024-08-06  M Holger  <m.holger@qpdf.org>

	* Bug fix: when writing real numbers as JSON ensure that they don't
	have a trailing decimal point. Fixes #1261.

2024-07-14  M Holger  <m.holger@qpdf.org>

	* Bug fix: handle named destinations where the entry is a
	dictionary with /D entry instead of an explicit destination.
	Fixes #1238.

2024-07-04  M Holger  <m.holger@qpdf.org>

	* Treat corrupt JPEG streams as unfilterable. This avoids them
	getting uncompressed when writing PDF files with decode level all.

2024-07-02  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDF::setMaxWarnings to set the maximum of warnings before
	warning suppression.

	* Add static option to Pl_DCT to limit memory usage of
	decompression. The option is generally exposed but is primarily
	intended to support fuzz tests, which have explicit memory limits
	that are smaller than what is commonly seen in the wild with PDF
	files.

	* Add static option to Pl_DCT to control whether decompression of
	corrupt JPEG data is attempted.

2024-07-01  M Holger  <m.holger@qpdf.org>

	* Bug fix: certain invalid object streams caused the insertion of
	invalid entries into in the xref table.

2024-06-29  M Holger  <m.holger@qpdf.org>

	* Bug fix: in QPDFOutlineObjectHelper detect loops in the list of
	direct children of an outline item.

2024-06-27  M Holger  <m.holger@qpdf.org>

	* Add sanity check in QPDF xref table reconstruction to reject
	objects with impossibly large object id in order to improve
	handling of severely damaged PDF files.

2024-06-25  M Holger  <m.holger@qpdf.org>

	* Detect severely damaged PDF files early. After parsing the xref
	table in QPDF throw a damagedPDF exception if the root of the pages
	tree is not a dictionary.

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

	* 11.9.1: release

2024-06-06  Jay Berkenbilt  <ejb@ql.org>

	* Rewrite a recursive function to be iterative in linearization to
	enable more complex files to be linearized, especially on Windows.

2024-02-24  Jay Berkenbilt  <ejb@ql.org>

	* Avoid non-standard use of `std::basic_string_view`. Contribution
	from Zoe Clifford.

2024-02-24  Jay Berkenbilt  <ejb@ql.org>

	* 11.9.0: release

2024-02-17  Jay Berkenbilt  <ejb@ql.org>

	* Add ENABLE_COVERAGE cmake option to assist with generating
	coverage reports.

	* From M. Holger: add QPDFObjectHandle::writeJSON to directly
	write a JSON representation to a pipeline. This is much faster
	than writing the serialized result of getJSON.

2024-02-11  Jay Berkenbilt  <ejb@ql.org>

	* The previous fix to #1056 was incomplete. When setting a check
	box value, the previous fix allowed any value other than /Off to
	mean checked. Now we also set the actual value based on the
	allowable non-/Off value in the normal appearance dictionary.
	Fixes #1056.

2024-02-03  Jay Berkenbilt  <ejb@ql.org>

	* Add fuzz testing for JSON.

2024-01-15  Jay Berkenbilt  <ejb@ql.org>

	* Add JSON::getDictItem (from m-holger)

2024-01-10  Jay Berkenbilt  <ejb@ql.org>

	* Allow --overlay and --underlay to be repeated. They may appear
	multiple times on the command-line and will be stacked in the
	order in which they appear. In QPDFJob JSON, the overlay and
	underlay keys may contain arrays. For compatibility, they may also
	contain a single dictionary.

2024-01-09  Jay Berkenbilt  <ejb@ql.org>

	* Add new command-line arguments --file and --range which can be
	used within --pages in place of positional arguments. Allow --file
	to be used inside of --overlay and --underlay as well. These new
	options can be freely intermixed with positional arguments. Also
	add file(), range(), and password() to QPDFJob::PagesConfig as an
	alternative to pageSpec.

2024-01-08  Jay Berkenbilt  <ejb@ql.org>

	* 11.8.0: release

2024-01-07  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: treat references to older generations of objects as
	null.

2024-01-06  Jay Berkenbilt  <ejb@ql.org>

	* When recovering a file's xref table, attempt to find xref
	streams if a traditional trailer dictionary is not found. Fixes
	#1103.

2024-01-05  Jay Berkenbilt  <ejb@ql.org>

	* Add --set-page-labels command-line argument and supporting API.
	Fixes #939.
	  - QPDFJob::Config::setPageLabels
	  - pdf_page_label_e enumerated type
	  - QPDFPageLabelDocumentHelper::pageLabelDict

2024-01-01  Jay Berkenbilt  <ejb@ql.org>

	* Support comma-separated numeric values with --collate to select
	different group sizes from different files. Fixes #505.

	* Support "x" before a group in a numeric range to exclude a group
	from the previous group. Details are in the manual. Fixes #564,
	#790.

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

	* When flattening annotations, preserve annotations without any
	appearance information at all, such as types /Link, /Popup, and
	/Projection. Fixes #1039.

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

	* Detect overlong UTF-8 in the UTF-8 decoder, and fix detection of
	8-bit characters in erroneous UTF-8 strings.

2023-12-24  Jay Berkenbilt  <ejb@ql.org>

	* 11.7.0: release

2023-12-23  Jay Berkenbilt  <ejb@ql.org>

	* Define CPACK_NSIS_MODIFY_PATH for the Windows builds so the
	official installers will offer to modify PATH when installing
	qpdf. Fixes #1054.

	* Add QPDFAcroFormDocumentHelper::disableDigitalSignatures, which
	disables any digital signature fields, leaving their visual
	representations intact. The --remove-restrictions command-line
	argument now calls this. Fixes #1015.

2023-12-22  Jay Berkenbilt  <ejb@ql.org>

	* Generate a more complete qpdf "man page" from the same source as
	qpdf --help. Fixes #1064.

	* Allow the syntax "--encrypt --user-password=user-password
	--owner-password=owner-password --bits={40,128,256}" when
	encrypting PDF files. This is an alternative to the syntax
	"--encrypt user-password owner-password {40,128,256}", which will
	continue to be supported. The new syntax works better with shell
	completion and allows creation of passwords that start with "-".
	Fixes #874.

	* When setting a check box value, allow any value other than /Off
	to mean checked. This is permitted by the spec. Previously, any
	value other than /Yes or /Off was rejected. Fixes #1056.

2023-12-21  Jay Berkenbilt  <ejb@ql.org>

	* Fix to QPDF JSON: a floating point number that appears in
	scientific notation will be converted to fixed-point notation,
	rounded to six digits after the decimal point. Fixes #1079.

	* Fix to QPDF JSON: the syntax "n:/pdf-syntax" is now accepted as
	an alternative way to represent names. This can be used for any
	name (e.g. "n:/text#2fplain"), but it is necessary when the name
	contains binary characters. For example, /one#a0two must be
	represented as "n:/one#a0two" since the single byte a0 is not
	valid in JSON. Fixes #1072.

	* From M. Holger: Refactor QPDFParser for performance. See #1059
	for a discussion.

2023-12-20  Jay Berkenbilt  <ejb@ql.org>

	* Update code and tests so that qpdf's test suite no longer
	depends on the output of any specific zlib implementation. This
	makes it possible to get a fully passing test suite with any
	API-compatible zlib library. CI tests with the default zlib as
	well as zlib-ng (including verifying that zlib-ng is not the
	default), but any zlib implementation should work. Fixes #774.

	* Bug fix: with --compress-streams=n, don't compress object, XRef,
	or linearization hint streams.

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

	* Add new C++ functions "qpdf_c_get_qpdf" and "qpdf_c_wrap" to
	qpdf-c.h that make it possible to write your own extern "C"
	functions in C++ that interoperate with the C API. See
	examples/extend-c-api for more information.

	* Bug fix from M. Holger: the default for /Columns in PNG filter
	is 1, but libqpdf was acting like it was 0.

	* Enhancement from M. Holger: add methods to Buffer to work more
	easily with std::string.

2023-12-10  Jay Berkenbilt  <ejb@ql.org>

	* 11.6.4: release

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

	* Install fix: include cmake files with the dev component.

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

	* Build AppImage with an older Linux distribution to support AWS
	Lambda. Fixes #1086.

2023-10-15  Jay Berkenbilt  <ejb@ql.org>

	* 11.6.3: release

2023-10-14  Jay Berkenbilt  <ejb@ql.org>

	* Tweak linearization code to better handle files between 2 GB and
	4 GB in size. Fixes #1023.

	* Fix data loss bug: qpdf could discard a the character after an
	escaped octal string consisting of less than three digits. For
	content, this would only happen with QDF or when normalizing
	content. Outside of content, it could have happened in any binary
	string, such as /ID, if the encoding software used octal escape
	strings with less than three digits. This bug was introduced
	between 10.6.3 and 11.0.0. Fixes #1050.

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

	* 11.6.2: release

	* Bug fix: when piping stream data, don't call finish on failure
	if the failure was caused by a previous call to finish. Fixes
	#1042.

	* Push .idea directory with the beginning of a sharable JetBrains
	CLion configuration.

2023-09-05  Jay Berkenbilt  <ejb@ql.org>

	* 11.6.1: release

	* Fix a logic error introduced in 11.6.0 in the fix to
	copyForeignObject. The bug could result in some pages not being
	copied.

2023-09-03  Jay Berkenbilt  <ejb@ql.org>

	* 11.6.0: release

	* ascii85 parser: ignore spaces everywhere including between ~
	and >. Fixes #973.

	* Bug fix: with --pages, if one of the external files had warnings
	but the main file did not, the warning was previously not taken
	into consideration when determining the exit status.

	* Put quotation marks around the command in completion output to
	better handle spaces in paths. It is not a perfect fix (ideally,
	full shell-compatible quoting should be used), but it handles more
	cases than the old code and should handle all reasonable cases of
	qpdf being in a directory with a space in its name, which is
	common in Windows. Fixes #1021.

	* Move check for random number device to runtime instead of
	compile time. Since, by default, the crypto provider provides
	random numbers, runtime determination of a random number device is
	usually not needed. Fixes #1022.

2023-09-02  Jay Berkenbilt  <ejb@ql.org>

	* Maintain links to foreign pages when copying foreign objects.
	This allows hyperlinks in imported files to work. Fixes #1003.

	* Bug fix: Return a null object if an attempt is made to to copy a
	foreign /Pages object with copyForeignObject. This corrects a
	possible crash. Fixes #1010.

	* Bug fix: Return a null object if an attempt is made to to copy a
	foreign /Pages object with copyForeignObject. Fixes #1003.

	* Add /MediaBox to a page if absent. Thanks M. Holger.

	* Use std::vector internally for Pl_Buffer to
	avoid incompatibility with C++20. Thanks to Zoe Clifford. Fixes #1024.

2023-07-09  Jay Berkenbilt  <ejb@ql.org>

	* 11.5.0: release

	* This release consists entirely of changes made by M. Holger.
	Mostly this is changes to the private API, performance
	enhancements, code cleanup, and reformatting to 100 columns
	instead of 80. For qpdf development, we are starting to use
	JetBrains CLion, so a lot of the changes are moving us toward a
	cleaner development experience in that environment.

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

	* Bug fix: when a the same page is copied multiple times, copy
	the annotations rather than having multiple pages share an
	annotation object. Thanks to M. Holger for the fix. Fixes #600.

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

	* Add "FUTURE" build option for enabling experimental APIs. Do not
	package qpdf built with the FUTURE option as there are no binary
	compatibility or even source compatibility guarantees. The option
	is intended for developers who want to ensure that future
	potentially breaking changes are compatible with their code or
	provide feedback on upcoming changes. At present, the only feature
	enabled by FUTURE is a move constructor for QPDFObjectHandle.
	While this shouldn't break any code, it would change details about
	how many copies of a specific QPDFObjectHandle were in existence,
	so it could potentially break code that was relying on internal
	shared pointer reference counts. Thanks to M. Holger for the idea
	and contribution.

2023-05-25  Jay Berkenbilt  <ejb@ql.org>

	* Add new method Buffer::copy and deprecate Buffer copy
	constructor and assignment operator. Buffer copy operations are
	expensive as they always involve copying the buffer content. Use
	"buffer2 = buffer1.copy();" or "Buffer buffer2{buffer1.copy()};"
	to make it explicit that copying is intended. This change was
	contributed by M. Holger.

2023-05-21  Jay Berkenbilt  <ejb@ql.org>

	* 11.4.0: release

2023-05-20  Jay Berkenbilt  <ejb@ql.org>

	* From M. Holger: add QPDF::newReserved as a better alternative to
	QPDFObjectHandle::newReserved. The operation of creating a new
	reserved object fits better in the QPDF API. The old call just
	delegates to the new one.

2023-05-13  Jay Berkenbilt  <ejb@ql.org>

	* When an annotation dictionary's appearance dictionary (`/AP`)
	has a key that is a stream, disregard `/AS` (which is supposed to
	point to a subkey). This enables qpdf to not ignore annotations
	that have incorrect values for `/AS` when the appearance stream is
	directly in the `/AP` dictionary instead of in a subkey. Fixes
	#949.

2023-04-02  Jay Berkenbilt  <ejb@ql.org>
	* Allow QPDFJob's workflow to be split into a reading phase and a
	writing phase to allow the caller to operate on the QPDF object
	before it is written. This adds methods QPDFJob::createQPDF and
	QPDFJob::writeQPDF and corresponding C API functions
	qpdfjob_create_qpdf and qpdfjob_write_qpdf. Thanks to M. Holger
	for the contribution.

2023-04-01  Jay Berkenbilt  <ejb@ql.org>
	* From M. Holger: throw a logic error if an uninitialized or
	foreign QPDFObjectHandle is added to an array.

2023-03-18  Jay Berkenbilt  <ejb@ql.org>

	* Enhance --optimize-images to support images nested inside of
	form XObjects. Thanks to Connor Osborne (github user cdosborn) for
	the contribution. Fixes #923.

2023-02-25  Jay Berkenbilt  <ejb@ql.org>

	* 11.3.0: release

	* When performing overlay or underlay operations, convert the
	original page to a form XObject instead of simply isolating its
	contents with q/Q operators. This prevents unbalanced q/Q
	operators in any of the original pages from messing up the
	graphics state of anything that is overlaid on top of it. Fixes
	#904.

2023-02-18  Jay Berkenbilt  <ejb@ql.org>

	* Treat all linearization errors and warnings as warnings, and
	issue them through the normal warning system using the new error
	code qpdf_e_linearization. That means that --no-warn will suppress
	them, and the file name is included in the warning. Fixes #851.

2023-01-28  Jay Berkenbilt  <ejb@ql.org>

	* New option --remove-restrictions removes security restrictions
	from digitally signed files. Fixes #833.

2023-01-09  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: flatten annotations should handle a page with no
	/Resources key. Fixes #827.

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

	* 11.2.0: release

	* Add a few convenience methods to QPDFTokenizer::Token for
	checking token types. thanks to M. Holger for the contribution.

	* Add stream creation methods to the QPDF class as a better
	alternative to the ones in the QPDFObjectHandle class. Thanks to
	M. Holger for the contribution.

2022-11-19  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: handle special case of an earlier xref stream object's
	object number being reused by an update made by appending the
	file. Fixes #809.

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

	* Fix major performance bug with the openssl crypto provider when
	using OpenSSL 3. The legacy loader and rc4 algorithm was being
	loaded with every call to the crypto provider instead of once in
	the life of the program. Fixes #798.

	* performance_check: add --test option to limit which tests are
	run.

2022-10-06  Jay Berkenbilt  <ejb@ql.org>

	* Change minimum required C++ version from C++-14 to C++-17.

	* Fix another symbol export issue with the MinGW build.

2022-10-01  Jay Berkenbilt  <ejb@ql.org>

	* 11.1.1: release

2022-09-27  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: avoid having the AppImage discard the first argument
	when renamed to one of the embedded executables. Fixes #789.

	* Add AppImage-specific tests to CI. These test different
	invocation styles and loading of the proper shared library.

2022-09-26  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: avoid using PDF Doc encoding for strings whose PDF Doc
	encoding representation starts with UTF-16 or UTF-8 markers. Fixes
	#778.

2022-09-27  Jay Berkenbilt  <ejb@ql.org>

	* Add tests to CI for char being unsigned by default.

2022-09-14  Jay Berkenbilt  <ejb@ql.org>

	* 11.1.0: release

	* Add notes to documentation clarifying that installing the dev
	component usually requires the lib component to also be installed.

	* Set CMAKE_INCLUDE_DIRECTORIES_PROJECT_BEFORE ON in cmake to
	(hopefully) solve the problem of older installed qpdf headers
	interfering with building qpdf from source. Fixes #763.

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

	* Add some missing DLL exports that only affect the Windows build.

	* Remove compile-time test for LL_FMT. It's unlikely that any
	compiler new enough to build qpdf still doesn't support %lld.

2022-09-10  Jay Berkenbilt  <ejb@ql.org>

	* 11.0.0: release

2022-09-09  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFObjectHandle::isSameObjectAs to test whether two
	QPDFObjectHandle objects point to the same underlying object.

	* Expose ability to create custom loggers and to get and set the
	logger for QPDF and QPDFJob through the C API.

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

	* Added new functions to the C API to support qpdf JSON:
	qpdf_create_from_json_file, qpdf_create_from_json_data,
	qpdf_update_from_json_file, qpdf_update_from_json_data, and
	qpdf_write_json. Examples can be found in qpdf-ctest.c (in the
	source tree), tests 42 through 47.

	* Add QPDFObjectHandle::isDestroyed() to test whether an indirect
	object was from a QPDF that has been destroyed.

2022-09-07  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFObjectHandle::getQPDF(), which returns a reference, as
	an alternative to QPDFObjectHandle::getOwningQPDF().

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

	* For all bounding box methods in QPDFPageObjectHelper other than
	MediaBox, add a parameter `copy_if_fallback`, and add comments
	explaining in depth exactly what copy_if_shared and
	copy_if_fallback mean. Fixes #664.

	* Add new methods getArtBox and getBleedBox to
	QPDFPageObjectHelper, completing the set of bounding box methods.

	* The --show-encryption option now works even if a correct
	password is not supplied. If you were using --show-encryption to
	test whether you have the right password, use --requires-password
	instead. Fixes #598.

2022-09-05  Jay Berkenbilt  <ejb@ql.org>

	* Add a move constructor to Buffer, making it possible to move
	rather than copy the internal buffer. Thanks to jbarlow83 for the
	contribution.

2022-09-02  Jay Berkenbilt  <ejb@ql.org>

	* Add new QPDF::create() factory method that returns
	std::shared_ptr<QPDF>.

	* Prevent copying/assigning to QPDF objects in the API. It has
	never been safe to do this, but the API wasn't preventing it.

2022-09-01  Jay Berkenbilt  <ejb@ql.org>

	* Remove QPDFObject.hh from include/qpdf. The only reason to
	include was to get QPDFObject::object_type_e. Instead, include
	qpdf/Constants.h, and change `QPDFObject::ot_` to `::ot_`.

	* More optimizations and cleanup from m-holger (#726, #730)
	including major refactor of QPDF's internal representations of
	objects. In addition to a large performance improvement, this also
	made it possible for QPDFObjectHandle::getOwningQPDF() to return a
	null pointer if the owning QPDF had been destroyed. (A more
	complete solution to this problem will be introduced for qpdf 12.)
	This work also paves the way for a future alternative to
	QPDFObjectHandle that is more idiomatic C++ and has greater type
	safety.

2022-08-31  Jay Berkenbilt  <ejb@ql.org>

	* From m-holger (#729): refactor QPDF's parser into a new
	QPDFParser class, cleaning the code, significantly improving
	performance.

2022-08-27  Jay Berkenbilt  <ejb@ql.org>

	* From m-holger: major refactoring of QPDFTokenizer to improve
	readability and to optimize performance. This also included some
	optimizations to some InputSource classes. Thanks for this
	excellent contribution. Fixes #749, #442.

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

	* Add new build configuration option ENABLE_QTC, which is off by
	default when not running in MAINTAINER_MODE. When this is off,
	QTC coverage calls sprinkled throughout the qpdf source code are
	compiled out for increased performance. See "Build Options" in the
	manual for a discussion. Fixes #714.

2022-08-06  Jay Berkenbilt  <ejb@ql.org>

	* Added by m-holger: QPDF::getObject() method as a simpler form of
	getObjectByID or getObjectByObjGen. The older methods are being
	retained for compatibility and are not deprecated.

2022-07-24  Jay Berkenbilt  <ejb@ql.org>

	* include/qpdf/JSON.hh: Schema validation: allow a single item to
	appear anywhere that the schema has an array of a single item.
	This makes it possible to change an element of the schema from an
	item to an array to allow the data to accept an array where a
	single value was previously required. This change is needed to
	allow QPDFJob JSON to start accepting multiple items where a
	single item used to be expected without breaking backward
	compatibility. Without this change, the earlier fix to
	removeAttachment would be a breaking change. Also allow the schema
	to contain a multi-element array, which means that the output has
	to have an array of the same length in the corresponding location,
	and each element is validated against the corresponding schema
	element.

	* QPDFObjectHandle: for the methods insertItem, appendItem,
	eraseItem, replaceKey, and removeKey, add a corresponding
	"AndGetNew" and/or "AndGetOld" methods. The ones that end with
	"AndGetNew" return the newly added item. The ones that end with
	"AndGetOld" return the old value. The AndGetNew methods make it
	possible to create a new object, add it to an array or dictionary,
	and get a handle to it all in one line. The AndGetOld methods make
	it easier to retrieve an old value when removing or replacing it.

	* Thanks to m-holger for doing significant cleanup of private APIs
	and internals around QPDFObjGen and for significantly improving
	the performance of QPDFObjGen -- See #731. This includes a few
	user-visible changes:
	- Addition of QPDFObjectHandle::StreamDataProvider::provideStreamData
	  overloads that take QPDFObjGen
	- Addition of an optional argument to QPDFObjGen::unparse allowing
	  specification of a separator character, with the default
	  resulting in the old behavior
	Examples have been updated to use improved APIs. The old
	provideStreamData overloads will continue to be supported, so
	updating older code to use the new interfaces is entirely at the
	programmer's discretion.

2022-06-25  Jay Berkenbilt  <ejb@ql.org>

	* Add tracking methods QPDF::everCalledGetAllPages() and
	QPDF::everPushedInheritedAttributesToPages(). Since those methods
	may have the side effect of creating new objects and replace
	objects in various places in the pages tree, it's useful to be
	able to find out whether they've ever been called.

2022-06-18  Jay Berkenbilt  <ejb@ql.org>

	* Add QPDFJob::registerProgressReporter, making it possible to
	override the progress reporter that is used when --progress (or
	the equivalent) is configured with QPDFJob. This is
	qpdfjob_register_progress_reporter in the C API.

	* Add examples that show how to capture QPDFJob's output by
	configuring the default logger (qpdfjob-save-attachment.cc,
	qpdfjob-c-save-attachment.c). Fixes #691.

	* Add C API for QPDFLogger -- see qpdflogger-c.h

	* Add additional qpdfjob C API functions take a handle.

	* Add qpdf_exit_code_e to Constants.h so that exit codes from
	QPDFJob are accessible to the C API.

	* When --progress or --verbose is combined with writing to
	standard output, progress reporting and verbose messages go to
	standard error. Previously it was disabled in this case.

2022-06-05  Jay Berkenbilt  <ejb@ql.org>

	* QPDFJob: API breaking change: QPDFJob::doIfVerbose passes a
	Pipeline& rather than a std::ostream& to the the callback
	function.

	* Add integer types to pipeline's operator<<: short, int, long,
	long long, unsigned short, unsigned int, unsigned long, unsigned
	long long.

2022-05-30  Jay Berkenbilt  <ejb@ql.org>

	* qpdf JSON is now at version 2. New command-line arguments:
	--json-output, --json-input, --update-from-json. New methods
	QPDF::writeJSON, QPDF::createFromJSON, QPDF::updateFromJSON. For
	details, see the "qpdf JSON" chapter of the manual.

	* When showing encryption data in json output, when the user
	password was recovered with by the owner password and the
	specified password does not match the user password, reveal the
	user password. This is not possible with 256-bit keys.

	* Include additional information in --list-attachments --verbose
	and in --json --json-key=attachments.

	* Add QUtil::qpdf_time_to_iso8601 and QUtil::pdf_time_to_iso8601
	for converting PDF/qpdf timestamps to ISO-8601 date format.

2022-05-18  Jay Berkenbilt  <ejb@ql.org>

	* Add QUtil::FileCloser to the public API. This is a simple inline
	class to help with automatic file closing.

2022-05-17  Jay Berkenbilt  <ejb@ql.org>

	* Allow passing *uninitialized* (not null) objects to
	replaceStreamData as filter and/or decode_parms to leave any
	existing values for /Filter and /DecodeParms untouched.

2022-05-15  Jay Berkenbilt  <ejb@ql.org>

	* Add QUtil::is_long_long to test whether a string can be
	converted to a long long and back without loss of information.

2022-05-04  Jay Berkenbilt  <ejb@ql.org>

	* JSON: add a new "blob" type that takes a function to write data
	into. The blob is serialized as a base64-encoded representation of
	whatever is written to the function.

	* FileInputSource has new constructors that eliminate the need to
	call setFilename or setFile in most cases.

	* Enhance JSON by adding a write method that takes a Pipeline* and
	depth, and add several helper methods to make it easier to write
	large amounts of JSON incrementally without having to have the
	whole thing in memory.

	* json v1 output: make "pages" and "objects" consistent.
	Previously, "objects" always reflected the objects exactly as they
	appeared in the original file, while "pages" reflected objects
	after repair of the pages tree. This could be misleading. Now, if
	"pages" is specified, "objects" shows the effects of repairing the
	page tree, and if not, it doesn't. This makes no difference for
	correct PDF files that don't have problems in the pages tree. JSON
	v2 will behave in a similar way.

2022-05-03  Jay Berkenbilt  <ejb@ql.org>

	* Add new Pipeline class Pl_String which appends to a std::string&
	passed to it at construction.

	* Add new Pipeline class Pl_OStream, similar to Pl_StdioFile but
	takes a std::ostream instead of a FILE*.

	* Add new convenience methods to Pipeline: writeCStr and
	writeString. Also add a limit << operator that takes C strings and
	std::strings. Also add an overloaded version of write that takes
	"char const*".

	* API change: Pipeline::write now takes "unsigned char const *"
	instead of "unsigned char*". Callers shouldn't have to change
	anything, though can stop using writable strings or
	QUtil::unsigned_char_pointer. If you have implemented your own
	pipelines, you should change your write method to take a const
	pointer.

2022-05-01  Jay Berkenbilt  <ejb@ql.org>

	* JSON: add reactors to the JSON parser, making it possible to
	react to JSON parsing events as they occur and to block the
	results from being stored. This makes it possible to incrementally
	parse arbitrarily large JSON inputs.

2022-04-30  Jay Berkenbilt  <ejb@ql.org>

	* QPDFWriter: change encryption API calls
	  - Remove deprecated versions of setR*EncryptionParameters
	    methods from before qpdf 8.4.0
	  - Replace setR2EncryptionParameters with
	    setR2EncryptionParametersInsecure
	  - Replace setR3EncryptionParameters with
	    setR3EncryptionParametersInsecure
	  - Replace setR4EncryptionParameters with
	    setR4EncryptionParametersInsecure

	* C API: change encryption API calls to match C++ interface
	  - Remove pre-8.4.0 functions:
	    - qpdf_set_r3_encryption_parameters
	    - qpdf_set_r4_encryption_parameters
	    - qpdf_set_r5_encryption_parameters
	    - qpdf_set_r6_encryption_parameters
	  - Add "_insecure" to insecure encryption triggers:
	    - Replace void qpdf_set_r2_encryption_parameters
	      with qpdf_set_r2_encryption_parameters_insecure
	    - Replace void qpdf_set_r3_encryption_parameters2
	      with qpdf_set_r3_encryption_parameters_insecure
	    - Replace void qpdf_set_r4_encryption_parameters2
	      with qpdf_set_r4_encryption_parameters_insecure

	* Make attempting to write encrypted files that use RC4 (40-bit or
	128-bit without AES) an error rather than a warning when
	--allow-weak-crypto is not specified. Fixes #576.

2022-04-24  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: "removeAttachment" in the job JSON now takes an array
	of strings instead of a string. It should have taken an array of
	strings since the corresponding command-line argument,
	--remove-attachment, is repeatable. Fixes #693.

	* Deprecate QPDFObjectHandle::replaceOrRemoveKey -- it does and
	always has done the same thing as replaceKey.

2022-04-23  Jay Berkenbilt  <ejb@ql.org>

	* Add a new QPDF::warn method that takes the parameters of
	QPDFExc's constructor except for the filename, which is taken from
	the QPDF object. This is a shorter way to issue warnings on behalf
	of a QPDF object.

	* Add new method QUtil::is_explicit_utf8 that tests whether a
	string is explicitly marked as being UTF-8 encoded, as allowed by
	the PDF 2.0 spec. Such a string starts with the bytes 0xEF 0xBB
	0xBF, which is the UTF-8 encoding of U+FEFF.

	* Add new method QUtil::get_next_utf8_codepoint as a low-level
	helper for iterating through the UTF-8 characters in a byte
	string.

2022-04-16  Jay Berkenbilt  <ejb@ql.org>

	* Breaking CLI change: the default value for --json is now
	"latest" rather than "1". At this moment, "1" is the latest
	version, but version "2" will be added before the release of
	qpdf 11.

	* Perform code cleanup including some source-compatible but not
	binary compatible changes to function signatures, use of anonymous
	namespaces, and use of "= default" and "= delete" in declarations.

2022-04-09  Jay Berkenbilt  <ejb@ql.org>

	* Replace PointerHolder with std::shared_ptr through the QPDF API.
	A backward-compatible interface is provided and enabled by default
	with a warning that can be turned off. See "Smart Pointers" in the
	"Design and Library Notes" section of the manual for information
	including a detailed migration process to assist with migrating
	code that uses the qpdf library.

2022-04-03  Jay Berkenbilt  <ejb@ql.org>

	* Add automatic code formatting with clang-format. See "Code
	Formatting" in the "Contributing to qpdf" chapter of the manual.

2022-03-19  Jay Berkenbilt  <ejb@ql.org>

	* 10.6.3.0cmake1: unofficial release

	* Conversion of build system to cmake. This change doesn't include
	any user-visible functional changes to the library API or CLI but
	completely replaces the build system. Details can be found in the
	manual in the "Building and Installing QPDF" and "Notes for
	Packagers" sections, especially "Converting From autoconf to
	cmake" in "Building and Installing QPDF". Highlights of the
	changes can be found in the release notes.

2022-03-08  Jay Berkenbilt  <ejb@ql.org>

	* 10.6.3: release

	* Use Windows 2022 github runners and therefore Visual Studio 2022
	to create Windows distributions

	* Fix DLL export issue with mingw (Windows)

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

	* Minor internal changes to assist with building in other
	environments: rename internal bits.icc to qpdf/bits_functions.hh
	(not part of public API), enforce reordering of header files to
	prevent jpeglib.h from interfering with other headers, remove an
	unused header that was accidentally added in 10.6.0 but never
	referenced by any code.

	* Make build work and tests work when NDEBUG is defined. This
	involved a few changes to some test files but no changes to any
	library code.

2022-02-25  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix in JSON parser: accept \/ in a string as valid input per
	JSON spec even though we don't translate / to \/ on output.

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

	* Recognize PDF strings explicitly marked as UTF-8 as allowed by
	the PDF 2.0 spec. Fixes #654.

2022-02-18  Jay Berkenbilt  <ejb@ql.org>

	* Bug fix: when generating appearance streams, the font size was
	substituted incorrectly from /DA if Tf was absent or the number
	preceding Tf was out of range. Fixes #655.

2022-02-16  Jay Berkenbilt  <ejb@ql.org>

	* 10.6.2: release

2022-02-15  Jay Berkenbilt  <ejb@ql.org>

	* Fix asymmetrical logic between
	QPDFObjectHandle::newUnicodeString() and
	QPDFObjectHandle::getUTF8Val(). The asymmetrical logic didn't
	matter before fixing the PDF Doc transcoding bugs.

	* When analyzing PDF strings, recognize UTF-16LE as UTF-16. The
	PDF spec only allows UTF-16BE, but most readers seem to allow
	both. Fixes #649.

	* Bug fix: 10.6.0 inadvertently removed an unknown/undocumented
	CLI parsing feature, which has been restored in 10.6.2. Fixes #652.

	* Don't map 0x18 through 0x1f, 0x7f, 0x9f, or 0xad as fixed points
	when transcoding UTF-8 to PDFDoc. These code points have different
	meanings in those two encoding systems. Fixes #650.

2022-02-11  Jay Berkenbilt  <ejb@ql.org>

	* 10.6.1: release

	* Fix some compilation issues from use of abs without including
	proper headers.

2022-02-09  Jay Berkenbilt  <ejb@ql.org>

	* 10.6.0: release

	* Fix one more PDF doc encoding omission: 0xAD is also undefined.
	Fixes #637.

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

	* Bug fix: when splitting pages with --split-pages or selecting
	pages with --pages, set the output PDF version to the maximum of
	all the input PDF versions. This is a fix to QPDFJob. If you are
	creating output PDF files yourself from multiple inputs, you will
	need to code the same thing. The new PDFVersion object, its
	updateIfGreater() method, and the new QPDF and QPDFWriter methods
	described below make this very easy to do. Fixes #610.

	* Add new class PDFVersion for more convenient comparison of PDF
	version numbers from the %!PDF header.

	* Add QPDF::getVersionAsPDFVersion() to return the PDF version and
	extension together as a PDFVersion object instead of a string.

	* Add a QPDFWriter::setMinimumPDFVersion() that takes a PDFVersion
	object.

2022-02-06  Jay Berkenbilt  <ejb@ql.org>
