Rand Stats


0.5.12  2022-07-27T05:13:06+12:00
   - Ensure cross reference entries are sorted by object number #35

0.5.11  2022-07-04T15:46:11+12:00
   - Fix locking for consistency in PDF::COS::Util ast_coerce()

0.5.10  2022-07-04T12:46:14+12:00
   - Fix pdf-checker.raku for PDF 0.5.8+
   - Add PDF::COS::Dict required-entries() and aliases method
   - Deprecate Hash slow-path in PDF::IO::Writer
   - Fix regression in Pod::To::PDF t/render-pdf-test-sheets.t

0.5.9  2022-06-09T08:20:15+12:00
   - Fix writing of Any as 'null'

0.5.8  2022-06-07T16:19:57+12:00
   - Use PDF::Grammar v0.2.9+ :lite mode for lighter AST's.
   - Numeric objects are no longer cast to roles PDF::COS::Int,
     PDF::COS::Bool, PDF::COS::Real unless they are indirect
   - Utilize PDF::Native v0.0.2+ cross reference stream
     unpack-xref-stream() and pack-xref-stream() subroutines.
   - Add --compat option to pdf-rewriter.raku script.

0.5.7  2022-06-02T06:26:44+12:00
   - Upgrade from 32 to 64 bit indexing in cross reference streams
     to support opening very large PDF 1.5+ (> 32Gb) files.
   - Added compatibility and automatic loading of PDF::Native. Soon
     to be released optional performance enhancement module.

0.5.6  2022-05-21T09:43:39+12:00
   - More thread protection for array/hash construction

0.5.5  2022-05-19T12:58:40+12:00
   - Fix possible memory leaks in PDF object construction

0.5.4  2022-05-12T13:37:30+12:00
   - Fix a thread-safety issue in PDF::COS::Util ast-coerce() sub.

0.5.3  2022-05-12T07:59:14+12:00
   - Fix a thread-safety issue in PDF::COS::Tie tie() method.

0.5.2  2022-05-11T12:58:16+12:00
   - Partially back-out PDF::COS required() method to fix PDF::Class
     regressions from 0.5.0 release.

0.5.1  2022-05-07T09:32:57+12:00
   - Further lock-protection of dynamically 'require'd classes
     for thread safety

0.5.0  2022-05-06T13:19:02+12:00
   - Improved thread safety of reading and fetching objects.
     -- Protect PDF::COS loader() method
     -- Protect Reader ind-obj method to allow concurrent fetching
     -- Better scoping of %seen + general refactor in PDF::COS::{Dict|Array}
     -- Some locking and deprecations in PDF::COS::Loader
     -- Added test t/threads.t
     This round of changes targets concurrent PDF reading only!

0.4.25  2022-03-31T16:42:09+13:00
   - Replace role() method with induce(). Only mixin punned roles.

0.4.24  2022-03-26T07:41:03+13:00
   - Further fixes to latin-1 in ByteString coercements

0.4.23  2022-03-13T17:25:53+13:00
   - Ensure strings are latin-1 in ByteString coercements
   - Simplify date string coercements
   - Add X::PDF::NoTrailer error

0.4.22  2022-03-13T17:07:05+13:00
   - Initial CPAN -> zef release

0.4.22  2022-02-24T13:21:35+13:00
   - Replace role-model() method with role()

0.4.21  2022-02-23T14:06:44+13:00
   - Attempted fix of flapping error in PDF::COS::Tie role-model() method

0.4.20  2022-02-06T11:53:46+13:00
  - Fix PDF::IO::Filter::RunLength for pending Rakudo 2022.02; niner++

0.4.19  2022-01-12T06:47:11+13:00
  - Refactor Array coercements for consistency with Dict and Stream
  - Fixed PDF::IO::Writer name serialization to encode '#' as #23 (not ##)
  - Fixed some test fails from git checkout on Windows #31 

0.4.18  2022-01-01T07:42:10+13:00
  - PDF::COS::Bool now does the PDF::COS role
  - Fixed PDFDoc encoding by regenerating from PDF::ISO_32000 resource:
  - Fixed PDF::COS::TextString to handle non-byte strings (e.g. /ActualText
    in content streams).
  - Improvements to PDF::COS::TextString utf16-be encoding

0.4.17  2021-09-29T14:46:25+13:00
  - Refix PDF::COS::DateTime.new

0.4.16  2021-09-28T09:21:51+13:00
  - Fix to PDF::COS::DateTime.new

0.4.15  2021-07-29T12:43:43+12:00
  - Add error check for zero cross reference offset
  - Change Bufs to Blobs in PDF::IO::Util :&pack and
  - Fix overflow error in LZW decode filter #30

0.4.14  2021-07-02T13:14:48+12:00
  - Refix PDF without file associations

