Skip to content

Commit 1d23564

Browse files
committed
Fix issue with FontFile3 font stream subtype.
1 parent 9289afd commit 1d23564

File tree

9 files changed

+103
-8
lines changed

9 files changed

+103
-8
lines changed

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

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -451,10 +451,10 @@ private void flushFontData() {
451451
cffBytes = cff.Process(cff.getNames()[0]);
452452
}
453453
fontStream = getPdfFontStream(cffBytes, new int[]{cffBytes.length});
454+
fontStream.put(PdfName.Subtype, new PdfName("CIDFontType0C"));
454455
// The PDF Reference manual advises to add -cmap in case CIDFontType0
455456
getPdfObject().put(PdfName.BaseFont,
456457
new PdfName(String.format("%s-%s", fontName, cmapEncoding.getCmapName())));
457-
fontDescriptor.put(PdfName.Subtype, new PdfName("CIDFontType0C"));
458458
fontDescriptor.put(PdfName.FontFile3, fontStream);
459459
} else {
460460
byte[] ttfBytes;

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

Lines changed: 100 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -9,7 +9,14 @@
99
import com.itextpdf.io.font.TrueTypeFont;
1010
import com.itextpdf.io.font.Type1Font;
1111
import com.itextpdf.io.source.ByteArrayOutputStream;
12-
import com.itextpdf.kernel.font.*;
12+
import com.itextpdf.kernel.color.DeviceRgb;
13+
import com.itextpdf.kernel.font.PdfFont;
14+
import com.itextpdf.kernel.font.PdfFontFactory;
15+
import com.itextpdf.kernel.font.PdfTrueTypeFont;
16+
import com.itextpdf.kernel.font.PdfType0Font;
17+
import com.itextpdf.kernel.font.PdfType1Font;
18+
import com.itextpdf.kernel.font.PdfType3Font;
19+
import com.itextpdf.kernel.font.Type3Glyph;
1320
import com.itextpdf.kernel.pdf.PdfDictionary;
1421
import com.itextpdf.kernel.pdf.PdfDocument;
1522
import com.itextpdf.kernel.pdf.PdfOutputStream;
@@ -484,9 +491,9 @@ public void createDocumentWithTrueTypeFont1() throws IOException, InterruptedExc
484491
}
485492

