Created Date: 01 Aug, 2022 11:47
Last Modifed Date: 01 Aug, 2022 11:47


Introduction

This is a regular quarterly update to Mako. Introduced in this version is support for OpenXPS, for input and output, and another PDF ISO standard, PDF/A-3b for output. Other improvements include enhanced alpha channel generation that adds 16-bit rendering with spot color support, and new safeguarding against accidental overwriting of an open assembly.

New and improved features

MAKO-1338

Support OpenXPS (input, output)


From the beginning, Mako has featured support for Microsoft’s XPS (XML Paper Specification) format. Mako 6.6.0 adds support for OpenXPS. Based on XPS, OpenXPS is an open format standardized by Ecma International, a standards organization for communication and information systems.

Although it has been around for more than a decade, OpenXPS has recently become more popular; for example, the Microsoft XPS Document Writer v4 in Windows 11 offers OpenXPS (using the file extension .oxps) as its default.

How to use in Mako

Input:

A new input enum, eFFOXPS, is introduced. Instantiate the input class with code such as:

const IJawsMakoPtr jawsMako = IJawsMako::create();
IJawsMako::enableAllFeatures(jawsMako);
const IOXPSInputPtr oxpsInput = IOXPSInput::create(jawsMako);
CPP

or

const IInputPtr oxpsInput = IInput::create(jawsMako, eFFOXPS);
CPP
Output:
const IOXPSOutputPtr oxpsOutput = IOXPSOutput::create(jawsMako);
CPP

The new classes offer the same methods and properties of their XPS equivalents.

The sample makoconverter has been updated to support OpenXPS, recognized by the file extension .oxps.

MAKO-3786

Detect attempts to overwrite an open assembly


A customer was puzzled that Mako didn’t immediately error when they were overwriting a PDF file on disk when they had the assembly open, instead failing at another point, after which the PDF was trashed.

To prevent this, Mako now tracks files that have been opened on behalf of input sources. Attempts to open a file on disk for write are checked; if the file is open, an error is thrown.

As many inputs are opened using a stream, not a file name, a method is needed to find out from a stream what file it has open. A new API, IInputStream::getSourceFilePath() is defined, and added to all input stream types. This may be of use in other situations.

New exception error codes are introduced, for errors when opening for read (EDL_ERR_OPENFORREAD), and for when output would overwrite an open input file (JM_ERR_ATTEMPTED_WRITE_ON_OPEN_INPUT). These can be caught by a try-catch block.

MAKO-4048

Discovering font resources contained in or referenced by a given PDF


The response to a support request concerning this subject led to the creation of a new simpleexample, charactermap.cpp. It illustrates basic font glyph listing, using the character map IDOMFont::CCharacterMap. It is also available in C# and Java.

MAKO-3990

Support predictors when partially decompressing flate-compressed images


In Mako 6.5.0, changes were made to improve the handling of flate-compressed images, by avoiding decompression of the entire image when only a single or a few scanlines were requested.

Building on that work, this release sees further improvements to Mako’s ability to decompress only part of a flate (zip) compressed image, by supporting predictors, a means to store only the difference between one block of data and the next. Refining partial decompression in this way increases efficiency and improves performance.

MAKO-4100

Add PDF/UA example in Python


A Python equivalent of the pdfuacreation sample is added to a simpleexamples folder found in the Python distribution (pdfuacreation.py).

MAKO-4037

Ensure PDF to PDF CJK CID font repeatability for unembedded fonts


Until now, PDF-to-PDF processing with Mako would always embed CID fonts even if they were not present in the source PDF, by creating appropriate subsets of the Nimbus Global font from Mako’s internal resources.

With this change, subsets are no longer generated, meaning that the output PDF is closer in profile to the original. Careful consideration is given to preserving CIDs (Character IDs) in the output to ensure a correct result.

MAKO-3991

New #define for Mako version


Added in this release is a new MAKO_VERSION value that represents the major, minor, and revision value. For example, the current value is:

#define MAKO_VERSION 60600
CPP

