Title: [Bug]: TTC font files containing CFF data result in (crashes or) broken PS and PDF files · Issue #20870 · matplotlib/matplotlib · GitHub
Open Graph Title: [Bug]: TTC font files containing CFF data result in (crashes or) broken PS and PDF files · Issue #20870 · matplotlib/matplotlib
X Title: [Bug]: TTC font files containing CFF data result in (crashes or) broken PS and PDF files · Issue #20870 · matplotlib/matplotlib
Description: Bug summary Some font files have the .ttc extension ("TrueType collection") but actually contain CFF data ("compact font format") which is not supported by the PDF and PS backends (#2869). Currently ttc files cause a crash which is easil...
Open Graph Description: Bug summary Some font files have the .ttc extension ("TrueType collection") but actually contain CFF data ("compact font format") which is not supported by the PDF and PS backends (#2869). Currentl...
X Description: Bug summary Some font files have the .ttc extension ("TrueType collection") but actually contain CFF data ("compact font format") which is not supported by the PDF and PS backen...
Opengraph URL: https://github.com/matplotlib/matplotlib/issues/20870
X: @github
Domain: github.com
{"@context":"https://schema.org","@type":"DiscussionForumPosting","headline":"[Bug]: TTC font files containing CFF data result in (crashes or) broken PS and PDF files","articleBody":"### Bug summary\n\nSome font files have the .ttc extension (\"TrueType collection\") but actually contain CFF data (\"compact font format\") which is not supported by the PDF and PS backends (#2869). Currently ttc files cause a crash which is easily fixed with\r\n\r\n```patch\r\ndiff --git a/lib/matplotlib/backends/_backend_pdf_ps.py b/lib/matplotlib/backends/_backend_pdf_ps.py\r\nindex 3224fb90e3..eaf8c8c094 100644\r\n--- a/lib/matplotlib/backends/_backend_pdf_ps.py\r\n+++ b/lib/matplotlib/backends/_backend_pdf_ps.py\r\n@@ -39,6 +39,10 @@ def get_glyphs_subset(fontfile, characters):\r\n # prevent subsetting FontForge Timestamp and other tables\r\n options.drop_tables += ['FFTM', 'PfEd']\r\n\r\n+ if fontfile.endswith('ttc'):\r\n+ options.font_number = 0\r\n with subset.load_font(fontfile, options) as font:\r\n subsetter = subset.Subsetter(options=options)\r\n subsetter.populate(text=characters)\r\n```\r\n\r\nbut with this fix, some ttc fonts result in broken output files if using font type 42 (type 3 seems to be fine).\r\n\r\nThe font manager lists fonts using `fc-list -f '%{file}\\n'` and selects based on file extensions. A better way might be `fc-list :fontformat=TrueType -f '%{file}\\n'` since fontconfig knows about the real font format. However, FreeType supports CFF fonts so we probably shouldn't exclude them from other backends or type 3 embedding.\r\n\r\n(The correct way to embed CFF fonts in PostScript is described in https://adobe-type-tools.github.io/font-tech-notes/pdfs/5176.CFF.pdf, and in PDF the font type needs to be Type1C, CIDFontType0C, or OpenType.)\n\n### Code for reproduction\n\n```python\n# this needs the patch above\r\n\r\nimport matplotlib\r\nfrom pathlib import Path\r\nmatplotlib.use('ps')\r\nfrom matplotlib import pyplot as plt\r\n\r\n# the following font is in CFF format on my Mac\r\nfont = Path('/System/Library/Fonts/AppleSDGothicNeo.ttc')\r\n\r\nfig = plt.figure()\r\nplt.axis((0,10,0,10))\r\nplt.text(3,3,'Glib jocks quiz nymph to vex dwarf.', font=font)\r\n\r\nmatplotlib.rc('ps', fonttype=42)\r\nplt.savefig('fmt42.ps')\r\n\r\nmatplotlib.rc('ps', fonttype=3)\r\nplt.savefig('fmt3.ps')\n```\n\n\n### Actual outcome\n\n`ps2pdf fmt42.ps` errors out with\r\n\r\n```\r\nError: /invalidfont in definefont\r\nOperand stack:\r\n AppleSDGothicNeo-Regular --dict:11/15(L)-- Font\r\nExecution stack:\r\n %interp_exit .runexec2 --nostringval-- definefont --nostringval-- 2 %stopped_push --nostringval-- definefont definefont false 1 %stopped_push 1990 1 3 %oparray_pop 1989 1 3 %oparray_pop 1977 1 3 %oparray_pop 1833 1 3 %oparray_pop --nostringval-- %errorexec_pop .runexec2 --nostringval-- definefont --nostringval-- 2 %stopped_push --nostringval-- 1923 2 4 %oparray_pop\r\nDictionary stack:\r\n --dict:729/1123(ro)(G)-- --dict:0/20(G)-- --dict:76/200(L)-- --dict:10/12(L)--\r\nCurrent allocation mode is local\r\nCurrent file position is 11851\r\nGPL Ghostscript 9.54.0: Unrecoverable error, exit code 1\r\n```\n\n### Expected outcome\n\n\u003cimg width=\"589\" alt=\"image\" src=\"https://user-images.githubusercontent.com/92814/130317552-7ceece63-7c05-4789-86e4-e48f897b0794.png\"\u003e\r\n\n\n### Operating system\n\nmacOS 11.5.2\n\n### Matplotlib Version\n\nmaster as of a4e81e7f + some of my local changes\n\n### Matplotlib Backend\n\n_No response_\n\n### Python version\n\n_No response_\n\n### Jupyter version\n\n_No response_\n\n### Other libraries\n\nfontTools 4.24.4\n\n### Installation\n\nsource\n\n### Conda channel\n\n_No response_","author":{"url":"https://github.com/jkseppan","@type":"Person","name":"jkseppan"},"datePublished":"2021-08-21T09:38:52.000Z","interactionStatistic":{"@type":"InteractionCounter","interactionType":"https://schema.org/CommentAction","userInteractionCount":1},"url":"https://github.com/20870/matplotlib/issues/20870"}
| route-pattern | /_view_fragments/issues/show/:user_id/:repository/:id/issue_layout(.:format) |
| route-controller | voltron_issues_fragments |
| route-action | issue_layout |
| fetch-nonce | v2:09274d8a-0ede-0166-6e3b-55c0e4e9a4d0 |
| current-catalog-service-hash | 81bb79d38c15960b92d99bca9288a9108c7a47b18f2423d0f6438c5b7bcd2114 |
| request-id | 9220:71E1B:FDED48:153339C:6A51C59D |
| html-safe-nonce | 28a5aa187d0c11dc056203a5d93784b859ced835e665a0b382d5a73d6585185a |
| visitor-payload | eyJyZWZlcnJlciI6IiIsInJlcXVlc3RfaWQiOiI5MjIwOjcxRTFCOkZERUQ0ODoxNTMzMzlDOjZBNTFDNTlEIiwidmlzaXRvcl9pZCI6IjM0MzE2MTEzOTczNTE1MjM3NDEiLCJyZWdpb25fZWRnZSI6ImlhZCIsInJlZ2lvbl9yZW5kZXIiOiJpYWQifQ== |
| visitor-hmac | b24a2bc315cd79fdc8c109f1c091160e39c3073d4eee37dce402f66149cb7fa6 |
| hovercard-subject-tag | issue:976095654 |
| github-keyboard-shortcuts | repository,issues,copilot |
| google-site-verification | Apib7-x98H0j5cPqHWwSMm6dNU4GmODRoqxLiDzdx9I |
| octolytics-url | https://collector.github.com/github/collect |
| analytics-location | / |
| fb:app_id | 1401488693436528 |
| apple-itunes-app | app-id=1477376905, app-argument=https://github.com/_view_fragments/issues/show/matplotlib/matplotlib/20870/issue_layout |
| twitter:image | https://opengraph.githubassets.com/344e228ca635cbaab3ce3bede5c32525710ab4fba1f6814409ae05d4a0c4e3a9/matplotlib/matplotlib/issues/20870 |
| twitter:card | summary_large_image |
| og:image | https://opengraph.githubassets.com/344e228ca635cbaab3ce3bede5c32525710ab4fba1f6814409ae05d4a0c4e3a9/matplotlib/matplotlib/issues/20870 |
| og:image:alt | Bug summary Some font files have the .ttc extension ("TrueType collection") but actually contain CFF data ("compact font format") which is not supported by the PDF and PS backends (#2869). Currentl... |
| og:image:width | 1200 |
| og:image:height | 600 |
| og:site_name | GitHub |
| og:type | object |
| og:author:username | jkseppan |
| hostname | github.com |
| expected-hostname | github.com |
| None | b9a586c06a05a7a86fc7e3f4dbd03e42f6869085879aa184aa6369456dbd50fb |
| turbo-cache-control | no-preview |
| go-import | github.com/matplotlib/matplotlib git https://github.com/matplotlib/matplotlib.git |
| octolytics-dimension-user_id | 215947 |
| octolytics-dimension-user_login | matplotlib |
| octolytics-dimension-repository_id | 1385122 |
| octolytics-dimension-repository_nwo | matplotlib/matplotlib |
| octolytics-dimension-repository_public | true |
| octolytics-dimension-repository_is_fork | false |
| octolytics-dimension-repository_network_root_id | 1385122 |
| octolytics-dimension-repository_network_root_nwo | matplotlib/matplotlib |
| turbo-body-classes | logged-out env-production page-responsive |
| disable-turbo | false |
| browser-stats-url | https://api.github.com/_private/browser/stats |
| browser-errors-url | https://api.github.com/_private/browser/errors |
| release | 7aed05249554b889eb33d002851a973eebcc7e91 |
| ui-target | full |
| theme-color | #1e2327 |
| color-scheme | light dark |
Links:
Viewport: width=device-width