prawn icon indicating copy to clipboard operation
prawn copied to clipboard

Font Embedding: Subset enabled by default and breaking font

Open MrSerth opened this issue 5 months ago • 2 comments

Since updating to prawn 2.5.0, we face issues with font embedding and incorrectly or missing glyphs.

Reproduction example:

This reproduction example assumes that the file Arial Unicode MS.TTF is present in the local working directory. While the font is shipped with Microsoft Office by default and can be licensed by Microsoft, it is also available on GitHub (for example here). With the file being available, a simple irb can be started and the following script can be executed:

require 'prawn'
@pdf = Prawn::Document.new()

@pdf.font_families.update("ArialUnicodeMS" => {normal: {file: "Arial Unicode MS.TTF"}})

@pdf.font "ArialUnicodeMS", style: :normal
@pdf.text_rendering_mode :fill_stroke do
  @pdf.draw_text "Demo Text @ Draw Text", size: 22.0, style: :normal, text_anchor: "middle", at: [0, 500], offset: [0, 0]
end

@pdf.render_file('prawn.pdf')
puts "Done"

Issues noticed:

  • [ ] The @ character included in the text is not shown in Acrobat. Instead (after a few seconds), an error is shown: Cannot extract the embedded font 'e23202+ArialUnicodeMS'. Some characters may not display or print correctly.

    Bildschirmfoto 2024-09-18 um 20 38 57
  • [ ] The documentation for font_families indicates that the default for subset is false. However, this doesn't seem to be the case and it rather appears that subset: true is the default since https://github.com/prawnpdf/prawn/commit/528a37d7152b378d5e20118988876d77c318c9dd. Given the above example, explicitly specifying subset: true doesn't change anything (with regard to showing the @ or the file size of the resulting PDF`)

    # Bug still occurs
    @pdf.font_families.update("ArialUnicodeMS" => {normal: {file: "Arial Unicode MS.TTF", subset: true}})
    

    However, changing the option to subset: false, the full TTF file is embedded and the PDF file size dramatically increases (due to the large TTF):

    # Bug doesn't occur any longer, `@` is shown correctly and the resulting PDF is huge
    @pdf.font_families.update("ArialUnicodeMS" => {normal: {file: "Arial Unicode MS.TTF", subset: false}})
    

After reducing the issue to the above-given minimal reproduction example, we are pretty confident to face a bug in Prawn. Otherwise, we probably misunderstood the subsetting and font-embedding and would be grateful about some advice - Thank you!

--

prawn: 2.5.0 Ruby: 3.3.5 Adobe Acrobat Pro: 2024.003.20121

MrSerth avatar Sep 18 '24 18:09 MrSerth