Skip to content

Commit

Permalink
FOP-2920: Surrogate pair edge-case causes Exception by Dave Roxburgh
Browse files Browse the repository at this point in the history
  • Loading branch information
simonsteiner1984 committed Jun 14, 2023
1 parent 1fd1281 commit ae5f6dd
Show file tree
Hide file tree
Showing 9 changed files with 182 additions and 62 deletions.
21 changes: 12 additions & 9 deletions fop-core/src/main/java/org/apache/fop/pdf/PDFFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -46,6 +46,7 @@
import org.apache.xmlgraphics.java2d.color.NamedColorSpace;
import org.apache.xmlgraphics.xmp.Metadata;

import org.apache.fop.events.EventBroadcaster;
import org.apache.fop.fonts.CIDFont;
import org.apache.fop.fonts.CodePointMapping;
import org.apache.fop.fonts.CustomFont;
Expand Down Expand Up @@ -930,11 +931,12 @@ public PDFEncoding makeEncoding(String encodingName) {
* @param encoding character encoding scheme used by the font
* @param metrics additional information about the font
* @param descriptor additional information about the font
* @param eventBroadcaster Event broadcaster.
* @return the created /Font object
*/
public PDFFont makeFont(String fontname, String basefont,
String encoding, FontMetrics metrics,
FontDescriptor descriptor) {
FontDescriptor descriptor, EventBroadcaster eventBroadcaster) {
PDFFont preRegisteredfont = getDocument().findFont(fontname);
if (preRegisteredfont != null) {
return preRegisteredfont;
Expand All @@ -955,7 +957,7 @@ public PDFFont makeFont(String fontname, String basefont,
Typeface tf = (Typeface)metrics;
mapping = CodePointMapping.getMapping(tf.getEncodingName());
}
generateToUnicodeCmap(font, mapping);
generateToUnicodeCmap(font, mapping, eventBroadcaster);
}
return font;
} else {
Expand Down Expand Up @@ -1005,7 +1007,8 @@ public PDFFont makeFont(String fontname, String basefont,
}
} else {
cmap = new PDFToUnicodeCMap(cidMetrics.getCIDSet().getChars(), "fop-ucs-H",
new PDFCIDSystemInfo("Adobe", "Identity", 0), false);
new PDFCIDSystemInfo("Adobe", "Identity", 0), false,
eventBroadcaster);
}
getDocument().registerObject(cmap);
assert font instanceof PDFFontType0;
Expand Down Expand Up @@ -1075,7 +1078,7 @@ public PDFFont makeFont(String fontname, String basefont,
if (singleByteFont.isSymbolicFont()) {
//no encoding, use the font's encoding
if (forceToUnicode) {
generateToUnicodeCmap(nonBase14, mapping);
generateToUnicodeCmap(nonBase14, mapping, eventBroadcaster);
}
} else if (PDFEncoding.isPredefinedEncoding(mapping.getName())) {
font.setEncoding(mapping.getName());
Expand Down Expand Up @@ -1105,7 +1108,7 @@ public PDFFont makeFont(String fontname, String basefont,
pdfEncoding.setDifferences(differences);
font.setEncoding(pdfEncoding);
if (mapping.getUnicodeCharMap() != null) {
generateToUnicodeCmap(nonBase14, mapping);
generateToUnicodeCmap(nonBase14, mapping, eventBroadcaster);
}
}
} else {
Expand All @@ -1117,7 +1120,7 @@ public PDFFont makeFont(String fontname, String basefont,
font.setEncoding((String)pdfEncoding);
}
if (forceToUnicode) {
generateToUnicodeCmap(nonBase14, mapping);
generateToUnicodeCmap(nonBase14, mapping, eventBroadcaster);
}
}

Expand All @@ -1140,7 +1143,7 @@ public PDFFont makeFont(String fontname, String basefont,
getDocument().registerObject(addFont);
getDocument().getResources().addFont(addFont);
if (forceToUnicode) {
generateToUnicodeCmap(addFont, addEncoding);
generateToUnicodeCmap(addFont, addEncoding, eventBroadcaster);
}
}
}
Expand Down Expand Up @@ -1228,10 +1231,10 @@ private List<PDFFontNonBase14> addAdditionalEncodings(FontMetrics metrics, FontD
return additionalEncodings;
}

private void generateToUnicodeCmap(PDFFont font, SingleByteEncoding encoding) {
private void generateToUnicodeCmap(PDFFont font, SingleByteEncoding encoding, EventBroadcaster eventBroadcaster) {
PDFCMap cmap = new PDFToUnicodeCMap(encoding.getUnicodeCharMap(),
"fop-ucs-H",
new PDFCIDSystemInfo("Adobe", "Identity", 0), true);
new PDFCIDSystemInfo("Adobe", "Identity", 0), true, eventBroadcaster);
getDocument().registerObject(cmap);
font.setToUnicode(cmap);
}
Expand Down
6 changes: 4 additions & 2 deletions fop-core/src/main/java/org/apache/fop/pdf/PDFResources.java
Original file line number Diff line number Diff line change
Expand Up @@ -28,6 +28,7 @@

import org.apache.xmlgraphics.java2d.color.profile.ColorProfileUtil;

import org.apache.fop.events.EventBroadcaster;
import org.apache.fop.fonts.FontDescriptor;
import org.apache.fop.fonts.FontInfo;
import org.apache.fop.fonts.Typeface;
Expand Down Expand Up @@ -116,8 +117,9 @@ public void createFontsAsObj() {
*
* @param doc PDF document to add fonts to
* @param fontInfo font info object to get font information from
* @param eventBroadcaster Event broadcaster.
*/
public void addFonts(PDFDocument doc, FontInfo fontInfo) {
public void addFonts(PDFDocument doc, FontInfo fontInfo, EventBroadcaster eventBroadcaster) {
Map<String, Typeface> usedFonts = fontInfo.getUsedFonts();
for (Map.Entry<String, Typeface> e : usedFonts.entrySet()) {
String f = e.getKey();
Expand All @@ -135,7 +137,7 @@ public void addFonts(PDFDocument doc, FontInfo fontInfo) {
encoding = null; //Symbolic fonts shouldn't specify an encoding value in PDF
}
addFont(doc.getFactory().makeFont(
f, font.getEmbedFontName(), encoding, font, desc));
f, font.getEmbedFontName(), encoding, font, desc, eventBroadcaster));
}
}
}
Expand Down
Loading

0 comments on commit ae5f6dd

Please sign in to comment.