0.4.13  2021-07-02T12:07:07+12:00
  - Fix PDF::IO coercement of Blobs
  - Ensure a PDF works without file associations. E.g. when rebuilt from:
    $pdf .= open: $pdf.Blob;

0.4.12  2021-06-24T11:43:44+12:00
  - Add COERCE method to PDF::IO::Blob, PDF::IO::Handle, PDF::IO:Str

0.4.11  2021-04-28T12:41:23+12:00
  - Fix writing of enumerated names #29

0.4.10  2021-04-20T06:27:30+12:00
  - Add --stream option to pdf-rewriter.raku and PDF::IO::Reader
  - Default to :!stream in save-as() method.

0.4.9  2021-04-19T06:37:06+12:00
  - Add PDF::IO::Writer stream-cos() and stream-body() methods for chunked
    saving to a file-handle. Apply to PDF save-as() and update() methods.

0.4.8  2021-04-15T07:09:03+12:00
  - Enum agnostic array access for latest Rakudo. See

0.4.7  2021-04-14T06:19:49+12:00
  - Tweak AST construction for latest Rakudo

0.4.6  2021-04-12T12:39:56+12:00
  - Use Hash::int for PDF::IO::Reader %!ind-obj-idx (indirect
    object index).
  - Add $pdf.id rw accessor. In particular, this allows assignment of
    consistent IDs for the benefit of PDF tool-chain testing.

0.4.5  2021-01-12T06:00:31+13:00
  - Rename classes PDF::Writer -> PDF::IO::Writer and PDF::Reader
    -> PDF::IO::Reader. Free up PDF::Reader and PDF::Writer for
    Raku ecosystem usage.

Release 0.4.4
- Add COERCE methods to COS roles and classes. For example:
      my PDF::COS::TextString $s .= COERCE: 'Hi';
  or using Rakudo 2020.11+ coercion semantics:
      my PDF::COS::TextString() $s = 'Hi';

Release 0.4.3
- [PDF::Reader] add abstract base exception class X::PDF apply to existing
  X::PDF::* exception classes
- [pdf-rewriter.raku]
  -- added --render option to render and reformat pages.  This option also requires
     an upstream module such as PDF::Lite or PDF::Class.
  -- Hide back trace for handled errors (type X::PDF)
- [PDF::COS::TextString] Decode as UTF16-BE / PDFDoc when input is a byte-string #26
- [PDF::COS::Util] rename  pack-pp() -> pack-be() [big endian]

Release 0.4.2
- Streamlined cross-reference loading; adjust to PDF::Grammar 0.2.1
- Fix 'missing required field(s)' message on a tied COS attribute.
- Fix accidental coercement of byte to name strings; also date coercements
- Fix syntax level PDF/A non-conformance issues, as reported by verapdf:
  -- follow 'obj' by \n (not space) when serialising indirect objects
  -- have 4 binary characters (not 3) in header comment

Release 0.4.1
- [PDF::Writer] Compacted writing of smaller dictionaries
- [PDF] .save-as() method: don't copy when updating and source and destination are the same

Release 0.4.0
- Rename modules *.pm -> *.rakumod and scripts *.p6 -> *.raku

Release 0.3.8
- [PDF::Writer] - Fixed .write-content() method to sanitise any non-latin
  unicode chars in comment strings, which otherwise breaks serialization.
  Choosing to map them to #Xxx where Xxx is a hexadecimal number
- [PDF] Add $.open(:type) option. Asserts that the PDF file is of a given type 'PDF', 'FDF' etc.
- [pdf-rewriter.p6] --class option changed from a Boolean to a string. Any class
  can now be loaded that is based on PDF (PDF::Lite, PDF::Class, PDF::API6).
- [PDF::COS::Tie][PDF::COS::Tie::Array][PDF::COS::Tie::Hash]
  Some internal renaming of attribute roles and methods. TiedHash -> COSDictAttrHOW,
  TiedArray -> COSArrayAttrHOW, $attr.tied -> $attr.cos

Release 0.3.7
- [PDF::COS::Type::XRef]
  -- Fixed a bug in decode-index() method.
- [PDF::Reader]
  -- Reworked !load-index method
- [PDF::COS]
  -- Improved required() method.

Release 0.3.6
- [PDF::Writer]
   -- Fix for issue#22 Incremental updates breaking Adobe
      Reader. Incremental updates to a 1.5+ PDF that has
      cross reference streams are now written with cross
      reference streams.

Release 0.3.5
- [PDF]
  -- Add top-level .cb-finish() hook. Call just prior to

Release 0.3.4
- [PDF::Reader][PDF::Writer]
  -- Allow copying of raw object ASTs from input to output
     PDFs. To reduce memory usage in full-save mode. Speeds up
     saving of encrypted PDFs.
  -- Fixed /Prev trailer entry in incremental save
  -- Fixed pdf-rewriter.p6 --decrypt option
