Created Date: 29 Apr, 2022 18:51
Last Modifed Date: 05 May, 2022 15:12


Introduction

Mako 6.5.0 is a full product release that introduces some new and improved features, as well as fixes for identifiable support issues, labelled MAKOSUP-XXXXX.

New features include:

  • improved support for PDF/UA
  • improved quality and performance of Mako’s vector-based transparency flattener
  • control over page labels

New or improved

MAKO-3845

PDF accessibility and PDF/UA


PDF/UA (PDF/Universal Accessibility), formally ISO 14289, is an ISO standard for accessible PDF technology. When used with appropriate software, a PDF conforming to this standard ensures accessibility for people with disabilities who use assistive technology such as screen readers, screen magnifiers, joysticks and other technologies to navigate and read electronic content.

This release of Mako enables a developer to generate or modify PDF content to conform to this standard, adding a new PDF output preset, PDF/UA.

Unlike other PDF output parameters and presets in Mako that specify PDF ISO standards, such as PDF/X-4 or PDF/A-2b, the PDF/UA preset does not guarantee a compliant PDF/UA file. It simply creates the conditions for compliance, but the content must be tagged correctly for an output file to pass an independent compliance check, such as that offered by veraPDF.

A complete example is added to the simpleexamples folder in the SDK distribution. Look for pdfuacreation.cpp. This creates a PDF page from scratch, and shows how text, images and tables are structure-tagged in accordance with the PDF/UA standard. You can also find it here on GitHub.

MAKO-3771

MAKOSUP-10878 Page Labels in PDF


PDF allows for a label to be assigned to a page that is displayed by PDF viewers alongside the page number. It simplifies page numbering of the front matter in a publication where the page numbers are Roman numerals, for example.

Mako 6.5.0 adds two new methods to the IPage class, for getting and setting page labels:

IPage::getPageLabel()
IPage::setPageLabel()
CPP

These methods work with a new class, IPageLabel, that contains a prefix string, the style of numbering, and a start page number. A C++ sample showing how to set page labels on an existing PDF can be found on Github.

MAKO-3867

Add 64-bit Raspberry Pi OS support for Mako


With the introduction of an official 64-bit Linux for the Raspberry Pi 4, it was a natural next step for Mako to include a Debian Bullseye release built for the arm64v8 processor. 64-bit processing provides Mako with a little extra headroom, and runs considerably faster than its 32-bit counterpart (which remains available).

MAKO-3927

Update NuGet package names


The NuGet packages contained in the distribution have acquired new names to make their purpose clearer, and with a view to publishing license-controlled versions on nuget.org in the future.

Old

New

MakoSDK-Linux-swig    

MakoCore.OEM.Net.Linux

MakoSDK-macOS-swig    

MakoCore.OEM.Net.macOS

MakoSDK-vc16-swig     

MakoCore.OEM.Net.Windows

MakoSDK-vc16-uwp      

MakoCore.OEM.UWP.x64

MakoSDK-vc15          

MakoCore.OEM.Win-x64.VS2017

MakoSDK-vc15-static   

MakoCore.OEM.Win-x64.VS2017.Static

MakoSDK-vc16          

MakoCore.OEM.Win-x64.VS2019

MakoSDK-vc16-static   

MakoCore.OEM.Win-x64.VS2019.Static

MakoSDK-vc16-x86      

MakoCore.OEM.Win-x86.VS2019

MakoSDK-vc16-static-x86

MakoCore.OEM.Win-x86.VS2019.Static

MAKO-3953

Performance improvements to the vector-based transparency flattener


A PDF of a city map consisting of hundreds of transparent strokes was very slow when processed by an IRendererTransform() set to flatten transparent nodes in vector mode. Refactoring to divide the page into smaller regions had a dramatic effect, bringing processing time down from well over an hour to 25s.

MAKO-3860

PDF/A-2u - We can't tell if Unicode is missing for CID fonts