486493
@Test
487-
public void createDocumentWithTrueTypeFont2() throws IOException, InterruptedException {
488-
String filename = destinationFolder + "DocumentWithTrueTypeFont2.pdf";
489-
String cmpFilename = sourceFolder + "cmp_DocumentWithTrueTypeFont2.pdf";
494+
public void createDocumentWithTrueTypeOtfFont() throws IOException, InterruptedException {
495+
String filename = destinationFolder + "DocumentWithTrueTypeOtfFont.pdf";
496+
String cmpFilename = sourceFolder + "cmp_DocumentWithTrueTypeOtfFont.pdf";
490497
final String title = "Empty iText 6 Document";
491498

492499
FileOutputStream fos = new FileOutputStream(filename);
@@ -538,6 +545,61 @@ public void createDocumentWithTrueTypeFont2() throws IOException, InterruptedExc
538545
Assert.assertNull(new CompareTool().compareByContent(filename, cmpFilename, destinationFolder, "diff_"));
539546
}
540547

548+
@Test
549+
public void createDocumentWithType0OtfFont() throws IOException, InterruptedException {
550+
String filename = destinationFolder + "DocumentWithType0OtfFont.pdf";
551+
String cmpFilename = sourceFolder + "cmp_DocumentWithType0OtfFont.pdf";
552+
final String title = "Empty iText 6 Document";
553+
554+
FileOutputStream fos = new FileOutputStream(filename);
555+
PdfWriter writer = new PdfWriter(fos);
556+
writer.setCompressionLevel(PdfOutputStream.NO_COMPRESSION);
557+
PdfDocument pdfDoc = new PdfDocument(writer);
558+
pdfDoc.getInfo().setAuthor(author).
559+
setCreator(creator).
560+
setTitle(title);
561+
562+
String font = fontsFolder + "Puritan2.otf";
563+
564+
PdfFont pdfFont = PdfFontFactory.createFont(font, "Identity-H");
565+
Assert.assertTrue("PdfType0Font expected", pdfFont instanceof PdfType0Font);
566+
pdfFont.setSubset(true);
567+
PdfPage page = pdfDoc.addNewPage();
568+
PdfCanvas canvas = new PdfCanvas(page);
569+
canvas
570+
.saveState()
571+
.beginText()
572+
.moveText(36, 700)
573+
.setFontAndSize(pdfFont, 72)
574+
.showText("Hello world")
575+
.endText()
576+
.restoreState();
577+
canvas.rectangle(100, 500, 100, 100).fill();
578+
canvas.release();
579+
page.flush();
580+
581+
byte[] ttf = Utilities.inputStreamToArray(new FileInputStream(font));
582+
pdfFont = PdfFontFactory.createFont(ttf, "Identity-H");
583+
Assert.assertTrue("PdfTrueTypeFont expected", pdfFont instanceof PdfType0Font);
584+
pdfFont.setSubset(true);
585+
page = pdfDoc.addNewPage();
586+
canvas = new PdfCanvas(page);
587+
canvas
588+
.saveState()
589+
.beginText()
590+
.moveText(36, 700)
591+
.setFontAndSize(pdfFont, 72)
592+
.showText("Hello world")
593+
.endText()
594+
.restoreState();
595+
canvas.rectangle(100, 500, 100, 100).fill();
596+
canvas.release();
597+
598+
pdfDoc.close();
599+
600+
Assert.assertNull(new CompareTool().compareByContent(filename, cmpFilename, destinationFolder, "diff_"));
601+
}
602+
541603
@Test
542604
public void testUpdateType3FontBasedExistingFont() throws IOException, InterruptedException {
543605
String inputFileName = sourceFolder + "type3Font.pdf";
@@ -1108,6 +1170,40 @@ public void testWriteTTC() throws IOException, InterruptedException {
11081170

11091171
}
11101172

1173+
@Test
1174+
@Ignore("Invalid subset")
1175+
public void NotoSansCJKjpTest() throws IOException, InterruptedException {
1176+
String filename = destinationFolder + "NotoSansCJKjpTest.pdf";
1177+
String cmpFilename = sourceFolder + "cmp_DocumentWithTTC.pdf";
1178+
1179+
PdfWriter writer = new PdfWriter(new FileOutputStream(filename));
1180+
PdfDocument doc = new PdfDocument(writer);
1181+
PdfPage page = doc.addNewPage();
1182+
// Identity-H must be embedded
1183+
PdfFont font = PdfFontFactory.createFont(sourceFolder + "NotoSansCJKjp-Bold.otf", "Identity-H");
1184+
//font.setSubset(false);
1185+
PdfCanvas canvas = new PdfCanvas(page);
1186+
canvas.saveState()
1187+
.setFillColor(DeviceRgb.GREEN)
1188+
.beginText()
1189+
.moveText(36, 700)
1190+
.setFontAndSize(font, 12)
1191+
.showText(pangramme)
1192+
.endText()
1193+
.restoreState();
1194+
canvas.saveState()
1195+
.setFillColor(DeviceRgb.RED)
1196+
.beginText()
1197+
.moveText(36, 680)
1198+
.setFontAndSize(font, 12)
1199+
.showText("1234567890")
1200+
.endText()
1201+
.restoreState();
1202+
1203+
doc.close();
1204+
Assert.assertNull(new CompareTool().compareByContent(filename, cmpFilename, destinationFolder, "diff_"));
1205+
}
1206+
11111207
@Test
11121208
public void testCheckTTCSize() throws IOException {
11131209
TrueTypeCollection collection = new TrueTypeCollection(fontsFolder + "uming.ttc", "WinAnsi");

pdfa/src/test/java/com/itextpdf/pdfa/PdfAFontTest.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -119,15 +119,14 @@ public void fontCheckPdfA1_04() throws IOException, XMPException {
119119
}
120120

121121
@Test
122-
@Ignore
123122
public void fontCheckPdfA1_05() throws IOException, XMPException {
124123
PdfWriter writer = new PdfWriter(new FileOutputStream(outputDir + "fontCheckPdfA1_05.pdf"));
125124
InputStream is = new FileInputStream(sourceFolder + "sRGB Color Space Profile.icm");
126125
PdfDocument doc = new PdfADocument(writer, PdfAConformanceLevel.PDF_A_1B, new PdfOutputIntent("Custom", "", "http://www.color.org", "sRGB IEC61966-2.1", is));
127126
doc.setXmpMetadata();
128127
PdfPage page = doc.addNewPage();
129128
// Identity-H must be embedded
130-
PdfFont font = PdfFontFactory.createFont(sourceFolder + "NotoSansCJKjp-Bold.otf", "Identity-H");
129+
PdfFont font = PdfFontFactory.createFont(sourceFolder + "NotoSansCJKtc-Light.otf", "Identity-H");
131130
PdfCanvas canvas = new PdfCanvas(page);
132131
canvas.saveState()
133132
.setFillColor(DeviceRgb.GREEN)
@@ -244,7 +243,7 @@ public void cidFontCheckTest3() throws XMPException, IOException, InterruptedExc
244243
doc.setXmpMetadata();
245244
PdfPage page = doc.addNewPage();
246245
// Identity-H must be embedded
247-
PdfFont font = PdfFontFactory.createFont(sourceFolder + "NotoSansCJKjp-Bold.otf", "Identity-H", true);
246+
PdfFont font = PdfFontFactory.createFont(sourceFolder + "NotoSansCJKtc-Light.otf", "Identity-H", true);
248247
PdfCanvas canvas = new PdfCanvas(page);
249248
canvas.saveState()
250249
.beginText()
Binary file not shown.
Binary file not shown.
Binary file not shown.

0 commit comments

Comments
 (0)