Skip to content

Commit 8cdb685

Browse files
committed
Do not add subset prefix for external fonts.
DEVSIX-1621
1 parent 987e3ef commit 8cdb685

File tree

7 files changed

+120
-7
lines changed

7 files changed

+120
-7
lines changed

kernel/src/main/java/com/itextpdf/kernel/font/PdfFont.java

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -531,6 +531,7 @@ protected boolean checkTrueTypeFontDictionary(PdfDictionary fontDic, boolean isE
531531
*
532532
* @return the subset prefix
533533
*/
534+
@Deprecated
534535
protected static String createSubsetPrefix() {
535536
StringBuilder s = new StringBuilder("");
536537
for (int k = 0; k < 6; ++k) {
@@ -539,6 +540,22 @@ protected static String createSubsetPrefix() {
539540
return s + "+";
540541
}
541542

543+
/**
544+
* Adds a unique subset prefix to be added to the font name when the font is embedded and subset.
545+
*
546+
* @return the font name with subset prefix if isSubset and isEmbedded are true.s
547+
*/
548+
protected static String updateSubsetPrefix(String fontName, boolean isSubset, boolean isEmbedded) {
549+
if (isSubset && isEmbedded) {
550+
StringBuilder s = new StringBuilder(fontName.length() + 7);
551+
for (int k = 0; k < 6; ++k) {
552+
s.append((char) (Math.random() * 26 + 'A'));
553+
}
554+
return s.append('+').append(fontName).toString();
555+
}
556+
return fontName;
557+
}
558+
542559
/**
543560
* Create {@code PdfStream} based on {@code fontStreamBytes}.
544561
*

kernel/src/main/java/com/itextpdf/kernel/font/PdfTrueTypeFont.java

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -139,9 +139,7 @@ public void flush() {
139139
fontName = fontProgram.getFontNames().getFontName();
140140
} else {
141141
subtype = PdfName.TrueType;
142-
fontName = subset
143-
? createSubsetPrefix() + fontProgram.getFontNames().getFontName()
144-
: fontProgram.getFontNames().getFontName();
142+
fontName = updateSubsetPrefix(fontProgram.getFontNames().getFontName(), subset, embedded);
145143
}
146144
flushFontData(fontName, subtype);
147145
}

kernel/src/main/java/com/itextpdf/kernel/font/PdfType0Font.java

Lines changed: 1 addition & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -831,10 +831,7 @@ private void flushFontData() {
831831
int[][] metrics = longTag.values().toArray(new int[0][]);
832832
Arrays.sort(metrics, new MetricComparator());
833833
PdfStream fontStream;
834-
String fontName = ttf.getFontNames().getFontName();
835-
if (subset) {
836-
fontName = createSubsetPrefix() + fontName;
837-
}
834+
String fontName = updateSubsetPrefix(ttf.getFontNames().getFontName(), subset, embedded);
838835
PdfDictionary fontDescriptor = getFontDescriptor(fontName);
839836
if (ttf.isCff()) {
840837
byte[] cffBytes = ttf.getFontStreamBytes();

kernel/src/test/java/com/itextpdf/kernel/pdf/PdfFontTest.java

Lines changed: 101 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -584,6 +584,55 @@ public void createDocumentWithTrueTypeFont1() throws IOException, InterruptedExc
584584
Assert.assertNull(new CompareTool().compareByContent(filename, cmpFilename, destinationFolder, "diff_"));
585585
}
586586

587+
@Test
588+
public void createDocumentWithTrueTypeFont1NotEmbedded() throws IOException, InterruptedException {
589+
String filename = destinationFolder + "createDocumentWithTrueTypeFont1NotEmbedded.pdf";
590+
String cmpFilename = sourceFolder + "cmp_createDocumentWithTrueTypeFont1NotEmbedded.pdf";
591+
String title = "Empty iText 7 Document";
592+
PdfWriter writer = new PdfWriter(filename);
593+
writer.setCompressionLevel(CompressionConstants.NO_COMPRESSION);
594+
PdfDocument pdfDoc = new PdfDocument(writer);
595+
pdfDoc.getDocumentInfo().setAuthor(author).
596+
setCreator(creator).
597+
setTitle(title);
598+
String font = fontsFolder + "abserif4_5.ttf";
599+
PdfFont pdfTrueTypeFont = PdfFontFactory.createFont(font, false);
600+
Assert.assertTrue("PdfTrueTypeFont expected", pdfTrueTypeFont instanceof PdfTrueTypeFont);
601+
pdfTrueTypeFont.setSubset(true);
602+
PdfPage page = pdfDoc.addNewPage();
603+
new PdfCanvas(page)
604+
.saveState()
605+
.beginText()
606+
.moveText(36, 700)
607+
.setFontAndSize(pdfTrueTypeFont, 72)
608+
.showText("Hello world")
609+
.endText()
610+
.restoreState()
611+
.rectangle(100, 500, 100, 100).fill()
612+
.release();
613+
page.flush();
614+
615+
byte[] ttf = StreamUtil.inputStreamToArray(new FileInputStream(font));
616+
pdfTrueTypeFont = PdfFontFactory.createFont(ttf, false);
617+
Assert.assertTrue("PdfTrueTypeFont expected", pdfTrueTypeFont instanceof PdfTrueTypeFont);
618+
pdfTrueTypeFont.setSubset(true);
619+
page = pdfDoc.addNewPage();
620+
new PdfCanvas(page)
621+
.saveState()
622+
.beginText()
623+
.moveText(36, 700)
624+
.setFontAndSize(pdfTrueTypeFont, 72)
625+
.showText("Hello world")
626+
.endText()
627+
.restoreState()
628+
.rectangle(100, 500, 100, 100).fill()
629+
.release();
630+
631+
pdfDoc.close();
632+
633+
Assert.assertNull(new CompareTool().compareByContent(filename, cmpFilename, destinationFolder, "diff_"));
634+
}
635+
587636
@Test
588637
public void createDocumentWithTrueTypeOtfFont() throws IOException, InterruptedException {
589638
String filename = destinationFolder + "DocumentWithTrueTypeOtfFont.pdf";
@@ -1310,7 +1359,59 @@ public void testWriteTTC() throws IOException, InterruptedException {
13101359
pdfDoc.close();
13111360

13121361
Assert.assertNull(new CompareTool().compareByContent(filename, cmpFilename, destinationFolder, "diff_"));
1362+
}
13131363

1364+
@Test
1365+
public void testWriteTTCNotEmbedded() throws IOException, InterruptedException {
1366+
String filename = destinationFolder + "testWriteTTCNotEmbedded.pdf";
1367+
String cmpFilename = sourceFolder + "cmp_testWriteTTCNotEmbedded.pdf";
1368+
String title = "Empty iText 7 Document";
1369+
1370+
PdfWriter writer = new PdfWriter(filename);
1371+
writer.setCompressionLevel(CompressionConstants.NO_COMPRESSION);
1372+
PdfDocument pdfDoc = new PdfDocument(writer);
1373+
pdfDoc.getDocumentInfo().setAuthor(author).
1374+
setCreator(creator).
1375+
setTitle(title);
1376+
1377+
String font = fontsFolder + "uming.ttc";
1378+
1379+
PdfFont pdfTrueTypeFont = PdfFontFactory.createTtcFont(font, 0, PdfEncodings.WINANSI, false, false);
1380+
1381+
pdfTrueTypeFont.setSubset(true);
1382+
PdfPage page = pdfDoc.addNewPage();
1383+
PdfCanvas canvas = new PdfCanvas(page);
1384+
canvas
1385+
.saveState()
1386+
.beginText()
1387+
.moveText(36, 700)
1388+
.setFontAndSize(pdfTrueTypeFont, 72)
1389+
.showText("Hello world")
1390+
.endText()
1391+
.restoreState();
1392+
canvas.rectangle(100, 500, 100, 100).fill();
1393+
canvas.release();
1394+
page.flush();
1395+
1396+
byte[] ttc = StreamUtil.inputStreamToArray(new FileInputStream(font));
1397+
pdfTrueTypeFont = PdfFontFactory.createTtcFont(ttc, 1, PdfEncodings.WINANSI, false, false);
1398+
pdfTrueTypeFont.setSubset(true);
1399+
page = pdfDoc.addNewPage();
1400+
canvas = new PdfCanvas(page);
1401+
canvas
1402+
.saveState()
1403+
.beginText()
1404+
.moveText(36, 700)
1405+
.setFontAndSize(pdfTrueTypeFont, 72)
1406+
.showText("Hello world")
1407+
.endText()
1408+
.restoreState();
1409+
canvas.rectangle(100, 500, 100, 100).fill();
1410+
canvas.release();
1411+
1412+
pdfDoc.close();
1413+
1414+
Assert.assertNull(new CompareTool().compareByContent(filename, cmpFilename, destinationFolder, "diff_"));
13141415
}
13151416

13161417
@Test

0 commit comments

Comments
 (0)