In version 6.4.0, Mako added support for PDF/A-2u. As part of that change, Mako would error if text is encountered where Unicode cannot be recovered. This requires a means to signal to PDF output that the character could not be recognized during PDF input. To do so, Mako inserts space characters if there is no Unicode available. During PDF output, Mako can detect when a space has been added for non-Unicode purposes by checking the name of the associated glyph. However, this approach works only for non-CID fonts; for CID fonts there was no such mechanism.

What changes in this release is the spaces previously added are replaced with Unicode U+FFFD, which is defined as REPLACEMENT CHARACTER and seemingly designed for this situation. Using this code, anonymous characters from both non-CID and CID fonts can be recognized, improving compliance with PDF/A-2u.

This is essentially an internal change to Mako but warrants inclusion in these Release Notes in case a Mako developer relies on text recovered from a PDF to include spaces, in place of unknown characters.

MAKO-3897

PDF/A-2u and PDF/X-1a compliance


Found during routine testing. Due to improved support for images with multiple decode filters, test files with LZW-encoded images (which are not allowed for PDF/X and other ISO standards for PDF) were failing compliance testing as LZW encoding was being passed through. Now fixed.

MAKO-3882

Java 11 support


Mako 6.5.0 includes a Windows SWIG release (C#, Java, Python) built with Java 11. The Linux SWIG distribution is already built with Java 11.

MAKO-3943

(et al)

 Memory leak issues

This investigation was prompted in part by a customer support request.

Using Valgrind and other profiling tools work was carried out for this Mako release to find and fix all causes of memory leaks.

MAKO-3878

Internal RIP performance improvement


This was a port to Mako of a change to Jaws RIP that was made in response to a customer support request. For the customer exhibit, memory consumption was reduced from 2.3 gigabytes to 800 megabytes.

MAKO-3783

Blank output for some layers when processing PS1X51DC.psd to TIFF


Found during routine testing. A sample Photoshop (.psd) file was losing information from certain layers when converting to a composite image. Now fixed.

MAKO-3800

Colours changed when processing some PSD files


Found during routine testing. A sample Photoshop (.psd) file was not correctly converting to a composite image. Now fixed.

MAKO-3794

Transparency missing when processing oldRussian.psd to TIFF


Found during routine testing. A sample Photoshop (.psd) file containing an element with a drop shadow was not correctly converting to a composite image. Now fixed.

MAKO-3812

Incorrect output when processing PS9ZC1CC.psd to TIFF


Found during routine testing. A sample Photoshop (.psd) file was not correctly converting to a composite image. Now fixed.

Issues fixed

MAKO-3640

MAKOSUP-10816 Support merging of CID CFF fonts.


This change enables merging of CID/CFF fonts (character ID / compact font format). This improves still further the excellent font and font subset merging that Mako already performs when writing PDFs. For the customer exhibit that had hundreds of such fonts, Mako was able to significantly reduce their number, transforming the file from 100MB+ to 33MB, thereby improving performance of subsequent processing.

CID/CFF merging can be blocked, if required. Simply set the environment variable MAKO_DONT_MERGE_CIDCFF to anything, and Mako will not attempt to merge CID/CFF at all.

MAKO-3772

MAKOSUP-10883 Improve error reporting when running out of temp store


A method is added to IJawsMako::getTempStore() to return a bool that indicates if temporary storage (temp store) was exhausted. The flag can be tested within a try-catch block, to clarify if an out-of-memory condition was due to temporary storage exhaustion.

For further details, and how to control the temp store size, see the Mako documentation.

MAKO-3773

MAKOSUP-10883 Avoid decompressing entire flate images to improve performance.


Exhaustion of the temp store (see MAKO-3772) was triggered by flate (zip) decompression of a 6Gb image that was occurring in one operation. Now, on-demand decompression of image sections takes place, thereby reducing pressure on the temp store.

MAKO-3807

MAKOSUP-10889 Error in a PDF (MakoDOMPage)


The customer exhibit contained a font with an invalid ToUnicode CMap stream, triggering an error during rendering. This problem is now caught, and raster output is produced correctly.

MAKO-3846

MAKOSUP-10911 Mako generates a blank thumbnail


The customer exhibit (a PDF) was unusual in that it had many nested optional content sections, taxing the logic in Mako to calculate whether a particular element should be visible. To fix the problem for the customer and improve Mako at the same time, close attention was paid to the evaluate() method of the IOptionalContentVisibilityExpression class. Rather than a simple bool, the method now returns an enum, eOptionalContentVisibility, that can express one of three results:

eOCVVisible
eOCVInvisible
eOCVUnchanged
CPP

This more nuanced approach ensures that Mako’s renderer class will include content that previously may have been considered invisible.

MAKO-3941

MAKOSUP-10953 Mako PDFLib cannot set a value for “CreatorTool” XMP data


The requirement from the customer was to be able to set the Creator string (which is the “Application:” property in Adobe Acrobat’s Document Properties dialog). To make this possible, an additional document information string, eDICreator, is added to the existing set that includes eDIAuthor, eDISubject etc.

Use with IDistiller::setDocumentInformationString(). For example:

IDistillerPtr distiller = IDistiller::create(jawsMako);
distiller->setDocumentInformationString(IDistiller::eDICreator, "GroovyApp 2000");
CPP

MAKO-3940

MAKOSUP-10954 Use OS-provided temporary directory path on macOS


The title of this improvement explains all. On macOS, Mako now uses the OS-supplied method instead of the generic method used for Mako’s Linux distributions.

MAKO-3950

MAKOSUP-10957 Conversion from XPS to PDF/A fails with EDL error 510


During the conversion process, code designed to deal with a specific requirement of PDF/A was triggering an exception. Now fixed.

MAKO-3974

MAKOSUP-10970 JVM crash with some PDF files


The customer exhibits (there were several) triggered an exception that resulted in a crash of the JVM (Java Virtual Machine). All were related to bad font or image encoding in the PDF that Mako was not equipped to deal with. These issues are addressed and the files process successfully, except for one that was too badly damaged.

Known issues

MAKO-4006

During release testing, a minor regression was found that we have decided to release with.


Mako 6.5.0 has a renderer issue that affects the (unusual) situation where a completely transparent object is painted into a knockout transparency group. This may be rendered incorrectly, but the change also improves some other cases.

A point release, Mako 6.5.1, will resolve this issue.

Distribution

MAKO Version 6.5.0 is built for the following platforms:

  • iOS
  • macOS
  • Linux (for Debian-based distributions, eg Ubuntu, Mint)
  • Linux (Centos)
  • Linux (Red Hat Enterprise v7.0)
  • Linux (Red Hat Enterprise v8.4)
  • Linux (for Debian Buster) (arm32v7 for Raspberry Pi)
  • Linux (for Debian Bullseye) (arm64v8 for Raspberry Pi)
  • Linux (for Debian Stretch)
  • Linux (for Debian Bullseye)
  • Linux (for MUSL distributions, eg Alpine Linux)
  • Linux (for Ubuntu 20.04 LTS)
  • Windows (static and dynamic libs, VS 2019 (V142), x86 and x64)
  • Windows (static and dynamic libs, VS 2017 (V141), x64)

Note that the Android build has been dropped from this release pending a tooling change. Please contact Mako support if you need a Mako release for Android later than Mako 6.1.0.

Mako supports the following programming languages

  • C++ (Mako is written in C++)
  • C# (.Net Core and .Net Framework)
  • Java (built with OpenJDK11)
  • Java (built with OpenJDK15)
  • Python (v3.8)

The alternatives to C++ are built using SWIG (www.swig.org) which provides a translation to the native libraries, are found in these distribution folders:

  • Linux_SWIG_(C#-Java-Python)
  • Linux_Centos7_SWIG_(C#-Java-Python)
  • Linux_Centos8_SWIG_(C#-Java-Python)
  • Linux_Ubuntu_SWIG_(C#-Java-Python)
  • macOS_SWIG_(C#-Java-Python)
  • Windows_SWIG_(C#-Java-Python)
  • Windows_SWIG_(C#-Java11-Python)