- [PDF::Reader]
  -- Respect EncryptMetadata flag in existing PDF files.
     Disallow for newly created PDF files.
  -- Fixed handling of encryption dictionaries when they're
     not an indirect object
  -- Improved loading of cross reference index
- [PDF]
  -- Allow reencryption of an already encrypted PDF.
  -- Disallow update of a newly encrypted or re-encrypted PDF
- [pdf-rewriter.p6]
  -- added owner-check and -drm option.

Release 0.3.3
- [PDF::COS::Tie]
  -- added :default trait
- [PDF::COS::Coercer]
  -- fixed coercement to a PDF::COS::TextString subset
- [PDF::Reader]
  -- Add revision-xrefs() method [to distinguish  revision
     sections from hybrid cross referefence sections]
  -- Tweaked filtering of object and cross reference streams
     during serialization

Release 0.3.2
- Handle null entries in stream DecodeParms entry (as per spec)
- Rename PDF::IO.substr() method to byte-str()
- `save-as()` method now copies an input PDF, then updates it incrementally.
- Add constant PDF::COS::DateString::DateRegex
- Add PDF::COS::Tie entry :key trait option
- Fix AES-128 encryption for xpdf

Release 0.3.1
- Add Tie :array-or-item trait. For the common case, where a
  single item or array of items is permitted.`
- add tmp/ directory for test JSON files, etc
- Adjust for 'pdf' -> 'ast' in PDF::Grammar 0.1.6.
- Changed the top level node from 'pdf' to 'cos' in JSON
- Handle utf-16 encoding in PDF::COS::DateString

Release 0.3.0
- Renamed PDF::DAO classes to PDF::COS, where COS stands for
  Carousel Object System (see
- Improvements to PDF::COS.coerce($obj, $type) multi methods.
- Fixed class-level PDF::COS::Stream.gist
- Support Hybrid PDFs that contain both cross reference tables and streams

Release 0.2.8
- [PDF::DAO]
  -- better support for lists and list to array coercion
- [PDF::DAO::Loader]
  -- replaced :$fallback option with :$base-class
- [PDF::DAO::Tie]
  -- add mixin method

Release 0.2.7
- [PDF::DAO::Tie]
  -- reintroduce method :entry(:alias) sub-trait.
  -- remove type-check method

Release 0.2.6
- [PDF::DAO::Util] setup libpdf at BEGIN time
- Rename or hide overused load() method in various classes/roles
  -- [PDF::DAO] [PDF::DAO::Loader] deprecate load() -> load-delegate()
  -- [PDF::Reader] rename load() -> load-pdf()
  -- [PDF::IO::Crypt] made load() method private
- Fix PNG predictors for BitsPerComponent < 8 (issue #18)

Release 0.2.5
- [PDF::Reader][PDF::Writer]
  -- adjust to PDF::Grammar v0.1.1 shaped cross reference streams.
  -- upgrade index offsets from uint32 to uint64 (for PDF files > 4.2Gb)
  -- don't escape binary characters when writing literal strings
- [PDF::DAO::Util]
  -- add coercements for typed arrays

Release 0.2.4
- [PDF]
  renamed .save-as :update option to :preserve
- Created classes PDF::DAO::Loader and PDF::DAO::Coercer. These
  replace the PDF::DAO::Delegator class.
- [PDF::DAO::Type::Xref]
  streamlined index decoding and encoding
- [PDF::Writer]
  tweak write-real method to match Lib::PDF::Writer.write-real

Release 0.2.3
- [PDF::DAO::Tie]
  -- Simplify method accessors. direct use of AT-KEY, ASSIGN-KEY,
     etc. 20% speed up of test suite run.
- [PDF::DAO::Util]
  -- convert enums to ints in to-ast()
  -- rename sub to-ast-native() -> ast-coerce()
- [PDF::Writer]
  -- use native functions from Lib::PDF::Writer, when available.

Release 0.2.2
- [PDF::Writer] handle ' (MoveShow) and " (MoveSetShow) operators
- [PDF::IO::Handle] Open I/O as :bin 
- Experimental use of Lib::PDF
  -- Speed up the slowest test xt/filter-predictors_bulk.t
  -- Fast packing alternative for PDF::IO::Util
  Optional, and for regression purposes, at this stage. Probably
  wont persue seriously until Rakudo has better JIT.

Release 0.2.1
- Renamed classes PDF::IO to PDF::IO::Util and PDF::IO::Input::*
  to PDF::IO::*.
- Don't cache misses in PDF::DAO::Delegator
- PDF::IO::Filter::Predictors now handles /BitsPerComponent < 8
- Replace PDF::IO::Util resample() with pack(), unpack()

Release 0.2.0
- Renamed class PDF::DAO::Type::PDF to PDF. Restored module name
  to PDF

Release 0.1.1
- [PDF::Reader] now handles very large xref tables or streams (> 65K)
- [PDF::DAO] use 'but' to apply roles to simple scalars, not 'does'.

Release 0.1.0
Renamed class namespace PDF::Storage -> PDF::IO. Used as the module

Release 0.0.9
- class PDF::DAO::Stream is now based on PDF::DAO::Dict
- withdrew non-standard PDF::DAO::Dict.new( $dict) positionals,
  in favour of PDF::DAO::Dict.new( :$dict ) named arguments.
  Same also for stream and array object constructors.
- Use of sigil-less variables, where appropriate.
- Revamped handing of PDF::DAO::Tie :entry and :index traits.
- Fixes for PDF::Storage::Input::Str (byte-string reader) and

Release 0.0.8
- [PDF::DAO::Doc] .update( :diffs(...) ) - now supports JSON
- Renamed classes
  -- PDF::DAO::Doc -> PDF::DAO::Type::PDF
  -- PDF::DAO::Storage::Crypt::Doc -> PDF::DAO::Storage::Crypt::PDF
- [PDF::DAO::Type::XRef] renamed methods
  -- decode-to-stage2 -> decode-index
  -- encode-from-stage2 -> encode-index
- [PDF::Writer]
  -- refactored 'write' multi method into node-specific methods
     (write-array, write-bool, ... etc)
  -- handle comments in write-op method
- [PDF::Writer] [PDF::Storage::Filter::RunLength] fixed handling
  of DOS newline graphemes "\r\n"
- [bin/pdf-rewriter.pl] fixed --rebuild option

Release 0.0.7
- [PDF::Storage::Crypt] Encryption refactored to use OpenSSL. Added support for
  PDF 1.6+ AES-128 encryption.
- [PDF::DAO::Doc] add saves-as( :update ) option.
  The input PDF is copied to the destination PDF, which is then incrementally
  updated. This should generally be faster than a regular .save-as.
- [PDF::Reader] Bug fixes to JSON serialization
- [PDF::Storage::Filter] simplified filter dispatch

Release 0.0.6
- [bin/pdf-rewriter.pl] unbust rewriting/recompression of encrypted PDFs
- [PDF::Storage::Serializer][PDF::DAO::{Array|Dict|Stream}] use Perl 6 object hashes
  -- Refactored `my %h; ...; %hash{$object.WHICH}` with `my %h{Any}; ...; %hash{$object}` 
     (See http://doc.perl6.org/type/Hash#Object_hashes_and_type_constraints)

- [PDF::DAO::Doc]
  -- added $doc.ast method. factored out from $doc.save-as
  -- Added $doc.Str method; for in-memory serialization
  -- $doc.save-as($target); # can now be file-name, io-path, or io-handle
  -- added $.update( :diffs(...) ) option.
  This allows the update body to be saved to a separate 'differences' file, as an
  alternative to appending to the original PDF.

  Useful in a mail-merge scenario where multiple documents are being produced
  from a common template and each can be reconstituted by appending the
  update file to the original template.

  Possible further work:
  -- JSON output of 'to' files
  -- add `$doc.open( $file, :diff(...))` option - load a base pdf, then apply
- [PDF::Reader] bug-fixes:
  -- avoid encrypting the encryption dictionary
  -- fixed de-Linearization. Now handled by PDF::Storage::Serializer
- [PDF::Storage::Filter] bug fixes:
  -- fixed ascii-85, ascii-hex and run-length encoders to add
     end-of-data markers
  -- withdrew LZW encoding

Release 0.0.5
- added some reader exception classes, e.g. X::PDF::BadXRef
- renamed META.info => META6.json
- changed $.delegator.find-delegate method
- removed PDF::DAO::Type
- [PDF::DAO::Delegator]
  -- simplified and more general coercement to roles
  -- added X::PDF::Coerce warning
- [PDF::DAO::Tie]
  -- removed support for method aliases
- [PDF::Storage::Filter::Predictors]
  -- fixed multi-channel (color) PNG prediction

Release 0.0.4
- encrypted document creation is now supported. RC4 (Encryption revisions 1-4)
  only at this stage. 
- [PDF::Writer]
  -- add extra new-line after each indirect object - readability improvement

Release 0.0.3
- [PDF::DAO::Util] from-ast() sub now handles cyclical hashes and arrays

Release 0.0.2
- [META.info] Correct PDF::Storage::Filter::Predictors entry
- [PDF::Writer]
  -- improved formatting of PDF output. Reduced number of new-lines in output.
     --- '>> stream' are now cuddled together on a line
     --- as are 'endstream endobj'
  -- added $.make-body and $.make-xref methods

Release 0.0.1
- Initial release