Which is “6.6.0”, split into “6” (major), “06” (minor), and “00” (revision), represented as a single integer value.  Using a value in this way makes it easy to test the current version; for example:

#include <edl/edlversion.h>

#if MAKO_VERSION > 60600
...
#endif
CPP

The EDL_VER_MAJOR and EDL_VER_MINOR values are redundant and have been removed.

MAKO-4026

Drop Debian Stretch


Debian LTS support for Debian 9 “Stretch” ended on June 30, 2022. A Mako build based on this Linux version is dropped from this and future Mako releases.

Issues fixed

MAKO-4032

MAKOSUP-10967 & MAKOSUP-10972 Incorrect handling of a spot color labeled as a process color


Two customers reported similar problems, which in part were due to a spot color having a name normally reserved for a process color (in this case Red). In principle this should not have been a problem, but some other incorrect assumptions had to be addressed. The problem for both support issues was solved, and correct separations are produced.

MAKO-3987

MAKOSUP-10974 Clipping Path Consideration when extracting text


When extracting text from a PDF, the customer found that text outside a clipping path was also extracted.

The response to this support request was the creation of a new simpleexample, cliptesting.cpp. The example walks the Mako DOM, keeping track of the clipping area in use, and extracting text content for everything that is clipped in. It also serves as a “best practice” example of how to manually traverse the DOM, tracking state, and walking through nested forms.

It is also available in C# and Java.

MAKO-4040

MAKOSUP-10975 Document properties values are unassigned for indirect values


A customer reported that Mako was retrieving metadata incorrectly. The problem was due to indirect objects that were not fully resolved. Now fixed.

MAKO-4020

MAKOSUP-10986 Alpha channel with 16 bits


Mako 6.1.0 introduced a feature to generate an alpha channel when rendering transparency. It was limited to process color separations, 8 bits per channel (8-bit rendering) only.

In this version, the feature is extended to support 16-bit rendering. Additionally, spot color separations can now be specified for rendering in both RGB and CMYK.

MAKO-4066

MAKOSUP-11002 File causing SIGSEV Failure during Thumbnail process


The problem was traced to an integer overflow in low memory conditions. Now fixed, and the customer exhibit renders correctly.

MAKO-4067

MAKOSUP-11008 Save as PDF/A-3b with source file embedded


This release adds support for an extra PDF/A standard, PDF/A-3b. A new PDFVersion enum is introduced, ePDFA3b. To use in code:

const IPDFOutputPtr pdfOutput = IPDFOutput::create(jawsMako);

pdfOutput->setVersion(IPDFOutput::ePDFA3b);
CPP

Or use setParameter():

pdfOutput->setParameter("PDFVersion", "PDF/A-3b");
CPP

An important difference to PDF/A-2b is that this standard permits arbitrary file attachments, rather than only PDF/A PDF attachments. This met the customer’s requirement, which was to embed a Microsoft Word (.docx) original.

MAKO-4074

MAKOSUP-11017 Rendering of specific PDF takes very long


Improvements to Mako’s code for rendering imagemasks saw a significant performance gain for the client test case: at 72dpi, from 45 seconds to 6 seconds; at 600dpi from 125 seconds to 12 seconds.

MAKO-4073

MAKOSUP-11018 Rendering the attached PDF only creates white pages


The solution to this problem required fixing a renderer clipping issue, triggered by an oddly constructed PDF.

MAKO-4079

MAKOSUP-11026 Redact does not remove OCR text in background


A minor change ensures text that is in effect invisible is also removed by the redaction process.

MAKO-4125

MAKOSUP-11040 Disappearing glyphs


Fix an issue reported by the customer with the ICFFCIDSplitter transform. A related problem with converting CFF/CID fonts to plain CFF, discovered during the testing of this fix, was also addressed.

MAKO-4128

MAKOSUP-11046 Missing characters


Fixed an issue with the removal of removing duplicate cntrmask operations in CFF charstrings.

MAKO-4013

Exception thrown when rendering a JPEG2K image


Fix issues and improve decoding of a JPEG 2000 image in a PDF.