From 03c1973559d9a0920282330745e71d32b135e657 Mon Sep 17 00:00:00 2001 From: tallison Date: Tue, 27 Oct 2026 14:00:01 -0400 Subject: [PATCH] PDFBOX-6293: resolve glyphs via Unicode for CIDFontType2 with an Identity-ordered substitute --- .../main/appended-resources/META-INF/LICENSE | 94 ++++++++++ .../pdfbox/pdmodel/font/PDCIDFontType2.java | 21 ++- .../pdmodel/font/IdentityCJKFixture.java | 168 ++++++++++++++++++ .../font/IdentityCJKSubstituteTest.java | 90 ++++++++++ .../font/NotoSansCJKsc-Regular-subset.otf | Bin 0 -> 109056 bytes 5 files changed, 372 insertions(+), 1 deletion(-) create mode 100644 pdfbox/src/test/java/org/apache/pdfbox/pdmodel/font/IdentityCJKFixture.java create mode 100644 pdfbox/src/test/java/org/apache/pdfbox/pdmodel/font/IdentityCJKSubstituteTest.java create mode 100644 pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/font/NotoSansCJKsc-Regular-subset.otf diff --git a/pdfbox/src/main/appended-resources/META-INF/LICENSE b/pdfbox/src/main/appended-resources/META-INF/LICENSE index 41c00b7d114..6bb2b7a1a97 100644 --- a/pdfbox/src/main/appended-resources/META-INF/LICENSE +++ b/pdfbox/src/main/appended-resources/META-INF/LICENSE @@ -942,6 +942,100 @@ Noto Sans Devanagari font (https://fonts.google.com/noto/specimen/Noto+Sans+Deva This license becomes null and void if any of the above conditions are not met. + DISCLAIMER + THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF + MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT + OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE + COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, + INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL + DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING + FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM + OTHER DEALINGS IN THE FONT SOFTWARE. + +Noto Sans CJK SC font, test subset (https://github.com/notofonts/noto-cjk): + + Copyright 2014-2021 Adobe (http://www.adobe.com/) + + This Font Software is licensed under the SIL Open Font License, Version 1.1 . + This license is copied below, and is also available with a FAQ at: https://openfontlicense.org + + ----------------------------------------------------------- + SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 + ----------------------------------------------------------- + + PREAMBLE + The goals of the Open Font License (OFL) are to stimulate worldwide + development of collaborative font projects, to support the font creation + efforts of academic and linguistic communities, and to provide a free and + open framework in which fonts may be shared and improved in partnership + with others. + + The OFL allows the licensed fonts to be used, studied, modified and + redistributed freely as long as they are not sold by themselves. The + fonts, including any derivative works, can be bundled, embedded, + redistributed and/or sold with any software provided that any reserved + names are not used by derivative works. The fonts and derivatives, + however, cannot be released under any other type of license. The + requirement for fonts to remain under this license does not apply + to any document created using the fonts or their derivatives. + + DEFINITIONS + "Font Software" refers to the set of files released by the Copyright + Holder(s) under this license and clearly marked as such. This may + include source files, build scripts and documentation. + + "Reserved Font Name" refers to any names specified as such after the + copyright statement(s). + + "Original Version" refers to the collection of Font Software components as + distributed by the Copyright Holder(s). + + "Modified Version" refers to any derivative made by adding to, deleting, + or substituting -- in part or in whole -- any of the components of the + Original Version, by changing formats or by porting the Font Software to a + new environment. + + "Author" refers to any designer, engineer, programmer, technical + writer or other person who contributed to the Font Software. + + PERMISSION & CONDITIONS + Permission is hereby granted, free of charge, to any person obtaining + a copy of the Font Software, to use, study, copy, merge, embed, modify, + redistribute, and sell modified and unmodified copies of the Font + Software, subject to the following conditions: + + 1) Neither the Font Software nor any of its individual components, + in Original or Modified Versions, may be sold by itself. + + 2) Original or Modified Versions of the Font Software may be bundled, + redistributed and/or sold with any software, provided that each copy + contains the above copyright notice and this license. These can be + included either as stand-alone text files, human-readable headers or + in the appropriate machine-readable metadata fields within text or + binary files as long as those fields can be easily viewed by the user. + + 3) No Modified Version of the Font Software may use the Reserved Font + Name(s) unless explicit written permission is granted by the corresponding + Copyright Holder. This restriction only applies to the primary font name as + presented to the users. + + 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font + Software shall not be used to promote, endorse or advertise any + Modified Version, except to acknowledge the contribution(s) of the + Copyright Holder(s) and the Author(s) or with their explicit written + permission. + + 5) The Font Software, modified or unmodified, in part or in whole, + must be distributed entirely under this license, and must not be + distributed under any other license. The requirement for fonts to + remain under this license does not apply to any document created + using the Font Software. + + TERMINATION + This license becomes null and void if any of the above conditions are + not met. + DISCLAIMER THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF diff --git a/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java b/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java index 45f4e73294b..248e2d6411b 100644 --- a/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java +++ b/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/font/PDCIDFontType2.java @@ -25,6 +25,7 @@ import org.apache.logging.log4j.Logger; import org.apache.logging.log4j.LogManager; +import org.apache.fontbox.cff.CFFCIDFont; import org.apache.fontbox.cff.CFFFont; import org.apache.fontbox.cff.Type2CharString; import org.apache.fontbox.cmap.CMap; @@ -55,6 +56,9 @@ public class PDCIDFontType2 extends PDCIDFont private final OpenTypeFont otf; private final int[] cid2gid; private final CmapLookup cmap; // may be null + // substitute is CID-keyed with a different ROS: this font's CIDs are meaningless in it, + // resolve glyphs via Unicode instead (PDFBOX-6293) + private final boolean isForeignCIDSubstitute; private Matrix fontMatrix; private BoundingBox fontBBox; private final Set noMapping = new HashSet<>(); @@ -153,6 +157,21 @@ public PDCIDFontType2(COSDictionary fontDictionary, TrueTypeFont trueTypeFont, } cmap = ttf.getUnicodeCmapLookup(false); cid2gid = readCIDToGIDMap(); + isForeignCIDSubstitute = !isEmbedded && isForeignCIDFont(otf); + } + + private boolean isForeignCIDFont(OpenTypeFont substitute) throws IOException + { + if (substitute == null || !substitute.isPostScript() || + !(substitute.getCFF().getFont() instanceof CFFCIDFont)) + { + return false; + } + CFFCIDFont cff = (CFFCIDFont) substitute.getCFF().getFont(); + PDCIDSystemInfo ros = getCIDSystemInfo(); + return "Identity".equals(cff.getOrdering()) && (ros == null || + !ros.getRegistry().equals(cff.getRegistry()) || + !ros.getOrdering().equals(cff.getOrdering())); } private TrueTypeFont findFontOrSubstitute() throws IOException @@ -291,7 +310,7 @@ protected int codeToGID(int code, PDType0Font parent) throws IOException // see PDFBOX-2599 return codeToCID(code, parent); } - else if (otf != null && otf.isPostScript()) + else if (otf != null && otf.isPostScript() && !isForeignCIDSubstitute) { // "Identity" is the default for CFF-based OpenTypeFonts // (copied from segment below where font is embedded) diff --git a/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/font/IdentityCJKFixture.java b/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/font/IdentityCJKFixture.java new file mode 100644 index 00000000000..3f8e17a32ee --- /dev/null +++ b/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/font/IdentityCJKFixture.java @@ -0,0 +1,168 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.pdfbox.pdmodel.font; + +import java.io.File; +import java.io.IOException; + +import org.apache.fontbox.FontBoxFont; +import org.apache.fontbox.cff.CFFCIDFont; +import org.apache.fontbox.ttf.OTFParser; +import org.apache.fontbox.ttf.OpenTypeFont; +import org.apache.fontbox.ttf.TrueTypeFont; +import org.apache.pdfbox.cos.COSArray; +import org.apache.pdfbox.cos.COSDictionary; +import org.apache.pdfbox.cos.COSInteger; +import org.apache.pdfbox.cos.COSName; +import org.apache.pdfbox.cos.COSString; +import org.apache.pdfbox.io.RandomAccessReadBufferedFile; + +/** + * Installs an Adobe-Identity-0 CID-keyed font as the substitute for every non-embedded CID font, + * standing in for an installed Noto CJK / Source Han font, and restores the previous mapper on + * {@link #close()}. {@link FontMappers} is JVM-wide, so test classes using this must be + * {@code @Isolated}. + *

+ * The substitute is Noto Sans CJK SC (SIL OFL 1.1) cut down to space and U+4E2D with glyph IDs + * kept, so that CIDs still equal GIDs as in the full font; every other glyph is empty. + * Regenerate with fontTools: + *

+ * pyftsubset NotoSansCJK-Regular.ttc --font-number=2 --unicodes=U+0020,U+4E2D --retain-gids \
+ *     --layout-features='' --no-hinting --desubroutinize --name-IDs='*' --notdef-outline \
+ *     --output-file=NotoSansCJKsc-Regular-subset.otf
+ * 
+ */ +final class IdentityCJKFixture implements AutoCloseable +{ + private static final File FIXTURE = new File( + "src/test/resources/org/apache/pdfbox/pdmodel/font/NotoSansCJKsc-Regular-subset.otf"); + + // U+4E2D: GID/CID 9544 in the substitute, CID 4559 in Adobe-GB1 + static final int ZHONG = 0x4E2D; + static final int ZHONG_GID = 9544; + + private final FontMapper original; + private final OpenTypeFont substitute; + + IdentityCJKFixture() throws IOException + { + substitute = new OTFParser().parse(new RandomAccessReadBufferedFile(FIXTURE)); + CFFCIDFont cff = (CFFCIDFont) substitute.getCFF().getFont(); + if (!"Identity".equals(cff.getOrdering())) + { + throw new IllegalStateException("fixture is not Adobe-Identity-0"); + } + original = FontMappers.instance(); + FontMappers.set(new FixtureMapper(original, substitute)); + } + + OpenTypeFont getSubstitute() + { + return substitute; + } + + @Override + public void close() throws IOException + { + FontMappers.set(original); + substitute.close(); + } + + /** + * A non-embedded Adobe-GB1 Type0 font dictionary. + */ + static COSDictionary type0(String baseFont, COSName subtype, String encoding) + { + COSDictionary ros = new COSDictionary(); + ros.setItem(COSName.REGISTRY, new COSString("Adobe")); + ros.setItem(COSName.ORDERING, new COSString("GB1")); + ros.setInt(COSName.SUPPLEMENT, 2); + + COSDictionary fd = new COSDictionary(); + fd.setItem(COSName.TYPE, COSName.FONT_DESC); + fd.setName(COSName.FONT_NAME, baseFont); + fd.setInt(COSName.FLAGS, 6); + COSArray bbox = new COSArray(); + bbox.add(COSInteger.get(0)); + bbox.add(COSInteger.get(-141)); + bbox.add(COSInteger.get(996)); + bbox.add(COSInteger.get(855)); + fd.setItem(COSName.FONT_BBOX, bbox); + fd.setInt(COSName.ITALIC_ANGLE, 0); + fd.setInt(COSName.ASCENT, 859); + fd.setInt(COSName.DESCENT, -141); + fd.setInt(COSName.CAP_HEIGHT, 859); + fd.setInt(COSName.STEM_V, 80); + + COSDictionary cid = new COSDictionary(); + cid.setItem(COSName.TYPE, COSName.FONT); + cid.setItem(COSName.SUBTYPE, subtype); + cid.setName(COSName.BASE_FONT, baseFont); + cid.setItem(COSName.CIDSYSTEMINFO, ros); + cid.setItem(COSName.FONT_DESC, fd); + cid.setInt(COSName.DW, 1000); + + COSArray descendants = new COSArray(); + descendants.add(cid); + COSDictionary type0 = new COSDictionary(); + type0.setItem(COSName.TYPE, COSName.FONT); + type0.setItem(COSName.SUBTYPE, COSName.TYPE0); + type0.setName(COSName.BASE_FONT, baseFont); + type0.setName(COSName.ENCODING, encoding); + type0.setItem(COSName.DESCENDANT_FONTS, descendants); + return type0; + } + + static COSDictionary descendant(COSDictionary type0) + { + return (COSDictionary) ((COSArray) type0.getDictionaryObject(COSName.DESCENDANT_FONTS)) + .getObject(0); + } + + private static final class FixtureMapper implements FontMapper + { + private final FontMapper delegate; + private final OpenTypeFont substitute; + + FixtureMapper(FontMapper delegate, OpenTypeFont substitute) + { + this.delegate = delegate; + this.substitute = substitute; + } + + @Override + public FontMapping getTrueTypeFont(String baseFont, + PDFontDescriptor fontDescriptor) + { + return delegate.getTrueTypeFont(baseFont, fontDescriptor); + } + + @Override + public FontMapping getFontBoxFont(String baseFont, + PDFontDescriptor fontDescriptor) + { + return delegate.getFontBoxFont(baseFont, fontDescriptor); + } + + @Override + public CIDFontMapping getCIDFont(String baseFont, PDFontDescriptor fontDescriptor, + PDCIDSystemInfo cidSystemInfo) + { + return new CIDFontMapping(substitute, null, true); + } + } +} diff --git a/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/font/IdentityCJKSubstituteTest.java b/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/font/IdentityCJKSubstituteTest.java new file mode 100644 index 00000000000..3101a76bd37 --- /dev/null +++ b/pdfbox/src/test/java/org/apache/pdfbox/pdmodel/font/IdentityCJKSubstituteTest.java @@ -0,0 +1,90 @@ +/* + * Licensed to the Apache Software Foundation (ASF) under one or more + * contributor license agreements. See the NOTICE file distributed with + * this work for additional information regarding copyright ownership. + * The ASF licenses this file to You under the Apache License, Version 2.0 + * (the "License"); you may not use this file except in compliance with + * the License. You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ +package org.apache.pdfbox.pdmodel.font; + +import static org.apache.pdfbox.pdmodel.font.IdentityCJKFixture.ZHONG; +import static org.apache.pdfbox.pdmodel.font.IdentityCJKFixture.ZHONG_GID; +import static org.apache.pdfbox.pdmodel.font.IdentityCJKFixture.type0; +import static org.junit.jupiter.api.Assertions.assertEquals; +import static org.junit.jupiter.api.Assertions.assertFalse; +import static org.junit.jupiter.api.Assertions.assertTrue; + +import java.awt.geom.GeneralPath; +import java.io.IOException; + +import org.apache.pdfbox.cos.COSName; +import org.junit.jupiter.api.AfterEach; +import org.junit.jupiter.api.BeforeEach; +import org.junit.jupiter.api.Test; +import org.junit.jupiter.api.parallel.Isolated; + +/** + * Non-embedded Adobe-GB1 CID fonts substituted by an Adobe-Identity-0 CID-keyed font (Noto CJK, + * Source Han). The PDF's CIDs are not glyph indices in such a substitute, so glyphs must be + * resolved via Unicode: PDFBOX-6249 for CIDFontType0, PDFBOX-6293 for CIDFontType2. + */ +@Isolated +class IdentityCJKSubstituteTest +{ + private IdentityCJKFixture fixture; + + @BeforeEach + void installSubstitute() throws IOException + { + fixture = new IdentityCJKFixture(); + } + + @AfterEach + void restore() throws IOException + { + fixture.close(); + } + + @Test + void testCIDFontType2ResolvesViaUnicode() throws IOException + { + PDType0Font font = new PDType0Font(type0("SimSun", COSName.CID_FONT_TYPE2, "UniGB-UCS2-H"), + null); + PDCIDFontType2 cidFont = (PDCIDFontType2) font.getDescendantFont(); + + assertEquals(ZHONG_GID, cidFont.codeToGID(ZHONG, font), + "GID must be resolved via Unicode, not used as a CID"); + assertSameGlyph(cidFont.getPath(ZHONG, font)); + } + + @Test + void testCIDFontType0ResolvesViaUnicode() throws IOException + { + PDType0Font font = new PDType0Font( + type0("AdobeSongStd-Light", COSName.CID_FONT_TYPE0, "UniGB-UCS2-H"), null); + PDCIDFontType0 cidFont = (PDCIDFontType0) font.getDescendantFont(); + + assertEquals(ZHONG_GID, cidFont.codeToGID(ZHONG, font), + "GID must be resolved via Unicode, not used as a CID"); + assertSameGlyph(cidFont.getPath(ZHONG, font)); + } + + private void assertSameGlyph(GeneralPath path) throws IOException + { + // with the CID used as a GID, the fixture yields an empty glyph + assertFalse(path.getPathIterator(null).isDone(), "glyph for U+4E2D has an empty path"); + GeneralPath expected = fixture.getSubstitute().getCFF().getFont() + .getType2CharString(ZHONG_GID).getPath(); + assertEquals(expected.getBounds2D(), path.getBounds2D()); + assertTrue(path.getBounds2D().getWidth() > 0); + } +} diff --git a/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/font/NotoSansCJKsc-Regular-subset.otf b/pdfbox/src/test/resources/org/apache/pdfbox/pdmodel/font/NotoSansCJKsc-Regular-subset.otf new file mode 100644 index 0000000000000000000000000000000000000000..2e9d3d0add33f91febfd62d34ff45ace1a7d3bf8 GIT binary patch literal 109056 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

rVxrIDJULl{5Unn3H6bcE2 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