All Versions
13
Latest Version
Avg Release Cycle
89 days
Latest Release
48 days ago

Changelog History
Page 1

  • v0.10.0

    October 02, 2019

    ➕ Added

    • [HexaPDF::Reference#to_s] to return the serialized form of the PDF reference
    • [HexaPDF::Revision#xref] for getting cross-reference entries
    • HexaPDF::XRefSection::Entry#to_s to return a description of the cross-reference entry

    🔄 Changed

    • ✨ Enhanced the hexapdf images command to also show information on PPI (pixels per inch) and size
    • Completely revamped the hexapdf inspect command with an interactive mode, structure output, cross-reference entry output and object search
    • Output of validation problem messages for hexapdf command to include more information
    • The Validation feature to automatically correct String-for-Symbol and Symbol-for-String problems

    🛠 Fixed

    • 👍 [HexaPDF::Document#wrap] to better handle subtype mappings in case of unknown type information
    • [HexaPDF::DictionaryFields::DictionaryConverter] to not allow conversion to a [HexaPDF::Stream] subclass from objects without stream data
    • Import of JPEG images with YCCK color encoding
    • Export of images without /FlateDecode filter or /DecodeParms to PNG files
    • Mistyped name of field type for field /Popup of [HexaPDF::Type::Annotations::MarkupAnnotation]
    • Loading and saving of encrypted and signed PDFs
    • ⚡️ CLI commands that optimize font data structures won't crash when encountering invalid font objects
  • v0.9.3

    June 13, 2019

    🔄 Changed

    • ↪ Behaviour of how object streams are generated to work around a bug (?) in Adobe Acrobat

    🛠 Fixed

    • 🛠 Fix problem with [HexaPDF::Encryption::StandardSecurityHandler] due to behaviour change of Ruby 2.6.0 in String#setbyte
  • v0.9.2

    May 22, 2019

    🔄 Changed

    • [HexaPDF::Encryption::AES] to handle invalid padding
    • [HexaPDF::Filter::FlateDecode] to correctly handle invalid empty streams
  • v0.9.1

    March 26, 2019

    🛠 Fixed

    • [HexaPDF::Serializer] to avoid infinite loops for self-referencing streams
    • 🐛 Bug due to frozen string in [HexaPDF::Font::CMap::Writer]
  • v0.9.0

    December 31, 2018

    ➕ Added

    • [HexaPDF::Composer] for composing PDF documents in a high-level way
    • 👍 Incremental writing support (i.e. appending a single revision with all the changes to an existing document) to [HexaPDF::Writer] and [HexaPDF::Document]
    • CLI command hexapdf split to split a PDF file into individual pages
    • 📜 [HexaPDF::Revisions#parser] for accessing the parser object that is created when a document is read from an IO stream
    • [HexaPDF::Document#each] argument only_loaded for iteration over loaded objects only
    • [HexaPDF::Document#validate] argument only_loaded for validating only loaded objects
    • [HexaPDF::Revision#each_modified_object] for iterating over all modified objects of a revision
    • [HexaPDF::Layout::Box#split] and [HexaPDF::Layout::TextBox#split] for splitting a box into two parts
    • ✅ [HexaPDF::Layout::Frame#full?] for testing whether the frame has any space left
    • [HexaPDF::Layout::Style] property last_line_gap for controlling the spacing after the last line of text
    • HexaPDF::Layout::Box#draw_content for use by subclasses
    • [HexaPDF::Type::Form#width] and [HexaPDF::Type::Form#height] for compatibility with [HexaPDF::Type::Image]
    • [HexaPDF::Layout::ImageBox] for displaying an image inside a frame

    🔄 Changed

    • [HexaPDF::Revision#each] to allow iteration over loaded objects only
    • [HexaPDF::Document#each] method argument from current to only_current
    • [HexaPDF::Object#==] and [HexaPDF::Reference#==] so that Object and Reference objects can be compared
    • ♻️ Refactored [HexaPDF::Layout::Frame] to allow separate fitting, splitting and drawing of boxes
    • 💅 [HexaPDF::Layout::Style::LineSpacing::new] to allow setting of line spacing via a single hash argument
    • 💅 Made [HexaPDF::Layout::Style] copyable

    🛠 Fixed

    • 🔧 Configuration so that annotation objects are correctly mapped to classes
    • 🛠 Fix problem with [HexaPDF::Filter::Predictor] due to behaviour change of Ruby 2.6.0 in String#setbyte
    • Fitting of [HexaPDF::Layout::TextBox] when the box has padding and/or borders
    • Fitting of [HexaPDF::Layout::TextBox] when width and/or height has been set
    • Fitting of absolutely positioned boxes in [HexaPDF::Layout::Frame]
    • 🛠 Fix bug in variable width line wrapping due to not considering line spacing correctly ([HexaPDF::Layout::Line::HeightCalculator#simulate_height] return value needed to be changed for this fix)
  • v0.8.0

    October 26, 2018

    ➕ Added

    • [HexaPDF::Layout::Frame] for box positioning and easier text layouting inside an arbitrary polygon
    • [HexaPDF::Layout::TextBox] for displaying text in a rectangular and for flowing text inside a frame
    • [HexaPDF::Layout::WidthFromPolygon] for getting a width specification from a polygon for use with the text layouting engine
    • [HexaPDF::Type::Image#width] and [HexaPDF::Type::Image#height] convenience methods
    • 👍 [HexaPDF::Type::FontType3] for Type 3 font support
    • 👍 [HexaPDF::Content::GraphicObject::Geom2D] for Geom2D object drawing support
    • [HexaPDF::Type::Page#orientation] for easy determination of page orientation
    • [HexaPDF::Type::Page#rotate] for rotating a page
    • 💅 [HexaPDF::Layout::Style::Quad#set] for setting all values at once

    🔄 Changed

    • [HexaPDF::Document#validate] to also yield the object that failed validation
    • [HexaPDF::Type::Page#box] to allow setting the value for a box
    • [HexaPDF::Layout::TextLayouter#fit] to allow fitting text into arbitrarily shaped areas
    • [HexaPDF::Layout::TextLayouter] to return a new [HexaPDF::Layout::TextLayouter::Result] structure when #fit is called that includes the #draw method
    • [HexaPDF::Layout::TextLayouter#fit] to require the height argument
    • ♻️ Refactored [HexaPDF::Layout::Box] to make using it a bit easier

    🛠 Fixed

    • Validation and conversion of dictionary fields with multiple possible types
    • Box border drawing when border width is greater than edge length
  • v0.7.0

    June 19, 2018

    🔄 Changed

    • 💎 All Ruby source files use frozen string literal pragma
    • [HexaPDF::MalformedPDFError::new] method signature
    • [HexaPDF::Layout::TextFragment::new] and [HexaPDF::Layout::TextFragment::create] method signatures
    • [HexaPDF::Encryption::SecurityHandler#set_up_encryption] argument force_V4 to force_v4
    • HexaPDF::Layout::TextLayouter#draw to return result of #fit if possible

    ✂ Removed

    • Optional leading argument to HexaPDF::Content::Canvas#font_size method

    🛠 Fixed

    • Misspelt variable name in [HexaPDF::Layout::TextLayouter::SimpleLineWrapping]
    • [HexaPDF::Layout::TextLayouter::SimpleTextSegmentation] to work if the last character in a text fragment is \r
    • [HexaPDF::Layout::TextLayouter] to work if an optional break point (think soft-hyphen) is followed by whitespace
    • 🏗 [HexaPDF::Font::TrueType::Builder] to correctly order the entries in the table directory
    • 🏗 [HexaPDF::Font::TrueType::Builder] to pad the table data to achieve the correct alignment
    • [HexaPDF::Filter::FlateDecode] by removing the Zlib pools since they were not thread safe
    • All color space classes to accept the color space definition as argument to ::new
  • v0.6.0

    October 27, 2017

    ➕ Added

    • [HexaPDF::Layout::Box] as base class for all layout boxes
    • 💅 More styling properties for [HexaPDF::Layout::Style]
    • 💅 Methods for checking whether styling properties in [HexaPDF::Layout::Style] have been accessed or set
    • [HexaPDF::FontLoader::FromFile] to allow specifying a font file directly
    • Configuration option 'page.default_media_orientation' for settig the default orientation of new pages
    • Convenience methods for getting underline and strikeout properties from fonts
    • 💅 Configuration option 'style.layers_map' for pre-defining overlay and underlay callback objects for [HexaPDF::Layout::Style]
    • [HexaPDF::Type::Action] as well as specific implementations for the GoTo, GoToR, Launch and URI actions
    • [HexaPDF::Type::Annotation] as well as specific implementations for the Text Link annotations
    • 💅 [HexaPDF::Layout::Style::LinkLayer] for easy adding of in-document, URI and file links

    🔄 Changed

    • 👍 [HexaPDF::Layout::TextFragment] to support more styling properties
    • 📜 Cross-reference subsection parsing can handle missing whitespace
    • 📇 Renamed HexaPDF::Layout::LineFragment to [HexaPDF::Layout::Line]
    • 📇 Renamed HexaPDF::Layout::TextBox to [HexaPDF::Layout::TextLayouter]
    • [HexaPDF::Layout::TextFragment::new] and [HexaPDF::Layout::TextLayouter::new] to either take a Style object or style options
    • [HexaPDF::Layout::TextLayouter#fit] method signature
    • [HexaPDF::Layout::InlineBox] to wrap a generic box
    • HexaPDF::Document::Fonts#load to [HexaPDF::Document::Fonts#add] for consistency
    • [HexaPDF::Document::Pages#add] to allow setting the paper orientation when creating new pages
    • [HexaPDF::Filter::Predictor] to allow correcting some common problems depending on the new configuration option 'filter.predictor.strict'
    • 🔧 Moved configuration options 'encryption.aes', 'encryption.arc4', 'encryption.filter_map', 'encryption.sub_filter.map', 'filter.map', 'image_loader' and 'task.map' to the document specific configuration object
    • 🔧 [HexaPDF::Configuration#constantize] can now dig into hierarchical values
    • 🔧 [HexaPDF::Document#wrap] class resolution and configuration option structure of 'object.subtype_map'

    ✂ Removed

    • HexaPDF::Dictionary#to_hash method

    🛠 Fixed

    • [HexaPDF::Layout::TextLayouter#fit] to split text fragment into parts if the fragment doesn't fit on an empty line
    • 📜 Parsing of PDF files containing a loop with respect to cross-reference tables
    • [HexaPDF::Layout::InlineBox] to act as placeholder if no drawing block is given
    • Undefined method error in [HexaPDF::Content::Canvas] by raising a proper error
    • Invalid handling of fonts by [HexaPDF::Content::Canvas] when saving and restoring the graphics state
    • [HexaPDF::Layout::TextLayouter] so that text fragments don't pollute the graphics state
    • [HexaPDF::Content::Operator::SetTextRenderingMode] to normalize the value
    • [HexaPDF::Stream#stream_source] to always return a decrypted stream
    • [HexaPDF::Layout::TextLayouter] to correctly indent all paragraphs, not just the first one
    • One-off error in [HexaPDF::Filter::LZWDecode]
    • 🔧 [HexaPDF::Configuration#merge] to duplicate array values to avoid unwanted modifications
    • [HexaPDF::Dictionary#key?] to return false if the key is present but nil
    • [HexaPDF::DictionaryFields::FileSpecificationConverter] to convert hash and dictionaries
    • Field /F definition in [HexaPDF::Stream]
  • v0.5.0

    June 24, 2017

    ➕ Added

    • HexaPDF::Layout::TextBox for easy positioning and layouting of text
    • HexaPDF::Layout::LineFragment for single text line layout calculations
    • [HexaPDF::Layout::TextShaper] for text shaping functionality
    • [HexaPDF::Layout::TextFragment] for basic text metrics calculations
    • 🛠 [HexaPDF::Layout::InlineBox] for fixed size inline graphics
    • 💅 [HexaPDF::Layout::Style] as container for text and graphics styling properties
    • 👌 Support for kerning of TrueType fonts via the 'kern' table
    • 👌 Support for determining the features provided by a font

    🔄 Changed

    • Handling of invalid glyphs is done using the special [HexaPDF::Font::InvalidGlyph] class
    • Configuration option 'font.on_missing_glyph'; returns an invalid glyph instead of raising an error
    • Bounding box of TrueType glyphs without contours is set to [0, 0, 0, 0]
    • Ligature pairs for AFM fonts are stored like kerning pairs
    • Use TrueType configuration option 'font.true_type.unknown_format' in all places where applicable
    • 👍 Allow passing a font object to [HexaPDF::Content::Canvas#font]
    • 🖐 Handle invalid entry in TrueType format 4 cmap subtable encountered in the wild gracefully
    • Invalid positive descent values in font descriptors are now changed into negative ones by the validation feature
    • 👍 Allow specifying the page media box or a page format when adding a new page through [HexaPDF::Document::Pages#add]

    🛠 Fixed

    • [HexaPDF::Task::Dereference] to work correctly when encountering invalid references
    • 📜 [HexaPDF::Tokenizer] and HexaPDF::Content::Tokenizer to parse a solitary plus sign
    • Usage of Strings instead of Symbols for AFM font kerning and ligature pairs
    • 🖨 Processing the contents of form XObjects in case they don't have a resources dictionary
    • ⚡️ Deletion of valid page node when optimizing page trees with the hexapdf optimize command
    • [HexaPDF::Type::FontType0] to always wrap the descendant font even if it is a direct object
  • v0.4.0

    March 19, 2017

    ➕ Added

    • [HexaPDF::Type::FontType0] and [HexaPDF::Type::CIDFont] for composite font support
    • 👍 Complete support for CMaps for use with composite fonts; the interface for [HexaPDF::Font::CMap] changed to accomodate this
    • CLI command hexapdf batch for batch execution of a single command for multiple input files
    • 0️⃣ CLI option --verbose for more verbose output; also changed the default verbosity level to only display warnings and not informational messages
    • CLI option --quiet for suppressing additional and diagnostic output
    • 📜 CLI option --strict for enabling strict parsing and validation; also changed the default from strict to non-strict parsing/validation
    • ⚡️ CLI optimization option --optimize-fonts for optimizing embedded fonts
    • Method #word_spacing_applicable? to font types
    • 👌 Support for marked-content points and sequences in [HexaPDF::Content::Canvas]
    • 👌 Support for property lists in a page's resource dictionary
    • 👉 Show file name and size in hexapdf info output
    • [HexaPDF::Type::Font#font_file] for getting the embedded font file
    • ⚡️ [HexaPDF::Font::TrueType::Optimizer] for optimizing TrueType fonts
    • 🔧 Configuration option 'filter.flate_memory' for configuring memory use of the [HexaPDF::Filter::FlateDecode] filter
    • Method [HexaPDF::Content::Canvas#show_glyphs_only] for faster glyph showing without text matrix calculations
    • Methods for caching expensive computations of PDF objects ([HexaPDF::Document#cache] and others)

    🔄 Changed

    • Enabled in-place processing of PDF files for all CLI commands
    • ⚠ Show warning instead of exiting when extracting images with hexapdf images and an image format is not supported
    • Handling of character code to Unicode mapping:
      • [HexaPDF::Font::CMap#to_unicode], [HexaPDF::Font::Encoding::Base#unicode] and [HexaPDF::Font::Encoding::GlyphList#name_to_unicode] return nil instead of an empty string
      • Font dictionaries use the new configuration option 'font.on_missing_unicode_mapping' in their #to_utf8 method
    • 🔧 [HexaPDF::Configuration#constantize] to raise error if constant is not found
    • 🏗 Extracted TrueType font file building code into new module [HexaPDF::Font::TrueType::Builder]
    • [HexaPDF::Filter::FlateDecode] filter to use pools of Zlib inflaters and deflaters to conserve memory

    🛠 Fixed

    • 👉 Use of wrong glyph IDs for glyph width entries and unicode mapping for subset TrueType fonts
    • Invalid document reference when importing wrapped direct objects with [HexaPDF::Importer]
    • Invalid type of /DW key in CIDFont dictionary when embedding TrueType fonts
    • Caching problem in [HexaPDF::Document::Fonts] which lead to multiple instances of the same font
    • 🐛 Bug in handling of word spacing with respect to offset calculations when showing or extracting text
    • 🔀 Incorrect handling of page rotation values in hexapdf merge
    • Missing handling of certain rotation values in hexapdf modify
    • Removal of unused pages in hexapdf modify
    • Handling of invalid page numbers in CLI commands
    • 👉 Useless multiple extraction of the same image in hexapdf images
    • Type of /VP entry of [HexaPDF::Type::Page]
    • 📜 Parsing of inline images that contain the end-of-image marker
    • High memory usage due to not closing Zlib::Stream objects in [HexaPDF::Filter::FlateDecode]