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>

	* Pl_Buffer and QPDFWriter: add getBufferSharedPointer(), which
	turns a PointerHolder<Buffer> but will return a
	std::shared_ptr<Buffer> in qpdf 11.

	* From m-holger: add getKeyIfDict(), which calls getKey for
	dictionaries and returns null if called on null. This is for
	easier access to optional, lower-level dictionaries.

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

	* Add several new accessors to QPDFObjectHandle: the bool
	getValueAsX(X&) accessors allow an alternative way to retrieve
	values from QPDFObjectHandle objects and can result in more
	concise code in many situations. Thanks to m-holger for the
	contribution.

	* Add qpdf_oh_new_binary_unicode_string and
	qpdf_oh_get_binary_utf8_value to the C API. This makes it possible
	to handle UTF-8-encoded strings with embedded NUL characters. Thanks
	to m-holger for the contribution.

	* Add a global user-defined string literal "_qpdf" as a shorthand
	for QPDFObjectHandle::parse, allowing you to create
	QPDFObjectHandle objects with

	QPDFObjectHandle oh = "<</Some (PDF)>>"_qpdf;

	* Expose QPDF::emptyPDF to the C API as qpdf_empty_pdf()

	* Add comments letting people know that the version string
	returned by QPDF::QPDFVersion and qpdf_get_qpdf_version is static.

	* Add QUtil::make_unique_cstr to return a std::unique_ptr<char[]>
	as an alternative to QUtil::copy_string and
	QUtil::make_shared_cstr.

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

	* New preprocessor symbols QPDF_MAJOR_VERSION, QPDF_MINOR_VERSION,
	QPDF_PATCH_VERSION as numbers and QPDF_VERSION as a string. These
	can be used for feature testing in code. These are in qpdf/DLL.h,
	which is included by every header that adds to the public API.
	Since these constants are introduced in version 10.6, it's
	important for them to be in a header that everyone already
	includes so you don't have to try to include a header that won't
	be there.

	* PointerHolder: add a get() method and a use_count() method for
	compatibility with std::shared_ptr. In qpdf 11, qpdf's APIs will
	switch to using std::shared_ptr instead of PointerHolder, though
	there will be a PointerHolder class with a backward-compatible
	API. To ease the transition, we are adding get() now with the same
	semantics as std::shared_ptr's get. Note that there is a
	difference in behavior: const PointerHolder has always behaved
	incorrectly. const PointerHolder objects only returned const
	pointers. This is wrong. If you want a const pointer, use
	PointerHolder<T const>. A const PointerHolder just shouldn't allow
	its pointer to be reassigned. The new get() method behaves
	correctly in that calling get() on a const PointerHolder to a
	non-const pointer returns a non-const pointer. This is the way
	regular pointers behave.

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

	* Major refactor: all functionality from the qpdf CLI is now
	available for library users using the QPDFJob class. See comments
	in include/qpdf/QPDFJob.hh and a new chapter about QPDFJob in the
	manual. QPDFJob provides fluent interfaces for setting options
	that exactly map to command-line arguments. There are also methods
	for initializing QPDFJob from an argv array and from a JSON
	object.

	* A light C API around basic QPDFJob functionality is in
	include/qpdf/qpdfjob-c.h.p

	* Add new functions version of QUtil::call_main_from_wmain that
	takes a constant argv array.

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

	* Have --json-help just output the JSON object, leaving a
	description to --help and the manual.

	* The --json flag now takes a version number as an optional
	parameter. The default will remain version 1 for compatibility
	until the release of qpdf 11, after which it will become "latest".
	At this time, there's only version 1, but a version 2 may appear
	in a future qpdf.

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

	* Add QPDFUsage exception, which is thrown by QPDFJob to indicate
	command-line usage or job configuration errors.

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

	* Add QUtil::make_shared_cstr to return a std::shared_ptr<char>
	instead of a char* like QUtil::copy_string

	* JSON: for (qpdf-specific, not official) "schema" checking, add
	the ability to treat missing fields as optional. Also ensure that
	values in the schema are dictionary, array, or string.

	* Add convenience methods isNameAndEquals and isDictionaryOfType
	to QPDFObjectHandle with corresponding functions added to the C
	API. Thanks to m-holger for the contribution.

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

	* Add JSON::parse. Now qpdf's JSON class implements a
	general-purpose JSON parser and serializer, but there are better
	options for general use. This is really designed for qpdf's
	internal use and is set up to be compatible with qpdf's existing
	API and to hook into a planned JSON-based API to the QPDFJob
	class.

	* Add isDictionary and isArray to JSON

