Skip to main content
Skip table of contents

Mako 6.6.0 Release Notes


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


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

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

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


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

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.


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.


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.


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.


Add PDF/UA example in Python

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


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.


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

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

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


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


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.


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.


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.


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.


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.


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);


Or use setParameter():

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

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.


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.


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.


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.


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.


MAKOSUP-11046 Missing characters

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


Exception thrown when rendering a JPEG2K image

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

JavaScript errors detected

Please note, these errors can depend on your browser setup.

If this problem persists, please contact our support.