Big Faceless PDF Viewer Changelog


               CHANGELOG for Big Faceless PDF library
               --------------------------------------

The version numbering scheme in use across all our products is designed
to simplify upgrade management for developers:

  * A "patch level" change indicates a minor feature or bugfix.
    Methods MAY have been added to the API, but none have been
    removed.
    eg. Code written for version 1.0.0 will work on version 1.0.9

  * A "minor level" change indicates a change to the API which
    may require some code changes. API changes are minor, but
    are necessary for bug fixes or new features.
    eg. Code written for version 1.0.3 MAY require changes for 1.1

  * A "major level" indicates big changes to the API or
    considerable extra functionality. Developers can expect
    significant changes to bring their code up to date.
    eg. Code written for version 1.1 is unlikely to work under 2.0

-----------------------------------------------------------------------------
2.28.7 (released 2024-11-14)
-------------------------------
* Minor adjustment to PKCS7SignatureHandler.SigningEngine.getTimeStampResp
  interface, to make it easier to implement a custom SigningEngine

* The legacy "Border" attribute on annotations is now supported.

* Improved the Font Subsitution algorithm, used when rasterizing a PDF with
  unembedded fonts.

* OpenTypeFont constructor was documented as failing when given a collection and
  an invalid font name, but it was continuing silently. Now works as specified.

* Various changes to make merging of tagged documents (such as PDF/UA documents
  created by BFO Publisher and Report Generator) easier

* Viewer: adjustments to allow a custom SignatureProvider.SignatureState which
  can reflect site-specific signature validation rules.



2.28.6 (released 2024-08-22)
-------------------------------
* Fixed rendering of bitmap images with more than 2^31 samples, and of very
  large JPX images that are downsampled before cropping

* Fixed rendering of files containing unclosed paths before other operations

* Previous release built Graal support classes with Java 11, which would break
  classloaders that foolishly verify classes themselves rather then letting the
  application test them in a try/catch (Websphere, specifically). Rebuilt with
  Java 8.

* Concatenating PDFs that made use of bfo:sort and bfo:uuid (ie those created
  by BFO Publisher or Report Generator) had their content reordered randomly,
  now fixed.

* Fixed a very particular error with PDFs containing a particular combination of
  tokens, which could cause load failures.

* A data-structure used when loading fonts from PDFs was causing OutOfMemory
  errors when used with very large heaps and many threads, despite being based
  on Weak References. Redid this in a different way using hard references, which
  seems to have fixed the issue.

* Viewer: when the viewer has no option of switching between different layouts,
  force layout to multi-page view so that navigations between pages is possible.



2.28.5 (released 2024-06-14)
-------------------------------
* The process for repairing errors in the Structure Tree hierarchy has been
  improved to the point where almost any hierarchy can be made technically, if
  not semantically, valid. See the "fix-structure" parameter described in the
  API docs for PDF.getStructureTree() for detail.

* Corrected the URLs used for WTPDF Declarations

* Added AES-256 encryption and support for EC keys to PublicKeyEncryptionHandler

* Added AES-256-GCM (from ISO 32003) to both Public Key and Standard encryption

* Fixed bug in StandardEncryptionHandler when password was > 32 chars long

* LayoutBox is more efficient when creating long runs of text in a backup font

* Some improvements to HtmlDerivation algorithm

* Added WidgetAnnotation.setReplacementImage() method, allowing the appearance
  of buttons, radio button and checkboxes to be completely overridden.

* Fixed "Can't write NaN" when redacting some documents.

* Fixed issue decoding CCIT images with particular (archaic) set of options

* Fixed rendering PDFs containing ImageMask images within stencil patterns

* Fixed rendering PDFs where the path does not contain an initial move.

* Added support for Graal JavaScript engine - tested on GraalVM 17.
  Uses the javax.script package so requires the "js-scriptengine" jar

* Verified with Java 21 (no changes required)

* Viewer: text search will now match against normalized text, making it work
  properly when searching for text with diacritics or mathemetical expressions.

* Viewer: when saving files attached to the PDF, sanitize if the filename
  contains a path.

* Viewer: set viewport to multi-page whenever the viewer is created without
  a toolbars, otherwise only the first page is visible.



2.28.4 (released 2024-03-08)
-------------------------------
* Added the final PDF/UA-2 OutputProfile, and two OutputProfiles for
  "Well Tagged PDF"

* Added the "HtmlDerivation" class, to deriving HTML from a tagged PDF.

* The StructureTree Document will now put newlines in extracted text to indicate
  line breaks, and text content will reflect the "ActualText" property if its
  set on any content.

* Previous release broke TIFF output for regular RGB images - now fixed.

* Previous release could result in NullPointerExceptions from font class due to
  some incorrect assumptions for logging: fixed.

* Minor adjustments to PDF/UA-1 and PDF/UA-2 profiles based on interop testing.

* Fixes for indexed colorspaces when using a custom OutputProfile.ColorAction
  to convert colors.

* Add AcrobatSignatureHandlerFactory.setSSLSocketFactory to control how SSL
  connections for OCSP responses, Timestamps, Certificate and other signature-
  related content are made.

* Fixed, for the final time, the ability to force the PDF version number when
  saving the file by requiring or denying a PDFVersionNN feature on the profile.

* Ensure we never write a NameTree with a mix of UCS and non-UCS encoded keys,
  and that we sort them the same was as Acrobat (ISO32000 errata #214)

* Under some rare circumstances, the original OpenType Color fonts (which we
  turn into Type3 fonts) were embedded in the PDF, despite not being used.
  This would increase the file-size and could cause some validators to complain.

* Bookmark open counts were not being set properly under some workflows

* Fixes to kashida justification algorithm

* Updated Arlington model to latest release

* Viewer: fix longstanding issue where a viewer that has no ThumbnailPanel would
  not display PDFs opened via the Open menu item.

* Viewer: ensure "defaultMode" property can be set to "DragScroll" or "TextTool"
  to choose the initial cursor selection mode.



2.28.3 (released 2023-12-07)
-------------------------------
* "Print Preview" images can now be created with PagePainter. See the blog
  article for more information on this significant addition to the API

* The CMYKColorSpace profile for device-dependent CMYK is now based on FOGRA39.
  This means a slight colorshift from previous releases when converting CMYK
  content to RGB (the old profile can still be used, see API docs)

* Added the DocumentPart class, for PDF 2.0 "DPart" support

* Added output profiles and profile features to support Factur-X 1.0.6

* Added support for Australian Post 4-state barcode

* DeviceNColorSpace has new getNames() and getColorConvertOp() methods. The
  DeviceNColorSpace.Builder has some new methods to make building easier.

* Only complain about "Nested BMC/EMC" sequences (invalid in PDF/UA) if both
  the parent and child are actually reachable from the Structure Tree.

* Fixed adding new properties to the StructureTree class-map, and when verifying
  PDF/UA-2, ensure we check the class-map for properties if necessary.

* Added support for TIFF images that use Flate compression with a predictor

* Previous version set PDF version to 2.0 whenever PAdES signatures were used,
  as that's when they were officially defined. This broke various tools that
  (unwisely) depended on a PDF version 1.x, and PAdES had been in common use for
  years prior to that anyway. Fixed this so it will work properly with PDF/A.

* Fixed renaming spot colors in single-color images with a ColorAction

* Fix creating a canvas from a page that had to be repaired due to it using a
  Tiling pattern - this was causing a "Canvas not closed" exception since 2.24.4

* OCSP responses with no certificates no longer cause an exception

* Fixed issue where cloning a PDF while it was being verified in another thread
  made impossible things happen.

* Previous release broke setting a "Layout:BBox" attribute to a raw float array.

* Added setRule() method to OutputProfiler SimpleImageAction, for resampling

* Ensure we always write "L" key for inline-images

* Corrected creation of PDFImage from Image using an IndexColorModel of < 8bpp

* Fixed use of Decode array with Images in Lab colorspace (exceedingly rare)

* Rendering PDFs with irregular tiling patterns is quite a bit faster

* Viewer: Line annotations were being drawn in the wrong direction



2.28.2 (released 2023-05-24)
-------------------------------
* Updates to several output profiles (mainly PDF/A-4 and PDF/UA-1) to fix some
  bugs and align our results with other tools. The PDF/UA-2 profile is now
  largely complete and matching the final draft of the specification.

* Many small bugs fixed and improvements made to the Structure Tree, as a result
  of the work on PDF/UA-2.

* Added "roles" parameter to the Structure Tree, to try and tame the complexity
  of element role-mapping. See PDF.getStructureTree API docs for details.
  
* Updated Arlington model trunk as of 2023-05-24.

* Fix for Type1 fonts that make presumptions about the hstem values returned
  from the PostScript internaldict subr #3.

* Fixes to JPEG error recovery to match other tools.

* Fix rendering error when font-size is zero

* Fall back to generic fonts when rasterizing PDF if the OS supplied font is
  missing glyphs.

* Viewer: Added SearchPanel.setMerged() to allow the search panel to group
  all matching text on a page into one item.



2.28.1 (released 2023-03-20)
-------------------------------
* Previous release broke applying Signatures with Timestamps. Now fixed.

* Previous release broke conversion to PDF/A of PDFs that had been cloned
  before conversion, where the original PDF was missing XMP metadata.

* Previous release introduced a check for timezone-less dates in XMP, but the
  repair for this was failing on cases where the date was also invalid.

* Fixed PDF/A conversion for PDFs containing fonts that share a FontDescriptor.

* Cloning a PDF before PDF/A conversion could cause conversion failures for
  documents containing OPI data, associated files, or a particular variation
  of damaged action.



2.28 (released 2023-03-10)
-------------------------------
* SECURITY: XMP parsing did not disable external entity resolution, so a
  malicious PDF could requested XML data is downloaded when processed.
  Details have been emailed to affected customers and are available on request

* INCOMPATIBLE CHANGE: the PKCS7SignatureHandler.SigningEngine has two new
  methods to implement, getOCSPSResponses() and getCRLs().

* Added the SignaturePolicy class to try and manage changes over time to the
  digital signature validation policy used in the BFO PDF Library.

* Added support for GlobalSign's new Qualified Signing Service, and added a
  setCustomAppearance() method to set custom visuals for them.

* FormSignature.verify() can no longer deadlock while running simultaneously
  to OutputProfiler.apply(). Progress in verify() can now be controlled with
  thw new FormSignature.cancelVerify() FormSignature.isVerifying() methods.

* When digitally signing we sometimes need to guess at the size of the
  signature, and would do that by signing twice, first with dummy data. This
  is problematic when the Signing process is expensive or slow (eg a signing
  service).  We now calculate the size the signature would be.

* A list of preloaded OCSP responses and CRLs can now be supplied to
  AcrobatSignatureHandlerFactory/PKCS7SignatureHandler.addValidationInformation
  to avoid the need to download them from the network when they're required.

* Our previous build fixed the version numbers being set in the PDF, but this
  caused a few other tools that (unwisely) rely on version numbers to break.
  Now the version number can be forced by setting that feature to required, eg
  pdf.getBasicOutputProfile().setRequired(OutputProfile.Feature.PDFVersion14)

* Rewrote the float formatter we use internally to improve precision of least
  significant figures when writing numbers to a PDF, while still running 16x
  faster than DecimalFormat.

* LayoutBox.setWordBreaksAllowed() wasn't working as described if the line had
  already overflowed the width of the box. Now fixed, but for anyone relying on
  the old behaviour, setting the "org.faceless.pdf2.LayoutBoxBreaksOnOverflow"
  system property to not-null will revert this change.

* Remove some cases where a PDF repair was done before it was needed,
  potentially invalidating a signature.

* Fixed error (introduced two versions ago) where using a SpotColorSpace in a
  PDFCanvas *before* it's been added to a PDF threw an Exception.

* Repurposed the deprecated OutputProfile.Feature.PurgeResources to allow it
  to remove unreferenced resources from within a page.

* Added the OutputProfiler.RemoveSignatures strategy to remove, rather than
  flatten, signatures when the OutputProfiler.apply method requires it.

* Some minor adjustments to the PDF/UA-1 profile to more closely follow the
  letter of the specification.

* Some minor tweaks to the API to make offline signing simpler.

* Optimizations to getArlingtonModelIssues() should speed this up by about 25%.
  Updated model to latest version.

* Fixed error introduced in 2.27 where certain types of damaged form fields
  were recovered with the incorrect name

* Fixed a a particular type of repair to damaged Name Trees that was deleting
  nodes instead of reordering them.

* Previous release introduced an exception if a PDF contained an invalid
  extension; now fixed.

* Viewer: if a signature is removed from the PDF, make sure this is reflected
  in the signature dialog. Also removed some unnecessarily noisy event handling
  designed to reset a signature state to unknown when the PDF has changed.

* Viewer: some fixes to FullScreen mode to keep the UI intact when the PDF
  in a DocumentPanel is removed or changed.

* Viewer: when closing the PDF in single-window mode, we weren't resetting
  the dirty flag for the next PDF that was loaded.



2.27.2 (released 2022-11-24)
-------------------------------
* Digitally signing a PDF will now set the correct version number on the file.
  For PAdES signatures, this means the version will be PDF 2.0

* Integrated the "Arlington" PDF data model as a validation step - see the new
  ArlingtonModelIssue interface API docuementation for detail.

* Add support for PDF Extensions, specifically ISO32001 (which adds the SHA-3
  family of signature hashes) and ISO32002 (which adds Edwards Curves Ed25519
  and Ed448, both of which were added in Java 15).

* Fix a bug in our DER encoder - Set keys were not ordered. Technically
  this meant some signatures we've been generating are invalid, although in
  practice no PDF reader seems to verify this.

* Fix an issue with 8-bit Lab ICC colorspaces where the colors were incorrect
  on conversion to RGB. Discovered in internal testing as these profiles are
  never seen in the wild.

* Fix for "sRGB Appearance profile beta" ICC profile from color.org

* Several minor changes to ensure PDFs generated by the API match the Arlington
  model - essentially verifying all fields in a PDF match the specification.

* Fix QR-Code encoding for a particular mix of Kanji and number values which
  was causing the mode-switch to break and throw exceptions.

* Added AnnotationFile.setCustomAppearance(), to support custom visualizations
  for file annotations.

* No longer update or generate ProcSets, which have been obsolete since
  2001. Viva progress!

* Quieten XML parse failures from SAX parser when parsing bad XMP data.

* Viewer: when PDF is modified, reset the validation state of any signatures.



2.27.1 (released 2022-09-23)
-------------------------------
* Fixed a bug introduced in the previous release which could cause text to
  disappear in some workflows - in particular, setting a custom appearance
  on a signature.

* Fixed a particular case where the previous "repair on load" still gave
  incorrect results.

* Updated our Signature Validity checks to match the current version of Acrobat
  by exhaustively testing what can and can't be changed in a signed PDF.
  For documents that have been modified after signing, this may result in the
  validity of the signatures changing in this release (for context, Acrobat's
  algorithm has changed since the last time we checked this in 2019, and is both
  undefined and inconsistent). This release is much closer than previous ones.

* Block "shadow attacks" on signatures, as illustrated by pdf-insecurity.org

* Many, many more adjustments to the loading process to try and match Acrobat's
  behaviour, and to better handle some deliberately corrupted documents from the
  Safedocs corpora. Several OutOfMemory and one StackOverflow issues fixed.

* Fixed loading of encryption flags when stored as an unsigned int

* When creating a PDFImage from a source image with transparency, where possible
  use a PDF/A-1 friendly "Mask" rather than a "SMask"
  
* Added PDFImage.isIndexed() and PDFImage.getTransparency() methods, and fixed
  PDFImage.quantize() to work correctly with transparency.

* Properly fixed clipping of unfeasibly large patterns when drawn with 
  transforms onto a page, for all cases.

* Fix a particular issue where we were not properly merging redefined
  Separations for PDF/A

* Identify a "billion laughs" type-error with page resources and fail early.

* Updated bundled "bfopdf-jj2000.jar" to include latest fix from Github -
  previous build would throw java.lang.Error on some types of corrupt input
  which we hadn't previously encountered.



2.27 (released 2022-09-06)
-------------------------------
* Dropped support for Java 6 - supported versions are now Java 7 to 17.

* Redid the process of repairing form fields on load, to try to match Acrobat's
  unpublished algorithm. For documents that require extensive repair on load,
  this may result in differences to the repair process affecting which
  annotations and fields are repaired.

* Use thread-safe classes for very high access structures used while
  profiling. Documents that share fonts over thousands of pages no longer
  block threads when profiling on multi-core hardware.

* [PDF/A] When substituting fonts in a document with OutputProfiler.FontAction,
  allow one font to be replaced by multiple fonts. This fixes that case where
  a suitable substitute was found but is missing only one or two glyphs.
  NOTE: This changes required an API change to the OutputProfiler.FontAction
  interface, see the API docs for details.

* [PDF/A] add OutputProfiler.setJustNoticeableDifference() method, to allow
  control over the threshold above which two colors are deemed to be different.

* [PDF/A] identify images that are damaged or truncated with the "ImageDamaged"
  feature, and disallow it for PDF/A-1 or later.

* [PDF/A] Check for truncated image data when looking for file damage, and
  repair it if required (this improves PDF/A compatibility with Acrobat).

* [PDF/A] Check for damage or truncatation to glyphs, and treat them as missing.

* [PDFA] Separations "All" and "None" are not exempt from the requirements
  against redefinition of Separations in PDF/X-4 and PDF/A-4, even though ISO32K
  does not require this. New RedefinedSeparationAll feature will identify and
  repair these. [https://github.com/pdf-association/pdf-issues/issues/168]

* [PDFA] Made timezones on metadata dates a requirement for PDF/A-1, based on
  PDFA TWG discussions. It's not a requirement for PDF/A-2 and later.

* [PDFA] While PDFA TWG determines whether invalid "colr" box in JPX images is
  significant when there is a ColorSpace on the stream, add a feature to
  identify and repair it if required (JPXNotBaselineColr)
  [https://github.com/pdf-association/pdf-issues/issues/167]

* [PDFA] Correctly convert JPX images containing alpha channels to non-JPX
  compression for PDFA1

* [PDFA] Finally clarified distinction on CIDSet requirements between PDFA1 and
  PDFA2+3, and handle both as required - this slightly relaxes the requirements
  for PDFA1. Fixed a bug to with double-encoding names in the related CharSet
  structure, which could result in some valid PDFA1 files identified as invalid.

* [PDFA] special handling to remove insane multi-MB data URLs added as URL
  actions by PrinceXML.

* [PDFA] find invalid ICC profiles used as transparency-group ColorSpaces

* [PDFA] Annotation C and IC colors are handled correctly in terms of their
  PDF/A requirements A [https://github.com/pdf-association/pdf-issues/issues/34]

* Fixed StackOverflowError when parsing PostScript containing a string that had
  been marked as not-readable: the the Exception includes the value, which is
  not readable so we thrown an Exception, and so on.

* Several dozen small fixes due to further bulletproofing against Apache Tika
  after converting all 33000+ files to PDF/A.

* Fixed redaction issue when resources with same name in XObjects could result
  in incorrect (although still redacted) content being written to the page.

* Work around odd bug in Java XML parser where trailing processing-instructions
  will (very rarely and depending on the parse state) throw a SAX failure.

* Fix failure to verify second-signature in files with PDF Articles.

* Fixed a bug where trying to justify text comprising a simple space character
  would fail.

* Fixed threading issue relating to traversing EmbeddedFiles

* Improved support for (interim) PDF/UA-2 spec.

* Viewer: fixed occasional Exception from race condition in Thumbnail teardown.

* Viewer: added workaround for odd issue relating to use of temporary files
  when saving to (some) Windows Network files.



2.26.5 (released 2022-07-04)
-------------------------------
* The Jars are now signed with SHA256 rather than SHA1

* Allow signatures that have just been signed to be queried via the various
  "get" methods  methods.

* Add a check for the "zero-value EC signature" issue fixed in 
  https://nvd.nist.gov/vuln/detail/CVE-2022-21449 - although we recommend
  upgrading the JVM to fix this, this patch ensures that even older JVMs will
  never validate this type of signature if its found in a PDF.

* Improvements to the preflight process for large embedded fonts, eg those
  used for Chinese, to stop the widths array growing too large for PDF/A.

* Improvements to the workaround we have to do when 2-byte font are used in
  Form fields, which will reduce memory footprint for large forms.

* Fixed subtle issue converting tiling-patterns with "general" transforms
  applied to them that could cause them to render to bitmap incorrectly

* Fixed an issue when merging Structure trees from two documents; iteration over
  a HashMap was causing random errors in the generated tree.

* We were incorrectly identifying some content as being part of a nested
  marked-content sequence, which is invalid in PDF/UA.

* PDFCanvas.beginTag() will now accept a "ref" attribute which is a space
  separated list of ids (or uuids) of other nodes, to be converted to the PDF2
  "Ref" property on the element. Also cleanup name atts (eg Table:Scope)
  which had values set with incorrect leading slashes.

* Consistently choose the correct rendering intent from ICC ColorSpaces when
  converting to PNG

* Minor tweaks to OutputProfile in anticipation of PDF/UA-2

* Fail (rather then loop forever) when attempting to load an invalid collection
  index from a WOFF font

* Don't fail when creating an AnnotationShape that has no area.

* Set the appropriate feature when private-use range text is added to the PDF.

* Minor bulletproofing to let us to work with some more types of damaged files



2.26.4 (released 2022-03-17)
-------------------------------
* The "Resource Merge" step which can be used to potentially reduce the size
  of files assembled from multiple smaller documents was sometimes writing
  out fonts with a ToUnicode that was incomplete, or failing to identify
  duplicate glyphs because the originals came from fonts with a different
  "longloc" flag. Both now fixed.

* Some very specific workflows could lead to a synchronization lock when
  reading PDFBookmarks - reworked these classes to make it impossible.

* Fixed exception rendering a PDF when the XMP object has been explicitly
  disabled from the output.

* Added PDFImage.setStrictDPI() to mimic the image DPI extraction rules from
  HTML5

* Don't fail when preflighting a PDF containing form fields with no font set.

* Re-rendering a signed PDF that was missing a trailing newline is fixed.



2.26.3 (released 2022-02-16)
-------------------------------
* Added PDFPage.createGraphics() and PDFCanvas.createGraphics(), to return
  a java.awt.Graphics2D object that can be used to write to the page or canvas.
  See PDFCanvas.createGraphics for details on this.

* Fixed regression in 2.26 relating to image scaling; when on a workflow that
  runs two passes over the page (namely, printing), a transform applied to
  bitmap images was applied twice - only noticable with anamorphic scaling.
  Symptoms often included a blank or damaged page when printing.

* Added XMP.setValidating() method to allow unknown XMP properties to be set
  without failing (known properties must still be of the correct type). This
  makes things a bit more useful for PDF/A-4, which no longer uses extension
  schemeas.

* Fixed silly problem with PDF/A-1 validation - we were ignoring trailing noise
  in any Info Dictionary dates, causing us to pass some invalid files as valid.

* Fixed a very specific issue when PDF/A conversion when no substitute fonts
  are available for a Type1 font inside a Type3 font.

* The StandardEncryptionHandler was failing to decrypt files if bit 31 was not
  set as required in the specification.

* Fixed a complaint about "this page is not in the PDF" when merging files that
  contains bookmarks and a structure tree.

* OutputProfiler: added a "getStrategy() method; added new "PartialPages"
  strategy to render what we can from fatally damaged pages; ensure we only
  throw ProfileComplianceException when conversion fails; allow rasterized
  pages to be quantized to 8-bit via setCompressionOptions().

* XMP.getData() will include the namespace for unknown fields. Added an
  XMP.addAll() method to merge XMP objects. Added an XMP.repair() for when the
  repair to an XMP needs to be run manually, is it might be for an image XMP.

* Fixed obscure threading issue when rendering OpenTypeFonts that are shared
  across PDFs (which we don't recommend).

* More fixes for another batch of difficult documents to ensure we handle
  various types of corruption as nicely as possible.

* Extraction of XMP metadata from PNG and JP2 images had never worked - fixed.

* Improvements to the code matching XFA form fields to the Acroform fields.

* Fixed exception when cloning a PDF then accessing the clones bookmarks.
  
* Some fixes to ensure that brand new PDF files are created in a way that is
  generally compliant with PDF/A (fixes to Type3 fonts, canvas cloning,
  DeviceNColorSpace)

* Made various changes internally to allow projects using the API to be compiled
  to native code using the GraalVM project. Mostly this was removing any use of
  Serialization, which was used internally in some places to store state.

* Viewer: fixed the code for generating self-signed certificates added in the
  previous release to replace the calls to the internal sun classes.



2.26.2 (released 2021-11-11)
-------------------------------
* Tested and verified with Java 17, dropped support for Java 5, and removed all
  support for Applets from viewer package. Note that JavaScript is NOT currently
  supported under Java 17; this is planned for a future release.

* Reduced the memory required to load TrueType and (in particular) OpenType
  fonts, and delayed the instantiation of some of the data we need until the
  font is used. These changes makes it cheaper to load fonts that may not be
  used.

* Added support for UTF-8 ECI mode to QR-Code, which means any UTF-8 character
  can be encoded. Reader support for this feature is common but not universal;
  we will only use it if no other encoding option for that character applies.

* Adjusted the font selection algorithm in Preflight to favour smaller fonts.

* When preflighting, certain types of damage no longer results in the page being
  rasterized.

* When preflighting, reduce memory footprint for fonts that use 16-bit identity
  lookups for their ToUnicode structures (a regression in 2.26).

* The method OutputProfile.getICCColorSpaces(), added in 2.26, was promptly
  broken in the following release and always returned an empty list. Fixed.

* Fixed exception when justifying a LayoutBox line with only a single character.

* When merging multiple structured documents, some tree structures could result
  in first level of the tree being sorted incorrectly. Now fixed.

* Fixed bug introduced in 2.26 that prevented us creating a PDFCanvas from a
  PDFPage that had disabled optional content.

* Added support for WOFF2 collections.

* Fixed some bugs relating to OpenType color fonts

* Minor fixes to some XMP namespaces.

* Worked around an AWT bug on Linux relating to rasterizing PDFs; non-embedded
  fonts are rendered with a java.awt.Font, and a bug introduced in 11.0.4 (we
  suspect related to the Harfbuzz upgrade; it's still present in 17.0.1) causes
  diacritics on the text to be mis-positioned.
  (ref https://bugs.java.com/bugdatabase/view_bug.do?bug_id=JDK-8277333)

* Viewer: got rid of legacy "AppleSupport" class, replaced with general
  "DesktopSupport" for integration with the java.awt.desktop package.
  Theoretically this could apply on platforms other than macOS.

* Viewer: the KeyStoreSignatureProvider.X509SignatureState class has a method,
  getCertificate(), which was confusingly named. Deprecated, and added
  getSigningCertificate() and getUnverifiableCertificate() to remove ambiguity.



2.26.1 (released 2021-09-30)
-------------------------------
* Fixes for NameTree/NumberTree structures with > 8191 elements; we were not
  splitting these into smaller sections correctly

* Vastly improved error logging, in particular during PDFReader stage - warnings
  are consistent and generally don't include stacktraces where they won't help.

* Signatures: added support for RSA-PSS, Gost1360/1361, ECDSA signatures in IEEE
  P1363 format; added several workarounds for non-standard PKCS#7 variations if
  supported by Acrobat; fixes for unexpected variations of OCSP responses.

* When preflighting and we have to rasterize, and the resulting image has no
  color pixels, convert to grayscale.

* Add OutputProfiler.setRasterizingActionExecutorService, to allow the
  rasterizing stage of PDF/A conversion to be run in parallel.

* Ensure OutputProfiler.apply() can be interrupted with OutputProfiler.cancel(),
  and ensure that we return at least the semblance of something useful from
  OutputProfiler.getProgress() while apply is running.

* Fixed handling of XMP values that consist only of space characters, and of
  lists of invalid values which would cause nulls to get into the datastructure.

* Fixed issue where Template pages containing form fields were losing their
  fields. Fixed issue where multiple copies of a Widget in a Field's list was
  not being repaired properly.

* Added support for PDFs using non-standard UTF16LE encoding in Text Strings
  (eg Bookmark labels, Optional Content layer names, annotation text etc).
  This encoding is not in spec but is supported in Acrobat, and not uncommon. 

* Fixed concurrency issue relating to the retrieval of names from CFF fonts,
  which could cause features relating to incomplete CharSets to incorrectly be
  set when profiling a PDF. Seemed to be quite rare in practice.
  
* Added rare but required standard CMap "V" and less-rare but non-standard UTF8
  CMaps to the set included with the PDF API.

* When choosing an ICC profile for use as a target profile, exclude profiles
  that are missing the B2A tables: we can't convert colors TO that type of profile

* We were supposed to be updating the xmpMM:InstanceId and "secondary" trailer
  document ID to a new random number on each save, but we broke this two
  releases ago. Now fixed.

* Many corrections to PDF/A-4 profile, in particular regarding color, actions
  and the many ways a PDF version number can be invalid. Many new features
  added. Many more very specific tweaks for various edge cases where our PDFA3
  results disagreed with veraPDF and Acrobat.

* Finished bulletproofing against Apache Tika and GovDocs - 50,000+ files.
  Many weird edgecases fixed (timezones of UTC+73 hours, pages over 600km on
  each side, Type3 fonts with negative glyph widths), and quite a few less weird
  ones too. All files load and parse where possible, or fail with an explanation
  otherwise.

* Correct identification of "font missing unicode values" for PDF/UA and
  PDF/A-na profiles.

* Fixes in a few workflows (text extraction, preflight) where fontsize=0

* Corrected rendering when rasterizing a page that contains a tiling pattern
  that overlaps itself. Result is a bit slower, but appears correct.

* Where a PDF had thousands of fonts sharing one font file, we created thousands
  of parsed fonts, which did not end well. Now we create one.

* Tweaks to the XMP output. Fixed type definition of Iptc4xmpCore:ContactInfo,
  and reflect that exif:MarkerNote was dropped in 2005 edition of spec

* Updated the bfopdf-jj2000.jar to qualify an earlier fix which was breaking the
  loading of JPX streams under some conditions.



2.26 (released 2021-07-30)
-------------------------------
* The OutputProfiler class has been extensively rewritten to allow conversion
  from any PDF to PDF/A. As part of this change some incompatible changes were
  required to parts of the API: 
  -- the OutputProfiler.ColorAction interface had some methods added
     (implementers can just return null) and the ProcessColorAction
     implementation had a method removed (setAllowUncalibrated).
  -- the OutputIntent class has been added, and some of the methods working
     with OutputIntents in the OutputProfile class deprecated (although they
     still function).
  See http://bfo.com/blog/tags/preflight for details on this significant change

* Changed the EmbeddedFile.getSize() method to return a long rather than an int.

* Considerable performance improvements in a few areas; some operations, eg
  PDF/A profiling and certificate signature validations, should be quite a
  bit faster.

* A lot of "bulletproofing" has been applied to ensure difficult files can be
  processed, identify loops and over-allocations early, and where we have to,
  throw sensible exceptions.

* New methods on EmbeddedFile to manage folders as well as files; to manage
  modify/creation dates as Calendars (to preserve timezone information); to
  manage user-specified data; and to help track PDFs embedded in PDFs.
  Relates to the next item, and to the new "EmbeddedFile" display in the viewer.

* Added the Portfolio class and the PDF.getPortfolio() method, to manage PDF
  portfolios (also known as PDFs that are mostly a tree of file attachments).

* The PDF.getXMP method now always returns a non-null value, as XMP objects now
  have isValid() and isEmpty() methods, so can be used to represent invalid XMP.
  PDFCanvas, PDFSound, PDFPage, PDFAnnotation, ICCColorSpace classes now have a
  getXMP() method to augment the legacy get/setMetaData methods.

* XMP metadata and EmbeddedFiles can be associated with elements in the Structure
  Tree. New methods in the OutputProfile allow retrieval of XMP (getXMPs()) and
  EmbeddedFiles (getAssociatedFiles()) from anywhere in the document

* OutputProfiling was previously checking the XMP metadata on the PDF for
  compliance; we are now correctly checking all XMP metadata in the file.

* Made some slight corrections to the PDF/A-1, A-2 and A-3 profiles, in
  particular to ensure we disallow undefined fields in XMP complex types; we
  believed this was allowed, but have since confirmed it is not.

* When creating LTV signatures, we were caching OCSP responses with no explicit
  expiry time for this for 24 hours. Changed to 5 minutes, to match Acrobat.

* Removed an unneeded synchronization lock when verifying signatures, to allow
  this to be done in parallel with most other operations, eg PDF/A validation

* When signing, check the KeyUsage of the key and reject it if it's going to be
  rejected by Acrobat. This can be overridden by setting the
  org.faceless.pdf2.IgnoreKeyUsage property

* We were accidentally dropping the timezone from the date when we create a
  DSS signature validation; now fixed.

* We were not correctly recognising signed digital signatures that have no
  annotation (the presence of an annotation is an unofficial requirement)

* Fix potential infinite loop when rendering a PDF with the ResourceMerge
  feature set, and rendering was running in a single thread.

* Fixes for OpenType CID fonts where CID!=GID and OpenType GSUB substitutions
  are used; we were using the wrong lookup.

* Viewer: the SidePanelFactory.isSidePanelRequired() method has changed
  signature to take a DocumentPanel rather than a PDF. The original PDF can
  be retrieved by caling DocumentPanel.getPDF();

* Viewer: moved most of the constants out into a PropertyFile that is compatible
  with the FlatLAF property file syntax. This should allow easier customization,
  including new icon packs, different margins/paddings on buttons etc.
  See Util.installUIDefaults() method for detail.

* Viewer: general refresh to some of the UIs, specifically the Signature and
  Thumbnail side panels.

* Viewer: Added an EmbeddedFile side panel, and support hyperlinks linking to
  embedded files.

* Viewer: Added support for WebSwing, to display the Swing application as a 
  web application. Added RemoteControl, OpenSystem and PrintSystem features to
  support this.

* Added ConvertToPDFA example

* Removed pack200 version of Jar.



2.25.1 (released 2021-03-30)
-------------------------------
* Fixed rookie error when comparing timezones that may cause newly created PDF/A
  or PDF/X documents to fail when the local timezone switches to summer time.
  This one was introduced in 2.24.1, released in December.

* Correctly generate PDF/A documents with more than 8191 pages.

* We weren't properly handling rendering for some old Type 1 fonts where the
  ".notdef" glyph wasn't CID 0. Also added recovery for some even older Type 1s
  with noise at the end of some of the streams.

* Better recovery from noise at the end of a page/content stream.

* Optimizations for Sampled Functions with large numbers of input parameters.
  While rare, these were extremely slow so had an outsized impact on average
  performance.

* Optimizations for common cases when recoloring images during preflight.

* Fixed bug where OutputProfiler.FontAction may not correctly substitute a font,
  introduced in 2.24.3

* Corrected verification of LTV Signature DSS dictionaries when PDF is
  encrypted.

* Include OCSP/CRL certificates for the Time Stamp in the DSS dictionary for
  LTV validation informaton.

* Don't stack overflow exception when asked to display a form field with
  128KB of binary data. Please don't make form fields like this.

* Fix NPE when linearizing existing PDFs that have a missing (rather than empty)
  page content stream - this was a regression introduced in the previous release.

* Viewer: fixed some issues with the Page Number field when switching between
  two different documents.

* Viewer: some bulletproofing to handle cases where pages are removed from a
  PDF and those pages contain form fields.

* Viewer: bulletproofing for pages containing form fields when switching to
  full-screen



2.25 (released 2021-02-26)
-------------------------------
* The PKCS7SignatureHander.SigningEngine interface has a new setPassword()
  method, required for some types of PKCS#11. This is only an issue if you're
  implementing this interface, which most won't. But it is a breaking change,
  and the reason we jumped to 2.25

* Significant reductions in memory footprint for the entire API, thanks to some
  fairly nasty low level optimizations of some basic types. To quantify this,
  profiling shows the amount of memory required to load a 1000 page document
  with many annotations has dropped by about 20%.

* Huge reduction in memory footprint when creating linearized documents, over
  90% for some very large testcases. The tradeoff is a minimal increase in
  runtime, which we've been unable to notice in practice - although this can
  be disabled by setting the "org.faceless.pdf2.LinearizedSinglePass" property
  to not-null.

* Fixes to the linearization structure for "old-style" documents where the first
  page opened is not page 1. Wider fixes to the same structures for "compressed
  xref" documents.

* The sRGB profile we have been embedding in PDFs for many years is not quite
  accurate. Replaced with the compact, public-domain profile from
  https://github.com/saucecontrol/Compact-ICC-Profiles. This may result in a
  very slight shift in colors for any PDF generated by the API. We were also
  using the modified D50 constant from the ICC specification, not the correct
  CIE constant. Fix has resulted in a barely perceptible shift in brightness
  when rendering some PDF documents to bitmap images.

* Officially added PDF/A-4 profiles to OutputProfile class, and tweaked a few
  features as a result.

* Fail during render() when creating a PDF/A-1,2 or 3 PDF that has object
  pointers greater than the maximum integer value in those specs (approx 2GB)

* Quite a few fixes to XMP
  * Added Value.clone(XMP) method, to deep-copy a value to allow it to be copied
    from one XMP to another.
  * Added Property.isDefinedIn() method, to show in which version of the XMP
    standard a property is defined, and Property.isValid() method.
  * Escape only control character during serialization, not all non-ASCII chars.
  * Ensure that all XMP values contain only characters allowed in XML1.1
  * Ensure TimeZone-free dates don't suddenly aquire one when they're migrated.
  * Fixed creation of PDF/A extension schema Type when type is a closed choice
  * Correctly identify empty-dates and lang-free Lang-Alts as type mismatches.
  * Correctly reset OutputProfile features when properties are removed.
  * Identify and repair a particular type of damage to rdf:li.
  * Fixed "clear()" method which wasn't clearing everything.

* Fix for an unusual combination of encryption settings relating to the
  long-deprecated 40-bit RC4 algorithm.

* Fix to sin/cos functions in our optimized PostScript Function parser.

* Added PDFDrawable.setDefaultColorSpace, to allow Device Gray/RGB/CMYK to be
  anchored to a calibrated space on a per-page basis.

* Some very large patterns accidentally fell off the optimized path when
  rendering, which slowed down rendering considerably. Now fixed.

* Cloning a PDF after its Structure Tree had been extracted for any reason,
  didn't always correctly sever the two documents. Now fixed.

* Minor fixes to OptionalContent layers with exclusions (i.e. "radio-button"
  groups).

* Fix for PKCS#11 signatures where the native PKCS#11 library enforces the
  "relogin before signing" requirement, which we hadn't implemented properly.

* Fixed bug in WOFF2 parser causing us to miscalculate the glyph box, which
  sometimes resulted in glyphs being positioned incorrectly on the page.

* Fixed obscure bug in Type2 (CFF) outline parser that was only visible if
  the text was being stroked, not filled. Regenerate CFF BBox if the value
  loaded from the font is invalid, as Acrobat requires it.

* Extended the number and type of repairs we're able to perform on a
  StructureTree to bring a document into PDF/UA compliance. Fixes for some
  edge cases relating to the PDF2.0 "Artifact" element.

* Fixed generation of MeshGradients in Lab colorspaces.
  
* Viewer: added "ignoreDocumentPageMode" option, to ignore the document "page
  mode" option when opening a PDF.



2.24.4 (released 2020-12-11)
-------------------------------
* New XMP class to make working with XMP metadata much easier. The XMP metadata
  we generate now includes DocumentID and InstanceID. Added support for RelaxNG
  schema use with XMP, as used by PDF/A-4.

* Lots of small fixes to bring our PDF/UA-1 validation into agreement with the
  veraPDF corpus. Now completely aligned with their results (except for a few
  tests with confirmed or under-discussion errors in them).

* FormSignature has getByteRangeCovered(), to make creation of signatures from
  an asynchronous signing service (like SwissCom's new service) a bit easier.

* AcrobatSignatureHandlerFactory has a new "setTimeStampServers" method, to
  allow more than one TSA server to be used, for failover.

* New get/putUserData() methods on PDF, PDFPage, PDFAnnotation and EmbeddedFile,
  to allow storage of your custom properties within a PDF.

* When a beginTag/endTag sequence is issued and there's no content between
  them, include an empty content item so that the tags are anchored to that
  page and will be moved with them.

* When migrating pages between documents that have tags, we also move any tags
  that refer to content on the migrated pages. Now, also move empty sibling
  tags at the same time.

* Added magic "phoneme" and "phonetic-alphabet" attributes for tags, to store
  PDF 2.0 pronunciation hints. Added new "lexicons" DOM config option to
  StructureTree, to store a PLS-format pronunciation dictionary.

* Fixed specific issue relating to a particular interleave of beginTag/endTag,
  text and canvas that was causing an NPE. And a similar issue where a
  particular nesting of tags inside an Artifact would cause an exception.

* Applying an OutputProfile with a CMYK intent to a PDF with DeviceRGB content
  where the combination was disallowed, didn't always fail (and vice versa).
  Now fixed. We also report on this in OutputProfile.isCompatibleWith()

* Fixed translation of shading/tiling patterns when creating a PDFCanvas from a
  PDFPage, if the page had a non-zero origin MediaBox or page orientation.

* Changing the alpha value between text runs didn't flush the text; now fixed.

* Slight improvement to the position of text in annotations where not enough
  space is available.

* Added ITF-14 Barcode Symbology

* Fixed a bug in the ICCv4.3 "lutAtoBType" table handler, which was causing some
  of the GWG tests to fail to render.

* Fixed some poor synchronization in getNamedActions.

* The position of underlines was out by the width of a line; fixed.

* Fixed scaling of bitmaps in OpenType CBDT fonts

* Fixed ToUnicode creation for Type3 fonts.

* Viewer: ensure we call "documentEnabled" on all actions in features, not
  just those created by the standard ViewerFeature.setAction() method.



2.24.3 (released 2020-07-10)
-------------------------------
* Added support for Khmer and Myanmar Unicode blocks, the last two scripts
  requiring special handling for layout.

* Optimizations for OpenType-CFF parsing - on large fonts like Noto Serif CJK,
  speed is almost doubled.

* Make sure we can handle characters defined in versions of Unicode ahead of
  the version supported by the JVM. Updated internal model to Unicode 13.0

* When rendering non-embedded CJK text to a bitmap on Linux, look for the Noto
  fonts on the OS as an option. Also, don't believe the AWT when it tells us that
  a glyph is defined in a Font (because, often, it's wrong). This should fix the
  occasional blank space where some dingbat characters should be.

* Added support for preflighting and generating PDF/X-4 documents.

* Added support for setting and getting ISO19593 processing steps to Optional 
  Content layers.

* Some compatibility issues had got into the code that prevented it from running
  under Java 5. Now fixed.

* XMP metadata can be set and retrieved from fonts (it's extracted automatically
  from WOFF/WOFF2 fonts if present), elements in the StructureNode (if the
  bfo:metadata property is true, call element.getUserData("metadata") to 
  retrieve), Optional Content layers and ICCColorSpace objects.

* When manipulating OutputProfiles, don't lose the Output Intent.

* Added support for extracting Color Separations from the OutputProfile

* The Reader returned from the various "getMetaData" methods will always return
  the metadata as a String from toString(), so you can just do 
  pdf.getMetadata().toString() to extract it in one line.

* Fixed JavaScript support for Java 11/14. We are still using the deprecated
  Nashorn engine, as that continues to work under Java 14.

* Some tweaks to PDF/UA validation to align with the expectations set by the
  latest version of the reference suite.

* Some fixes for text extraction from fonts embedded with 0/1 cmaps. When
  extracting text with no semantic meaning, assign the private-use area
  characters based on the CID, not based on the order we encounter them, which
  was non-deterministic as this is multi-threaded.

* Some fixes to links-to-structure-destinations, added in last release, and
  added support for creating links to embedded files.

* Throw "ProfileComplianceException" (a subclass) rather than plain old
  IllegalStateException when trying to do something that is disallowed by an
  OutputProfile. This allows us to add more context to the exception.

* Allow a "forced" PDF version number to be set when writing the PDF. While
  this shouldn't be required, ever, there are some workflows that require a
  specific version number, so this change caters for them.

* Viewer: when importing a non-PDF file (eg a TIFF) into the viewer, we now
  disable the Save button, but initialize the filename to the matching PDF for
  SaveAs (the Save feature can be re-enabed for new files, see the API docs).

* Viewer: the SaveAs feature has the option of only allowing the PDF format,
  and a new "Export" feature can be added to the viewer to save in non-PDF
  formats.



2.24.2 (released 2020-06-01)
-------------------------------
* ToUnicode maps for OpenType fonts have been improved, and should now reflect
  any OpenType glyph substitutions.

* The PDF Library now ships with some free OpenType fonts that are identical to
  the StandardFonts in every metric. These will be substituted by the 
  OutputProfile.AutoEmbeddingFontAction, resulting in visually identical PDF
  but without the unembedded fonts.

* Fixed the use of OpenType-CFF fonts in forms.

* Added a new feature "OverprintOff", which can be set to denied to modify
  the PDF so it can be safely drawn as a canvas without knocking out any ink
  behind it.

* Fixed OutputProfiler.ColorAction rebuilding of Type 1 shading patterns.

* Added a new feature "DoubleCompression", which will remove a second
  compression from image streams that have been compressed twice. This could
  trigger a bug in Acrobat causing the images to turn bright pink ("My Little
  Pony" documents).

* Some fixes to the StructureTree to make the structure it generates work a bit
  better with the NVDA screen reader.

* Moved around some low-level features used in the OutputProfile to ensure we
  have one for every combnation of alt-text on link, annot and form StructElems.

* It's now possible to create a "Tree" of OptionalContent layers, rather than 
  just a list, with the new OptionalContentLayer.getOptionalContentLayers()
  method.

* Added the ability to embed video and 3D models to AnnotationRichMedia.

* PDFAnnotations can now be part of an OptionalContent layer

* PDFAnnotations can now have Locales and Associated Files (both new in PDF2)

* Cloning a PDF that uses embedded fonts within form-fields, and then filling
  the fields and saving the PDF with "merge resources" could result in the
  fonts being saved incorrectly.

* Updated eiDAS trusted keystore to latest certificates

* "Optimization" added in 2.23.2 to reduce memory footprint of Noto fonts traded
  away too much speed for memory; Reverted most of it.

* Fixed off-by-one error that could rarely result in the API creating a
  ToUnicode map that garbled some letters on text extraction. Font specific.

* Added support for GoTo actions to Structure Elements, part of PDF2 and likely
  required for PDF/UA-2

* Fix bug where sharing a PDFCanvas across two different PDFs could muddle some
  aspects of the the OutputProfiles, causing the later PDFs to not be PDF/UA.

* Fix position of distinct but adjacent runs of text where the text was 
  stretched.

* Fixed clipping of mask on shading patterns.

* Fixes for CFF fonts that don't terminate their real-numbers properly.

* Fixed truncation during removal of 1-bit predictor stream on 8-bit streams.

* Some fixes specific to math text layout.

* Fix for longstanding issue with a particular type of "WAV" format in PDFSound.

* Viewer: added PropertyChangeEvents to all ViewerFeatures (currently only the
  "enabled" change event is fired, to notify when a feature is enabled/disabled.

* Viewer: change icon when dragging document into the viewer to the "copy" icon,
  not the "move" icon.



2.24.1 (released 2020-03-20)
-------------------------------
* Verified as working against Java 14

* Several fixes in the "Structure Tree" classes to more accurately represent
  the way namespaces are used in PDF 2.0. Added the ability to set namespaces
  in the "role-map" - see PDF.getStructureTree for detail.

* Added ability to get/set properties in the StructureTree "class-map", again
  see PDF.getStructureTree for detail.

* Improved repair of StructureTree when pages contain hyperlinks to pages that
  have been removed before saving.

* Changed the way text is extracted from the PDF from an adhoc mix of rules,
  to match *exactly* the "AGL" specification recently published by Adobe.
  Some older documents where the text is not encoded correctly may regress,
  others will have their text extraction improved.

* Fixes bugs and reduced size of ToUnicode maps extending beyond the BMP.

* Optimizations for reading PDFs with millions of pages.

* Fixed an issue where PDFs with multiple revisions could be written in such
  a way as to trigger error messages in Acrobat.

* Added parsing of Math tables from OpenType fonts, and some support methods
  for this in PDFGlyphVector to kern super/subscripts correctly.

* Added support for OpenType Color fonts using the Microsoft "COLR" table.
  See the OpenTypeFont.Palette interface for details.

* Fixes for WOFF2 fonts, fixes for non-latin encodings used in font-names,
  fixed font bounds calculations when reading fonts from a URL, fix font
  bounds where the font specifies USE_TYPO_METRICS.

* Fixed errors applying kerning to text from OpenType fonts where the text
  is made of multiple scripts, eg hiragana and kanji

* Correctly handle gradients where stop colors are in a mix of ColorSpaces.

* The validity state of the middle signatures in a document with three or more
  digital signatures was sometimes incorrect. Now correctly consider changes
  applied in all revisions after the signature.

* Correctly orientate digital signatures on pages with the "Rotate" flag set.

* Parse and generate the PDF 2 "Path" entry for shape annotations, to represent
  a shape with curves without having to flatten it to straight line segments.

* Viewer: we weren't correctly recognising PDF 2.0 documents!

* Viewer: AbstractRegionSelector.setRegionShape to allow selecting different
  types of region, e.g. a fixed size box, a point, a single line and so on.
  SelectArea (which extends this class) also gets methods to optionally
  prevent the shape being moved, resized or extended beyond the page.

* Viewer: source code cleanup to remove some "lint" warnings that can be 
  turned on in javac.



2.24 (released 2019-12-04)
-------------------------------
* INCOMPATIBLE CHANGE: Support for the PDF "structure tree" required by
  PDF/An-a and PDF/UA has been completely reworked in this release, primarily
  to improve PDF/UA support and add support for XML namespaces, new in PDF 2.0.
  As a result some of the PDF/UA specific features in the OutputProfile class
  have been removed and replaced with others that are more accurate and better
  reflect a world with both PDF 1.x and 2.x.

  In the event that your code refers to individual features by name, rather
  than simply as part of the large PDF/UA profile, you'll need to make code
  changes. Contact support@bfo.com for guidance on this.

* INCOMPATIBLE CHANGE: some compatibility names for attributes have been
  dropped from the map that can be supplied to the "beginTag" method in PDFPage,
  PDFCanvas and LayoutBox (for example, "ID" is no longer a synonym for "id",
  and "Scope" not longer a synonym for "Table:Scope"). Consult the
  PDFCanvas.beginTag API docs for details.

* Added the PDF.getStructureTree() method as a simpler synonym for the same
  method on PDFParser. The returned Document is now live, and can be manipulated
  to modify the PDF's logical structure. This means that merging two documents
  that each have a logical structure is easier; where we don't get the structure
  right automatically, it's possible to modify the tree with the regular Java
  XML packages.

* Completely redid the PDF/UA profile. Finer grained reporting of invalid
  structures has been added, giving the ability to selectively disable those
  tests deemed a bit too "strong".  Creation and validation of PDF/UA documents
  should be a lot more correct.

* Fixed an issue introduced in 2.23.2 which would rarely result in text
  disappearing or errors in Acrobat. We'd partially fixed it a while back but
  never identified the root cause, an undocumented requirement in Acrobat.
  Now finally fixed for good.

* Fix an issue loading linearization tables as created by Oracle, resulting in
  our API complaining the linearization was damaged.

* Audited and removed many changes that were happening unnecessarily, to reduce
  the number of object marked as changed when saving a PDF that previously had
  a digital signature.

* Optimizations to OpenTypeFont layout should result in 10% faster text layout
  when making heavy use of GSUB/GPOS tables.

* Added ability to load OpenTypeFont that consist only of a CMap and CFF table,
  as generated by Adobe Illustrator 12.0



2.23.7 (released 2019-09-27)
-------------------------------
* Improve our best guess as to exactly what Acrobat is doing when validating
  PAdES signatures.

* Fixes to signing and verifying PAdES LTV signatures. We will now
  download missing CA certificates rather than just complaining they're
  missing.

* Fixed regression introduced in 2.23.4 which could result in text not being
  displayed properly if the canvas was flushed at a particular stage in the
  workflow.

* Include a list of "trusted root certificates" with the API, accessible from 
  FormSignature.loadTrustedKeyStore(). This currently includes the root
  certificates required to validate signatures signed under the EU eiDAS
  regulations. This is why the Jar is 2MB larger than the last release.

* Add a new "FN1" warning which is displayed when a font is being shared
  across multiple threads in a dangerous manner.

* Fixed final issues reading WOFF2 format fonts - now passing all WPT tests.

* Fixes relating to correctly identifying the end of an inline-image where the
  image has been intentionally truncated, rather than truncated due to damage.

* Fixes for a number of XFA issues.

* Fixed obscure deadlock when loading linearized PDFs from a web-server.

* Fixed ICC profiles that use the same Matrix as sRGB but a different gamma
  curve; these were mistakenly being identified as sRGB, resulting in slightly
  incorrect colors when rendering to a bitmap.

* Fix for PDFCanvas.drawPolygon where the polygon only has two points.

* Fixed some issues to do with logical structure creation in PDF, which
  manifested by some of the text in Acrobat not highlighting correctly, or not 
  being available to edit when "Edit PDF" is selected.

* Fix an issue parsing Type1 fonts where the PostScript actually defines
  multiple fonts, as seen in a document created by Cairo engine.

* Viewer: Fixed Save button becoming disabled if a Save fails under particular
  circumstances.

* Viewer: Fixed "gray box" sometimes occurring when a thumbnail panel is moved
  around in the viewer (regression introduced 2.22)

* Viewer: Fixed visual issues painting annotations at relatively high zoom
  levels, a regression introduced in 2.23.4

* Viewer: Fixed some exceptions resulting from races during closing.

* Viewer: don't close the parent frame when closing the PDFViewer unless we
  created it.

* Viewer: fix issue which prevented the KeyStoreManager from working with
  custom KeyStore types (regression introduced 2.23.5)

* Viewer: ensure callback to listener passed to PDFViewer.loadPDF() is called
  after all other callbacks.

* Viewer: fix issue where deleting a page via the thumbnails panel could result
  in an incorrect selection.



2.23.6 (released 2019-08-30)
-------------------------------
* Added the Ideographic Variation Selector list to the characters supported by
  the Japanese StandardCJK fonts. Variation Selectors will also be silently
  skipped where not available.

* Fixed regression introduced in 2.23.2 relating to the way text was marked
  up within a Structure Tree, which resulted in gaps when text was selected in
  in Acrobat.

* Fixed some issues with Kashida justification for arabic.

* Fix for a particular type of gradient containing a hard color transition.

* Fix for very rare, PDF-only variation on CCITT.G4 that interleaves image data
  with normally invalid EOL markers (as made by Xerox Workcenter 7120).

* It's now possible to synthesize the various Unicode space characters and the
  Unicode U+2011 and U+2010 (hyphen and nbhyphen) from a regular space and
  regular hyphen/minus by setting an appropriate font-feature value.

* Fix for 2D sampled shading functions.

* Fix for issue reading inline images where the data has been deliberately
  truncated early.

* Fixed an issue where Shading patterns could be damaged when preflighting
  a document.

* Better text extraction for common Adobe InDesign method of embedding fonts.

* Ensure superscript/subscript versions of the style have the same underline
  and strikeout positions as the originals.

* Fix deadlock when loading using the "linearized" loader.

* Fix for XFA when datasets contains attributes with namespaces, fix for some
  XFA binding issues, and performance enhancements for XFA datasets loading.



2.23.5 (released 2019-07-31)
-------------------------------
* Added FormSignature.addAnnotation() method that takes a PDFCanvas for
  the appearance stream, as an alternative to setting it on the factory

* Added OptionalContentLayer class, PDFCanvas.setOptionalContentDescriptor()
  and PDF.getOptionalContentLayers() methods to allow creating and editing
  optional content layers in the PDF.

* Fixed bug in BarCode which could result in 1D barcodes (Code128 etc)
  being assigned the wrong height if the the "setWidth" method is called to
  resize them.

* Work around some bugs in Acrobat when form fields use a variety of fonts.
  Improvements to the way buttons with images are written out.

* Fixed LayoutBox.getText() value if the text in question has been split
  onto multiple lines after opentype substitution.

* Fixed text cursor if last character in the string was a non-spacing
  mark that was positioned vertically with the GPOS table (rare, but more
  common than it sounds).

* Fixed position of hyperlinks created from an abstract Shape.

* Reworked locking to avoid deadlock in font rendering (reported by a customer
  running 150 threads for several hours, so not a concern for most).

* Fixed crash when rendering zero-sized annotations in the viewer.

* Recognise the "cc" prefix when embedding creative-commons license information
  in the XMP metadata.

* Viewer: fixes for signing with PKCS#11 SmartCards



2.23.4 (released 2019-06-26)
-------------------------------
* Fixed regression where PDFs saved with a combination of encryption and
  compressed XRefs were causing errors in Acrobat (introduced in 2.23.2).

* Fixed regression from previous release where creating a new PDFCanvas from a
  PDFPage would incorrectly set a Transparency Group, which causes problems for
  PDF/A.

* Predictors on LZW/Flate streams were implemented poorly. Now about 10x faster.

* Optimizations of the way text is written, in particular if the Document
  Structure is being created, to reduce filesize.

* Workaround invalid AES encryption of zero-length strings, as created by some
  products.

* Fixed overzealous remapping of glyphs to the private-use area when extracting
  text.

* Fixed errors when rendering Annotations with absurdly large dimensions.

* Added experimental Kashida justification for arabic.

* Fixed small-caps synthesis when used with OpenType fonts.

* Added support for OpenType CBDT table to load color bitmap glyphs, as
  sometimes used for Emoji.

* Fixed a failure which could occurred when loading resources (eg fonts or
  images) direct from a URL.

* Updated internal Unicode model to 12.0.

* Viewer: improvements to the way the "dirty" flag is monitored, to prevent the
  viewer from being closed without prompting the user. Also fixed the "Quit"
  feature to trigger a window close event, rather than just calling System.exit.



2.23.3 (released 2019-05-30)
-------------------------------
* Fixed two regressions in previous release relating to the way documents with
  compressed XRef tables are structured. One which could break some PDF
  processors, one which could hang when writing compressed, linearized PDFs

* Changed the way radial, linear and mesh gradients with an alpha component are
  created to (mostly) work around a bug in macOS Preview.app, and added support
  for linear interpolation.

* Legacy code cleanup relating to rendering shapes and styles in
  PDFPage/PDFCanvas, for more efficient output when writing.

* Added WOFF2 support to OpenTypeFont class; more robust parsing of
  OpenTypeFonts with truncated tables

* Fixed setInfo("Marked", true).

* Fixed invalid rollover states on checkboxes which could cause them to seem a
  bit odd when the mouse rolled over them in Acrobat.

* Improvements to the way non-rectangular outlines for hyperlinks are stored.

* Add "alt" text to structure output

* Fixes to letter-spacing and kerning for right-to-left languages; fixed
  transform applied for fake-italic.

* Forcing recompression with OutputProfile.setRequired(RegularCompression) is
  now guaranteed to never make the PDF bigger.

* Fixes for a particular PDF with a strange form of JPX compression

* Added PDFCanvas.setMask, to allow PDFCanvas to be created with a soft mask

* Added PDFCanvas.setBox/getBox and PDFPattern.setTransform.

* Fixed metadata profiling for non-core metadata.

* Viewer: don't fail when dragging iconised windows about.

* Viewer: Undo/Redo keyboard shortcuts will work even if Menus are disabled

* Viewer: added ThumbnailCopyAction



2.23.2 (released 2019-03-08)
-------------------------------
* It is now possible for the PDF API to write linearized PDFs with "Compressed
  XRef tables"

* Fixed LayoutBox bug, introduced in 2.22.2, that could cause text with -ve
  track kerning to wrap unnecessarily.

* Some fixes to the way structured tags are inserted into the PDF

* Fixed color shift converting DeviceCMYK to GrayScale profiles during Preflight

* Creating a PDFCanvas from a PDFPage where only some layers were visible will
  now discard the hidden layers.

* Mitigate a theoretical attack on PDF digital signatures as described at
  https://www.pdf-insecurity.org/signature/signature.html

* Deprecated some recently added OpenTypeFont constructors and replaced with new
  ones that are better designed for use with OpenType collections.

* Added PDFFont.getDefinedCodepoints() method

* Fixed redaction of PDFs containing Separation ColorSpaces with spaces in the
  ColorSpace name

* Reduced memory footprint for large OpenTypeFonts (eg the Noto fonts)

* When preflighting, unused Separation ColorSpaces are now removed completely
  from the PDF. Separation Colors that are converted to process color are
  completely replaced rather than just remapped, although the old behaviour of
  remapping the inks is available (see OutputProfiler.setRemapNamedInks)

* Fixes for when the soft mask used while rendering derives from an image that
  is itself translucent, as created by iOS renderer.

* Fixes for better error logging for some types of broken JPEG2000 images.

* Bulletproofing XMP metadata extraction to handle buggy xpacket headers.

* Corrected inheritance of Resource map during redaction

* Updated the Chinese CMaps to include HKSCS-2016 and Japanese to include U+32FF

* Added "implied" option to PDFFont, to allow the actual text to be inserted
  into the Structure. Useful for languages making heavy use of OpenType fonts.

* Added option to extract OpenType baseline information where available,
  and the PostScript font name.

* Fix for 12-bit sampled functions

* Fixes to handle various misformed PDFs



2.23.1 (released 2018-12-14)
-------------------------------
* OpenType/CFF fonts that are not CID encoded will now be rebuilt as CID
  fonts on-the-fly as required. This finally removes the "OT8" warning, the
  workaround we put in to avoid bugs in the OS X Preview.app viewer, which
  was itself causing problems with some fonts when printing from Acrobat.

* Fixed an issue where some OpenType fonts (specifically Noto Sans Arabic)
  would sometimes be missing a glyph when subset.

* Deprecated OutputProfile.Feature.PurgeResources, as this step is now always
  run when the PDF is rendered.

* Added DeviceNColorSpace.Builder, to allow creation of custom N-color
  ColorSpaces.

* Added MeshGradient, to allow creation of "Coons Patch" gradients alongside
  the existing radial and linear gradients.

* Fixed issue where the CIDtoGID map wasn't being applied to CFF fonts.

* Fixed typo in Code128 preventing the backslash working.

* Added BarCode.setText, to use custom text or a custom font on BarCodes.

* Added PDFGlyphVector.setGlyphTransform, to manipulate an individual glyph

* Fixed mismatch between a gradient fill and the alpha channel of that gradient
  fill, which occured if the gradient had a translate on its AffineTransform

* Fixed incorrectly encoded transparent PNGs that would display as opaque.

* Fixed rendering shading in a PDF when the shading contains an ExtGState

* Special handling for "All" Separation in SpotColorSpace, for printing
  registration marks.

* Slight improvements in render quality for particular type of Gouraud
  triangle shading.

* Underline and Strikeout positions loaded from OpenType fonts were wrong by
  half the width of the line. Now fixed. Although this is a negligible change,
  anyone converting PDFs to bitmap and comparing pixels to look for changes
  may notice.

* Fixed rasterizing PDF to a Graphics2D when the Graphics2D had a translating
  AffineTransform, and the PDF itself contains Transparency Groups.

* Added PDFGlyphVector.getOutline() method.

* Fixed bug in ICC ColorSpace handling relating to GrayScale spaces defined
  against the Lab PCS.

* Respect the winding rule when drawing a Shape to PDFCanvas, and added the
  "Miter Limit" property to PDFStyle.

* IOExceptions due to damaged input encountered during Redaction are now
  warnings by default, as they are for rasterizing. Fixed a couple of errors
  occurring in redaction for certain types of Document.

* Viewer: honour "UseNone" viewer preferences when opening a PDF, to hide
  the side panel.

* Viewer: fixed Exception during PDFViewer.close which was introduced in the
  previous release.

* Viewer: don't fail when saving to a new file (bug introduced a few releases
  ago).



2.23   (released 2018-10-08)
-------------------------------
* Verified against Java 11, and dropped support for Java 4.

* Repackaged: the supplementary Jars "bfopdf-cmap.jar", "bfopdf-qrcode.jar" and
  "bfopdf-stamp.jar" are all combined into the main Jar, and "bfopdf-old.jar" is
  no longer being distributed (it contained wrappers for the original 1.0 API).

* Removed the "RemoteSignatureHandlerFactory" class, which hasn't worked for
  many years, and removed methods that have been deprecated for over ten years
  from PDF, PDFSound and Event (Credit to Benoit Côté-Jodoin from GoSecure
  for pointing out issues with the RemoteSignatureHandlerFactory class).

* Wrote our own ICCColorSpace class to replace the java.awt.color package, which
  is unstable in a multi-threaded environment. As well as benchmarking slightly
  faster than the native code original, it brings support for v4 ICC Profiles
  to Java 7 and earlier.

* Many optimizations to try and target the improvements to the JIT compilers
  since Java 8, and to reduce the memory footprint for incidental allocation
  where possible. Average workflow appears about 5% faster.

* Added some methods to PDFGlyphVector to make it a bit more flexible.

* Fixed an issue where BitMask images containing a color tint were not having
  that tint applied correctly under Java 8.

* Fixed the line spacing calculation when the "correctleading" feature is set
  to match that used by most OpenType libraries.

* Fixed issue converting duotone N-color images to RGB when rendering, and
  enabled conversion from ICC RGB profiles to sRGB.

* Fixed NullPointerException sometimes seen when converting the Color of bitmap
  images with an OutputProfiler.ColorAction.

* Fixed UPC-A barcode output to allow a non-zero prefix.

* Fixed GS1 Databar text output where the text had a leading zero.

* Workarounds for bugs in OpenType features in some older fonts.

* Viewer: Added PDFViewer.isClosing() to allow long-running features to shut
  down gracefully.

* Viewer: Fire a "selection" PropertyChangeEvent from TextTool when the selected
  text is changed, to make it easier for classes extending the viewer to respond
  to text selection.

* Viewer: KeyboardFocusManager appears to hold references to Keyboard shortcuts
  even after Menu items have been removed. We have added several last-ditch
  attempts to work around this to PDFViewer, and also decoupled the actions from
  the Swing Components to allow the Viewer to be garbage collected on close.



2.22.2 (released 2018-07-31)
-------------------------------
* We're now distributing a JPEG-2000 decoder with the PDF library, supplied in
  "bfopdf-jj2000.jar". Sources are at  https://github.com/faceless2/jpeg2000.
  This version fixes some bugs in the standard release, reduces the memory
  footprint and removes some dependencies. We recommend adding it to the
  classpath and removing any other "jj2000" Jar you may have already.

* Rewrite of the Indic language shaper which was previously working properly for
  Hindi, but not much else. Verified test results in Assamese, Bengali,
  Punjabi(Gurmukhi), Gujarati, Kannada, Malayalam, Marathi, Oriya, Sinhala,
  Tamil and Telugu.

* Many associated fixes to OpenType font positioning, which may improve results
  for other languages too (in particular most Urdu fonts are now working).

* Improved heuristics for fonts that have non-spacing marks with advance.

* Added OutputProfiler.ImageAction, to allow more control over downsampling or
  recompression of images.

* Fix for documents with Encryption Dictionaries containing indirect references.

* Some minor ColorSpace math fixes

* Refactored to remove some synchronization

* Fixes for OSGi statements in Manifest

* When applying a new signature to a PDF/A file, we now check the addition is
  PDF/A compliant on creation.

* Add cached for OCSP responses, which should speed up validation of multiple
  signatures.

* Viewer: Remove lingering reference preventing the final instance of the viewer
  from being garbage collected

* Viewer: BackgroundSignatureVerifier class verifies in background, not on EDT!



2.22.1 (released 2018-04-27)
-------------------------------
* Reduced memory pressure when working with documents containing a StructureTree
  in many simultaneous threads.

* By popular request, added UPCA Barcodes as a distinct variation of EAN13, but
  with slightly different text formatting.

* Fixes for WOFF font format parsing

* Fixed data being truncated after a U+FEFF character in the text when using the
  non-OpenType layout engine, introduced in previous release.

* Fixed issue that could result in two XMP packet headers in the metadata,
  introduced a few releases ago.

* Added PDFStyle.setLineBreakBehaviour to control the line breaking, and updated
  line breaking rules to support latest release of UAX#14 as well as the
  variations defined in css-text-3

* Improvements to OutputProfiler.AutoEmbeddingFontAction should result in a
  better choice of font.

* Improvements to OutputProfiler.ProcessColorAction to skip conversion of
  device gray, RGB or CMYK.

* Improvements to the way the OutputProfiler repairs PDFs containing form fields
  when trying to bring them into line with PDF/A

* Write out a full CharSet when creating an OpenTypeFont - we need all glyphs
  listed for PDF/A-2 and PDF/A-3, not just the used ones.

* Rendering a page or annotation with severe structure problems would previously
  throw an exception. We now render as much as we can and report a PP2 warning.

* Fixes to allow the use of LinearGradient and RadialGradients containing alpha
  values as fill or line paints in the PDFStyle class, and add support for
  AffineTransforms on those classes.

* Correctly apply ligatures when arabic is displayed left-to-right or non-arabic
  is displayed right-to-left (useless, unless you are trying to pass testcases)
  and more fixes to position of marks in arabic.

* Fix ClassCastException when changing the ColorSpace of an indexed image,
  introduced in previous release.

* Speed improvements to the preflighting code when converting an image from one
  colorspace to another. Also corrected the value of "type" being passed in to
  OutputProfile.ColorAction. Note: these changes first appeared in 2.22, but
  were missed from the changelog. This release fixes some small bugs added in
  that release.

* Added PDFImage.getResolution and PDFImage.getOrientation methods.

* Viewer: fixed memory leak that could occur when verifying digital signatures
  in a PDFViewer containing a single DocumentPanel, then closing and repeating.

* Viewer: fixed NPE from DocumentPanel that sometimes occurred on closing.



2.22 (released 2018-03-12)
-------------------------------
* The text layout model has been rewritten to accomodate fixes to the OpenType
  layout engine and the bidirectional model. Due to floating point rounding
  difference this will mean fractional sub-pixel differences to justified text.

* INCOMPATIBLE CHANGE: We now have the ability to set an OpenType feature to
  an integer, not just on or off. This is rarely required except for "swash"
  letters, but it required a minor change to the API: PDFFont.getFeature and
  PDFStyle.getFontFeature now return an int instead of a boolean.

* INCOMPATIBLE CHANGE: Removed long-deprecated "requote" and "ligaturize" from
  the PDFFont class, as these are incompatible with the new text model. These
  were deprecated and the functionality rolled into PDFFont.setFeature in
  release 2.11.21 (released Feb 2012).

* Added new GlobalSignDSS class, to apply digital signatures using the new
  GlobalSign digital signature service.

* Added a new PKCS7SignatureHandler.SigningEngine class to allow the
  "outsourcing" of some of the core tasks of PKCS#7 digital signatures to a
  custom class (such as the GlobalSignDSS class).

* A number of fixes made to the code for adding long-term validation
  information to a signature (specifically for the Indian ID card certificate
  hierarchy, but generally applicable).

* Updated OpenType font handling to version 1.8.2 of the OpenType specification
  (excluding the new Font Variations).  Fixed a number of bugs relating to the
  way glyphs are shaped and positioned using the OpenType engine, particularly
  in the Indic languages and where multiple combining characters are used.

* Fixed some of the more complex cases in the Bidirectional algorithm for
  Arabic and Hebrew, to do with nested runs. The Locale of the LayoutBox is now
  a critical part of the algorithm, so be sure to set it to the primary
  language of the paragraph.

* Updated internal Unicode model to 10.0.

* Added support for Unicode "Variation Selectors" where available in the font.
  These are primarily used for Chinese/Japanese fonts to resolve some of the
  issues with Han unification.

* Added quite a lot of functionality to the PDFGlyphVector class, to make it
  useful for high-performance text layout not using a LayoutBox.

* Added "italic" and "smallcaps" font-features, to allow synthesized italic and
  small-caps to be created directly on a PDFGlyphVector.

* Fixed more slowdowns relating to editing documents containing an existing
  Structure Tree.

* Added PDFPage.setUserUnit method, required to create very large pages in PDF.

* Fixed rare bug in JBIG2 decoder.

* LinearGradientPaint and RadialGradientPaint can be used as Paints in the
  PDFStyle class.

* Add additional space at end of line when it has been split, for PDF/UA text
  extraction.

* Added ability to create a PDFCanvas with a particular blendmode, via a new
  constructor.

* Removed some unnecessary work that was being done when adding text content to
  the PDF; this could result in speed improvements if there is a lot of text
  being added.

* Speed improvements when rendering very large, very complex gradient shading
  (specifically Coons Patch shading, types 6 and 7). Some pathalogical test
  cases were so slow the appeared to have hung, speed is now back to normal.

* Viewer: removed some lingering references to the previous PDF that could
  occur when a single DocumentPanel is reused for multiple PDFs, rather than a
  new DocumentPanel being opened each time (as would happen when MultiWindow
  was turned off).



2.21 (released 2017-12-14)
-------------------------------
* Added a new PDFDrawable interface which is implemented by both PDFCanvas
  and PDFPage. This necessitated some very minor changes to some method
  signatures in the PDFPage class: although no changes are required to client
  code, anything calling the pathBezier, pathLine, pathArc or transform methods
  on PDFPage will need to be recompiled.

* OpenTypeFont, PDFImageSet and PDFImage can now be loaded from a File or URL,
  using the same "lazy load" approach available for loading PDFs. This is mainly
  of use when working with very large fonts or multi-page TIFF images.

* Drastically reduced the amount of memory required to work with OpenTypeFonts
  and StandardCJKFonts, particularly when cloning them for simultaneous use
  in multiple threads.

* PDFReader, PDFImageSet and OpenTypeFont all have new methods allowing their
  objects to be loaded from an existing URLConnection. See BFO blog article
  for details on why this might be useful.

* Logging can now use Log4j version 2 if available

* Added Type3Font class, for custom font creation.

* Worked around a particular type of bug in some LZW compressed TIFF images

* Tweaked the way the Executor created for use internally to the PDF Library
  manages threads, resulting in less idle threads hanging around after use.

* Catch situation arising from modifying a signed PDF where the objects needing
  to be modified were direct. This resulted in a PDF where a new signature
  appearance on an existing page wasn't visible in Acrobat.

* Removed warnings about PDF streams being the wrong length in a few situations
  where the spec allowed it.

* Removed warnings about PDF/A XMP conditions that are not considered invalid
  in the latest PDF/A technical note.

* Add method to create translucent Lab colors.

* Load special Apple kerning table from special Apple OpenType fonts

* Don't return kerning values from PDFStyle.getTextWidths() if font has kerning
  disabled.

* Don't trim 0xA0 from end of line (regression in 2.18.7)

* Final batch of PDF417 bugfixes

* Added a few missing getters to match existing setters in PDFStyle

* Viewer: several fixes to viewer when working with linearized documents, in
  particular when loading is cancelled before completion.

* Viewer: removed hard-coded font sizes from a few points in the code, and
  added Util.setFontScale method as a means of scaling fonts in the viewer
  for HiDPI screens (far from ideal, but the best option we have in Swing).

* Viewer: fixed regression from previous release where the Outline pane might
  not complete loading.



2.20.3 (released 2017-10-19)
-------------------------------
* No longer render optional content layers that are initially off

* Added isRTL/setRTL methods to FormText/FormChoice/FormButton, to set
  undocumented but useful flag used by Acrobat

* More resilient parsing of CCITT encoded images that have deliberate errors
  but specify the DamagedRowsBeforeError flag.

* Rather than throwing an exception, make a best effort to handle variants of
  digital signatures that specify their own Filter but use a standard
  SubFilter

* More fixes to PDF417 thrown up by fuzzing.

* Fixed storage of non-user attributes in the StructureTree

* Fixed loading of interlaced 1/2/4 bit PNG images, almost never seen
  in the wild.

* Added PDFImage(PDFImage) method to clone an image, for rare cases where
  an image is used in multiple threads and modified after load (which is not
  a typical practice)

* Viewer: KeyStoreManager is working with PKCS#11 under Java 9.



2.20.2 (released 2017-09-22)
-------------------------------
* Significant speed improvements to PDF.rebuildStructureTree.

* Decode array on ImageMasks was not working properly.

* Implemented "Alpha" masks, and improvements to the way SMask on GStates was
  applied, leading to better blending of transparent colors.

* Kill stuck thread that could occur if an error was encountered while loading
  a PDF from a URL.

* Fixes to PDFParser.getDitheringColorModel and
  PDFParser.getBlackAndWhiteColorModel.

* Fixes to the algorithm to choose the best font for replacement in
  OutputProfiler.getAutoEmbeddingFontAction, and also attempt to recover if
  the the replacement font doesn't have all the required glyphs.

* Attmpting to apply a new OutputProfile such as PDF/A to a new PDF that has
  already been edited will now (correctly) insist that the existing profile
  be determined first - this closes a small loophole that could allow the
  creation of a file that claims to be PDF/A but isn't (for example).

* Fixed issue with a seldom-seen variant of TrueType outline that could cause
  small distortions in some glyph shapes.

* Added new PDF417 Barcode method to cater for absurd incompatible change
  in specification five years after it was initially released.

* Fixed typo in PDF417 barcodes that could sometimes cause codes with a colon
  character to be encoded incorrectly.

* Viewer: removed some references that would delay garbage collection of a
  linearized PDF that had its load from a URL interrupted until the entire PDF
  was loaded.

* Viewer: don't allow save to a read-only file - previously this was allowed
  so long as the filename wasn't prompted for.

* Viewer: added the option to disable the class prompting for HTTP authentication
  details, due to reports it was breaking SPNEGO (Active Directory) authentication
  when run as a JNLP application.

* Viewer: added workaround for Java bug 8042020, the everpresent horizontal
  scrollbar under the Nimbus L&F.



2.20.1 (released 2017-06-20)
-------------------------------
* Added OutputProfiles to validate and create PDF/A-2u, PDF/A-3u and ZUGFeRD
  documents.

* This release brings our API largely into agreement with the industry-wide
  "verapdf" test corpus for PDF/A validation - the exceptions are all the
  subject of open queries. This has meant a large number of subtle changes to
  the PDF/A profiles.

* Added a large number of new OutputProfile.Features to XMP to validate types,
  and deprecated a few others (to cater for the previous item)

* Added OutputProfile.getClaimedTargetProfiles, to make validating a document
  against all of its standards easier.

* Minor improvements to page extraction when text is overlapping

* A few minor tweaks to ensure we can create and parse documents from the
  upcoming PDF 2.0 standard.

* Added FormSignature.setRequiredDigestAlgorithm(), to set the list of
  allowable digest algorithms that can be used to sign a blank signature.

* Workaround to handle curious interpretation of PKCS#1 in DynaPDF signatures.

* Added bfo:key, bfo:pos and bfo:pdf attributes to the beginTag method, to
  allow StructureTree nodes to spread over a more than one location in the PDF

* Cleaned up error reporting when trying to load a damaged font: damage is
  only reported once per font in the logs

* Fixed long-standing, very subtle bug in PDFs we generate: we were setting the
  whitepoint of any sRGB colors used to D50, in fact it should be D65. The
  corresponding Matrix ensured the results were visually identical, but D65 is
  more correct.

* Fixed an issue where we painted way more pixels than we needed to when a
  SoftMask was used with a massive bounding box. Documents exhibiting this will
  now render faster.

* More tolerant parsing of off-spec Radio Buttons in incoming PDFs

* When partially redacting an image that was compressed with DCT (JPEG)
  compression, ensure the redacted image is compressed the same way. Although
  this means two lossy compression cycles for the image, the alternative is
  a potentially massive increase in file size.

* Viewer: a few changes to make it easier to recompile the classes into a
  non-standard package.



2.20   (released 2017-04-10)
-------------------------------
* Changed default encryption algorithm to SHA256. If you want to continue using
  SHA1 for signatures, you will now need to specify this explicitly.

* Added full support for creation and verification of PDF/A-1a, PDF/A-2a,
  PDF/A-3a and PDF/UA compliant doucments. This includes new OutputProfiles,
  and a large number of new OutputProfile.Feature entities.

* Fixed creation of new structure elements, broken in 2.19.1.

* Fixed a bug in OCSP verification of signatures that would cause some
  verifications to fail.

* Fixed very obscure issue where extracting a full Output Profile on a PDF
  containing PDF file attachments on N pages, where N >= the number of worker
  threads the PDF has (defaults to number of cores) could cause a deadlock.

* Fixed a few obscure problems after running our PDF API against 15,000
  documents from the "govdocs" corpora.

* When rasterizing a PDF to a bitmap, confirm that fonts that claim to have
  a specific glyph do have it.

* Fixed OutputProfiler.ColorAction not running on a newly created PDF.

* Bulletproofing for various types of corruption in embedded OpenTypeFonts.

* Reverted warning added in 2.19.1 referring to "invalid date"; specification
  changed without comment, so we must presume both formats are valid.

* When rendering a PDF with missing glyphs in the font would previously
  give a blank space, now we attempt to locate a glyph that is theoretically
  visually identical, and print a warning.

* Added various new OutputProfile.Features to identify the algorithms used
  in any digital signatures applied to the document.

* Viewer: tested successfully against Java 9 EA builds.

* Viewer: when running from JNLP, allow the "jnlp." prefix to be used
  on any of the properties, to alllow them to be easily set in the
  JNLP file.



2.19.1 (released 2017-03-10)
-------------------------------
* Fixed a bug introduced in the previous release where cloning a page
  by calling PDFPage(page) would cause an exception if the page was from a PDF
  containing structured content

* Use "soft clipping" when rendering the PDF to a bitmap, to work around
  limitations in the AWT. This should result in considerably better ressults
  when converting certain types of PDF to a bitmap (in particular those
  documents that use a clip path and fill to draw text).

* Setting the "TaggedPDF" feature to denied before applying the profile will
  remove teh Structure Tree, root and branch, from the PDF. Previously we were
  only removing the root.

* Repairing a PDF that contains multiple copies of the same field is now
  done the same way as Acrobat.

* Don't fail when a font Widths array has > 256 entries.



2.19 (released 2017-03-01)
-------------------------------
* Many improvements relating to PDFs containing "Structured Content".
  Since 2.18.7, moving pages between documents when the PDFs involved
  contain Structured Content was occasionally taking more time and memory,
  as we were attempting to preserve the Structured Content during the page
  move. These methods are now back to full speed, and if the Structured
  Content is to be preserved then the new PDF.rebuildStructureTree() method
  should be called.

* Improvements to the way we create new Structured Content (via the beginTag/
  endTag methods), making it possible to create PDF/UA compliant documents.
  Added OutputProfile.Feature.InfoMeetsPDFUA1 to reflect this, and revised
  the "StructuredPDF.java" example to show how to do it.

* Added a new PDFParser.getStructureTree method, to retrieve the document
  structure as a W3C DOM

* Removed the spurious PD8 warnings related to StructureTree damage, added in
  a previous release.

* Fixed broken reconstruction of some XRef tables (particular those created
  by Oracle Docuprinter)

* The above changes required a minor change to PageExtractor - adjoining
  text is no longer concatenated into a single item if the text is in a
  different node in the structure tree.

* Added GS1 Databar (aka RSS-14) Barcode symbology

* Improved extraction of enormous XMP metadata from minutes to milliseconds.

* More tolerant parsing of incorrectly formatted dates in Info dictionary

* Don't fail when digital signature "V" object contains garbage

* Don't incorrectly merge fonts with same name in OutputProfile.getFontInfo

* Fixed rendering of Type 3 fonts with negative font sizes

* Fixed for some special cases where moving a page from PDF A to B would not
  correctly update the page list in document A.

* Fixed JavaScript methods that worked with colors for the Java 8 JS Parser

* Fix for documents created with Flate compression, but where the Flate stream
  was not closed. Previously we were losing the last few bytes due to
  buffering, we are now extracting all the bytes we can before displaying
  a warning.

* Fix for one-off case where font-merging in "ResourceMerge" was incorrect

* PageExtractor.Text.getVisualBounds works correctly for zero-length text.

* Improvements to merge of ICC and Seperation Color Spaces in "ResourceMerge"

* Fix when trying to render or extract from page containing a new, unclosed
  PDFCanvas

* Fixed TIFF predictors when BPC != 8

* Viewer: workaround unimplemented code in Java 8/OS X when displaying highlight
  annotations.

* Viewer: fixed missing synchronized sometimes causing exceptions when PagePanel
  is being disposed.



2.18.8  (released 2016-10-17)
-------------------------------
* Fixed a bug introduced the previous release, which could result in a
  NullPointerException when moving pages between PDF documents constructed
  in a certain way.

* Fixed a bug where PDFParser.writeAsTIFF(PDFParser.BLACKANDWHITE) could result
  in a TIFF that used LZW rather than CCITT compression



2.18.7  (released 2016-10-11)
-------------------------------
* Moving a page from one PDF to another will now migrate structured tags
  with it.

* Some non Java-1.5 compatible code got into the codebase - removed, now
  running under Java 1.5 again.

* Added option to force use of AWT font renderer for difficult fonts.

* Fixed justification of text that makes use of non-breaking space characters

* Fix for pages where MediaBox coordinates were stored in the wrong order

* Fixed caching for colorspaces referenced by Indexed ColorSpaces - this could
  cause a catastrophic slowdown when rendering under some very specific
  circumstances.

* Viewer: searching for text would return a selection one character too long

* Viewer: ensure icons are consistant size, was causing visual artifacts in
  some look-and-feels.



2.18.6  (released 2016-08-04)
-------------------------------
* Workaround for AWT mangling of CMYK colors to RGB, which was causing errors
  when working with a CMYK shading pattern

* Using the OutputProfiler to recolor an image could result in the file size
  increasing, as we used lossless Flate compression. Now, if the original was
  JPEG compressed then the recolored version will be too.

* Fix for Identity ToUnicode maps

* Acrobat places undocumented requirements on how TrueType fonts used in forms
  are stored. We have accomodated this with a nasty hack since 2.17.1, but this
  has inadvertantly broken the (correct) handling of these field when the PDF
  is loaded back into our API for further processing. This release adds code
  to "un-hack" the original hack for display.

* Viewer: fixed some issues with the toolbar layouts, introduced in the previous
  version



2.18.5  (released 2016-06-29)
-------------------------------
* Fix for absurdly large tiling patterns that were causing an integer overflow

* Fix for ThreadLocal leak in viewer which could result in a memory leak if
  many PDFViewer instances were created

* Better rebuilding of PDFs that contain damaged cross-reference tables, we
  now can usually recreate the version history.

* Viewer: fixed the way menu separators are added to make it easier for the
  menus to be customized with new features

* Viewer: improvements to text extraction for arabic and hebrew text.



2.18.4  (released 2016-05-06)
-------------------------------
* Viewer: we broke text selection in the previous release: now fixed

* Viewer: don't display error dialog when a PDF save is cancelled

* Viewer: fixed page navigation buttons so they work (again) from Applets.



2.18.3  (released 2016-04-22)
-------------------------------
* Added support for OpenType collections, via a new OpenTypeFont constructor.

* Added option to partially redact a PDF by removing any combination of text,
  bitmap images or vector graphics in an area. See Redactor.setRedactionMode

* Added OSGi headers to the manifest files

* Fix for PDF/A-2 relating to the "Charset" restrictions - this could cause
  some valid PDF/A-2 and PDF/A-3 PDFs to be marked as invalid.

* Some fixes to the way structured PDF tags were created, to make the generated
  PDFs more compaible with screen reading software.

* Fixed resource merging of two PDFs where two fonts were apparently identical
  but one of the glyphs was zero-width. This could result in an incorrect merge
  and a corrupted output PDF.

* Fixed rare situation where digially re-signing a PDF could invalidate the
  original signature (in Acrobat), due to a shared resource between the two
  signature fields. Also ensure that only the first signature can be marked
  as certifying, as required by the spec.

* Fixed error in optimized PostScript parser used for PostScript function
  evaluation.

* Fixed text coordinates in PageExtractor.Text when extracting vertical text.

* Radial shading is now calculated using a (very complicated) function instead
  of a bitmap lookup, which is faster and uses less memory.

* AcrobatSignatureHandlerFactory allows a Provider to be set, which will be
  used for all its operations. See also PKCS7SignatureHandler.getProvider()

* Fix for rare exception when parsing progressive JPEG images containing a very
  large ICC profile.

* Fixed conversion of PDF containing JPEG2000 images to PDF/A

* Fixes to the rules for "curly-quotes" substitution for various languages,
  and in particular for a trailing apostrophe in English ("St. James' Park"),
  which was broken a few releases ago.

* Viewer: Ctrl-Tab will now cycle between open documents.

* Viewer: fixed failure to correcly save a TIFF image over an existing file.

* Viewer: fixed duplicate keyboard shortcut between "Zoom to fit width" and
  opening recent files.

* Viewer: added scrollbar (where appropriate) when editing multi-line text
  fields.

* Viewer: it's possible to add custom fonts to the AnnotationTextFactory
  feature. See the initialization parameters for that class

* Viewer: clearing the list of search results will also clear the selection of
  any of those results in the PDF.

* Viewer: fixed deadlock that would occur when the customer signs a and saves
  a PDF using a KeyStore that opens a Swing dialog.

* Viewer: we can now tile hundreds of open PDFs without it looking silly.


2.18.2  (released 2016-01-13)
-------------------------------
* Added full support for PAdES part 4 (LTV) signatures. This involved fixes
  to the signing process, new PKC7SignatureHandler.ValidationInformation
  and TimeStampHandlerFactory classes, and methods to add and retrieve this
  information from the PKCS7SignatureHandlerFactory. See the API docs for
  those classes for details and examples of use.

* AnnotationLink and AnnotationMarkup can now have irregular shapes - the
  corners can be specified with a generic java.awt.Shape.

* Fixes to text extraction from a PDF containing a Type 3 font that itself
  contains text

* Fixed off-by-one when converting 100% gray to RGB: was #FEFFFE, now #FFFFFF

* Workaround bug in OS X PDF-to-PostScript conversion which resulted in text
  in certain types of CID Compact font being missed.

* Fixed position of text added to the PDF when using horizontal scaling
  and track kerning.

* Fixed visual size of AnnotationNote markers (i.e. paperclips) in the PDF.

* Fix StackOverflow when loading a particular PDF

* Viewer: fixed use of custom JavaScript on features

* Viewer: fixed rare thread coordination issue for long-running tasks



2.18.1  (released 2015-10-27)
-------------------------------
* Fixed a race condition revolving around the PDF(PDF) constructor, and the
  subsequent use of PDFs created that way in multiple threads.

* Migrated all internal multi-threaded operations across to use an Executor,
  and added the PDF.setExecutor method to allow this Executor to be set by
  the customer.

* Calling the PDF.getEmbeddedFiles() method would result in the PDF being
  identified as containing Embedded Files (and so failing various PDF/A
  validation tests). Mainly evident when verifying PDF/A documents from the
  viewer.

* Fix to handle encrypted PDFs created by iText that have unusual combination
  of usage flags, and fixed use of empty owner password with Acrobat 3
  encryption

* Corrected handling of "Artifact" tags when creating Structured PDF

* Added PageExtractor.Text.getHorizontalScale, and fixes to the output of
  PageExtractor.Text.getVisualBounds when this is not 1

* Viewer: Added new, all encompassing loadPDF method for those not using the
  Importer

* Viewer: Added DocumentPanel.get/setAssociatedFile method

* Viewer: Added Exporter.completed method, to make subclassing simpler

* Viewer: when saving back to the same file the PDF was opened from, don't
  require the use of multiple-revisions if the PDF was opened as an InputStream



2.18    (released 2015-09-25)
-------------------------------
* API change: deprecated the PDF.getFullOutputProfile and PDF.setOutputProfile
  methods in favour of the new "OutputProfiler" class.

* Added OutputProfiler class, which gives more control over verifying and
  modifying a PDF to match a specific profile. New functionality includes
  support for doing this in a background thread, and the ability to replace
  colors or fonts in a PDF to those required by the target profile.
  More details in our blog at http://bfo.com/blog/tags/outputprofile

* Fixes to special handling for PMingLiU font when it's embedded - the HKSCS
  character range was not being correctly handled.

* Fail before OutOfMemory when instructed to create images with
  dimensions > 65535 during render.

* Don't mark the PDF as containing embedded files just because we've called
  PDF.getEmbeddedFiles.

* Improved OutputProfile.setOutputIntent - many parameters can be specified as
  null, the method will now derive the correct values to use from the others.

* Fixed error when using certain fonts that mapped the "fi" ligature to the
  private use area, resulting in a missing glyph when rendering.

* Added PDFFont.isBold/isItalic/isSerif methods

* Added OutputProfile.FontInfo.getUsedCharacters method, to show which
  characters are used by each font in a PDF during profiling. Also modified
  to include fonts created but unused in the PDF in the list

* JavaDoc uses SyntaxHighlighter for the embedded examples

* Viewer: the Print dialog displayed when calling DocumentPanel.print() can
  now be the "native" dialog, the "java" dialog, or an autoselection between the
  two - sadly necessary as neither provide the full functionality.

* Viewer: fixed some subtle bugs in ZoomLevel, and unified the min/max levels
  for the various zoom functions with new methods in the PDFViewer class

* Viewer: size of splitpane and whether it is opened/closed is correctly stored
  in preferences and used when the viewer is reloaded



2.17.1  (released 2015-07-28)
-------------------------------
* Rewrite of the StructureManager class to fix numerous bugs, and tested with
  JAWS screen reader

* Corrected subtle error in L*a*b* ColorSpace to RGB.

* Added Form.isXFA, for quick checking of XFA.

* Fixed PDFPage.drawShape handling of Quadratic bezier

* OutputProfile has a new "setOutputIntent" method, to set the intent without
  going through the constructor.

* Fixed handling of soft-hyphens, which would not align properly and
  occasionally disappear altogether.

* Handle OTF fonts that are missing everything except the CFF table

* Added BarCode.getContentRectangle, for exact position of barcodes

* Added two new RenderingHints to PagePainter to help those implementing their
  own Graphics2D object identify text drawn as shapes

* Align behaviour when dealing with damaged DCT image content to that of Acrobat,
  to handle documents that rely on it.

* PageExtractor.Text now has a getOutlineColor method, and this and getColor
  will return null if the text is drawn in a mode that doesn't fill (or stroke)

* Behave correctly when a user-password but no owner-password is set on a
  StandardEncryptionHandler

* Fix bad-glyphs error when changing the value of a field that uses an
  embedded font, then immediately flattening the form.

* Don't reset arabic/hebrew documents to right-to-left binding when saving

* More fixes for bad XFA documents

* Fix for checkboxes with values that are punctuation

* Fixed rare case where editing certain PDFs could break the "Reader Extensions"
  signature in Acrobat.

* Added PDFParser.setPrintAsImageResolution, to control the resolution of the
  image for printing. This can be useful for memory-constrained environments.

* JavaScript was getting the timezone wrong for date/time fields, now fixed.

* Removed memory-leak potential for a certain customer who is torturing our
  viewer API in a particularly horrendous way

* Improved our guess for the MediaBox of a page where it's not specified (we
  now assume it's the same as the neighbouring ones).

* Fix for breaking behaviour under Java 5 for some documents.

* Logging has been modified to allow the system to be tapped into, and modified
  the viewer to report these via the new "WarningNotifier" Viewer feature.

* Some more subtle PDF/A validation tweaks based on a new test corpus.

* Added awful hack to work around Acrobat bug when using a CID font in a form.

* Creating a PDFCanvas from a Page will use the smaller of the CropBox/MediaBox
  rather than just the CropBox.

* Text Extraction without a valid license no longer replaces "e" with "a", but
  changes the first word extracted on each page to "DEMO" instead.

* Viewer: many protected methods in ViewerWidget made public

* Viewer: tweaked the "Save" feature changes in the previous release to better
  cope with missing/locked files, Windows locking, and other edge cases.

* Viewer: added EmbeddedFilePanel to display embedded files

* Viewer: when saving, use a PDF file suffix for files converted from bitmaps.

* Viewer: fixed unusual situation where page zoom could get stuck on 101%

* Viewer: fixed "ghost" window after returning from full-screen mode

* Viewer: fixed NPE when can occur occasionally when there are no SidePanels

* Viewer: many small "snagging" issues fixed.



2.17    (released 2015-03-31)
-------------------------------
* Viewer: made "Save" feature save without prompt, and new "SaveAs" feature
  will prompt for the filename - they now function exactly as a "Save" and
  "SaveAs" feature would be expected to, but due to the change in functionality
  in Save this release is tagged 2.17 rather than 2.16.4

* Reduced memory footprint when rendering very large documents containing an
  old-style XRef table. This can make quite a difference for some files.

* Support the JPEG-2000 API at https://github.com/jai-imageio/jai-imageio-jpeg2000
  as well as the legacy Sun version of the same code, and mitigate a memory
  leak in both versions.

* PDF/A-2 fixes - applied the changes from the technical corrigenda; added the
  "XMPMetaDataInfoMismatchTrailingZero" and "CIDSetCoverageIncompleteTolerant"
  features to the OutputProfile to deal with some ambiguity in the spec;
  fixes to the CIDSet font object for PDF/A-2; fixes to handling of the
  .notdef glyph.

* Print a warning rather than throw an exception when rendering a PDF to a
  Graphic2D with no alpha channel - it will work sometimes, just not always.

* Removed unused "cloneEntry" method from Cache interface.

* Correct text size calculation when extracting text and the text has been
  scaled unevenly.

* Allow files that contain an invalid PDFName to be read without exceptions.

* Fix for Type 1 fonts that claim to use a custom encoding.

* Fixed redaction of images where the image detail is stored in the mask, not
  the image itself.

* Some improvements to the way we modify documents make it less likely that we
  will break a reader-extenions signature unnecessarily.

* Fixed repair of compressed XRef PDFs with damaged streams.

* Fixes to allow an OutputProfile to be set on a PDF twice.

* More fixes for XFA, this time to do with edge cases in the <picture> clauses
  and FormChoice fields.

* Viewer: fixed a deadlock in the PagePainter which could be triggered by
  JavaScript in the PDF modifying the form data.

* Correctly handle TTF fonts with "0/1" cmaps - was mostly working before, but
  not always.

* Removed assumptions preventing the viewer being used in an SWT application.

* Fixed clipping for Type3 fonts, previously working in 99% of cases, now 100%.

* DiskCache uses File.createTempFile, to allow multiple JVMs to run with the
  same cache directory.

* Viewer: quicker freeing of resources when a page paint is interrupted -
  this should result in a much lower memory footprint when scrolling rapidly
  through a document.

* Viewer: fixes to handling of temporary files in Save and SaveAs on Windows.

* Viewer: allow runtime overriding of whether a file loaded by an Importer is
  added to the "Most Recently Opened" list.

* Viewer: when saving the PDF, the stream it was loaded from is closed. This
  has no impact for most, but will allow the file to be deleted immediately
  on Windows.

* Viewer: don't allow DocumentPanels to be dragged so far out of the Desktop
  that they can't be dragged back.

* Viewer: the Quit feature now calls PDFViewer.close() first.

* Viewer: fixes to navigation in ThumbnailPanel, and increased max thumbnail
  size.



2.16.3  (released 2015-01-23)
-------------------------------
* Fixed linearized loading, broken in previous release

* Fixed rare bug in Acrobat X (AES256) encryption which could result in
  invalid encryption or a failure to decrypt.

* Fixed NullPointerException after calling FormElement.duplicate and when
  dealing with an annotation that has no rectangle, or for Screen annotations
  with no "Type" field.

* Don't fail when XFA form values are illegal according to AcroForm.

* Fixed handling of format events in JavaScript, broken in previous release.

* Fixed display of soft-hyphens when laying out text, broken a few releases ago.

* Viewer: fixed the behaviour of the Save dialog when the filename is modified
  in the text field; depending on how the field was blurred and the L&F, the
  the new filename was sometimes ignored and the previous filename used (since
  2.16.2), and fixed the display of save options (currently only for TIFF) for
  the various Look & Feels. This also fied a NullPointerException that was
  specific to a particular series of selections under the Windows L&F.

* Viewer: fixed some focus issues relating to multi-line text items.

* Viewer: clicking with the "zoom to selection" tool caused the viewer to
  try to zoom to an infinite zoom level and hang - now fixed.

* Viewer: Fixed deadlock which could occur when a field changed the value
  of another field in the viewer using JavaScript.

* Viewer: Fixed handling of JavaScript events, in particular, an event which
  triggered another event wasn't always being handled properly.

* Viewer: deleting a page in JavaScript that contains the sole Widget for
  a field will also delete the field, to match Acrobat's behaviour. Also fixed
  the value of Field.page, which was off by one.

* Viewer: JavaScript closeDoc method closes window regardless of dirty state,
  to match Acrobat's behaviour.



2.16.2  (released 2014-12-16)
-------------------------------
* Fixed exception when rendering newly generated PDFs for the second time,
  broken in previous release.

* Added Deutsche Post "PostMatrix" barcodes

* Fixed exception when trying to paint XObject with SoftMask that has been
  clipped away entirely.

* Fix to choreography issue setting line endings in line annotations.

* Fix to edge-case for XFA picture clause processing

* Fix for particular format of broken OpenType tables.

* PagePainter.drawSubImage no longer overrides the clip on the Graphics2D

* Viewer: Thumbnail panel scrolling is improved, particularly when reordering
  pages.

* Viewer: Fixed error when trying to save PDF to a new file, broken in previous
  release. Filename is updated to match when the file format is changed, and any
  additional options for the selected file-format are displayed without a popup.

* Viewer: Many settings (e.g. zoom level, last side panel selected, size of side
  panel, size of thumbnails) are stored in preferenced and will be used the next
  time the viewer is loaded if nothing else has a preference.

* Viewer: Improved keyboard navigation. Ctrl-Enter or Ctrl-Esc can be used to
  OK/Cancel a dialog, and Ctrl-Up and Ctrl-Down can be used to page through
  the document as well as PageUp/PageDown (which are missing on many laptops)

* Viewer: MultiPageDocumentViewport was holding references to a closed PDF
  longer than it needed to - now fixed.

* Viewer: many small usability improvements.



2.16.1  (released 2014-11-21)
-------------------------------
* Our tolerance of damaged PDFs was reduced in 2.16 and we were more likely to
  throw an error during load than in previous versions - now fixed.

* Using an unembedded TrueType font will now work even if the font is missing a
  POST table. Also some related fixes to parsing unembedded fonts.

* Some memory improvements for certain workflows relating to modifying existing
  pages.

* Corrections to XFA formatting to handle some unusual cases.

* Added PageExtractor.Text.getVisualBounds(), to give an exact visual bounding
  box for text. Also fixed some related bugs in PageExtractor.cropText

* Viewer: correctly mark a PDF as dirty when a hidden form field is changed

* Viewer: fixed round trip edits of text annotatations in non-ASCII languages.

* Viewer: fix for a curious race condition relating to intiialization of
  JFileChooser

* Viewer: don't fail with exception if OS has no default printer set.

* Viewer: Allow Save feature to be disabled unless PDF is "dirty"

* Viewer: Allow configuration of margins size and border colors for Viewports

* Viewer: Allow replacement of the default TransferHandler, to intercept copy/paste
  operations.

* Viewer: Added Importer.addToMostRecent, to prevent a file being added to the
  "Most Recently Loaded" list.

* Viewer: corrections to Chinese translation



2.16    (released 2014-09-05)
-------------------------------
* We're finally using generics in our method signatures both internally and
  externally throughout the library, including the viewer. This means a few
  methods have had generics added to their signatures, and in one or two places
  the signatures have changed. This shouldn't affect existing classes but source
  code being (re)compiled against this Jar may need tweaking.
  Here's a list of the changed method signatures:

  * Collection<? extends Text> PageExtractor.getTextUnordered -> Collection<Text>
    (and the same for PageExtractor.getTextInDisplayOrder)

  and in the viewer

  * PDFViewer(Collection) -> PDFViewer(Collection<ViewerFeature>)
  * PDFViewer.getFeature now returns feature of specified class, so you can do
    PDFImporter importer = viewer.getFeature(PDFImporter.class)
  * TextTool.select(Collection) -> TextTool.select(Collection<PageExtractor.Text>)
  * TextSelection.RangeList and KeyStoreAliasList have generic-correct supertype
  * BackgroundSignatureVerifier methods take Collection<FormSignature>

* Complete rewrite of rendering layer - this will result in a microscopic
  difference to the bitmaps in conversions of most files, and a large
  improvement for a few. See http://bfo.com/blog/

* Complete rewrite of redaction - redacted area should now be much closer to the
  specified area (previously we tended to redact too much). Redaction will now
  fail if digital signatures or XFA are in place - a signature would retain the
  previous version of the PDF, which misses the point of redaction. Also added
  an easy method to Redactor to identify annotations that may need removal.

* Reduced memory footprint when working with documents loaded by PDFReader.
  How much varies per document, but a 10% reduction seems about average.

* XFA parsing has been redone and should now load all valid XFA documents without
  warning or error.

* Rewrite of the structural tags facility - beginTag/endTag on LayoutBox/PDFCanvas
  and PDFPage. More documentation and added a new example "StructuredPDF.java"

* Added support for ECDSA encryption with SHA256/384/512 hash algorithms

* Correct render forms when NeedAppearances flag is true

* Added AnnotationNote.setOpenRectangle, to control location of popup.

* Fixed some incorrect warnings about XMP processing instructions

* Removed the deprecated DSE200HandlerFactory class, which hasn't worked properly
  for some time and whose functionality has long since been absorbed into the
  AcrobatSignatureHandlerFactory class.

* Viewer: fix some possible deadlocks that could arise from customized workflows

* Viewer: don't fail when trying to save to a filename < 3 characters long

* Viewer: improvements to German translation

* Viewer: added DocumentPanel.get/setWindowTitle, and improved UI when two
  documents with identical names are open



2.15.3  (released 2014-05-21)
-------------------------------
* Several fixes to XFA, in particular regarding field formatting.

* Improved algorithm for text extraction now gives better results for most
  documents. Added identification of super and subscript digits from the text.

* Changed mapping from PDF font to OS font from 1:1 to 1:many, required
  to correctly render characters from the more recent HKSCS supplements on
  Windows.

* Identified and fixed a bug in the official Adobe-CNS-6 mappings for CIDs 16976
  and 16977 (U+24156 and U+24157, both from HKSCS-2008), which had the wrong
  Unicode values. The "bfopdf-cmap.jar" file has changed as a result.

* Several fixes for JavaScript under Java 8

* Handle ToUnicode maps that map every possible codepoint to identity
  in a saner way.

* XMP metadata now requires namespaces end in a '/' or '#', to match Acrobat's
  incorrect implementation of bizarre and entirely unnecessary clause in
  badly written specification (ISO 16684-1:2011(E) 6.2, p14).

* Don't decode an image in PageExtractor.Image just to get its dimensions

* Fix infinite loops when particular values passed into pathArc, and when
  the PageLabels in a PDF has corrupted data.

* Fixed font sizing of text with small-caps, broken a few releases ago

* Moving pages between documents more reliable for files created with NitroPDF.

* Correctly render text with font size < 1.

* Fixed subtle and long-standing bug triggered by printing certain documents
  containing an inline image.

* Subtle correction to PDF/A-2 and A-3 rules regarding default page blend modes

* Viewer: Save dialog works when no Exporter features are defined



2.15.2  (released 2014-03-03)
-------------------------------
* Added generics to method signatures where appropriate. Java 4 is supported
  (as before) with the "bfopdf-14.jar" Jar.

* Tested and verified with Java 8 - mainly adding support for the "Nashorn"
  JavaScript engine.

* Added signing/verifying of PAdES signatures to AcrobatSignatureHandlerFactory

* Added support for the latest release of the Hong Kong Supplementary character
  set (HKSCS-2008) to the MSung and MHei fonts. The changes for this are in the
  "bfopdf-cmap.jar" as well as the core Jar, so remember to upgrade both.

* Faster cloning of PDFs with PDF(PDF) constructor

* If an OutOfMemoryError occurs when drawing a bitmap image while rendering the
  page, we'll try to draw it at a lower resolution before failing completely.

* Viewer: aded facility to load the KeyStore from a Jar

* Viewer: When calling Importer.setFile(), if the file is not absolute the Save
  dialog will default to the last directory used by the user. Useful for saving
  files loaded from streams or URLs.



2.15.1  (released 2013-12-18)
-------------------------------
* Viewer: Fixed memory leak when reloading PDFs in the same PDFViewer.

* Viewer: Fixed exceptions that sometimes occur when changing the
  DocumentPanel's PDF, as is done when the MultiWindows feature is disabled.

* Viewer: Fixed position of window after zooming to selection, selecting text
  in a search panel, or otherwise running a GoToFitRectangle action when a
  CropBox is set on the page.

* Fixed race condition in PDF, only apparent if you're accessing it
  simultaneously from multiple threads, as we are in the viewer since 2.15


2.15    (released 2013-12-13)
-------------------------------
* No change, but we've renumbered the release to 2.15 because the behaviour of
  the PDF page list is, technically, an API change. We've documented why here:
  http://bfo.com/blog/2013/12/13/bfo_pdf_library_2_15_but_what_happened_to_2_14_1.html


2.14.1  (released 2013-12-12)
-------------------------------
* Added support for loading linearized documents to the viewer - if you want
  your custom features to take advantage of this then they may need rewriting,
  but should have no impact for most.

* Added PDF/A-2b and PDF/A-3b support to the OutputProfile class, and fixed a
  few (very specific) issues with PDF/A-1b.

* Added support for creating PDF portfolios.

* Pages can now categorically only belong to one document. This was enforced
  half-heartedly with previous releases, but this release is more rigourous.
  Pages can now be rearranged in the list or moved between documents, with an
  iterator if preferred, and they will only ever exist in one place at a time.

* Fixed names of inks in Separation (Spot) colors, broken a few releases ago

* Fixed subtle but long-standing issue with glyph position, usually only
  noticable in particular symbol fonts. Improved rendering of glyphs on Windows.

* Made public our LabColorSpace class to allow colors defined in the CIELAB
  space. Primarily useful as a means of defining PANTONE Spot colors.

* Correctly identify documents with Spot colors and RGB alternates as
  containing RGB - broken a few releases ago. Fixed a few other edge-cases
  relating to colorspaces and the OutputProfile class.

* Font features can be set on the style as well as the font - which means a font
  can have a feature enabled for a single word in a LayoutBox without needing to
  clone it. Deprecated PDFFont.linearize as part of the cleanup in this area.

* Changed manifest to allow applets to run with (ill-considered) changes made in
  Java 7u45.

* Fixes to RTL text processing with OpenType layout algorithm

* When profiling or extracting text, don't load unembedded fonts if we don't need
  to.

* Fixes to repairing bookmarks

* Viewer: will prompt if a password is required when loading a PDF over HTTP.

* Viewer: added cut/paste option for pages, and correctly order pages cut/pasted
  this way.

* Viewer: fixed failure to redraw after reordering pages in some circumstances

* Many other small fixes and improvements



2.14  (released 2013-08-05)
-------------------------------
* Basic support for Linearized or "on-demand" loading. This is a large revision
  which allows Linearized or "web-ready" PDF files to be loaded from an HTTP URL
  in the background. Many changes still need to be made to the Viewer to allow
  for this, but this revision puts the necessary changes into the core API.
  New methods are in the PDFReader class and PDF.getLoadState(), and new classes
  are LoadState and LinearizedExeption.
  *****  Existing functionality for non-linearized PDFs remains unchanged. *****

* Added new methods to PDFReader - setSource, addEncryptionHandler - and
  deprecated (with replacement) some of the more convoluted constructors.

* Increased speed  when concatenating very large PDFs and merging resources by
  several orders of magnitude.

* Fixed typo when purging resources which deletes any non-hyperlink annotations.

* Fixed issue resulting in missing text when flattening Forms in rare PDFs.

* Added PDFPage.setMeasurementUnits, to assign real-world dimensions to an area
  of the page (useful for CAD or Geo PDFs).

* Fixed PDF/A related issues when calling PDF.setMetaData.

* Modified XMP metadata creation to never include a UUID, in line with latest
  revision of XMP specification (to produce more acceptable PDF/A files).

* Progress of save is reported much more accurately, and progress on load can
  be reported via new PDFReader.getProgress() method.

* Fixed rare issue when merging resources, which could result in fonts with
  missing glyphs.

* Conversion to bitmap on Windows machines with huge numbers of installed fonts
  could be slow - now cache the list.

* Added the option to discard rather than repair damaged form fields when
  repairing a damaged PDF on load: set the "RepairRemoved" property to not-null.

* Fixed requote feature in LayoutBox where there are complex nested quotes.

* Viewer: fixed some Event Dispatch Thread violations when dialogs are displayed
  by the KeyStore management classes.

* Viewer: use the ".pdf" suffix when saving a PDF created from an image.

* Viewer: API change: the DocumentViewport.getNextSelectablePage has changed
  to DocumentViewport.getNextSelectablePageIndex. Shouldn't matter unless you're
  creating a custom Viewport.

* Viewer: multi-line annotations do not add extra newlines on every edit.



2.13.2   (released 2013-05-08)
-------------------------------
* Map returned from PDF.getNamedActions() didn't fully implement Map interface.

* Added ColorContent, ColorImage, GrayscaleContent and GrayscaleImage to
  OutputProfile class, to categorically determine if a PDF contains color or
  grayscale content.

* Slightly modified column spacing during text extraction - previously the two
  columns would overlap by one character.

* Minor fixes for some specific damaged PDFs.

* Removed the last finalizers from the API - although most use-cases wouldn't
  have created many finalizable objects, there are certain ways to use the API
  that do and this should help performance in those situations.

* Viewer: reverted Java 1.5 incompatible change in previous release.

* Viewer: ensure action() method is always called in our features (needed by
  overloaders - reverting change in previous release).

* Viewer: fixed occasional NPE from PagePanel.doLayout on deleting annotation.

* Viewer: fixed order of activated/loaded/deactived events.

* Viewer: improved french translation.



2.13.1   (released 2013-04-18)
-------------------------------
* Fixed NullPointers which could occur when working with documents that had been
  cloned, a problem introduced in the previous release.

* Fixed clash between Tomcat ClassLoader and JavaScript sandbox, which would
  result in exceptions and no JavaScript being executed (since 2.11.25)

* Correctly render form fields that have their style changed during formatting

* Correctly clip Shading patterns that specify a BBox

* Don't allow invalid CreationDate or ModDate to be set in PDF info dictionary.

* Correctly position text with vertical writing direction.

* Don't fail on documents with existing but zero-size MediaBox or CropBox

* Viewer: allow ViewerWidgets to define javax.swing.Action and share that action
  between buttons, menus and potentially other objects. This makes for easier
  code when that Action has complex rules for when it's enabled (eg it depends
  on the DocumentPanel permission). See ViewerWidget API docs for details.

* Viewer: fixed memory leak when repeatedly opening Documents in a viewer
  without MultiWindow, added in previous release.

* Viewer: corrected the order of DocumentPanelEvents when closing Documents.

* Viewer: added dual-page view (two-up)

* Viewer: Opening a PDF can now be properly (ie immediately) cancelled

* Viewer: background tasks are automatically cancelled when their parent window
  is closed.

* Viewer: correctly run JavaScript actions after the first in a linked-list of
  actions on a Widget

* Viewer: fixed race when rapidly scrolling through PDF which could result in
  Annotations not being rendered correctly

* Viewer: correctly deal with pages being deleted by JavaScript during load

* Viewer: corrected ordering of overlapping annotaitons, lost in a previous
  revision

* Viewer: corrected parenting of dialogs when Viewer is itself in a JDialog

* Viewer: corrected order of OK/Cancel buttons when LAF is Nimbus on Windows

* Viewer: corrected "zoom to fit" operation on SinglePageView



2.13     (released 2013-03-20)
-------------------------------
* Many internal changes paving the way for improvements in future releases.

* Fixed an exception when running JavaScript under Java 5

* Allow recompression of DCT encoded images by denying OutputProfie.FilterDCT

* Fixes to JavaScript run when a field is flattened

* Treat truncated tables in OpenType fonts as missing rather than failing.

* Regression fix relating to right-aligned text, broken in the last release
  and mainly reproducible in the Report Generator

* Added improved "requote" feature to PDFFont, deprecate PDFFont.requote method

* Fix for limitations in Windows relating to fractional font metrics

* Ignore embedded ColorSpaces in images that are valid but wrong order

* Accept XMP PDFs with missing template or datasets

* Added OutputProfile.PDFPortfolio, to identify PDF portfolios when loaded

* INCOMPATIBLE CHANGE: Viewer: AreaSelectionAction and TextSelectionAction
  interfaces both have a new "isEnabled" method which must be implemented.

* Viewer: Added "permissions" to the DocumentPanel, which are a superset of
  the restrictions imposed by encrypted documents. This allows us to temporily
  remove the ability to save (for example) and allows us to respect limitations
  imposed by a digital signature, a background task or anything else.
  See DocumentPanel.hasPermission and DocumentPanelEvent.permissionChanged

* Viewer: Specifying the "respectSignatureCertification" option will respect the
  limitations placed on a PDF containing a certifying signature. This is not
  the default behaviour for backwards compatibility. See DocumentPanel
  initialization parameters documentation.

* Viewer: when selecting a character in the middle of a long line of text, one
  bug could cause the drawn rectangle to be out by up to half a character, and
  another could cause the selection to be short by one character. This could
  cause problems when redacting part of a word.

* Viewer: repaint pages in SinglePageDocumentViewport after rotation

* Viewer: allow cancelling when importing or exporting an image

* Viewer: better management of long running background tasks.

* Viewer: added before and after hooks to the Exporter class, which can be
  used by custom subclasses to modify a PDF before and after save if necessary.

* Viewer: clean up the PDFViewerApplet's resources when it's destroyed.

* Viewer: fixed potential deadlock when annotations are being rebuilt while
  thumbnails are painted.

* Viewer: fixed coordinates when jumping to hyperlink that specifies all four

* Viewer: NetworkSave fires Doc/WillSave and Doc/DidSave JavaScript events

* Viewer: improvements to german translation

* Viewer: many small fixes resulting from extensive testing


2.12     (released 2012-10-24)
-------------------------------
* Text Extraction will only decode images if they're asked for, which should
  speed up extraction by a large factor for some documents.

* Text Extraction now has hooks to "recode" an incorrectly encoded font,
  although the mapping must be created manually.

* Revert change to LayoutBox from 2.11.22 relating to trailing spaces on a line.

* Improvements to color fidelity, particularly relating to shading patterns.

* Removed unnecessary restriction on setting ModDate and CreationDate in PDF -
  these are still set automatically, but it's now possible to override them.

* Some dashed lines were turned to solid when rendering - now fixed.

* Correctly render (rare) documents with uncolored Tiling pattens.

* Correctly render documents with unfeasibly large soft-masks, as sometimes
  created by InDesign 6. Previous builds would run but would fade graphics with
  a blocky appearance.

* Fixes for various incorrectly constructed PDFs and PNGs.

* Correctly resolve relative URIs in hyperlinks where the PDF has a a Base URI.

* PDF.getFullOutputProfile no longer locks entire PDF object for its duration,
  which could cause deadlocks in the viewer.

* Viewer: reworked the event notifications between the PDF core and the viewer,
  resulting in less synchronization and better stability. See the
  PDF.useAWTEventModel() method for detail


* Viewer: Changing or closing a PDF in a DocumentPanel may now call PDF.close().
  This will immediately free resources for the PDF (allowing the file to be
  deleted on Windows), but if anyone is still holding a link to the PDF object
  after its DocumentPanel has closed it will cause problems. This is not on
  by default but may be set with the "org.faceless.pdf2.viewer2.EarlyClose"
  property.

* Viewer: PagePanel completely refactored to better handle interruptions and
  fix a number of special case rendering errors. Note this release does not
  allow the page to be changed once set.

* Viewer: Windows L&F now has Cancel button on the right - the Windows way.

* Viewer: improvements to ThumbnailPanel. Added new ThumbnailSelectionAction
  subinterface and three implementations to delete/extract/rotate thumbnails.
  This approach makes it possible to add custom actions to the ThumbnailPanel as
  Features. Also cleaned up keyboard control, selection with right button,
  resize when a page is rotated, and better release of resources when the
  DocumentPanel is closed.

* Viewer: Text selection (via TextTool) can now work in "natural" or "display"
  order - for documents created with columns or out-of-order text, this affects
  how drag selection of text works.

* Viewer: added new "stateChanged" event, which is a generic way to inform the
  viewer that something transient has changed - eg a signature was verified.

* Viewer: undo/redo of annotations correctly updates modification & creation
  date, and the author can optionally be changed too (see
  AnnotationComponentFactory API documentation for details).

* Viewer: fixed text selection of rich text when text on a page is not strictly
  top-left to bottom-right.

* Viewer: NetworkSave will pause background tasks, fire JavaScript Doc/WillSave
  and DidSave events and clear the "dirty" flag on the DocumentPanel, exactly as
  the same as the regular Save feature.

* Viewer: correctly position page on GoToRectangle actions.

* Viewer: added NullDocumentViewport, to completely disable the DocumentViewport
  in a PDF. If this is used at all, we anticipate it's by people who want just
  the thumbnail panel visible.

* Viewer: improved German translation, moved page rotation to "edit" rather than
  "view" menu (as it changes the PDF).

* Viewer cleanup: removed some very old deprecated code; many small bug fixes



2.11.25  (released 2012-07-13)
-------------------------------
* SECURITY: Fixed potential JavaScript security issue. Customers are encouraged
  to upgrade and can contact BFO directly for more detail.

* Correctly enforce the restrictions that an annotation can only be in one page
  or belong to one field, without having to a) tidy things up before we render
  the PDF and b) throw loads of ConcurrentModificationExceptions.

* Added support for barcode fields with the new FormBarCode class

* Added support for 16-bit PNG images

* Added support for optional supplemental codes to EAN-8 / EAN-13 BarCodes

* Added ability to create binary DataMatrix and PDF417 BarCodes

* Fix hang when converting a single image to JBIG2 (multiple images are OK)

* Added "kerning" feature to fonts, to optionally turn off kerning

* Added ability to use embedded fonts in rich text annotations

* Fixed extraction of uLaw and aLaw encoded audio streams from PDFSound

* Fixed rare issue when merging fonts that could cause spaces to disappear

* Fixed occasional issue in FormChoice.setValue when field is a Combo Box

* Fixed issue in LayoutBox which could cause the last letter of a line to be
  repeated, with very specific input

* Tweaked position of bullets in radio buttons

* Correct algorithm for inter-line spacing in TrueType fonts can now be used
  by setting the "correctleading" feature in the font. Not on by default for
  compatibility.

* Added "ContentIsDamaged" feature to OutputProfile, to better identify some
  badly damaged PDFs

* Fix for exception decoding some valid-but-odd DCT encoded images

* Viewer: added SelectArea tool and associated AreaSelectionAction, and changed
  TextSelectAction from abstract class to interface to match. Also added
  CropPage feature as an AreaSelectionAction.

* Viewer: rewrote MultiPageDocumentViewport for efficiency, particularly when
  scrolling rapidly with mousewheel. Added smooth scrolling where possible.

* Viewer: added ability to capture handwritten signatures using an iPad, iPhone
  or Android device via the new SignatureCapture feature (not on by default)

* Viewer: removed double-buffer related deadlock in TextTool when rapidly
  changing text selections

* Viewer: implemented Doc.getNthFieldName and Doc.exportAsXFDFStr in JavaScript

* Viewer: optimizations to default SecurityManager for across-the-board speedup

* Viewer: slightly more compact when using Nimbus theme, and fixed for Java 7

* Viewer: added option to prompt before overwrite to Save feature

* Viewer: added support for barcode fields

* Viewer: improvements to error dialogs



2.11.24  (released 2012-05-30)
-------------------------------
* Added support for Type 1, 4 and 5 shading patterns, fixes for type 6 and 7,
  and corrected gradient rotation.

* Fixed exception when signing a PDF with an invisible signature, broken in
  previous release.

* Fixed occasional stretching of fonts after merge in MergeResources

* Reverted slight change to text layout algorithm in 2.11.22 so two are now
  identical

* Fix for rendering duotone indexed images with soft masks

* Fix for removal of LZW compression

* Added "ImageLengthIncorrect" OutputProfile feature, to catch truncated images

* Fixed mapping of unofficial-yet-acceptable codes for bullet char in
  WinAnsiEncoding, which could cause bullets to go missing when rasterizing PDF

* Viewer: selected text will stay selected if text selection tool is inactive.

* Viewer: About feature can be configured with custom logo/text properties

* Viewer: Fixed ClosedByInterruptException in ThumbnailPanel with no multiple
  DocumentPanels



2.11.23  (released 2012-04-30)
-------------------------------
* Added reading/writing PDFs with AES-256 Encryption as used by Acrobat X.

* Corrected version numbers when reading/writing PDFs with ISO 32000 extensions.

* Fixed exceptions when rendering documents containing progressive JPEG images,
  broken in previous release.

* Reduced memory footprint when moving pages from one PDF to another.

* Fixed crash and/or incorrect glyph widths in resulting document when merging
  certain types of font with the MergeResources feature.

* Reduced memory footprint when profiling or extracting text from documents
  with large bitmap images.

* Fixed issue with OpenType layout engine that would prevent features being set
  on digits.

* Fixed a minor deviation from spec for StandardFont class.



2.11.22  (released 2012-04-19)
-------------------------------
* Added OpenType layout engine - slower than the default one so it's disabled
  by default, but it can be enabled to support Indic languages such as Hindi,
  Bengali etc, or to use special features of the font like swash capitals.

* Replaced ImageIO-based JPEG and JPEG2000 decode with new implementation,
  drastically reducing memory footprint when displaying PDFs containing very
  large JPEG images and allowing reading to be interrupted, for example by
  scrolling the page containing the image out of view in the viewer.

* PostScript functions are an order-of-magnitude faster - this will mainly
  help those rasterizing PDFs containing DeviceN colors.

* Added PDFImage.quantize() method, to convert CMYK or RGB images to indexed.

* Changes to position/size of text in text and choice fields to closer match
  Acrobat.

* Added methods to get the open/closed rectangles of an AnnotationNote without
  having to change its state.

* Fixed some PDF/A verification failures on valid documents.

* Fixed "early-break" issue when laying out text, which could cause a line to
  break into two lines a word early.

* Fixed bug when justifying text on the line - wasn't correctly aligning to the
  right edge of the line.

* Fixed rasterizing of PDFs containing exceptionally large XObjects or Tiling
  Patterns - was previously giving incorrect results or OutOfMemoryError.

* Don't break usage rights when original PDF has weird default form styles.

* Fixed setJavaScript, which wasn't correctly clearing previous JavaScript.

* Fixed rendering of Type3 fonts with Identity FontMatrix.

* Fixed extraction of font names and details into OutputProfile.

* Added WidgetAnnotation.isOverflowing(), to give a rough idea of when too much
  text has been placed into a text field.

* Don't fail when Apache Batik's patched version of Mozilla Rhino is installed.

* Fixed long-standing issue relating to explicit Bidi directional override
  characters, which were not working correctly.

* Fixed occasional disappearing images in Windows 16-bit color environments.

* Fixes for rendering some PDF edge-cases - symbolic OpenType fonts, 16-bit
  indexed JPEG2000 images, Lab/YCbCr JPEG2000 images.

* Added PDF.isLicensed() to identify whether a valid license is available.

* Viewer: Added "setFile" method to Importer, to set the default filename for a
  loaded PDF, and integrated support for this into the PDFViewerApplet.

* Viewer: fixed support for JCEKS format keystores containing SecretKey objects.

* Viewer: correctly redraw when JS deletes the currently displayed page.

* Viewer: better interrupting when scrolling rapidly through image-heavy pages
  (particularly through changes to JPEG decoding, mentioned above).



2.11.21  (released 2012-02-09)
-------------------------------
* Fixed regression introduced in previous release where some documents with
  compressed XRef streams would fail to open in Acrobat.

* Fixed regression introduced in previous release where adding JPEG images to
  a PDF could result in them being uncompressed.

* Fixed regression from 2.11.19 where merging multiple copies of the same PDF
  could result in larger files than necessary, or with errors if PDF was
  encrypted.

* Improvements to the "MergeResources" step for PDF/A and PDF/X documents, will
  now merge compatible but different subsets of same OpenType font.

* XFA forms containing picture clauses for field formatting are now supported.

* Signing documents with PKCS#7 Signatures no longer requires a "dummy sign"
  first to establish the size of the object.

* Stamp annotations added to rotated pages by our API were displayed in the
  wrong place by our viewer, despite being correct. Now fixed.

* Improvements to memory usage when rendering PDF to bitmap image on Windows
  with 16-bit display.

* Fixed positioning of tiling patterns when rendering under the most complex
  circumstances.

* Can flatten Highlight annotations with missing appearances.

* Subtle fix to Type 1 fonts when rendering now gives better text rendering.

* Workaround for several bugs in Crimson XML parser, as supplied with Java 1.4.

* PostScript functions are now thread safe - was only manifesting itself when
  rendering pages containing images in PostScript-based SpotColorSpaces (rare).

* Invisibly signing a PDF/A document doesn't break PDF/A compliance.

* Fixed errors relating to: truncated IndexColor maps, truncated kerning tables
  in OpenType fonts, missing CMaps in Type1 fonts, three-cornered rectangles,
  fonts with (some) missing glyph contours, OpenType fonts claiming to be
  CompactFonts, rare inverted CMYK and skewed images when displaying PDF,
  decoding of indexed JPEG2000 images and rendering of forms with noninvertible
  transforms.

* It's now possible to prevent the use of "fi" and "fl" ligatures in Latin
  fonts by calling PDFFont.setFeature("latinligature", false) or by setting
  the System property "org.faceless.pdf2.NoLatinLigatures", to control for
  all fonts.

* Fixed incomplete list of fonts returned from OutputProfile.getFonts()

* Viewer: Improvements to interrupt handling mean that rapid scrolling through
  an image-heavy document is more responsive and less of a memory hog.

* Viewer: certain types of PageLabel could cause the viewer to display the
  wrong pagenumber (eg 11 for 1, 22, for 2). Fixed.

* Viewer: fixed ability to disable flatten/edit/delete functionality for some
  or all annotations.

* Viewer: creating a very large pattern on a very small zoom level could cause
  an integer overflow, leading to an exception trying to create a huge bitmap.

* Viewer: added JCEKS KeyStore support.

* Viewer: added EGIZSignature support to signature panel, and format signature
  dates in locale-sensitive way.



2.11.20  (released 2011-12-06)
-------------------------------
* "bfopdf.jar" jar is now compiled for Java 5.0 or later; customers running
  Java 1.4 now need to use the "bfopdf-14.jar" instead, which is a backported
  version of the main jar. Changed to allow us to benefit from the improvements
  to Java, while still continuing to support our customers using Java 1.4.

* Fixes to setOutputProfile, which was sometimes not failing when it should
  have. This could result in profiles being applied incorrectly, so documents
  that should have failed when being converted to PDF/A were succeeding.

* Updated Lucene to support 3.4

* Added Code-93 barcodes

* Bug fixes to ensure moving annotation around between pages does the right
  thing every time, and don't clear annotation unique ID when we clone a PDF

* Fixes to compression of zero-length AES streams, and when modifying digitally
  signed, encrypted PDFs

* Fixes for TrueType fonts with FPGM, and Type1 fonts missing required fields

* Fixed removal of Movie/Sound annotations when denied in an OutputProfile

* Fixed long-standing bug where some dates from a read-in PDF may have been out
  by a few hours, due to incorrect timezone handling.

* Allow user-configurable fallback fonts when rendering Chinese/Japanese/Korean

* Viewer: don't OutOfMemory if drawing scaled down huge patterns

* Viewer: fixed reversed test which could result in pages not redrawing properly
  when the zoom changes in SinglePageDocumentViewport.

* Viewer: Don't lose rendering hints (eg anti-aliasing) when changing Viewports

* Viewer: added Feature.setFeatureName, to make subclasses our standard features
  easier.

* Viewer: fixed NPE in PageNumber.



2.11.19  (released 2011-10-25)
-------------------------------
* Verified API against Java 7 and fixed some Java 1.4 compatibility issues

* JBIG2 classes from JPedal are now included and have been optimized. There's
  no longer any need to use "jbig2dec" or include the "jbig2.jar" in your
  classpath.

* Speed improvements for text extraction and PDF creation

* Improvements to XFDF reading and writing - properly handles more unusual
  annotation types. Also added JavaScript import from FDF - for FDF files
  containing JavaScript THIS MAY CAUSE JAVASCRIPT TO EXECUTE AT THE POINT
  OF IMPORT. This is configurable, see the FDF class API docs for more info.

* Rendering bitmap images with a Blend Mode is now working

* Added PropertyChangeEvent support to PDFPage and PDF classes

* Added PageExtractor.getStyledText method, to extract an AttributedString.
  Styling information is limited to font, size and color.

* Now any annotation can be flattened (with PDFAnnotation.flatten()), not just
  form fields

* Added getPageLabel/setPageLabel to PDF, and integrated labels into the Viewer

* Viewer Applet: Can set look and feel with "swing.defaultlaf" parameter

* Viewer: Documents can now be flagged as "dirty", meaning they need to be
  saved before closing. This optional feature is on by default, but to close
  dirty documents without a prompt, set the viewer property
  "unpromptedDirtyClose" to "true".

* Viewer: Fixes for Nimbus L&F and improved layout for some of the dialogs

* Viewer: NetworkSave and form submission can be usefully cancelled, and
  NetworkSave feature has optional "fieldname" parameter, to send PDF to network
  in the same way as an HTML Form upload

* Viewer: The viewer property "currentUser" can be used to set the user name for
  any annotations

* Viewer: Added ability to set document actions WillSave, DidSave, WillPrint,
  DidPrint and WillClose (implemented JavaScript methods Doc.setAction and
  Doc.setPageAction)

* Viewer: Can right-click to flatten annotations, as well as edit or delete

* Viewer: text copies to the clipboard will copy as rich-text as well as plain

* Viewer: Fixed drag selection over multiple pages

* Viewer: Improvements to AnnotationFactories, to make them look more
  consistent and adjust their size to their content. AnnotationStampFactory
  has been rewritten and can better be extended for custom stamps.

* Viewer: Fixed import of FDF (implemented Doc.importAnFDF and Doc.importAnXFDF)

* Viewer: better synchronization should remove occasional exceptions when
  moving/deleting annotations while the thumbnail panel is rendering them



2.11.18  (released 2011-08-24)
-------------------------------
* When reading/writing a PDF using AES encryption, document restrictions (eg
  printing, text extraction) weren't maintained properly. Now fixed.

* Fixed Classloader issue when executing JavaScript in PDFs under Apache Tomcat

* Added PDFPage.setThumbnail (although feature is unused in modern PDF Viewers)

* Improved stretching of glyphs when rendering substituted fonts with different
  metrics to the original.

* Added basic hooks for use of Elliptic Curve cryptography in signatures.

* Fixed reversed test on FormCheckbox.isSelected

* Fixed reversal of red/blue when printing certain types of RGB images

* Fixes to results returned by getFullOutputProfile() on versioned PDFs

* Fix to issues when moving annotations between form fields.

* Fixed interaction between FormText.setNumberOfCombs and FormText.setMaxLength

* Fixed specific issue identifying form fields where "FT" property is inherited,
  and where checkbox Opt array is invalid

* Fixed encoding issue for certain Type 1 fonts, eg "Palatino Light"

* Fixed embedding of XMP metadata loaded from JPEG images.

* Viewer: Implemented JavaScript function Doc.submitForm, and rewrote
  FormSubmitActionHandler to enable this. Also added a much easier way to
  execute custom JavaScript in the viewer

* Viewer: Added PDFViewer.close() method, to ensure clean shutdown of the viewer
  components.

* Viewer: if a new signature is cancelled before signing, remove it.

* Viewer: default to system default printer in print dialog

* Viewer: fixed JavaScript formatting of zip/phone numbers, and fixed call to
  blur event which was missed when focus was lost via tab key.



2.11.17  (released 2011-06-27)
-------------------------------
* Updated bfopdf-cmap.jar - if you see ObjectInputStreamException when working
  with documents containing Chinese/Japanese/Korean text then make sure you have
  installed the latest version of this Jar.

* Fixed a confusion regarding FNC1 characters in barcodes: previously we allowed
  "\n" to mean FNC1 in Code128 barcodes, but "\n" is actually a valid character
  so this was broken some time ago. FNC1 is now specified with U+EFC1 character
  (defined as BarCode.FNC1), and this may be used in DataMatrix codes as well.

* Fixed threading issue when cloning a PDF containing XMP form using new PDF(PDF)

* Fixed issue where subsetting CFF font could prevent page containing font from
  being printed by Acrobat.

* Fixed SecurityException caused by editing form fields which fire JavaScript
  events in an environment where a SecurityManager is installed.

* Added workaround for Sun Bug 7007299 which could cause NullPointerException
  when multiple threads are rendering unrelated PDFs with unembedded fonts.

* PDFParser.setFont() will take an OpenTypeFont as well as a Font class, to
  avoid use of system fonts completely in case workaround (above) doesn't do it

* Fixed NullPointerException from specific PDF with XFA form

* More fixes to DataMatrix barcodes. We now have a test-suite just for these...

* Fixed divide-by-zero in ColorBurn composite

* Fixed misread of number of pages in certain (invalid) PDF documents.

* Don't mark a document as Linearized when it's loaded if linearization has
  been broken.

* Now PDFParser.getBlackAndWhiteColorModel(0) can be used to auto-determine
  an appropriate threshold.

* Added ability to create "cloudy" AnnotationShape objects, via new
  PDFStyle.setFormStyle(FORMSTYLE_CLOUDY1) and FORMSTYLE_CLOUDY2 constants.

* Improved reporting of warnings related to XMP formatting errors

* Fixed exception with rendering when blendmode and softmask were both active

* Viewer: Added the "NetworkSave" feature, to save a PDF back to an HTTP URL

* Viewer: fixed buggy creation of new digital identities in KeyStoreManager

* Viewer: basic support for RTL locales.



2.11.16  (released 2011-04-18)
-------------------------------
* Fixed issue where certifying a PDF sometimes only applied a regular signature

* Tweaked rules for CMYK PDF/A documents relating to link annotations.

* Exhaustive barcode testing fixed bugs in PDF417, MaxiCode, Codabar, Aztec
  and Datamatrix BarCode output

* Fixed regression bug where valid signatures were sometimes failing to verify
  (introduced in 2.11.14)

* Viewer: fixed issue where at high zoom levels, parts of a large (full page)
  image sometimes wouldn't display.

* Removed Java 1.3 compatibility - Java 1.4 or greater is now required to use
  the PDF Library.

* A new BFO signing key is used to sign the Jar



2.11.15  (released 2011-03-28)
-------------------------------
* Viewer: PKCS#11 KeyStore added in previous release is not available in
  64-bit Windows JVM, which would cause a ClassNotFoundException when using
  the viewer

* Fixed bug when rendering PDFs containing a TextRise on unembedded fonts,
  which would cause text to be positioned incorrectly

* Viewer: modified Viewports to better implement drag scrolling.

* Viewer: prevent OutOfMemory with high zoom levels on pages containing very
  large annotations.



2.11.14  (released 2011-03-09)
-------------------------------
* Added support for (hardware-based) PKCS#11 based KeyStores when signing.

* Added AnnotationRichMedia class, to embed Flash into a PDF

* Added "Aztec Code" Barcode

* Fixed validation of signatures with SHA256/284/512 digests and when PDF is
  encrypted (broken a couple of releases ago)

* Replaced BouncyCastle code with considerably smaller home-grown ASN.1 parser

* Added methods to FormSignature to restrict the users options when signing
  a blank signature created with this class (see setRequiredNNN methods).

* Updated QR-Code character set to ISO-8859-1 (new for version 2 of the spec),
  fixed DataMatrix encoding rules and fixed issue with specific type of Code128

* Tweaked some low-level data structures for speed/memory improvements.

* Fixed a few bugs relating to cloning form fields, either by calling
  FormElement.duplicate() or by duplicating a page containing them. Also fixes
  for radio buttons and checkboxes with duplicate values.

* Fixed a bug when subsetting of OpenType fonts when the Form is flattened -
  subset wasn't always happening.

* Fixed native code memory leak when decoding JPEG images. Note this leak only
  occurs when decoding thousands of DCT compressed images on one PDF page -
  an unusual situation. In 99.9% of cases the memory is properly recovered on
  the next minor garbage collection.

* Fixed text extraction for a few (unusual) documents, broken in 2.11.11

* Fixed error when linearizing documents previously created with Object
  Compression - results were not necessarily linearized correctly.

* Corrected end-of-line whitespace trimming for text in Arabic or Hebrew locales

* Correctly extract embedded files created by FoxIt.

* Fix to XFA parsing for certain (unusual) documents.

* Renamed and corrected spell-check methods on FormText, which were the wrong
  way around.

* Spec says PDFs must have < 1kb of trailing garbage, but as Acrobat accepts
  documents with more, now so do we.

* Viewer: Can now drag-select text over multiple pages.

* Viewer: Fixed behaviour of RadioButtons and Checkboxes for more obscure
  combinations of flags, and when data values contain duplicates.

* Viewer: Fixed positioning of page when a "Go To Rectangle" action is performed

* Viewer: Fixed status of "zoom to fit" buttons when zoom is changed manually.

* Viewer: Remove NPE when TextHighlighter is given a list of words before
  extraction has finished

* Viewer: Fixed text extraction/selection after page is rotated and when zoom
  is changed.

* Viewer: Position of "OK/Cancel" buttons is consistant across all dialogs

* Viewer: One-touch expand button on split-pane divider now always work

* Viewer: Fixed rendering of images on Solaris



2.11.13  (released 2010-12-23)
-------------------------------
* Redaction now removes all references to images that are completely redacted

* Add support for vertical chinese/japanese CMaps

* Fixed StackOverflowError when loading PDF with 250,000+ bookmarks

* Added "bfo.printasimage" PDF option, to work around bugs in Apple/Java 1.5
  and possibly other setups.

* Fixed mixing of fill, text and border colors in Link annotations

* Fixed positioning of annotations using beginTextLink

* Added ability to remove Document Structure tags via an OutputProfile

* Viewer: Added properties to control size of thumbnail images, width of
  SidePanel and initial page mode.

* Viewer: Fixed obscure race condition in thumbnail panel which sometimes
  resulted in higher CPU usage immediately after load.

* Viewer: Added swipe and rotate gestures on OS X

* Updated Producer field to use to bfo.com



2.11.12  (released 2010-11-11)
-------------------------------
* Bug fixes and improvements to MaxiCode barcode generation, and improvements
  to Code128 barcodes to use the most efficient representation.

* Improvements and extensions to the SignatureHandler API enable customized
  signature handlers to be better implemented.

* Fixes to FDF: export includes annotation appearances, and import imports all
  annotations correctly.

* Tweaked document structure when creating documents with translucent RGB colors
  so Acrobat won't (incorrectly) convert them to CMYK before displaying.

* Added fixes for: pages containing corrupt inline JPEG images; ObjectStreams
  with garbage mid-stream; Type 1 fonts that modify "internaldict"; PMingLiu
  font that was causing trouble

* Fixed rendering of pages containing 1-bit images to 1-bit Rasters, and "x or w
  not on byte boundary" errors, both broken in 2.11.10.

* Fix for broken rendering of images when on Windows with 16-bit Color,
  introduced in 2.11.10

* Fixes for change to font selection for Sun Java on Ubuntu Linux made in
  1.6.0_18, which required non-standard "DejaVu" font to be installed. We now
  check for this and fall back to standard Java "Lucida" if it's not installed.

* Added PageExtractor methods required for the Adobe Highlight File Format
  (http://partners.adobe.com/public/developer/en/pdf/HighlightFileFormat.pdf)

* Added options to PageExtractor to ignore "artifacts" when extracting.

* Don't set language tag in XMP, as it breaks PDF/A validation in Acrobat 9

* Added PDFStyle.setTextDoubleUnderline() method

* Fixed creation of AnnotationLink with visual appearance.

* Viewer: fixed some Swing Component manipulation that was not done in the EDT.

* Viewer: fixed position of Free Text annotations with callouts on rotated pages

* Viewer: fixed memory leak when documents were being opened and closed after
  text extraction had been run.

* Viewer: added new DocumentPanelEvents "pageChanged" and "pagePositionChanged",
  for more accurate notifications of scroll and pagenumber changes. Fixed
  pagenumber sometimes failing to update correctly in MultiPageDocumentViewport.
  Anyone implementing their own DocumentViewport subclass will probably need to
  update their class to reflect these changes.

* Viewer JavaScript: added Doc.zoom, Doc.scroll, Field.borderStyle, App.openDoc,
  App.execMenuItem, App.runtimeHighlight and App.runtimeHighlightColor,
  Doc.print

* Viewer: correctly save KeyStore when a Certificate has been imported



2.11.11  (released 2010-06-02)
-------------------------------
* Fixed error introduced in previous release which resulted in text extraction
  on pages after the first failing to work correctly when performed in the
  viewer.

* Fixed bug causing failure to parse JBIG2 images at certain zoom levels

* Improvements to font substitution for Chinese/Japanese/Korean when rasterizing

* Fixed orientation of rotated annotations fields being added to rotated pages
  during FDF import

* Fixes for some OpenType fonts containing glyphs > U+10000

* Viewer: added italian translation



2.11.10  (released 2010-05-14)
-------------------------------
* Major rewrite of the rendering engine should give much better results when
  rasterizing PDF to bitmap images, particularly when dealing with PDFs
  containing bitmap images. Memory use is down and speed is up.

* Added OpenTypeFont(OpenTypeFont) constructor, to quickly create a clean
  copy of an OpenTypeFont without having to reload it from source.

* Fixed issues where rasterizing a PDF to a bitmap could leave a dark line
  to the right or bottom of the bitmap.

* Added workaround for Bug 6775390, which was causing RasterFormatException
  when rasterizing some types of PDF

* Corrections to Type 1 Font parser that was giving incorrect results for
  some accents on characters

* Fixed issues when Linearizing PDF - since 2.11.8 the Linearization tables
  weren't being positioned correctly, which means although the first page was
  loading quickly, navigation to subsequent pages was slower than necessary.

* Corrected cropping of text in PageExtractor.cropText() method

* Fixed issues when signing/verifying/linearizing > 2GB PDF files

* Fixed bug preventing editing forms containing characters > U+10000

* Corrected rasterizing ImaskMasks on Patterns

* Correctly render PDFs that define DefaultRGB/CMYK/Gray ColorSpaces, and
  approximation of ColorSpaces is now much more accurate.

* Much faster rendering of PDFs containing CMYK images.

* Corrected positioning of text in AnnotationText objects with thick borders

* Work around Acrobat bug where specifying "QuadPoints" on an annotation can
  render it uneditable

* Improvements to XFA processing - although editing XFA-based documents is
  still limited to completing form fields, this should now work for all static
  XFA 3.1 or earlier forms.

* Fixed incorrect reporting of errors when loading large (>40MB) Linearized PDF

* Fixed PDFCanvas.setWatermarkOrBackground() method

* Fixed loading of PDF/E documents

* Fixed failure to load some very large objects from an ObjStm

* Correct function parsing for some types of function, which sometimes resulted
  in incorrect Color reproduction for Spot/DeviceN colors

* JavaScript: Added support for arguments to Doc.saveAs to select file format

* Improvements to heuristics used when text extraction doesn't specify encoding.

* Viewer: Fixed exception when dragging Callout box over its line, and clip
  correctly when a box contains too much text.

* Viewer: Fixed rare thread deadlock under certain circumstances, introduced in
  last release.



2.11.9   (released 2010-02-26)
-------------------------------
* Added beginTag/endTag methods to PDFPage, PDFCanvas and LayoutBox, to add
  structured tags to a PDF.

* Optimization to SecurityManager used to limit JavaScript should speed up
  operations that make repeated calls to SecurityManager.checkPermission()

* Corrected the algorithms for HardLight, SoftLight and Exclusion blends

* Added support for rendering with Soft Mask (SMask key in ExtGState dicts)

* Added preliminary support for rendering Type 6 and Type 7 shading patterns

* Improvements to the PDFSound class, which now handles any format supported
  by the javax.sound package.

* New font renderer fixes problems rendering some old-style Type 1 fonts

* Added OutputProfile.FontInfo class, to retrieve information about the fonts
  used in a PDF.

* Fixed failure to load PDFs containing an invalid Trapped key

* Fixed API so library once again runs on Java 1.4

* Fixed incorrect color change when drawing underlined and struck-out text

* Correctly load PDFs where the trailer dictionary is a stream instead.

* Added mouseX, mouseY, pageNum and numFields to JavaScript Doc and "rect", to
  Field

* StandardFont objects now allocate faster and have reduced memory footprint

* Handle invalid fonts where ToUnicode is specified as a name

* Workaround what we think are invalid CFF fonts where FontMatrix is identity

* Workaround for some XFA forms that were failing to parse properly

* Fix for OpenType fonts where the loca table is unordered

* Viewer: Fixed dragging selection of text on Windows

* Viewer: Fixed selector for dotted lines when creating Line annotations

* Viewer: log Exceptions to the standard logger, in the same was as the PDF API

* Viewer: Fixed a leak due to a race when scrolling pages containing many
  annotations



2.11.8   (released 2009-11-11)
-------------------------------
* Added the ability to Redact documents with the new Redactor class. Text can
  also be selected and redacted using the Viewer.

* Added the ability to set "Callouts" on AnnotationText objects.

* Added a new PDFImage constructor, PDFImage(Image, String), to control how
  PDF images created from AWT Images are compressed. This allows images to be
  saved to the PDF using JPEG or JPEG-2000 compression. No longer convert
  all images constructed this way to RGB.

* Fixes to color calibration. RGB colors create with the java.awt.Color class in
  the normal way have their correct colorspace used in PDF. This may result in
  slightly brighter colors when displaying a PDF created with BFO in Acrobat,
  but the results are now correct and platform independent. The old behaviour
  can be used instead by setting the System property
  "org.faceless.pdf2.NoDefaultRGB" to not null. Similar changes have been added
  to the CMYK ColorSpace to use a more typical conversion to RGB, and the API
  docs for that class show how to use a standard SWOP space or others to obtain
  different results.

* Rasterizing pages containing bitmap images has been parallelized, for speed
  improvements on multi-core machines.

* Fixed writing Linearized Encrypted documents.

* Changes to allow working with PDF files > 2GB in size.

* Fixed AnnotationShape for Ink annotations (the Pencil tool in Acrobat).

* Added BarCode.getBufferedImage() method, to render BarCodes to bitmap images.

* Added PageExtractor.cropText() method, to crop selected text to a rectangle.

* Fixes to parsing of PNGs containing (cHRM && !gAMA) || (cHRM && iCCP) chunks,
  and added code to override the ColorSpace of a PDFImage - necessary when the
  original image has an incorrect space embedded.

* Added support for Blend modes to AnnotationStamp class, with setBlendMode().

* Bookmark parsing is more lenient with damaged documents.

* Fixed text extraction to correctly take kerning into account when determining
  spacing.

* Fixed rare ConcurrentModificationException when rendering.

* Minor tweak to PDF/A: output documents are always PDF-1.4 (although PDF-1.3
  header is valid, it was causing issues with some 3rd party software).

* Fixed parsing of CFF fonts with different Font DICTs for ranges of CIDs.

* Fixed glyph sizing for fonts where all glyphs use DW then modified by kerning.

* Fixed parsing of CMYK JPEG-2000 image objected embedded in the PDF.

* Fixed "Function must be a Dictionary or Stream" when rendering some gradients.

* Added workaround for AWT failure to respect "FontMatrix" in Type1 fonts.

* Don't stretch font to match it's width for non-substituted fonts.

* PublicKeyEncryptioHandler throws an exception if the wrong password was
  specified for the private key.

* Bugfixes to Java 1.6 JavaScript engine, and implemented a few more methods.

* Viewer handles the changing of the Field.readonly property from JavaScript.

* Viewer: fixed race condition which sometimes resulted in form fields not
  being visually updated.



2.11.7   (released 2009-09-02)
-------------------------------
* Added AnnotationShape and associated editors in the Viewer, to create and
  manipulate lines, arrows, polylines, ellipses and rectangles using the
  java.awt.geom package.

* Improvements to the way AnnotationLink and AnnotationMarkup work on rotated
  pages. This now works when creating or moving annotations on all types of
  rotated pages. Improved set/getCorners and set/getRectangle interaction.
  Correctly position all forms of rotated annotation on all variations of
  rotated page in the Viewer and when rendering.

* Added ability to arbitrarily rotate AnnotationStamp objects.

* Added the AnnotationSound class, to manage sound annotations as created by
  Acrobat. Note this is the "Acrobat 5 and earlier" approach as described in
  Acrobat 9.

* Added PDFStyle.setBlendMode() method, which can be used to modify the blend
  mode of PDF content or some annotations that use blend modes (shapes & text).

* Added PDFCanvas.drawShape(java.awt.geom.Shape), related clip/path methods
  and PDFCanvas.transform(java.awt.geom.AffineTransform).

* Fixed non-JavaScript date formatting when the date format contains commas.

* Fixed, again, a small memory leak first fixed in 2.3.5 that reappeared.

* Catch particular type of corruption when loading PDF Tokens from stream.

* Add optimization for daft approach occasionally used by GhostScript when
  rendering lines. See OutputProfile.SinglePixelImage.

* Added PageExtractor.Text.getBaseline()

* Improvements to text extraction algorithm should result in less words being
  run together, and to prevent any concurrency issues if extraction is started
  from multiple threads simultaneously.

* Text extractor no longer joins together adjacent words with different colors.
  What is "different" can be set by the "org.faceless.pdf2.TextColorDistance"
  System property, which may vary from 0 to about 170 (which would treat all
  colors as identical, the behaviour prior to 2.11.6).

* Fix case where imagemask size != image size and image is not RGB.

* Prevent out-of-gamut results caused by unwanted switch to RGB when rendering
  CMYK PDFs containing complex blends.

* Added workaround for unidentified bug in AWT with non-standard Composites.

* Added support for the JBIG decoding using the BSD-licensed JBIG2 decoder from
  http://www.jpedal.org/support_JBIG.php and improvements to the garbage
  collection of temporary files when using the "jbig2dec" native JBIG2 decoder.

* PDFs containing annotations without matching fields are repaired by adding
  those fields rather than remove the annotations, matching Acrobat's behaviour.

* Added support for javax.sound.sampled.AudioInputStream to PDFSound objects.

* Fixes to the WidgetAnnotation.get/setAction method to correctly handle the
  two ways Acrobat may do this.

* Numerous improvements to FDF and XFDF exporting - exporting of annotations
  now properly supported.

* Fixed linearization where bookmarks should be displayed but are missing.

* Improvements to text sizing algorithm for auto-sized text in text fields.

* Removed dependency on log4j 1.2.15 causing a NoSuchMethodError - now earlier
  versions can be used as well.

* Viewer: Made consistant the approach to initializing viewer features via the
  "initialization parameter" concept. Many features can now be configured at
  runtime - for instance Thumbnails can be made read-only, initial view of the
  viewer can be set and more. See the API docs for each feature and also
  http://bfo.com/products/pdf/docs/api/org/faceless/pdf2/viewer2/doc-files/initparams.html

* Viewer: Text selection has been rewritten and is vastly improved. Selection
  now works across the entire document, which means a selection is not garbage
  collected if a page has been scrolled away. Text can be selected by mouse
  as before, or now also programmatically via a regular expression.

* Viewer: Actions may be performed on selected text via the TextSelectionAction
  class, by right-clicking on selected text. Actions are supplied to create
  markup annotations of various types.

* Viewer: Signatures can be verified when a PDF is loaded or programatically,
  with the new BackgroundSignatureVerifier feature.

* Viewer: Text extraction of a PDF may be started in the background via the new
  BackgroundTextExtractor feature.

* Viewer: long running tasks like thumbnail painting are now paused while the
  PDF is being saved, to avoid concurrency issues.

* Viewer: Lines and Arrow annotations can be drawn intuitively onto the PDF via
  the new AnnotatonAddLine feature.

* Viewer: Fixed deadlock when JavaScript was updating a field that had just
  been edited.

* Viewer: Side panels (thumbnails, signatures, search results) are optinally
  displayed as icons now thanks to the new SidePanel.getIcon() method.

* Viewer: Thumbnail panel now scrolls to follow the current page, as Acrobat.
  This can be controlled programatically.

* Viewer: All appropriate annotations can be deleted as well as edited by right
  clicking on them. Editing annotations requires a double click, not a single.

* Viewer: Further corrections to fix component focus, started in 2.11.6

* Viewer: Sounds embedded in the PDF are now played.

* Viewer: Add default-disabled Features, see ViewerFeature.isEnabledByDefault().

* Viewer: Timeout for form submissions can be controlled.



2.11.6   (released 2009-07-06)
-------------------------------
* All BFO warning (and debug, if enabled)  messages are now logged using
  log4j if available, or java.util.logging.* if not.

* Large synchronization audit fixed some issues when reading from one PDF
  in multiple threads, particularly when using the viewer.

* Fixed problem that could result in corruption when repeatedly saving a
  PDF containing compressed XRef tables and multiple revisions.

* Modified AnnotationStamp so Acrobat correctly handles custom stamps,
  and added some new types of standard stamp.

* Added FDF.getXFDF() method, for exporting XFDF from a PDF, and added support
  for this to the Viewer. Fixed FDF export, broken some releases ago.

* More PDF/A related fixes, and added a number of new OutputProfile.Features.

* Fixed RichText content in text fields

* Added subsetting for CFF fonts

* Fixed error with some Windows JDKs when rasterizing JPEG images

* Fixed unusual cases of Linear & Radial shading, added preliminary support for
  Coons & Tensor-Product Patch shading (Type 6 & 7).

* Fixed blending, broken in previous release and resulting in opaque highlight
  annotations.

* Correctly handle masked images where the mask and image are different sizes,
  as created by Luratech products.

* Added PageExtractor.Image.getUniqueId(), to identify extracted images.

* Added PageExtractor.Image.getMetaData() and Text.getFontMetaData(), to
  return any embedded XMP MetaData for those items in the PDF.

* Fixed long-standing bug in CCITT.G3 2D encoding - now rarely seen in very
  old TIFF images.

* Further fixes to handle some types of corrupt PDF

* Viewer: Page Up/Page Down/Home and End keys navigate correctly through the
  PDF via the Viewport ActionMap. Standard ScrollBar keybindings are overridden,
  previous KeyListener approach didn't work reliably and was removed.

* Viewer: Fixed missing glyphs in some fonts after a search was run.

* Viewer: PDFTool (the class run by "java -jar bfopdf.jar") has more options.

* Viewer: Stamps no longer slowly grow when clicked on due to rounding error

* Viewer: Calling DocumentPanel.redraw(page) will work as expected.

* Viewer: Don't allow JavaScript to be run on the console if no PDF is loaded

* Viewer: Fixed page jump when zoom level is changed in Column view

* Viewer: Dont fail under 1.6 when saving PDFs to filenames containing an
  invalid regex backreference.

* Viewer: Improved display under OS X, including addition of a Dock Icon.

* Viewer: Added keyboard shortcuts to "Open Recent" menu.

* Viewer: Thumbnail panel now scrolls to follow the current page, and renders
  more reliably.



2.11.5   (released 2009-05-13)
-------------------------------
* Our Jar Signing Key has been renewed, which means those running the Jar as an
  applet will probably need to reauthorize the Jar.

* A large number of PDF/X and PDF/A related fixes. The PDF Library now
  correctly handles all PDF/A-1b test cases from the Isartor Test Suite
  (http://www.pdfa.org).

* Improved heuristics used when extracting text in symbolic TrueType fonts,
  and fixed sometimes broken extraction of text in Type 3 fonts.

* Fixed an issue where editing a rights-enabled PDF containing an ICC
  ColorSpace could invalidate those rights.

* Fixed AccessControlExceptions when trying to run certain operations on forms
  from JavaScript

* Parallelize PDF.getFullOutputStream() for performance on multi-core hosts.

* Added support for Blend Modes, used for advanced transparency

* Fixed PostScript "--invalidaccess--" reading some Type1 fonts on IBM JVMs

* Fixed "Invalid Hex Character" issue when reading truncated ASCIIHex streams

* Correctly create a PDFCanvas from rotated, cropped PDFPages.

* Better handling of non-standard CMaps, as created by FOP, PDF-XChange and GS.

* Fixes to rendering of Radial shading patterns at extreme zoom levels.

* Handle OpenType fonts where multiple glyphs are stored at the same offset.

* Fix for Type 2 Font "flex" operator, as seen in embedded Garamand CFF

* Fixed ink bleed for BarCodes - was allowing twice as much as specified.
  Also fixed incorrect handling of newlines in Code128 codes.

* Added ability to set XMP Metadata on annotations.

* Fonts with missing Widths array render properly.

* Fixes for customers extending PKCS7SignatureHandler.

* Handle Mask arrays on non-indexed Images, and remove false-positive cache
  hit on ImageMasks that are rendered in two different colors.

* Workaround JIT compiler issue causing occasional NPEs with inline images.

* Viewer: Fixed scrollbar jumping when form fields off screen have focus

* Viewer: Fixed FileFilters used when loading and saving signing keys.

* Viewer: Fixed TextHighlighter redrawing after zoom level has been reset.

* Viewer: JSManager can now be shared across multiple PDFViewer objects

* Viewer: Workaround unusual error in DirectColorModel native code that could
  cause black blobs on the screen.

* Viewer: several fixes to Thumbnail Panel, for better refreshing when the
  PDF is edited. It also prioritizes drawing based on the viewport position.



2.11.4   (released 2009-03-03)
-------------------------------
* SECURITY: Fixed potential JavaScript security issue. Customers are
  encouraged to upgrade and can contact BFO directly for more detail.

* Added DataMatrix barcodes

* Added support for "locking" annotations, both to PDF API and to Viewer.

* Fixes for PDF/A to match PDF/A verification in Acrobat 9.

* Added LayoutBox.setWordBreaksAllowed() method, to prevent word-break
  opportunities between font changes.

* Improved text extraction for RTL documents.

* Improvements to "last resort" method of text extraction, for fonts that
  really shouldn't be extractable but still do something in Acrobat.

* Fixed issues rendering some JPEG200 encoded bitmaps

* Viewer: Improved TextTool and TextHighlighter - both can now handle rotated
  text in any direction, and can highlight, outline, underline or double-
  underline. The default type of highlight can be set by system properties.

* Viewer: Opening, Saving, Printing are now privileged actions, so they can
  to be called from untrusted code (ie JavaScript).

* Viewer: Fix Z-index of overlapping annotations, and add the component before
  JavaScript event fires

* Viewer: Fixed PagePanel to handle more than 2^31 mapped pixels.

* Viewer: Fix event.value for RadioButton mouse events, broken in 2.11.2

* Fixes for incorrect CFF fonts, OpenTypes with glyphs in the U+FF00 range,
  overflowing Type 0 functions, CCITT decoding for particularly ancient TIFF.



2.11.3   (released 2009-02-13)
-------------------------------
* Fix to handle change to Applet ClassLoader in Sun Java 1.6r12.

* Some synchronization fixes should now reliably allow a PDF to be saved while
  its being displayed in another thread.

* Fixes to AnnotationMarkup class to correctly highlight rotated text, and
  to allow multiple lines of text to be marked-up in one annotation.

* Fix for fields in some PDFs overflowing on flatten()

* Big improvements to text extraction when PDF contains different size fonts
  or overlapping rows (such as newspapers or magazines).

* Fix sometimes incorrect letter offsets in extraction, noticable mainly as an
  incorrect position of highlight in the Viewer when selecting text.

* Viewer: Added methods to load a PDF by specifying a PDFParser. This allows
  the PDFParser to be overridden, required for customers wanting to tinker
  with the way text is extracted.

* Viewer: fixes for when using a PDFViewer without the MultiWindows feature.

* Viewer: TextHighlighter will repaint when the match requirements change.

* Viewer: several fixes relating to setting the zoom mode on a Viewport before
  a PDF has been assigned.

* Fix line layout algorithm when PDFStyle.setTrackKerning() was called with a
  non-integer value. This was affecting the "line-spacing" attribute in the
  Report Generator.

* Fix PDF/X-3:2003 OutputProfile (was setting version identifier to 2002), and
  added OutputProfile.PDFX3_2003_Acrobat, to cater for (what we think is a)
  slight difference between the specification and Acrobat's implementation.

* Fixed "open stream" exception sometimes occuring when specifying a
  ColorProfile in an OutputProfile.

* Fix bug in Type 1 parser resulting in some not-corrupt fonts being flagged
  as corrupt.

* Added further heuristics to try and give some useful output for previously
  unextractable text.

* Correctly read PNG images with sRGB chunk.

* Fixes to downsampling of very large or high-resolution images during paint.

* Fixed ColorModel exception rendering PDF containing JPEG images to 1-bit TIFF.

* Fixed isolated problems in: OpenType fonts with unusual long LOCA tables or
  truncated KERN tables; CFF fonts with invalid encodings; illegal characters
  in Names; missing patterns or colorspaces during render; Form default
  appearances with odd whitespace; CFF fonts setting stems in subroutines;
  Checkboxes with missing check type

* Viewer: don't fail when editing an annotation with no creation date

* Viewer: Fixed rectangle position of zoom-to-rectangle actions.

* Viewer: SinglePageDocumentViewer now resizes after the page has been drawn,
  not before.



2.11.2   (released 2009-01-22)
-------------------------------
* Revert changes to obfuscator made in 2.11.1, which were causing unpredictable
  exceptions with IBM JREs (1.5 and 1.6, and possibly 1.4 as well). Customers
  using Websphere who upgraded to 2.11.1 should upgrade as soon as possible.

* Viewer: Removed some trailing references to a PDF that remained after the
  window containing it was closed.

* Viewer: Fix occasional screen corruption when rendering some form fields

* Added PageExtractor.setSpaceTolerance(), for customers who find text
  extraction is splitting or joining words incorrectly and want to tune it.

* Maintain open FileHandle for PDFs read from File, rather than FileInputStream.
  This prevents (to some degree) that file being deleted while in use, and removes
  repeated opens/closes. Added a "PDF.close()" method to close the File.

* Handle special case of saving back to the same file we're reading from, by
  setting the OutputProfile.Feature.MultipleRevisions feature to required.

* Fixed PageExtractor.getTextInDisplayOrder()

* More fixes to handle corrupt PDFs (trailing junk in CMaps or pages, truncated
  OpenType fonts, invalid chars in names, missing styles in annotations)

* Further fix to bookmarks.

* Fix to HYSMyeonJo korean font

* Viewer: Improved behaviour of text form fields

* Viewer: Fixed text selection and copy, broken in 2.10.4

* Viewer: The Save feature has been bulletproofed when saving to the same file.



2.11.1   (released 2009-01-07)
-------------------------------
* Further reduction in Jar size through new obfuscation techniques.

* Added case-insensitive search to PageExtractor.getMatchingText().

* Fixed PostScript errors on "copy" and "internaldict" operators, used in some
  fonts created by pdfeTeX.

* Fixed Flate streams with Predictor=10 and multi-pages little-endian TIFFs.

* Fixed internal errors in remove() of map returned by Form.getElements().

* Fixed subsetting of fonts used in flattened form fields, broken in 2.10.4.

* Fixes to PDFBookmark.setOpen(), broken some versions ago.

* Clarified steps to implement a SignatureHandler, and fixed "handlers" example.

* Fixed removal of form fields with "." in the name, broken last release.

* Handle some broken PDFs (missing CID Supplement, padded inline DCT images).

* Viewer: Full support for new Java 1.6u10 features, including dragging
  applets to desktop and applet initialization via JNLP.

* Viewer: AppletURLActionHandler is now URLActionHandler as it works everywhere.

* Viewer: Added list of open windows to Window menu (ActiveWindowMenu feature).

* Viewer: Fix redraw on return from full-screen mode.

* Viewer: (OS X only) Add support for system KeyChain, menu placement,
  about menu, workaround for Safari-applet-background issue.

* Viewer: (Windows only) rename "Quit" to more Windows-like "Exit".

* Viewer: Added running total of matching results in search panel.



2.11   (released 2008-12-15)
-------------------------------
* INCOMPATIBLE CHANGE: For RadioButtons and CheckBoxes, the "value" is now
  equal to the name given the field in Acrobat, rather than it's internal
  value (although these are often the same). This allows multiple radio
  buttons with the same name to function correctly, and better reflects what
  Acrobat does. WidgetAnnotation.get/setTextValue now simply call get/setValue.

* INCOMPATIBLE CHANGE (Viewer): Digital Signature signing and verification in
  the Viewer has been rewritten to use the "SignatureProvider" class, allowing
  use of multiple signature factories, RFC3161 Timestamping servers and so on,
  most of which can be controlled by system properties. The default KeyStore is
  now the Java default, the users ".keystore" file, and the system keystore is
  automatically used for verification.

* INCOMPATIBLE CHANGE (Viewer): The SuperJOptionPane class has been deprecated
  and will be removed shortly. Customers extending the Viewer should use the
  "Util" class to display error dialogs instead.

* Moved the appearances for AnnotationStamp objects to a new "bfopdf-stamp.jar"
  file, as part of continuing efforts to reduce the size of the main Jar. This
  new Jar must be added to the classpath if AnnotationStamp objects are created.

* Added 256-bit AES encryption to StandardEncryptionHandler, new in Acrobat 9.

* Fixed incorrect encoding of some fonts in forms after a read/write

* Added support for regular expression matching in PageExtractor

* Added setBackgroundStyle() and methods to support rich text to AnnotationText
  class.

* Fixed rendering of some CMYK JPEG images

* Parallelized part of the render() method, for faster rendering on multi-core
  machines.

* Improvements to the way elements are managed in a Form, to handle cases where
  people are removing and adding fields with the same name.

* Fixes to RemoteSignatureHandler, and added support for this to the viewer.

* Fixed infinite loop in rare corrupt documents

* More JavaScript fixes to support Adobe's {key:value} method call syntax.

* Fixed HYGoThic-Medium font support, broken a couple of releases back

* Viewer: big improvements to the Free Text annotation widget, and annotations
  can now be resized.

* Viewer: Fixed precision errors when moving annotations and fixed opacity bug,
  for less redrawing.

* Viewer: Improvements to TextHighlighter class to work with regular expressions

* Viewer: Created public constructors for all non-singleton features.

* Viewer: improved color selection dialog



2.10.6 (released 2008-11-10)
-------------------------------
* Fixed signing PDFs rendered with Compressed XRef tables

* Fixed loading Compressed XRef PDFs with stream Length contained in an ObjStm

* Fixed bug in PDFFont.getTextBottom(), added in 2.10.4

* Fixed handling of RadioButtons with "Opts" array - corrected WidgetAnnotation
  and FormRadioButton.getValue() and added WidgetAnnotation.set/isSelected().

* Rewrote JavaScript again, for what we now feel is a broken JSR 223 in Java 6.

* Handle PDFs with invalid odd-length Named Action trees.

* Flattening an XFA Form no longer produces an invalid PDF - the XFA is removed.

* Don't fail in linearization if open action refers to a deleted page

* Viewer: fixed a number of form field JavaScript Event problems.

* Viewer: a thread which was preventing a a process exiting after the viewer was
  closed has been fixed.

* Viewer: FormNNNWidgetFactory constructors are now protected, for subclassers.



2.10.5 (released 2008-10-21)
-------------------------------
* Fixed memory leak which occured when a PDF had part of it's internal structure
  replaced. Leak was on a per-PDF basis so would not expand infinitely over
  time, but while that PDF existed, editing it could take more memory than it
  actually required. All customers are encouraged to upgrade.

* Fixed creation of signature annotations for Acrobat 9.

* Improvements to the "MergeResources" feature added in the previous release.

* Fixed redraw of fields with multiple annotations in the viewer.

* Fixed JavaScript bugs evaluating "event.target", "event.source" and setting
  "event.change" and "event.value" in Keystroke events.

* Fixed Lucene extraction failure on some PDFs with Annotations

* Added support for Template pages via the PDF.getPage(String) method

* Several further enhancements to the JavaScript DOM.



2.10.4 (released 2008-10-07)
-------------------------------
* Large internal rewrite of font handling now correctly renders some edge
  cases that weren't handled before, and improves font substitution for
  CJK fonts.

* Added OutputProfile.Feature.MergeResources, which will attempt to merge
  duplicate resources such as fonts and images when concatenating multiple
  PDF files.

* Added "Intelligent Mail" BarCodes, the next generation of USPS routing code.

* OpenTypeFonts containing CFF outlines now have the correct sizes returned
  from getTextTop/getTextBottom().

* XFA-only PDFs can now have their XFA data updated via Form.setXFADataSets().

* Fixed bug in PDFPatterns with a background color, introduced in 2.10

* Soft-hyphen characters now fit correctly in LayoutBox objects

* Fixed case where counter-signing an existing signed PDF could cause the
  original signature to be invalidated.

* Fixes to JavaScript so "this" correctly refers to the Doc object in events.

* Fixed rare case where PDFPage.drawPolygon() could create an invalid PDF.

* Fixed NullPointerException when cloning a newly-created PDF containing open
  streams.

* Added PropertyChangeEvents to FormElement and PDFAnnotation

* Viewer: Added MultiPageDocumentViewport, and a number of internal
  improvements to the way pages are rendered.

* Viewer: Fixed redraw of calculated form fields

* Viewer: Added "OpenRecent" menu

* Viewer: Fixed export of PKCS#12 files.

* Viewer: Improved icons, improved toolbar layout (Windows only), added
  horizontal mousepad scrolling (OS X only), improved widgets (OS X only).



2.10.3 (released 2008-07-15)
-------------------------------
* Added the ability to write Linearized (also known as "web optimized") PDF's.
  Simply set the "OutputProfile.Feature.Linearized" to required when rendering.

* Rewrote the PageExtractor class completely - now faster, better and working
  with rotated documents.

* Fixed a problem causing increased memory usage when using a PDFReader in a
  single thread. The difference can be significant, so anyone in this situation
  is encouraged to upgrade.

* Viewer: Significant improvements to behaviour and appearance, giving more
  reliable results across the board. All users are encouraged to upgrade

* Viewer: Added text search and selection.

* Viewer: Changes to the SidePanel class so a factory is no longer required.

* Big speed increase rendering JPEG images with ICC ColorSpaces and all images
  with non-ICC CMYK ColorSpaces.

* Fixed Java 1.6 JavaScript (broken in 2.10.2) and JavaScript Date formatting.

* Fixed missing kerning when drawing kerned text into an area of exactly the
  right width, causing the text to extend slightly too far. Also fixed return
  from LayoutBox.getNumberOfLines, which was always one too high.

* Reduced memory footprint when sharing OpenType fonts across multiple PDFs

* Added BarCode.setColor() method

* Fixed some minor rendering issues wth certain CFF and OpenType glyphs

* Setting the System property for a warning to "fatal" will make those
  warnings throw an exception - eg "org.faceless.pdf2.warning.JB2=fatal"



2.10.2 (released 2008-04-30)
-------------------------------
* Automatically subset any possible OpenType fonts when flattening a form.

* Fixed occasional bug when encrypting documents - under some circumstances
  a corrupt PDF could be created.

* Importing some types of FDF resulted in a corrupt PDF - fixed.

* Fixed exception when a FormTextButton Widget has a null value.

* Added ability to set/clear "DoNotSpellCheck" flag on FormText fields.

* Fixed parsing of some BMP images that were broken in 2.10.

* Fixed Exception thrown when incorrectly merging PDF's with form fields - a
  PG1 warning is displayed, as was the case prior to 2.10.

* Removed public finalize methods - these should have been protected.

* Cache inline images, to speed up rendering pages containing Type3 fonts.

* Fixed rendering problems with colours containing alpha values, and finally
  worked around the Java bug causing "blueing" of white colors in calibrated
  RGB colorspaces.

* Added setInkBleed method to BarCode class, to handle print processes that
  distort the size of the bar.

* Fixed turning off Checkbox annotations with XFA

* Fixed appearance of StrikeOut annotations

* Handle buggy PDFs created by Actuate PDF Converter 1.0 and Ad Lib's "EX317".

* Improved CJK font substitution in Debian-based Linux.

* Viewer: the Thumbnail panel can be used to reorder the PDF or merge pages
  from other PDFs, directly from the viewer or by dragging PDF or image files
  into the panel.

* Viewer: new features can be added to the viewer automatically by specifying
  the "org.faceless.pdf2.viewer2.ViewerFeature" service in the Jar. See
  http://java.sun.com/j2se/1.4.2/docs/guide/sound/programmer_guide/chapter13.html

* Viewer: added mnemonics to the menu items.

* Viewer: bitmap images can now be imported directly into the PDF viewer, due
  to the new generic Importer/Exporter framework.

* Viewer: various smaller improvements:
  * Ability to drag the URL of a PDF onto the viewer to load
  * Improvements to LookAndFeel in GTK+, Metal and Motif.



2.10.1 (released 2008-02-14)
-------------------------------
* This release fixes problems some customers been having with the NIO changes
  in 2.10. Java bug 4724038 has been causing problem with OutOfMemory errors
  in some environments, and customers on Windows were unable to read a PDF then
  write it back to the same file.
  This release no longer uses the problematic MappedByteBuffer class, and
  doesn't hold the stream open when loading a PDF from a FileInputStream (the
  same as for 2.9). The only area where upgrading may require changes is for
  customers reading multi-page TIFF images from a File using a PDFImageSet: the
  FileInputStream should not be closed until after the last call to getImage().

* Removed a reference to the last PDF edited, allowing it to be gc'ed earlier
  and so reducing the working memory footprint of the library.

* Fixed some image parsing bugs with transparent GIF images added in 2.10



2.10 (released 2008-02-06)
-------------------------------
* INCOMPATIBLE CHANGE: BarCode class has been rewritten. You now create all
  Barcodes (including those that were formerly subclasses) by calling one of
  the static factory methods, then drawing the canvas returned by getCanvas().
  Fixed return value from getHeight() and added getMinimumHeight().

* INCOMPATIBLE CHANGE: Customers implementing their own EncryptionHandler or
  SignatureHandler will need to take note of some API changes. For signing,
  see the new getMessageDigest() and sign() methods, and for encryption note
  the new getEncryptionStream() and getDecryptionStream() methods.

* Huge improvements to memory use across the board, mainly when loading objects
  (including PDFs) from a File or FileInputStream. NIO is used and the File
  acts as a backing store, giving a drastic reduction on memory footprint for
  large PDFs. However it means the file the PDF was loaded from is now kept
  open until the PDF object and its children are garbage collected.

* Big speed improvements when reading and writing PDFs. Reading has been
  parallelized to make use of multi-core environments - the number of threads
  can be set explicitly with the "org.faceless.pdf2.Threads" System property.

* Added option to parallelize TIFF rendering in PDFParser.writeAsTIFF().

* Applying a Digital Signature has been improved from a two-pass operation to
  almost a single pass one even when not rendering to a File - reducing memory
  footprint and increasing speed.

* Added PDFStyle.setOverprint() method to turn on/off overprinting.

* Added support for SHA384, SHA512 and RIPEMD160 Signature message digests.

* Added new WidgetAnnotation.setButtonImage(), to position image on the button.

* Fixed print scaling when printing to paper that doesn't match the page size.

* Fixed creation of PDFCanvas from rotated pages.

* Added DragScroll, ZoomSelection and AnnotationTextFactory to the viewer.

* Added French, German, Japanese, Chinese translations to the viewer.

* Added PDFA1b_2005_Acrobat OutputProfile, for Acrobat's version of PDF/A.

* Many smaller fixes, including:
  * Handle CID fonts with zero-length rather than missing CID->GID mappings
  * PDFBookmark loading/saving speed improvements
  * Don't crash on broken ToUnicode streams
  * Don't eat/choke on junk on the operator stack when rendering text
  * AnnotationMarkup creation wasn't creating valid appearances
  * Removed incorrect Aleph-Lam ligature when rendering Hebrew
  * Corrected ToUnicode parsing of "compact" bfrange objects
  * Scrolling/GoTo actions at high zoom in the PDFViewer were mispositioning
  * Fixed input to PDFAction.goToFitRectangle() and output from getRectangle()
  * Fixed added for some old CCITT.G3 TIFF images
  * Applying OutputProfile.AcrobatNCompatible updates the PDF version



2.9 (released 2007-11-21)
-------------------------------
* POSSIBLY INCOMPATIBLE CHANGE: A number of changes have been made to
  FormChoice, mostly under the hood unless you're working on the Map returned
  by getOptions, which has keys/values now in the correct order. Also added
  FormChoice.set/getSelectedIndices(), to set unambiguous values for
  multi-selection lists.

* JavaScript events are now fully implemented, and a basic JavaScript
  environment is in place in the viewer which mimics Acrobat. This means
  form validation scripts in PDF documents will likely run. Rhino 1.6r6
  or Java 1.6 or later is required to take advantage of this.

* Changes to the licensing method to allow License files to gradually replace
  the old-style "keycode" licensing. All current licenses will continue to work.

* Deprecated Event.CLICK, which is now simply a synonym for MOUSEUP

* Localization hooks in place for the viewer, and mostly implemented the
  Spanish translation.

* Added support for parsing BMP images in the PDFImage class

* Rendering bugs fixed for documents with -ve dash phases, where CropBox is
  greater than the MediaBox

* Fixed calls to nested procedures in PostScript parser, which was causing
  problems for some fonts and patterns

* Fixed display of some rotated pages in Locales with "," as a decimal separator

* Improved About dialog and added the "SplashScreen" and "ShowConsole" features



2.8.5 (released 2007-10-17)
-------------------------------
* Documents with Reader Extensions (Usage Rights) will have those rights
  preserved if possible.

* Rendering bitmap images in PDFs has been rewritten to support tiling and
  low-resolution thumbnails. This means documents containing very large images
  should no longer require an equally large amount of memory to render, and
  will render much faster at low resolutions.

* Added new methods to the PDFViewerApplet class to support LiveConnect,
  allowing the viewer applet to be communicate with JavaScript. See the
  PDFViewerApplet API docs for more details.

* Added the PropertyManager class, to allow an alternative to the System
  property method of controlling the PDF library and PDF Viewer - mainly
  useful when using the PDFViewer in an applet or JWS environment.

* Added the ability to create new annotations on a page to the Viewer

* Fixed occasional bug when setting text field to multi-line.

* Fixed MaxiCode class so a ])> prefix doesn't automatically create a SCM.

* Fixed issue where under certain circumstances, an OpenType font used in
  more than one document could cause exceptions to be thrown when rendering.

* Bugfix for PostScript parser to handle some buggy Type1/Type3 fonts.

* Still more tweaks to calibrated colors to remove "blueing" of white on
  some platforms. Now tested and verified on Java 1.4 and above on Windows,
  Linux and OS X.

* JBIG2 images are decoded once only while using the viewer, which should
  make paging through documents containing those images much quicker.

* Worked around Java bug relating to 1-color DeviceN images.

* Improvements to StandardEncryptionHandler.getChange() method for PDFs
  encrypted with 40-bit encryption.



2.8.4 (released 2007-08-20)
-------------------------------
* Fixed memory leak occurring when creating new form fields with 2-byte fonts.

* Reusing subset 2-byte OpenType fonts across documents now works correctly

* Added some fixes to PDF/A document creation and validation.

* Fixes for reading byte-aligned Group 4 and some 2D Group 3 CCITT streams.

* Fixed inverted 1-bit images for certain unusually constructed PDFs

* Fix for some XFA forms wth pageArea objects

* Improvements to Swing "Look & Feel" for Viewer on Windows and Linux



2.8.3 (released 2007-08-06)
-------------------------------
* Added the KeyStoreManager class to the viewer, which provides a management
  console for digital keys and certificates.

* Added the ability to submit forms to the viewer. Currently HTTP and basic FDF
  submission are supported.

* Added some support methods for form submission to PDFAction and FDF classes.

* Added the PDFPage.get/setPageOrientation() method, to quickly rotate a page
  by 90, 180 or 270 degrees. Also added features to do this to the viewer.

* Fix rendering problems with some PDFs containing transparency groups.

* Added PublicKeyEncryptionHandler.chooseRecipient() method, to allow
  subclasses to automatically select a matching key.

* Improvements to the Toolbar layout in the viewer

* Adjusted the distribution of files between the Jars - many documents should
  now load without the "qrcode" and "cmap" Jars.



2.8.2 (released 2007-07-09)
-------------------------------
* Split the Jar into three parts: "bfopdf.jar", "bfopdf-cmap.jar" and
  "bfopdf-qrcode.jar". This is intended to ease deployment in Applets and Java
  Web Start environments. If upgrading from a previous version all three Jars
  are required to replace the previous "bfopdf.jar"

* We now supply a pack200 compressed Jar "bfopdf.jar.pack.gz" for JWS and Applet
  use, and a sample "bfopdf.jnlp" file for Java Web Start. Updated the
  "Installation" section of the userguide detailing how to best deploy the
  library in these environments.

* Updated PublicKey support to work with the Sun JCE and AES encryption or
  unencrypted metadata. Also fixed a bug resulting in truncated strings when
  reading documents encrypted with AES.

* More fixes when moving objects between PDFs, catching a number of RF1
  warnings and a potential ConcurrentModificationException in render()

* Added option to pass in array of possible EncryptionHandlers to PDFReader,
  for when you don't know in advance how the document has been encrypted.

* Added support for transparency groups when rendering - used when rendering
  translucent annotations.

* Added EncryptionHandler.hasRight() method, to allow EncryptionHandlers to
  properly manage document usage rights.

* Added the "org.faceless.pdf2.DeviceColor" System property, which if set will
  replace calibrated RGB, CMYK and Gray colorspaces with their uncalibrated
  equivalents.  For documents making heavy use of calibrated colorspaces this
  will greatly increase rendering speed, possibly at the expense of accurate
  color reproduction.

* Some fixes to XFA parsing

* Added FullScreenMode viewer feature, and the ability to load documents
  encrypted with Public Key encryption using the PDFViewer, via the new
  viewer2.PublicKeyPromptEncryptionHandler class.

* Text extraction to Lucene now requires Lucene 1.9 or greater



2.8.1 (released 2007-06-19)
-------------------------------
* Form Fields will now be formatted if possible. Basic formatting is supported,
  and some JavaScript will work if Java 1.6 or Mozilla Rhino are available.

* Improvements to PKCS#7 parsing means verifying signatures should now work
  with any JCE provder, including IAIK and the default Sun provider

* Fixed text wrapping algorithm when track kerning was set

* Added TextHighlighter and SignaturePanel viewer features, to mark some text
  as highlighted and provide an Acrobat-style panel summarizing the digital
  signatures in a document.

* Fixed rendering of some types of Masked images.

* Added PageExtractor.getMatchingText(String[]), to find multiple items at once.

* Fixed parsing of some symbolic OpenType fonts

* Fixed namespace bug in XMP processing that was breaking Resins DOM.

* A bug in Windows printing required us to modify the PrintPDF.java example and
  the printing code in DocumentPanel for reliable results with unusual page
  sizes.

* Fixed bug when extracting text from TrueType fonts with the Symbolic flag set.

* Added the ability to selectively decompress/recompress streams compressed
  with CCITT, JBIG2 and JPX by setting the appropriate OutputProfile.Feature
  to denied. This may be useful for customers having problems with certain
  compression algorithms in their workflow.

* Fixed default RenderingHints on Linux, *BSD and possibly other UNIX boxes -
  pages were being rendered without anti-aliasing by default.

* Improvements to Info and FormSignedSignatureWidgetFactory viewer features

* Fixed duplicate byte order mark when creating some non-ASCII bookmarks

* Fixed rendering of linear gradients, brokem in 2.8

* Removed 1.4 specific code - the library will once again run under Java 1.3.



2.8 (released 2007-05-21)
-------------------------------
* MAJOR CHANGE: Replaced the "viewer" package with the vastly improved
  "viewer2". The old viewer package is still available, see "old/README.txt"
  for more information.

* Added two new PDFReader constructors, the PDF.getRenderProgress and
  PDFParser.getWriteAsTIFFProgress methods, to monitor how long these
  potentially long running tasks will take from another thread.

* Added PagePainter.setPaintAnnotations() and PagePainter.paintAnnotation(), to
  allow annotations to be painted separately from their parent page.

* Added PagePainter.setPageExtractor() method, to run the text extraction while
  rendering rather than having to do the two sequentially.

* StandardEncryptionHandler and PublicKeyEncryptionHandler are no longer final.

* Fixed a number of bugs in the show/hide PDFAction.

* Added PDFAnnotation().getPopup()

* Added Form.getPDF() and PDFPage.getPDF()

* Added "ViewBox" and "PrintBox" options to PDFPage.getBox()

* Fixed handling of yet another variation of CMYK JPEG images

* When merging annotations from an FDF, don't disassociate annotation replies.

* Some further fixes to XFA processing

* Fixed Form.setXFAElement when the data contained non-ASCII characters

* Fixed annotation positioning on rotated pages, broken again in 2.7.9

* Added FormElement.rebuild(), to recreate the form fields annotations if
  necessary before the PDF is rendered.

* Fixed reading of more corrupt PDF variations



2.7.9 (released 2007-04-16)
-------------------------------
* Added support for JBIG2 image encoding, via the external "jbig2enc" tool.
  See http://bfo.com/products/pdf/jbig2

* Corrected values of PDFStyle.get/setFormFieldOrientation() when the field
  is on a rotated page.

* The Form.removeXFA() method wasn't working if the form fields were modified
  first, and was sometimes colliding with a bug in Acrobat 7 if it was called
  at any other point. Fixed.

* Fixed occasional incorrect RD6 warning about stream lengths

* Fixed bug in importFDF for some FDF documents with Popups, and no longer
  create duplicates of annotations.

* Fixed issue when two threads are rendering the same page in PagePainter

* Now recognises the view.area and print.area PDF options when rendering pages

* Fixed rendering problem with some Pashto and Kirghiz glyphs (06CC 06C7 06D0)



2.7.8 (released 2007-03-15)
-------------------------------
* Enhanced the viewer to add the beginnings of mouse interaction with the
  document. Added EventHandler and it's subclass DefaultEventHandler,
  which handles mouse clicks on hyperlinks throughout the document.

* Improvements to the PageExtractor class - text previously being extracted
  as individual letters or smaller groups are now being reassembled where
  possible into longer phrases

* Added support for dot/dash patterns, via new PDFStyle.setLineDash() method.

* Added support for JBIG2 image decoding, via the external "jbig2dec" tool.
  See http://bfo.com/products/pdf/jbig2

* Added OpenTypeFont.getEmbeddingRestrictions() method, for users that need
  to determine whether a font has embedding restrictions or not.

* When creating goToRemote actions, you can now specify whether they are to
  open in a new window or not. Also fixed page numbers, which were out by 1.

* Added missing methods to PDFBookmark, to get/set the open status.

* Correctly recompress documents using compressed XRef stream when the PDF has
  been read in rather than created from scratch.

* Added OutputProfile.Feature.MaximumCompression, for maximum deflation

* Fixed positioning of rotated annotations on rotated pages. Again.

* Fix position of text returned from PageExtractor when there's a CropBox set.

* Fixed problem when cloning objects then moving them between documents.

* XFA loading now handles hidden fields.

* PDFCanvas is no longer final.

* Better handling of invalid CMaps.



2.7.7 (released 2007-02-05)
-------------------------------
* Reduced the number and size of temporary objects allocated when reading a
  PDF, and reduced the number of intern() Strings to lessen the load on the
  PermGen space.

* Added an option not to intern() dictionary keys. This slows things down but
  may reduce long-term memory requirements for some users. Details are in
  Appendix B of the userguide.

* Now handles inline images with Indexed Colorspaces, and correctly renders
  2 and 4-bit non-indexed images.

* Improvements to XMP handling should result in less warnings.

* Fixed issue with some very old CFF fonts failing to parse.

* Fixed "Font has bad Flags" message from Acrobat for some TrueTypes.

* A change back in 2.6.6 meant when cloning pages in a certain way, fonts
  and images that were used on multiple pages were cloned multiple times,
  resulting in bigger file sizes. Now fixed.

* Added a PDFViewport.runAction() method, and run the Open Action on a PDF if
  one is specified when viewing.

* Added PDFParser.setFont() method, to override font substitution rules when
  rendering PDFs.

* A bug in PDFCanvas.pathArc (undiscovered since version 1.0!) meant arcs
  could only be drawn clockwise. Fixed.

* Corrected annotation size/positions when the annotation box doesn't match the
  page rectangle.

* Corrected display of translucent annotations in the viewer.

* Some PDF/A related fixes to bring closer into line with Acrobat 8.

* Fixed opening documents with passwords, broken in 2.7

* In the last release we always use the default RenderingHints when rendering
  a TIFF. Unfortunately for some reason on Linux/Sun JDK 1.5, anti-aliasing is
  explicitly set to "off". Changed this back to "default".

* Fixed rendering of L*a*b colors

* Fixed a few more exceptions and rendering errors resulting from unusually
  constructed documents.



2.7.6 (released 2006-12-13)
-------------------------------
* Added workaround for Acrobat bug regarding character widths for new
  StandardFont characters added in 2.7.3

* Improvements to reading PDFs mean a reduction in memory footprint and a
  speed increase of up to around 25% for large documents.

* Added support for verifying signatures created with Acrobat 8.0 and by the
  OpenLimit Signature handler (www.openlimit.com)

* Added the OutputProfile.Feature "PDFVersion17" for Acrobat 8.0 documents,
  and fixed some of the missing Features that should have been returned from
  PDF.getBasicOutputProfile.

* Added PDF.setOption and PDF.getOption, which replace the (now deprecated)
  setViewerPreference, setLayout and getViewerPreference methods. These new
  methods also allow the setting of the new Acrobat 8.0 print preferences,
  although this is considered experimental until the PDF specification
  is published.

* Fixed bug in PDFCanvas(PDFPage) when the page isn't anchored at (0,0)

* Added AcrobatSignatureHandlerFactory.setContentSize() method, to specify
  how much space to preallocate for a digital signature token.

* Fixed text extraction from PDFs containing symbolic fonts with differences
  array (as created by GhostScript)

* Fixed barcodes so there is no minimum height. This was attempted back in
  2.4.1 but wasn't working for all barcodes.

* More robust parsing of embedded OpenType fonts, to handle some invalid PDFs

* Fixed display of PDFs that were created by the API (rather than read in)
  which contain rewritten fonts.

* Added new OutputProfile Features Cyan/Magenta/Yellow/BlackSeparation.

* Workaround for invalid PDFs created by old versions of Extensis FontSense

* Fixed bug introduced two versions ago where a ClassCastException is possible
  when PDFs containing compressed object streams are re-rendered.



2.7.5 (released 2006-11-09)
-------------------------------
* Fixed "Font has bad Flags" issue with certain fonts introduced in 2.7.4

* Fixed "Not in XRef" error when reading/writing some documents, introduced
  in 2.7.4



2.7.4 (released 2006-10-27)
-------------------------------
* Added support for signing and verifying Certifying or "Author" Signatures,
  via the FormSignature.get/setCertificationType methods.

* Redesign of the PDF reading process shaves about 10% off time taken and
  memory used for large documents.

* Fixed missing signature appearances, which disappeared in release 2.7.2

* Improvements to Gradient fills - results are more accurate and Colorspace
  is preserved (this also applies to Pattern fills)

* Improved handling of documents with missing named actions.

* Unverified Signatures no longer display two "?" symbols in Acrobat 7.

* No longer fails when rendering embedded OpenType fonts with no "post" table.

* Fixed bug when printing a page before the first color has been set



2.7.3 (released 2006-10-12)
-------------------------------
* Font encodings have been completely reworked - a large change. As a result,
  rendering PDFs containing "unusual" characters or encodings is much improved.

* Added some missing glyphs to the StandardFont class, which can now support
  all of ISO-8859-1, ISO-8859-2, ISO-8859-9 and ISO-8859-15.

* Chinese/Japanese/Korean PDFs using non UCS2 or UTF16 encodings are supported.

* Better font substitutions for non-embedded fonts on Windows, OS X and Linux.

* Fixed bug where if the last revision in a PDF was less than 1024 bytes long
  it was being skipped.

* Increased maximum object number to 24 bit, to match new limit in Acrobat 6.

* Correctly render bitmap images with a colormask.

* Fixed bug causing some Type 3 fonts not to render.

* Fixed bug in Type 2 parser causing some glyphs to render incorrectly.

* Fixed occasional bug when underlining text, added in last release.

* Fixed incorrect rotation when page was rotated 180.

* Fixed yet more inline images that were failing to parse

* Now handles negative values for fontsize when rendering.



2.7.2 (released 2006-09-13)
-------------------------------
* Added PDFCanvas(width, height, opacity) constructor to create translucent
  canvases

* Fixed TIFF clipping path problems in european Locales

* Fixed FormSignature.getSignatureDate() returning null, broken in last release

* Fixes to alpha handling when rendering - wasn't working all of the time.

* More improvements to XFA support, including full handling of Barcode fields

* Fixed infinite loop in LayoutBox under very specific circumstances

* Setting Combs in a FormText turns off scrolling, as expected by Acrobat.

* Fixed parsing of some AFM files, which was failing

* Better rendering of calibrated colors - we believe this is finally correct

* Corrected char widths for Type 0 fonts (mainly chinese/japanese/korean)

* Fixed bug where changing color halfway through an underlined paragraph
  was taking effect too early

* Better substitution of missing fonts when rendering

* Large regression test found and fixed the following rendering bugs:
  Fixed infinite loop in RunLength decoding under certain circumstances
  Typo in CalRGB colorspace resulted in blue becoming green
  Correctly display CCITT encoded images when EndOfBlock=true
  writeAsTIFF was failing if CreationDate or ModDate were invalid
  Pages with invalid annotation lists were failing to render
  Fonts with Differences Array and ToUnicode entry were rendering incorrectly
  Color reproduction for DeviceCMYK and DeviceGray colorspaces matches Acrobat
  Fixed troublesome inline images, broken a few releases ago
  Graceful failure when JPEG2000 decoder fails from internal errors
  Fixed bug when nesting clipping areas
  Fixed Java 1.4 dependency when loading documents with a language specified



2.7.1 (released 2006-08-11)
-------------------------------
* Released the source to the rest of the "org.faceless.pdf2.viewer" package,
  and moved the PDFTool.java example into the JAR as the main class.
  "java -jar bfopdf.jar --help" for option.

* Added the annotateComponent() method to PDFViewport which allow updates to
  be made to the viewport after the page has been updated. This can be used for
  anything from adding text highlights or graphics objects to form fields.

* Added the AcrobatSignatureHandler factory, which extends HANDLER_ACROBATSIX
  and allows more options to be set such as changing the hash algorithm and...

* Added support for Digital Signature Timestamps (RFC3161). This is supported
  in Acrobat 7, and by us with the new AcrobatSignatureHandlerFactory class.
  The DSE200SignatureHandler class should no longer be used unless you're
  specifically targeting Acrobat 6.0 or earlier with the DSE plugin.

* Added the RemoteSignatureHandlerFactory (and RemoteSigningServlet) to allow
  a PDF to be signed remotely via a simple web-service.

* Writing CCITT TIFF images has almost doubled in speed in some cases,
  provided a ColorModel from PDFParser.getBlackAndWhiteColorModel is used
  instead of PDFParser.BLACKANDWHITE.

* Fixes to PDF/A-1b OutputProfile to work with Acrobat 7.07 (which has had it's
  PDF/A support updated).

* More fixes to the XFA parsing.

* Correctly handles Type 6 cmaps in OpenType fonts.

* Fixed PublicKeyEncryption, broken in last release.

* Fixed the co-ordinates used in the PageExtractor classes so they're relative
  to the MediaBox - previously they were (incorrectly) relative to the CropBox.

* Added OutputProfile.Feature.Article and Feature.PublicKeyEncryption.

* Fixed parsing issues occurring on some PDFs with compressed XRef tables, on
  PDFs with dangling pointers in the page list or with a bad FormChoice object.



2.7 (released 2006-07-18)
-------------------------------
* API DIFFERENCE: There was some "confusion by design" over PDF version numbers
  when verifying signatures. Previous versions treated the original file as
  revision 0, which made it impossible to determine whether a signature covered
  the original release or no releases. The API has now been modified so that
  the original version of a file is revision 1, the first revision is 2 and so
  on.

  This should only affect you if you're trying to specifically load an earlier
  revision of a PDF. If you're validating signatures, provided you're only
  testing FormSignature.getNumberOfRevisionsCovered()==PDF.getNumberOfRevisions
  then no changes have to be made. You can now also be sure when the number of
  revisions covered in a FormSignature is 0, then it's invalid.

* Relased the source to most of the PDFViewer package under the "src" folder.
  We hope this will make life easier for those building their own viewers.

* Added PageExtractor.getMatchingText method to help those trying to search a
  document and highlight the search terms.

* Added PageExtractor.Text.getOffset() method, to determine the exact position
  on the page of a section of text, and getPage(), to return which page the
  text was on. Fixed getAngle() method too - results were rotated 180 degrees.

* XFA parsing is much smarter - the Form.setXFADatasets method should work
  for some of the more unusual constructions that are possible.

* Now supports rendering bitmap images with an alpha channel

* Now renders PDF1.6 documents containing OpenType fonts

* FormSignature.verifyCertificates was throwing an exception on certain
  certificate chains, rather than passing back the invalid certificate. Fixed.

* Fixed incorrect application of BBox on nested Form XObjects

* Improvements made to annotations (particularly AnnotationNote) when
  setOpacity is called - structure is now more compatible with Acrobat 7.
  All AnnotationNote types are now anchored to the top-left corner of their
  rectangle, not just "Note" types.

* AnnotationLinks with old-style links to named actions are now supported

* AnnotationMarkup had some incorrect flags set resulting in odd behaviour when
  the document was zoomed. Now fixed.

* PDFPattern can have "null" as a background color, for transparent patterns.

* Added the PDFTool example - a swiss-army knife for PDFs



2.6.11 (released 2006-06-13)
-------------------------------
* Fixed speed increase in last release so it's actually faster in all
  circumstances.

* Now uses LZW compression for non-bilevel TIFF images. This is roughly the
  same speed as the previous RLE compression algorithm but produces files
  50% smaller than packbits (the LZW patent has now expired internationally).

* Fixed values returned from PageExtractor.Image.getDPIX/DPIY

* Fixed rare problem parsing unusual Type 1 and Type 3 fonts

* Fixed underlined text fields losing their underlining.

* Fixed rare "PDF IS NULL" error when rendering some PDFs



2.6.10 (released 2006-05-11)
-------------------------------
* Fixed obscure problem when creating canvases from a page containing flattened
  form fields.

* Corrected flags for some StandardCJKFonts, which was causing incorrect font
  substitution in Acrobat.

* Down appearance on buttons wasn't preserved if the button wasn't beveled.

* Slight improvements to memory and speed when rendering PDF to a bitmap.

* Removed some unnecessary work done to each page when reading and writing
  documents, resulting in a PDF that is slightly closer to the original file
  structure. Necessary for a particularly obscure bug with a sample PDF.

* Fixed opening of 128-bit encrypted documents using the owner password

* Fix to XFA field bug introduced in 2.6.9 which sometimes resulted in field
  content disappearing in Acrobat



2.6.9 (released 2006-04-24)
-------------------------------
* Now works with the Bouncy Castle Crypto provider as the preferred provider.

* Fixed ClassCastException when rendering, sometimes occuring in PDFs with
  multiple appearances per button.

* Added option to save TIFF images at 204x196DPI, required for TIFF-F.

* Rendering PDFs as color TIFFs now uses Packbits compression.

* Fixed position of rotated images on buttons.



2.6.8 (released 2006-03-28)
-------------------------------
* Roughly doubled the speed of PDFParser.writeAsTIFF() method.

* Fixed writing of previously read in PDFs with compressed XRef tables.

* Added PDFParser.getBlackAndWhiteColorModel() method, for better control of
  black/white threshold when creating 1-bit TIFF images.



2.6.7 (released 2006-03-21)
-------------------------------
* Added support for PDF/A-1b:2005 as an OutputProfile.

* Fixed bitmap images appearing stretched in some cases.

* Now parses PDFs with exactly 1k of junk at the end of the file.

* Better font substition in viewer.

* Can now display text in Multiple Master fonts.

* Better handling of File actions.

* Fixed position of images extracted from PageParser.

* Correctly prints documents with no initial color set.

* Attempts to fail gracefully when displaying some corrupt TrueTypes.



2.6.6 (released 2006-01-31)
-------------------------------
* Added ability to extract XFA data from a Form, and set a form's values based
  on an XFA dataset object.

* Rendering PDFs containing bitmap images to sRGB is now slightly faster.

* Text extraction from PDFs containing bitmap images is considerably faster.

* Fixed occasional creation of invalid PDFs where fill and line transparency
  were both being used.

* Correctly use ToUnicode map for single-byte fonts when specified.

* Fixed sometime incorrect line width calculation when Track Kerning was used.

* Fixed display of 2 and 4 bit bitmap images.

* Fixed colors being inverted in DeviceN colorspaces

* Added workaround for bug in Sun builds of Java causing rendering of GrayScale
  images to RGB canvases to take much longer than it should.

* Fixed bug in PostScript Function calculator, showing in some GradientFills

* Fixed incorrect PDFPage.UNITS_PERCENT calculations.

* Process some more corrupt PDFs successfully



2.6.5 (released 2005-12-14)
-------------------------------
* Profiled and improved the DiskCache class to reduce memory. Heap use can be
  reduced by up to 75% in some extreme situations (documents consisting
  entirely of bitmap images, for example).

* Worked around "blue tint" when displaying some PDF documents in the viewer,
  caused by ColorSpace issues.

* Tweaked FormChoice internals to match Acrobats behaviour, rather than the
  PDF specification.

* Tweaks to AnnotationNote class to allow setting of popup window location

* Fixed viewer to handle documents containing zero-width lines and other
  path oddities.

* Added display of Type 3 fonts to viewer.

* Fixed permissions in PublicKeyEncryptionHandler, and added get methods to
  retrieve them.

* More improvements to text extraction.

* Added protected methods getStreamValue / putStreamValue to SignatureHandler.

* Added PDFStyle.getTextAlign

* Fixed PDFAction.getRemoteFilename



2.6.4 (released 2005-11-22)
-------------------------------
* Fixed errors when loading some TIFFs and FDF files, added in previous release.

* Added various new methods to PDFAction to support "remote" go-to actions.

* Fixed bugs when creating new documents with translucent colors - these were
  not always working as expected.

* Correctly handle truncated images.

* Various fixes to handle more bad or unusual PDFs, including those with
  truncated images/ASCIIHex streams, missing form objects and so on.

* Fixes to AnnotationNote rectangles

* Handles documents containing TrueType fonts with 1/0 CMaps and no PostScript
  names



2.6.3 (released 2005-11-04)
-------------------------------
* Added setTextValue and getTextValue to WidgetAnnotation, to better handle
  Checkbox and Radio Buttons in XFA forms. Plus some related XFA bugfixes.

* Drastic reductions in size of PostScript generated when printing under some
  circumstances, due to fonts being rendered as fonts rather than shapes where
  possible. Currently only for non-embedded fonts due to bugs in java printing.

* Added RenderingHints to PDFParser.writeAsTIFF and PagePainter classes, to
  control rendering settings.

* Worked around obscure problem to do with ColorSpace gamuts which could result
  in color changes when converting PDFs containing CMYK images to CMYK TIFF
  (see http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=6349627).

* Now recognises and uses clip paths in TIFF images, if specified.

* Indexed non-RGB images in PDFs are no longer converted to sRGB but are kept
  in their original colorspace.

* Fixed text extraction after the Collection of Text objects has been modified

* Fixed widths of non-embedded CID fonts.



2.6.2 (released 2005-10-25)
-------------------------------
* Added text and image extraction, via the PageExtractor class. This requires
  the "Extended Edition plus Viewer" license.

* Added integration with Apache Lucene, via the PDFParser.getLuceneDocument()
  method.

* Now parses XMP metadata and keeps it in sync with the original metadata (as
  set by PDF.setInfo). Also updated PDF.setInfo() and getInfo() to be able to
  manipulate XMP data as well as the original.

* Added "UnscaledPrinting" as an option to PDF.setViewerPreferences().

* Can now display 2, 4, and 16 bit images in the viewer (16-bit images are
  downscaled to 8)

* Handle Indexed images with truncated index map.

* Correct fontwidths for Type 3 fonts and unembedded CID fonts in forms

* Some fixes to the OutputProfiles, including PDF/X-1a:2001.

* Handle some previously corrupt PDFs

* Bug fixes to large dictionary changes made in last release.



2.6.1 (released 2005-10-12)
-------------------------------
* Added preflighting. OutputProfiles have been vastly expanded and can be
  extracted from a PDF with the PDF.getFullOutputProfile() method. They can
  also be applied to existing PDFs to bring them into line with a profile.

* PDF/X support completely redone and verified against the ISO specifications
  and Acrobat. The previous, badly broken PDF/X support has been removed and
  replaced with OutputProfiles for PDF/X-1a:2001, PDF/X-1a:2003, PDF/X-3:2002
  and PDF/X-3:2003. OutputIntents can be specified or extracted from a PDF.

* Added the PDF.getBasicOutputProfile() method, which retrieves a lot of
  "under the hood" information about the PDF.

* Added support for Acrobat 6.x document compression. Setting the OutputProfile
  to OutputProfile.Acrobat6Compatible will cause the document to be fully
  compressed - the resulting document will usually be considerably smaller, but
  no longer be readable in Acrobat 5.x or earlier. Also upgraded the PDFReader
  to parse documents compressed in this way.

* Fixed PKCS#7 problem causing some valid Digital Signatures to appear invalid.

* Fixed obscure problem with text encodings - using a non-standard encoding
  with incorrect glyph names for the StandardFonts could cause text extraction
  and display to lose the spaces in the text.

* In the viewer, Fixed text display when page is transformed under Java 1.3.

* Fixed NPE in java.awt.geom.Area when trying to print some PDFs containing
  images to a PostScript StreamPrintService.

* Fixed NPE when parsing OpenType fonts with no cmap.

* Reset clip rectangle before painting annotations in PagePainter - some
  weren't appearing.

* PDF1.6 no longer has the limits on Dictionary sizes that applied to earlier
  versions, and our implementation was very inefficient for dictionaries
  containing 1000s of keys. Now fixed, resulting in potentially huge (10x)
  speed increases reading some 1.6 PDFs.

* Fixed issue in LayoutBox.split() where the split point occurred on a blank
  line. Was causing some bad breaks in the Report Generator.

* Fixed issue getting co-ordinates of annotations on rotated pages before
  the page had been normalised.

* Fixed length of text calculation when a backup font it used.

* Printing PDFs created with the trial version now results in smaller print
  jobs.

* Using a predictor on LZW or Flate streams was broken for some parameters.

* Fixed Event.CLOSE for documents - PDF specification was incorrect.



2.6 (released 2005-09-26)
-------------------------------
* API DIFFERENCE: The AnnotationFile class previously handled all the details
  of the embedded file. With the addition of the EmbeddedFile class in this
  release, most of the functionality in AnnotationFile has been stripped out
  and moved to that class.

* Added the PDF.getEmbeddedFile method, to get or set embedded files in the
  document. Also added the EmbeddedFile class to support this functionality.

* Big improvements to DeviceGray, CalGray and DeviceCMYK ColorSpaces - PDFs
  containing those ColorSpaces now render considerably better.

* Unparseable ICC profiles now fall back to their Alternate ColorSpace.

* CMYK DCT (JPEG) images embedded in PDFs can now be displayed, although this
  requires Java 1.4. Earlier versions of Java will continue to fail when
  decoding CMYK images encoded with a DCTDecode Filter.

* Now handles ImageMask images.

* The viewer now displays a gray rectangle for images that cannot be displayed,
  for any reason, to illustrate somethine is there.

* Fixed bug when working with rotated pages containing radio button
  annotations - was resulting in ClassCastException.

* Fixed JavaScript actions - can now create actions using UTF-8 characters
  (reading existing UTF-8 actions was already working, only writing was broken)

* Added (or rather made public) the getTextWidths() method in PDFStyle.

* Improvements to "Dump.java" example, to better handle PDFs with non-ASCII
  content



2.5.2 (released 2005-09-14)
-------------------------------
* Added RGBA and CMYK as available colormodels for PDFParser.writeTIFF(). Also
  added PagePainter.setBackground(), to enable PDFs to be rendered to
  backgrounds other than opaque white.

* Fixed viewer component on UNIX, not working due to API differences with
  Windows!

* Removed some more Java 1.4 dependencies. The PagePainter class can now run
  under Java 1.3 on UNIX and Windows, which means converting PDFs to bitmap
  images (eg TIFF) or drawing to an existing Graphics2D will work under 1.3.
  However, the "org.faceless.pdf2.viewer" package still requires 1.4.

* Fixed some bugs with XFA forms

* Fixed creating digital signatures with no annotations and when flattening
  some forms - broken a couple of versions ago.

* Fixed race condition in StandardCJKFont which could cause occasional errors
  when trying to create the same font from many simultaneous threads.

* TIFFs created from PDFs were technically invalid due to tags being stored in
  the wrong order, although they were accepted by all tested viewers. Fixed.



2.5.1 (released 2005-09-01)
-------------------------------
* Fixed PNG de-interlacing routine - was failing for some image dimensions and
  depths

* Fix attempt to modify unmodifiable map with some Type 1 fonts (since 2.4.3)

* The core of the library runs with Java 1.3 again, and will run if calls to
  System.getProperties() have Access Restrictions. This has resulted in a
  visible change to the API - StandardEncryptionHandler.setAcrobat7Security
  no longer throws a javax.crypto.NoSuchPaddingException.



2.5 (released 2005-08-23)
-------------------------------
* Added PDFParser and PageViewer classes and org.faceless.pdf2.viewer package.
  These classes make up the viewer extension, which allows rendering PDFs to
  bitmaps. This is a significant addition so the version number has been
  bumped to 2.5, despite the fact the rest of the API is compatible with
  earlier versions.

* Added AnnotationFile class, for attaching files as annotations.

* Added "setTextSmallCaps" method to PDFStyle class, to style text with small-
  caps.

* Fixed track-kerning when backup fonts are in use.

* Fixed positioning issue with rotated widgets on rotated pages



2.4.3 (released 2005-07-25)
-------------------------------
* Added PDF417BarCode class, for PDF417 2D bar codes.

* Added QRCode class, for QRCode 2D bar codes (including full support for Kanji
  and mixed-modes).

* Added StandardEncryptionHandler.setAcrobat7Level(), to encrypt documents
  using the AES Encryption method added in Acrobat 7.0.

* Setting values in documents containing XFA forms now works. Also enhanced
  Form.getElement() to search on the "friendly name" of a field, to make
  working with XFA forms easier.

* Correctly position rotated annotations on rotated pages

* Fixed infinite loop when document contains recursive bookmarks

* Return PasswordException instead of generic IOException when opening a
  document and supplying an invalid password, to make invalid passwords
  easier to catch.

* Added support for PPM images to PDFImage class

* Fixed bug in v1 compatibility API when calling page.drawPage()

* Much of the Font code has been reworked to allow text extraction and
  rendering - coming soon. Users should notice no changes, but we mention it
  here for completeness



2.4.2 (released 2005-06-09)
-------------------------------
* Better handling of extremely long text - if a single word is longer than the
  available space, it will be wrapped.

* Altering opacity of existing annotations now works for all annotation types.

* Handle special case where seekStart is followed by another seekStart - was
  failing.



2.4.1 (released 2005-05-23)
-------------------------------
* Expanded support for TIFF-JPEG images - more variants (although not all) can
  now be loaded, and those containing an embedded JFIF stream can now be
  embedded directly into the PDF without recompression.

* More flexibility when sizing Bar codes - any width/height/bar-ratio may be
  used, although a BC1 warning will be displayed if the size is outside legal
  limits

* Fixed bug introduced in 2.4 where boxes would sometimes appear around form
  fields

* FormSignature.loadDefaultKeyStore no longer fails when the default JCE
  Provider has been changed.



2.4 (released 2005-04-27)
-------------------------------
* Added support for multiple signatures. Documents that have already been
  signed can now have further signatures added to them without invalidating
  the first signatures. As many as required can be added provided the PDF is
  rendered between them. Although still API compatible with 2.3.7, this is a
  fairly large change so we've marked it as 2.4

* Added several methods to PDFAnnotation relating to reviewing and replying to
  comments - specifically getReviews, getReplies, addReview, and the
  set/getStatus method in AnnotationNote

* Re-saving a previously encrypted document now preserves the Owner password

* Fixed some unusual cases when cloning pages with widget annotations

* Can now read and write forms with Form XObjects as button images

* Always reset graphic state before drawing a canvas, including text operators.
  This fixes some cases where text in canvases was being located incorrectly,
  or pictures were inheriting the transparency of the previously drawn picture.

* Added AnnotationLink.setCorners(), to use the Acrobat 7.0 feature of non-
  rectangular hyperlinks.

* Completely rewrote the Dump.java example, which hopefully will serve as a
  better guide for those wanting to extract information from PDFs.

* Fixed the memory leak in the PDF1.0 wrapper classes. We still don't recommend
  you use them, but if you must this should make it a little more bearable.



2.3.7 (released 2005-04-13)
-------------------------------
* Reversed change in 2.3.5 which should have resulted in smaller XRef tables.
  In practice, although it appeared to meet the specification it wasn't
  accepted by Acrobat and resulted in "Repairing corrupt document" warnings
  on load.

* Fixed concurrency problem occuring when using an OpenTypeFont in more than
  one PDF, which are then rendered simultaneously

* Promoted get/setAuthor, get/setComment to PDFAnnotation class from it's
  subclasses - these apply to all annotations

* Added get/setColor and get/setOpacity to PDFAnnotation

* Added AnnotationText class, for FreeText annotation

* Fixed very obscure bug in LZW decompression for TIFF images, which could
  occasionally result in "streaks" in images with horizontal differencing.



2.3.6 (released 2005-04-01)
-------------------------------
* Added support for interlaced PNG images.

* Added AnnotationMarkup class, for highlight/underline etc. annotations

* More robust parsing of CCITT-2D encoded images (including TIFF) should handle
  slightly corrupt images more gracefully

* Very slight modification to line spacing in multiline FormText elements,
  so fields with many lines occupy the same space as in Acrobat.



2.3.5 (released 2005-03-11)
-------------------------------
* Fixed memory leak to do with ICC profiles, which are sometimes embedded
  in images. Unlikely to affect many users, and at a typical 5k per affected
  PDFImage it's not a big leak, but if you've been seeing leaks then please
  upgrade.

* The Form.flatten() method has been modified to produce smaller PDF files -
  sometimes considerably smaller.

* Added synchronized block around ICC profile extraction, to work around
  Sun JRE bug 4863795. Performance hit should be negligable we hope, but if
  you notice a difference then vote for the bug at bugs.sun.com.

* Fixed IllegalStateException caused when flushing an empty page then
  immediately trying to write to it.

* No longer delete unrecognised Annotation types

* Fixed issue decoding some LZW streams

* Names containing [ and ] characters now work



2.3.4 (released 2005-02-21)
-------------------------------
* Fixed signature verification where a document was both signed AND encrypted.
  The spec is silent on what to do in this case and each handler does it
  differently, so added the SignatureHandler.isVariableEncrypted method to
  cover all possibilities.

* Added full support for Lab and calibrated Gray and RGB color spaces.

* Fixed bug introduced in 2.3.3 where documents were encrypted with metadata
  unencrypted but all rights enabled, were not being encrypted.



2.3.3 (released 2005-02-07)
-------------------------------
* Fixed very rare writing of corrupt strings in documents when encrypted.
  This could occasionally result in documents failing with "Dictionary key
  not a Name") when reading them back in with this library.

* Fix "trying to seal with mutable objects" error when loading PDFs error
  once and for all.

* Don't encrypt PDFs if no encryption is required

* Correctly handle form fields with non-ASCII field names



2.3.2 (released 2004-12-06)
-------------------------------
* Fixed rare problem when reading documents containing indirect references to
  Name objects

* FormChoice.setValue("") now works if the options in a FormChoice contains the
  empty string.

* No longer fails immediately if the Length field in a stream is wildly wrong.



2.3.1 (released 2004-11-11)
-------------------------------
* Fixed two Exceptions when reading in images from existing documents, one to
  handle invalid null images created by GhostScript, the other to handle a
  problem with Masked images introduced in 2.2.4.



2.3 (released 2004-10-25)
-------------------------------
* API DIFFERENCE: Removed SignatureHandler.isPDFObjectSignature() method and
  replaced with SignatureHandler.getVariable(). This is unlikely to affect
  many (any?) people, but it is an API change so we've gone to 2.3

* Added support for OpenType fonts containing PostScript glyphs

* Added "DSE200Handler" class for digitally timestamping documents using the
  nCipher DSE200

* Fixed positioning of PDFCanvas objects created from pages with CropBox set

* Fixed getTop/getBottom methods for Courier fonts

* Minor TIFF fixes



2.2.6 (released 2004-10-05)
-------------------------------
* Added support for Unicode 4.0 chars > U+FFFF. Currently these characters
  are only defined in some of the StandardCJKFonts.

* Support added for UTF16 encoding (new in Acrobat 6.0). This is required to
  display glyphs added in Acrobat 6, specifically the HKSCS-2001 and
  JISX0213:2004 character sets. Also upgraded Cmaps to those supplied with
  Acrobat 5 and 6.

* Directly embed some CCITT TIFF images without recompressing them, giving a
  sizable speed increase.

* Added FDF.setIgnoreErrors() method

* Added getChange(), getPrint() and getExtract() to StandardEncryptionHandler

* Should now be able to extract text from forms in Chinese/Japanese/Korean
  that don't use a Unicode encoding

* Fix ClassCastException when setting OpenAction on newly-read in documents

* No longer force keystore provider to Sun when loading Default Keystore

* Fix "trying to seal with mutable objects" error when loading images from
  existing PDFs



2.2.5 (released 2004-08-18)
-------------------------------
* Reduced memory footprint, particularly when reading documents using the
  PDFReader(File) constructors, and when digitally signing documents when a
  Cache is in use. Reading large documents should also be about 15% faster.

* Rewrote DiskCache to write to disk before the stream is closed if necessary,
  which allows large individual streams to be handled.

* Added PublicKeyEncryptionHandler, to read/write documents encrypted with
  public keys.

* Fixed "stream still open" exception when cloning a page that had had fields
  flattened on it.

* FormChoice fields no longer have a "ghost" image.

* Fixed error when reading documents containing a "Caret" annotation.



2.2.4 (released 2004-07-30)
-------------------------------
* Fixed XMP metadata generation

* The FDF class can now parse XFDF files, provided there is a SAX parser
  available for it to use.

* Fixed duplicate annotations when importing open annotations from an FDF

* Added isPDFObjectSignature method to SignatureHandler class, for added
  flexibility when developing signature handlers.

* When creating a Canvas from a Page or cloning a Page, images or fonts used
  on that page are no longer cloned

* Fixed obscure problem when cloning documents with empty indirect dictionaries



2.2.3 (released 2004-07-12)
-------------------------------
* Fixed PDFPage.rotate method to work after a call to setUnits

* FormTexts are no longer clipped if there is no background/border set - the
  same behaviour as Acrobat 6.

* Page sizes may now be specified as a string like "A4", "A3" and so on. In
  addition page sizes can now be specified as decimals, eg "100.5x100.5"

* TIFF parsing refactored, now uses less memory and takes less time.



2.2.2 (released 2004-06-15)
-------------------------------
* Added Caching. Images, Sounds, Pages and Canvases that are closed may now
  optionally be cached to disk to free up RAM. See the Cache interface.

* Repackaged the JAR so that the compatibility classes for version 1 of the
  library are stored in a separate JAR.

* Rewrote the StandardFont class to use less memory and initialize quicker

* Text in Forms is no longer displayed with ligatures

* Annotations are now imported from FDF documents in the PDF.importFDF method

* Added the PDFCanvas.setAcrobat6Layer method, to add watermarks/backgrounds to
  documents.



2.2.1 (released 2004-05-25)
-------------------------------
* A mistake in the testing procedure for 2.2 meant that release is unable to
  write encrypted documents. All users who downloaded 2.2 are encouraged to
  upgrade to 2.2.1 as soon as possible.

* Added TEXTALIGN_JUSTIFY_ALL to justify all lines of the paragraph, including
  the last one.



2.2 (released 2004-05-18)
-------------------------------
* API DIFFERENCE: Added flush() methods to PDFPage and PDFCanvas classes. These
  methods *may* need to be called when a PDFPage or PDFCanvas is being cloned.
  See the API documentation for those methods for more information. If memory
  is a concern it's a good idea to call them anyway.

* API DIFFERENCE: PDFSound.getStream() method returns an InputStream, not a
  byte array as before.

* Major refactoring of the code should help to reduce the memory footprint,
  mainly in the following areas:
   *  Reading stripped TIFF images
   *  Appending to pages from documents loaded from a PDFReader
  The changes in this version are mainly to lay the way for a disk-based cache
  in a future release.

* Added new PDFImage constructor, for creating images from raw bitmap data.
  Useful for extremely large images (we tested with a CMYK 15000x25000 pixel
  image) or for images in unusual formats.

* Added "rawWrite" method to PDFPage and PDFCanvas, which allows advanced
  users to write raw PDF operations to the page.

* Fixed text indent and layout of right-to-left text in Acrobat 6

* Fixed close() method on PDFImage objects and added a close() method to PDFSound
  Those running low on memory should remember to close() any of these objects that
  they create.




2.1.2 (released 2004-04-27)
-------------------------------
* Added _ModDate and _CreationDate to PDF.getInfo() output.

* Added PDF.getDocumentID() method

* UNIX users not running X11 should be able to create a PDFImage from a
  BufferedImage

* Fixed CCITT encoding of images where the left pixel of each row is black.




2.1.1 (released 2004-04-08)
-------------------------------
* Fixed HeiSeiKaku-Gothic font

* Added support for TIFF alpha transparency

* For users running Java 1.4, added support for JPEG TIFFs, and also fixed
  color problem when printing CMYK JPEGs created with Adobe Photoshop

* Added support for the JPEG 2000 image format

* Fixed exception when using an embedded 2-byte font in form fields.

* Appending to pages where the page co-ordinate system was changed now works.




2.1 (released 2004-03-12)
-------------------------------
* Added the "MaxiCode" class, to render UPS MaxiCodes (a type of 2-D barcode).
  We had to change the method signature of the drawBarCode() methods to accept
  the new BarCodes, so ANY CODE CREATING AND DRAWING BARCODES WILL NEED TO BE
  RECOMPILED (NOT changed, just recompiled). This is the only reason this
  release is marked as 2.1 rather than 2.0.9

* Tiled TIFF images can now be loaded, and inverted 8-bit images are working
  again (broken in 2.0.1)

* Fixed rare stack overflow condition when drawing arcs very close to 90
  degrees

* Fixed equally rare concurrency error when filling out several forms in
  different threads

* Now reads (even rarer) zero-length hex strings when reading PDFs and FDFs.




2.0.8 (released 2004-02-10)
-------------------------------
* Signature appearances are no longer opaque by default.

* PKCS7SignatureHandler.sign() method is no longer final.

* Handles some cases of form names with a "." that weren't handled before.

* Obscure problem fixed in 2.0.7 caused some documents to inflate in size
  drastically - now fixed.

* Tweak to positioning for right-aligned form fields prevents occasional
  clipping

* Fixed italic/bold variants of StandardCJKFonts

* Added set/getUniqueID() to PDFAnnotation class

* Certain documents were incorrectly returning a null action for their
  bookmarks - now fixed.




2.0.7 (released 2004-01-19)
-------------------------------
* Fixed inabilty to reset the dash pattern in a PDFStyle

* Drawing dashed lines with a fill-color set no longer gives a "trace" line

* Added PDFPage.setBox and PDFPage.getBox methods.

* Handles pre-rotated pages with annotations correctly, and no-longer resets
  the Crop/Bleed/Art/TrimBox when it does.

* Now handles fonts created with the "Private Character Editor" supplied with
  Windows XP

* Fixed extremely obscure problem occurring when signing one particular PDF
  with a non-standard signature appearance.

* Fixed slightly innacurate (<0.1%) definition of MM and CM.




2.0.6 (released 2004-01-09)
-------------------------------
* Fixed unembedded OpenType fonts - now working again

* Added support for PGM and PBM images to PDFImage class

* Added 3 new barcodes - PostNet (for US ZIP codes), the RoyalMail 4-state
  Customer Code (for UK postcodes) and the Deutschen Post Leit and Identcode
  variation of Interleaved 2/5 (for German postal codes)

* Certain types of PDF1.1 named action were causing problems - now fixed

* Fixed issue where standard edition licenses failed when annotations are used




2.0.5 (released 2004-01-05)
-------------------------------
* Fixed small memory leak when creating Form() object.




2.0.4 (released 2003-12-05)
-------------------------------
* Fixed bezier curves when the page origin is set to ORIGIN_PAGETOP

* Added workaround for spec-defying behaviour of some FormText elements in
  Acrobat 5.0

* Added language coding for multi-language documents, for basic accessibility
  support. Also added RTL markings for hebrew/arabic.

* Normalize presentation-forms when creating ToUnicode table.

* More FDF tweaks - now handles Checkboxes with values of "Off"

* Fixed problem appending to pages that are uncompressed to start with.




2.0.3 (released 2003-11-25)
-------------------------------
* Added PDFStyle.setTextStretch() method

* Fixed more FDF problems

* Improved reading of linearized PDFs with broken byte offsets

* Fixed some issues with Track Kerning.




2.0.2 (released 2003-11-19)
-------------------------------
* Fixed problem with importing FDFs

* Fixed problem where a "double image" can appear when editing a form field
  in Acrobat that has been created by the PDF library.

* Can now read documents with corrupt named actions




2.0.1 (released 2003-11-11)
-------------------------------
* Worked around yet another IBM JIT compiler bug - this time, the JDK supplied
  with WebSphere 5.1 on Windows was failing when reading some documents.

* Added support for Acrobat 6 encryption with unencrypted metadata. See the
  StandardEncryptionHandler.setAcrobat6Level() method

* Changes to stream compression result in significant memory savings when
  creating large documents from scratch - in the region of 5-15% depending on
  the document.

* Fixed auto-sizing of multi-line text box fields

* Fixed incorrect RD3 warning when loading an FDF file

* Colors for barcodes, form borders and others that were previously black in
  the RGB colorspace are now black in the GrayScale/CMYK colorspace, for
  compatibility with PDF/X. Also added CMYKColorSpace.BLACK and
  CMYKColorSpace.WHITE as constants.

* Fixed occasional ArrayIndexOutOfBoundsException in IdentitySet/IdentityMap,
  caused by some JREs using negative hashCodes.




2.0 (released 2003-11-03)
-------------------------------
* First release of 2.0. For a list of changes over the beta period and compared
  to version 1.0, please see the file "UPGRADING-2.0.html"




1.2.11 (released 2003-06-25)
-------------------------------
* Fixed processing of indexed 2-color java.awt.Image images.

* Fixed bug whereby Signatures in Acrobat 6.0 were not visible.



1.2.10 (released 2003-04-30)
-------------------------------
* LayoutBox now has a new constructor which specifies the Locale of the box as
  a whole. This is only required if the main locale of your LayoutBox has a
  right-to-left language like arabic or hebrew.

* By popular request, added an "addTab" method to the LayoutBox class for
  easy creation of tab stops.

* Changing the value of form fields with multiple annotations changes the value
  for all annotations.

* Fixed FormRadioButton.setValue() method for new radio buttons

* Form Signature actions such as "Mark as ReadOnly on all fields" now work



1.2.9 (released 2003-04-08)
-------------------------------
* Submitting an entire PDF as a form action now works.

* Add fix for broken colorspace, occurring very rarely under Solaris 2.8

* Fixed mistaken assumption that CropBox/MediaBox is a direct object



1.2.8 (released 2003-03-21)
-------------------------------
* "-32768" error reading extremely large, complex documents has been fixed.

* Now handles TrueType fonts that have their name specified in UCS-16 only

* Correctly reads font widths for all types of Type 1 fonts in form fields

* Added workaround for broken colorspaces on AS/400 JDKs for Spot colors

* Added fix for occasional broken printing with Acrobat 4.0



1.2.7 (released 2003-02-24)
-------------------------------
* Fixed issues with track kerning - the return value from getTextLength
  was incorrect.

* Now recognizes TIFF images with alpha channels that aren't explicitly
  marked as having an alpha channel.



1.2.6 (released 2003-02-12)
-------------------------------
* Fixed PDF.getJavaScript method - wasn't working properly at all.

* Better support for drawing zero-length strings, which were failing under
  some circumstances. Also fixed Exception when calling LayoutBox.flush()
  twice in a row.

* Now handles documents with shared resource dictionary, like those created
  by JetForm 2.3

* No longer converts NULL form text fields to empty form text fields.

* Fixed multi-threading issue during font initialization.



1.2.5 (released 2003-01-24)
-------------------------------
* Added workaround for documents whose streams begin with "stream<0D>" only

* Added fix for PDFDocEncoding - "\r" wasn't listed. This was resulting in
  newlines being stripped from JavaScript and some annotations.

* Fix for TIFF images with ASCII directory entries <4 bytes long



1.2.4 (released 2002-12-23)
-------------------------------
* Fixed checksum calculation for Interleaved 2/5 barcodes

* Added workaround for JIT bug in IBM Java 1.3.0 and 1.3.1 on Windows, as
  supplied with (at least) WebSphere 4.0.2 to 4.0.4. This was causing a
  NullPointerException when reading PDFs

* Fixed PDF.getBookmarks() - will no longer return NULL if the document
  doesn't have any

* Handles buggy CCITT Group 4 TIFF images with premature EOL markers.

* Acrobat 4.0 has a limit of about 4k for JavaScript in a single item. Now
  splits document-wide JavaScript into smaller lumps to work around this

* JavaScript may now contain Unicode characters.

* Handles buggy PDF documents where a named action points to something other
  than a page

* Fix for obscure bug where the last revision of a multi-version PDF was
  ignored if it was less than 1024 bytes long

* Fix rather stupid error which was causing the pdf.getInfo() method to fail
  on any documents which were explicitly marked as trapped/not trapped

* Fixed error in Type 1 fonts which was causing warning messages under JDK1.4



1.2.3 (released 2002-10-31)
-------------------------------
* Fixed handling for rotated form elements, which was broken in version 1.2

* The drawText() method now handles leading newlines and lines consisting
  entirely of spaces in the same way as 1.1.x

* Fixed alpha values of non-sRGB fill colors, broken in 1.2.1.



1.2.2 (released 2002-10-21)
-------------------------------
* Closes the file and frees resources when a PDFReader is created with a
  java.io.File. This probably would have resulted in memory leaks for
  those calling this constructor

* Fixed the PDFAction.getJavaScript method

* In certain situations the last word of a LayoutBox wasn't getting
  positioned correctly - this is now fixed



1.2.1 (released 2002-10-01)
-------------------------------
* IMPORTANT CHANGE FOR DIGITAL SIGNATURES. Owing to an oversight in earlier
  releases of the library, it was possible for a document modified after a
  digital signature had been applied to show up as valid.  Although the signed
  section of the document was unchanged, it is posible to "append" a later
  revision of the PDF to the file, and this would not show up as invalidating
  the signature. Those using the library to verify digital signatures should
  upgrade, and see the documentation for the "FormSignature" class to see what
  changes are required to their code.

* Tied in with the above change is the new ability to import earlier revisions
  of a PDF, by means of a new PDF constructor and the
  PDFReader.getNumberOfRevisions method.

* The beginText/drawText/endText method of printing text should now function
  almost identically to version 1.1 of the library (the only differences are
  bugs that were fixed)

* Added the ability to import a Forms Data Format (FDF) file to complete a
  form - see the PDF.importFDF method and the new FDF class

* Added the ability to load an FDF-format keystore, of the kind exported by
  Acrobat 5, to verify Adobe self-sign signatures. See the
  FormSignature.loadFDFKeyStore method.

* Increased the range of characters available in the MSung font to include the
  HKSCS 2001 characters added to the Adobe CNS1 revision 3. This seems to be a
  combination of the characters from the ISO10646:2-2001 when they're in the
  BMP, and characters in the U+E000 to U+F848 range when they're not. Note the
  MHei font does not appear to contain these characters in Acrobat 5 - users
  requiring these characters should stick with MSung

* Fixed a bug in the LayoutBox class, which was causing text to be pushed down
  too far. Text is now displayed according to the CSS rules, i.e. any leading
  is split equally in two on either side of the text.

* Fixed handling of PDFStyle.setTextIndent

* Added several new methods to LayoutBox - splitAt() (to split a box in two),
  getLineNumber(), getLineTop(), getLineBottom() and setText()

* Fixed displayed values in FormChoice

* Form Buttons can now be read-only, and new fields are printable by default.

* Added isMultilineScrollable/setMultinelineScrollable flags to FormText

* Fixed mouseover/mouseout when reading form elements



1.2 (released 2002-09-03)
-------------------------------
* Fixed some problems with creating new forms using TrueType fonts.

* Fixed an encoding problem with Forms. Now forms using the standard fonts
  should work for all languages covered by Adobes "PDFDocEncoding".

* Fixed some final layout bugs to do with kerning. Results are now identical
  to 1.1.x versions of the library, except where those results were incorrect.



1.2 BETA2 (released 2002-08-28)
-------------------------------
* Fixed bug in beta 1 - failing to read some forms

* Fixed the TIFF parser to prevent it choking on malformed custom tags.

* Fixed bug with reading CFF fonts from forms that use the Adobe Standard
  Encoding.

* Fixed bug in setAccessLevel which always allowed annotations to be altered

* Added "getGoToCoordinates" method to PDFAction class



1.2 BETA1 (released 2002-08-20)
-------------------------------
API CHANGES
-----------
* Now reads DPI from JPEG images. This may result in some JPEG images being
  resized as previously they were always assumed to be 72dpi (this is the
  chief reason this release is 1.2 rather than 1.1.28).
  We've added the getDPIX() and getDPIY() methods to the PDFImage class, to
  make conversion easier - to reproduce the old behaviour, change any reference
  to "image.getHeight()", to "image.getHeight() * image.getDPIY() / 72"

* the setFillColor() / getFillColor() methods in the PDFStyle class now take a
  java.awt.Paint object, rather than the more limited subclass java.awt.Color.
  This won't require any changes to code unless you're using the getFillColor()
  method, but will require the code to be recompiled to avoid a
  NoSuchMethodError at runtime.

* The ColorPattern class is now an implementation of Paint, rather than a
  subclass of Color. In addition, the contract for the adjustBrightness method
  has changed to adjust and return a copy of the pattern, rather than the
  current pattern.

OTHER CHANGES
-------------
* Completely rewrote the text layout engine around the "LayoutBox" class, and
  backported the current API to fit. This should allow existing programs to
  continue on as before, while those requiring more advanced layout can use
  the new classes.

* Added the concept of a "backup font", where a style can define one, two or
  more fonts which act as a backup to the main font if a glyph isn't found.
  See the PDFStyle.addBackupFont() method.

* Corrected use of Unicode characters in Bookmarks and Annotations - now
  working properly.

* When merging pages from two PDFs into one, now correctly handles pages with
  form fields.

* Added the ability to fill with a java.awt.GradientPaint.

* Form Text and Button fields now work properly when rotated about 90, 180 and
  270 degrees. Form Text now works for centered multiline text.

* Handles buggy documents where the AcroForm array points to the annotations,
  not the widgets

* CCITT TIFF image reading about 40% faster, on average.

* Added BARCODEUPCA, for UPC-A barcodes that don't look like EAN-13

* Now handles Unicode spacing character U+2000 to U+200A in the StandardFont
  class

* PDF reading now skips junk at the start/end of the document, and can read
  buggy documents where actual and recorded stream length don't match. Also
  removed some debug code, which should speed things up a bit.

* TrueType fonts requiring more than 255 glyphs are now embedded properly. Also
  added a warning when using a TrueType font that is missing some (but not all)
  PostScript names, which was causing blank spaces in the document.

* PDFs can now be rendered more than once - this was broken a few releases
  ago.

* Merges resources across multiple form fields, for smaller documents



1.1.27 (released 2002-06-26)
----------------------------
* TrueType names required for unembedded fonts are different to TrueType
  names required for form fonts! Fixed so the appropriate name is chosen.

* Now reads interlaced GIF images, and GIF's with comments too.

* Fixed bug in FormSignature class when "SUN" is not the default provider.

* Correctly handles CMYK JPEG images saved by Photoshop, which were inverted

* Fixed some problems with the arabic ligature routines - U+0651 to U+0655
  weren't being classed as non-spacing.

* Fixed obscure problem when recoding fonts that differ from the Adobe
  Glyphlist, which could sometimes result in the wrong glyph being displayed.



1.1.26 (released 2002-05-16)
----------------------------
* Added fix to previous CompactFont change, was breaking documents with
  unembedded Type1 fonts

* More workarounds for bad forms - reads MK from stream and DA/DR from
  annotation if necessary.

* Workaround for segmented content-streams with no space between operators

* Added zero arg contructors for FormElements

* Fixed some bugs with Form Signatures - default name is now set according
  to API docs



1.1.25 (released 2002-05-12)
----------------------------
* Added workaround for forms that erroneously specify an FT for their
  annotations

* Added Chinese/Japanese/Korean fonts for form elements. We'd appreciate
  feedback on this, as it's difficult to test without a localized copy of
  Acrobat.

* Further, hopefully final fix for for pages with unusual MediaBoxes - now
  works when pasting these onto other pages.

* Preliminary work on Compact Font Format - form elements using this font
  type can now be rewritten, but new CFF fonts cannot (yet) be loaded.



1.1.24 (released 2002-05-08)
----------------------------
* Fixed problem with last change to TrueType fonts - was breaking documents
  using large subsets of those characters (eg. the Unicode.java example)



1.1.23 (released 2002-05-07)
----------------------------
* Fully implemented AcroForms! Text boxes, buttons, javascript etc. - a very
  large addition for users of the Extended Edition. See the userguide, the
  new Form???.java examples, and the Form??? classes in the API documents for
  details.

* New action - FormJavaScript, FormSubmit, FormReset, ShowElement, HideElement
  and FormImportData - plus new helper methods to deal with these.

* New annotation type - rubber stamp.

* New annotation methods - set/getPage, set/getEventAction, set/isVisible,
  set/isPrintable, getLastModified

* New method for fonts - isMonospace(). Ligatures are now disabled for
  Monospace fonts.

* New page method - removeAnnotation

* New examples - FormCreation, FormFill and FormProcess

* Code128 Barcodes may now include newlines (\n), representing the FCN1
  control character. This allows EAN128 codes to be printed

* Pages with CropBox set now have their size returned correctly

* Fixed bug in number formatting which occasionally caused bad PDFs

* Fixed problem where reusing a subset TrueType font gave missing glyphs

* Fixed bug with form fields and fonts containing punctuation characters
  in their names.

* Remove deprecated PDFPage.resetClip() method



1.1.22 (released 2002-04-21)
----------------------------
* Optimized - squeezed another 8-10% speed increase for writing PDFs.

* Hopefully fixed problem with reading PDFImageSets from slow pipes.

* Renamed bouncycastle package to bouncycastle1, to avoid method resolution
  clash with new versions of their package.

* Fixed occasional problem with ASCII85Decode filter

* Added some new methods to PDFAnnotation and PDFAction, in anticipation of
  upcoming Form support.

* Now correctly handles all "seascape" pages.



1.1.21 (released 2002-04-12)
----------------------------
* Corrected the size of the LETTER_LANDSCAPE pagesize

* Added setTextIndent method to PDFStyle object, to control the indenting
  of the first line of text in a paragraph.

* Text height is now calculated correctly when the line-spacing is set to
  values less than the height of the font.

* Fixed some problems with Track Kerning - length wasn't being accurately
  calculated.



1.1.20 (released 2002-04-07)
----------------------------
* Fixed bug resulting in illegal PDF stream when importing certain PDF
  documents.

* Certain Type 1 fonts were failing due to blank lines in the Kerning Pair
  data. Now fixed.

* Now handles TIFF images missing SamplesPerPixel and BitsPerComponent tags.



1.1.19 (released 2002-03-22)
----------------------------
* GIF images of any depth can now be read.

* Changed obfuscation method. Should now be able to use the library in fussy
  environments like Jikes and Visual Age for Java.



1.1.18 (released 2002-03-02)
----------------------------
* Fixed some bugs in the ASCII85Decode filter, which was failing on some docs.
  Also added ASCIIHexDecode and RunLengthDecode handling, for completeness.



1.1.17 (released 2002-02-22)
----------------------------
* Now handles transparency in GIF and PNG images. Note this is not full
  alpha transparency - colors can only be fully transparent or fully opaque.

* Compresses 1-bit images using CCITT-G4 compression - up to 40% smaller.

* Fixed an image handling bug introduced in the last release which was breaking
  some TIFF images.

* Fixed unusual problem to do with different page sizes in documents created with
  early version of Distiller.

* Fixed problem when transferring annotations and bookmarks between documents -
  if they referred to a named destination, the name wasn't transferred.

* Fixed problem with editing pages that have been rotated - any alterations to
  the page weren't being rotated to match.

* More robust reading of PDFs in general



1.1.16 (released 2002-02-13)
----------------------------
* More, more and still more CCITT fixes.

* 1-bit PNG images were colliding with a bug in Acrobat Viewer. We now
  decompress and recompress them, which slows things down slightly when
  dealing with these images, but opens the way to recompression with CCITT
  (coming soon).

* Now extracts DPI from PNG image if specified using the pHYs chunk.

* Slight improvement in memory efficiency. First of many we expect.

* Fixed problem reading some older (PDF1.1) PDFs with named destinations.



1.1.15 (released 2002-02-05)
----------------------------
* Added fix for CCITT TIFF images wider than 1792 pixels, some of which were
  failing.

* Added fix for some LZW streams which were failing.



1.1.14 (released 2002-01-27)
----------------------------
* Optimized. Most applications should now run between 30% and 50% faster.

* Reduced memory footprint by StandardFont class - the main memory hog.

* Added two new barcode algorithms - EAN-13 (also covers UPC-A) and CodaBar.

* Added setTrackKerning method to PDFStyle class, to override or force
  kerning for text.

* Updated the userguide to cover the changes since 1.1.12. Digitally
  signed it, because we can.



1.1.13 (released 2002-01-21)
----------------------------
* Added native TIFF image support. Although this doesn't cover every TIFF
  format, it does cover uncompressed, RLE, LZW, CCITT RLE and Group 3/4
  (both 1D and 2D). Not supported are JPEG, ThunderScan and NeXT images.
  Also added the wrapper class PDFImageSet to handle Multi-page images
  efficiently.

* Added Digital Signatures via the "FormSignature" class (available with
  the extended version only). Currently handles Adobes Self-Sign signatures
  and VeriSigns document signer plugin.

* Added the "Sign.java" example to demonstrate these signatures.

* Added new drawBarCode() routine to the PDFPage object, giving even more
  control over the code (allows the height of the code and the thin/thick
  ratio to be specified)

* Fixed bug where setting the clipping path as the first thing on the page
  resulted in an invalid PDF.



1.1.12 (released 2001-12-09)
----------------------------
* Added support for Reading and editing an existing PDF. This is done
  using the PDF(PDFReader) constructor.  Added several new examples
  demonstrating this functionality - Stamp, PageStitch, FormFill and Dump -
  and updated the userguide to reflect this.

* The trial version now has the word "DEMO" stamped on each PDF instead of
  the 30-day timeout.

* Added support for Adobes XMP specification, allowing XML metadata to be
  embedded and extracted from the document. The methods "setMetaData" and
  "getMetaData" have been added to the PDF, PDFPage, PDFImage and PDFSound
  classes. See http://www.adobe.com/products/xmp for more information.

* Added 128 bit encryption, as supported by PDF1.4 (Acrobat 5). This is set
  using the PDF.setEncryptionAlgorithm method.

* Added "drawPage" method to PDFPage class, for merging several pages into
  one.

* Added "getPages" to PDF class, to get the list of all the pages in the
  document.

* For PDFPage class, added "seekStart" and "seekEnd" methods to control where
  to make changes to the page - before or after any current page content.

* Added a corresponding "get" method for many set methods in many classes -
  specifically added:
  * "getInfo", "getViewerPreference", "getNamedActions" and "getOpenAction"
    to PDF class
  * "getType" and "getPage" and "getSound" to PDFAction class
  * "getType", "setTextAnnotationContents", "getTextAnnotationContents",
    "setTextAnnotationLabel", "getTextAnnotationLabel" and "getRectangle" to
    PDFAnnotation class
  * "getOpenAction", "getCloseAction" and "getAnnotations" to PDFPage class
  * "getSample", "getRate" and "getType" to PDFSound class

* Added timezone to creation/modification dates

* Fixed Unicode support for bookmarks, annotations and document information

* Fixed the Named Actions handling in the PDF so it works properly.

* Fixed a minor glitch in the PDFBookmark class which didn't appear to affect
  anything.



1.1.11 (released 2001-11-29)
----------------------------
* Another IBM specific bug - worked around the AS/400 throwing an exception
  when calling java.awt.color.ColorSpace.getInstance(CS_GRAY). Also optimized
  for the 99.99% of cases where the colorspace is sRGB, which may avoid
  problems on other colorspace-impaired platforms - almost certainly including
  AIX. Do all IBM JRE's need a graphics card to work with colorspaces?



1.1.10 (released 2001-11-21)
----------------------------
* Finally isolated and added a workaround for a JIT bug in the IBM JRE. Users
  using IBM Websphere or other IBM versions of Java for Windows who have got an
  "ArrayIndexOutOfBoundsException" when using non-Latin characters, this fix is
  for you.

* Fixed bug where bookmarks that were supposed to open by default, weren't

* Added the "pathClipAndPaint" method to PDFPage



1.1.9 (released 2001-11-13)
---------------------------
* Fixed bug in StandardCJKFont where some characters codes were rendered
  incorrectly.



1.1.8 (released 2001-11-09)
---------------------------
* Deprecated the PDFPage.resetClip method, as it violates the PDF spec. The
  correct way to reset the clipping area is to nest calls to clip between
  save() and restore().



1.1.7 (released 2001-11-07)
---------------------------
* The upside-down arc fix in 1.1.5 broke Rounded rectangles for certain
  canvas orientations (including the default). Fixed this.



1.1.6 (released 2001-10-25)
---------------------------
* According to the PDF specification, nesting calls to path operations while
  a text paragraph is open is illegal (although it does actually work under
  Acrobat 4 and 5, it causes an error in some versions of Acrobat 5).

  Consequently the draw, path and clip methods (e.g. drawRectangle)
  will now throw an IllegalStateException if called between a call to
  beginText and endText.

  THIS MAY BREAK EXISTING APPLICATIONS. The workaround is to ensure the only
  method called between beginText and endText is the drawText method.



1.1.5 (released 2001-10-23)
---------------------------
* Many, many color changes. Most important, generated PDF documents are now
  automatically calibrated to use the sRGB colorspace, the same colorspace
  used in Java. Documents may appear slightly different, but they're now
  more correct than they were.

* Added setNamedAction() method to PDF object.

* Added clip...() methods to PDFPage objects, to set the clipping area.

* Added (transparent) support for device-independent color. ICC profiles
  are now extracted from colors or images and embedded in the document where
  appropriate. All of this occurs behind the scenes, but means that an image
  or color which is supposed to be device-independent, will be. Handles
  calibrated RGB, CMYK, Gray, full ICC profile embedding and Spot colors,
  leaving only Lab and DeviceN color spaces unsupported.

* Added support for device-dependent CMYK color via the CMYKColorSpace class

* Added support for Spot (separation) colors via the SpotColorSpace class

* Deprecated the drawBarCode method and added a new one allowing more control
  over the size of the barcode.

* Fixed bug where only the last hyperlink on a single line of text returned
  the correct list from endTextLink. Very obscure, unlikely to have affected
  anyone but us.

* Fixed interesting problem where ColorPatterns were only sometimes being
  applied. When comparing a class and a subclass, equals isn't necessarily
  symmetric!

* Fixed problem where arcs came out upside-down if the setCanvas method had
  inverted the page co-ordinates

* Change setLineDash so parameters can be floats (for very short dashes)



1.1.4 (released 2001-10-03)
---------------------------
* Fixed all new inconsistancies (aka bugs) in the state stack - the save()
  and restore() methods - that we introduced in version 1.1.1. This was
  breaking things that rely heavily on these methods, including our Graph
  library.



1.1.3 (released 2001-09-27)
---------------------------
* Nailed the last (yes, we're confident) of the problems caused by codepages
  different to our test environment, in particular several Eastern European
  Windows locales. Write once, run anywhere huh?



1.1.2 (released 2001-09-21)
---------------------------
* Fixed a problem with certain TrueType fonts (usually smaller ones)
  embedding incorrectly, resulting in missing characters when subset.

* The "font may have restrictions on embedding" test for TrueType
  fonts was reversed, so only fonts with no embedding restrictions
  displayed this message.

* Added the setOpenFullScreen method to the PDF class.



1.1.1 (released 2001-09-18)
---------------------------
* Fixed a problem with certain TrueType fonts failing - noticable with
  Arial Italic from Windows 2000.

* Fixed some inconsistancies in the page stack - restore was restoring
  aspects of the style that had never been saved. Also clarified in the
  save() method JavaDocs *exactly* what is saved and what isn't.



1.1 (released 2001-09-14)
-------------------------

API CHANGES
-----------
* Whether the font is rendered as a solid or outline no longer depends on
  the LineColor or FillColor being set to null, but on the new setFontStyle
  method of a PDFStyle.
   REASON FOR CHANGE: This restriction meant the colors often had to be set
  to null, for no reason other than to prevent text being drawn with an
  outline.  Following the rule of "always optimise for the most common case",
  and considering how rarely outlines text is actually used, this didn't
  make sense. Plus it made underlining text very difficult.
   IMPACT: For programs using outlined text, add a call to setFontStyle for
  the outlined texts' PDFStyle.

* The return values from drawText, continueText, endText and discardText are
  no longer an integer representing the number of text lines used, but a
  double representing the number of points needed to render these lines. So
  for example, a call to drawText with a single line of text with a leading
  of 14 would return 14.0, rather than 1.
   REASON FOR CHANGE: Required to handle multiple font sizes per line. Think
  superscript/subscripts.
   IMPACT: Most programs ignore these return values anyway. Only programs
  measuring how many lines a paragraph took to render will need to change.

* The Line spacing variables have been altered. Previously, the default
  spacing was based on the actual height of the font, and defaulted to 1.2.
  This meant for double spacing the spacing had to be set to 2.4, which was
  just plain strange. The spacing is now a function of the inter-baseline
  distance of each individual font, so double spacing requires a value of 2.
   REASON FOR CHANGE: Previous system didn't allow fonts to set their own
  leading.
   IMPACT: Because the line spacing is now font-dependent, programs that
  adjust the line-spacing may need to tweak the values slightly to fit. If
  in doubt, try dividing all values passed to PDFStyle.setLineSpacing by 1.2

NEW FEATURES
-------------
* Increased text layout speed - documents making heavy use of text
  are over 40% faster. Now renders the first 20 chapters of Great
  Expectations in 8 seconds flat on our test machine!

* Documents can be encrypted using a 40-bit cipher algorithm compatible
  with Acrobat 3.x and later, using the PDF.setUserPassword() method and
  friends.

* Embedded TrueType fonts are now subset by default, resulting in potentially
  huge savings in filesize.

* Chinese, Japanese and Korean text is supported (horizontal writing only)
  using the StandardCJKFont class. Correct display depends on having the
  appropriate language pack installed.

* Text layout now uses the full Bi-directional algorithm from the Unicode 3.1
  specification, and the Line Break algorithm from the same, resulting in
  correct text layout in most languages (although line breaking for Thai,
  Khmer, Laotian and Burmese is not implemented). Correctly handles direction
  override characters U+202A to U+202E.

* Recognises Unicode characters U+00A0 (non-breaking space), U+00AD
  (soft hyphen), U+200B to U+2011, U+2028 - U+202E, U+2044 (Fraction slash),
  U+2028 - U+202E and U+FEFF (zero-width non-breaking space), which can be
  used to control line and word-breaking as per the Unicode 3.1 specification.
  In particular, U+00AD characters can be sprinkled throughout text to
  indicate an acceptable word-break, but won't be visible unless a break
  actually occurs.

* Hooks added for word-hyphenation, and a "last-resort" algorithm implemented
  for english (will only come into play when the word is too wide for a whole
  column, in which case you want to look at using soft hyphens anyway).

* Accessing more than 255 distinct characters in a single font is now handled
  internally by the library. Unlike earlier versions, you can now just create
  the font and then use as many characters as you like.

* Added pattern fills using the ColorPattern class. Currently only pre-defined
  patterns can be used.

* Can embed sounds with the PDFSound object.

* Added new Actions - goToURL, playSound, and named. Actions can now be
  linked together in a list to perform more complex actions.

* Added setOpenAction and setCloseAction methods to PDFPage, to allow
  actions to be run when the page is opened or closed.

* Added getPageNumber method to PDFPage, and getNumberOfPages to PDF classes.

* Added Annotations. The PDFAnnotation object allows embedding of popup
  notes, sound, files and hypertext links. The latter can be added
  manually, or via...

* Added beginTextLink and endTextLink methods to PDFPage, for actions
  positioned within a paragraph of text. A piece of text in a paragraph
  can now easily be made a hyperlink to (for example) a webpage, another
  part of the document, they can play a sound or print the document.

* Added the drawEllipseArc and pathEllipseArc methods to PDFPage, for
  drawing arcs, and the drawCircle and drawCircleArc methods to PDFPage for
  circles.

* Added the drawRoundedRectangle method to PDFPage for drawing rounded
  rectangles or (for the designers out there) "supercircles".

* Added underlining and strikeout for fonts, via the new setTextUnderline and
  setTextStrikout methods in the PDFStyle class.

* Added superscript and subscript capabilities to PDFStyle by calling the
  PDFStyle.superscriptClone() and PDFStyle.subscriptClone() methods.

* Added the getAscender, getDescender, getUnderlinePosition,
  getUnderlineThickness, getStrikeoutPosition and getStrikeoutThickness to
  the PDFFont superclass and it's children.

* Bookmarks can now be coloured and italicised if the PDF viewer supports it
  (currently Acrobat 5.0 only)

* Hebrew and Yiddish combining characters are now used if available.

* PDF.setOpenAction can now take a null value to remove the action.

* Styles can now have some fields (specifically font and color) set to null
  even if they are required, to inherit from a previously applied style.

BUG FIXES
---------
* Fix added for broken TrueType fonts which specify a width for zero-width
  characters (diacritics). This is surprisingly common!

* Fixed a couple of bugs when the continueText method is used to contine text
  to the same page (for example, in a different column). If the continued box
  is not contiguous with the previous textbox, leading blank lines are now
  trimmed automatically.

* Fixed problem with non-embedded TrueType fonts getting an incorrect italic
  angle, ascender and descender value.

* Fixed problem with zero-length image files throwing an exception other
  than IOException.

* Kerning wasn't working on Type1 fonts (it is now).



1.0.4 (released 2001-07-23)
---------------------------
* A new PDFBookmark() constructor was added, to allow creation of bookmarks
  that are open by default.

* Fixed bug in Locales using a "," as a decimal separator causing invalid
  PDFs to be created.

* The internal state of all PDF Objects has been reworked, mainly to fix
  a memory leak, but it has the side effect that objects like fonts and
  images can be created once and then reused in different PDFs without
  side-effects. Should make threaded PDF generation more consistent too.

* New example showing PDF generation from servlets - HelloServletWorld.java

* Fields in a dictionary are now ordered alphabetically. This has no effect
  for viewers, but is great when comparing two PDFs using diff(1).

* Actions are now dictionaries. This means a few more bytes for each
  bookmark in the document, but is necessary for future work on annotations
  (hyperlinks, popup-notes, sounds and movies etc.)



1.0.3 (released 2001-07-10)
---------------------------
* Changed license key algorithm. Old keys are still backwards compatible,
  but all license keys supplied from this date forward will need at least
  this version of the library to run.

* Fixed minor bug where paragraphs ending in a single word are followed by
  a newline.



1.0.2 (released 2001-07-01)
---------------------------
* Fixed bug in PDFPage.discardText() that caused an invalid PDF to be created

* PDFStyle.getLineCap and PDFStyle.getLineJoin now return an "int" instead of
  a "float". This matches the corresponding set methods.

* Optimized the use of styles within the page. This should give slightly
  smaller PDFs than before and (for documents making heavy use of styles),
  result in a large speed increase: one of our tests more than doubled in
  speed.

* Now silently drops null values from dictionaries, resulting in slightly
  smaller files.

* Type 1 fonts weren't being compressed in previous versions - they are now.



1.0.1 (released 2001-06-26)
---------------------------
* Fixed a big problem with binary files under Windows (yes, the good ol'
  CR/LF trap). Windows users should definately upgrade.

* Fixed bug get PDFImage.getHeight() actually returning the width.

* New method - PDFPage.discardText()

* New example - HelloUnicodeWorld.java

* New documentation - CHANGELOG and unicode.txt

* Created new classes TextProcessor and friends for dealing with
  complex text processing (as will surely be demanded by Unicode spec).

* Added support for minimal set of Arabic ligatures from Unicode spec.
  Some of the code for this is based on some example code by Roman Czyborra
  (http://czyborra.com)

* Reverses a line of text if any HEBREW or ARABIC codeblock characters.
  Correctly handles Arabic digits (ie. they're still written L2R).

* More accurate font-metrics for built in fonts - now uses the full
  glyph bounding box to determine size, not just ascender/descender.

* Fixed problem with center or right aligning multiple lines of text (text
  was being centered on the left of the paragraph block, not the center).



1.0 (released 2001-06-09)
-------------------------
* Initial release

# vim: syntax=none textwidth=80