我正在使用 iText 5.3.3 库,我不想使用 PdfAWriter 类创建 PDF,该类需要指定必须遵守的合规性级别。
我不想在我的文档中添加 PdfPTable,但由于此错误,我无法做到这一点:“必须嵌入所有字体。这不是:Helvetica”。
我认为这个问题是因为当我们想用 PDFAConformanceLevel 制作 PDF 时,我们必须嵌入我们使用的字体;这就是我所做的,但在某些情况下,似乎使用了默认字体:Helvetica,并且此默认字体未嵌入且无法嵌入!当我们添加新行、空行、新页面或使用 PdfPTable 等元素时,就会发生这种情况。
我认为当我们使用 PdfPTable 之类的元素时,它必须是一种定义要使用的默认字体的方法;我听说有人设法通过定义一个新的 Chunk 构造函数来做到这一点,但我不知道该怎么做......有人有想法吗?
在这里你可以找到我的代码......我已经简化了它的目的:
我用这段代码定义了 2 种嵌入字体:
FontFactory.register("c:/NewYorker.ttf");
baseFont = (FontFactory.getFont("new yorker","UTF-8",BaseFont.EMBEDDED)).getBaseFont();
baseFont.setSubset(true);
BOLD = new Font(timesbd, 12);
NORMAL = new Font(times, 12);
我使用这些字体在 3 个单元格中添加 3 个段落以放入一个表格中:
Document document = new Document();
PdfAWriter writer = PdfAWriter.getInstance(document, new FileOutputStream(filename), PdfAConformanceLevel.PDF_A_1B);
document.open();
float[] columnWidths = { 3.5f, 4.5f, 2.8f };
PdfPTable table = new PdfPTable(columnWidths);
PdfPCell defaultCell = table.getDefaultCell();
defaultCell.setPhrase(new Phrase("",NORMAL));
table.setWidthPercentage(90);
table.setHorizontalAlignment(Element.ALIGN_RIGHT);
PdfPCell cell1 = new PdfPCell(new Phrase("test 1",BOLD));
PdfPCell cell2 = new PdfPCell(new Phrase("test 2",NORMAL));
PdfPCell cell3 = new PdfPCell(new Phrase("test 3",NORMAL));
cell1.setBorder(0);
cell2.setBorder(0);
cell3.setBorder(0);
cell1.setIndent(27);
cell2.setIndent(27);
cell3.setIndent(27);
cell1.setLeading(4.5f, 1);
cell2.setLeading(4.5f, 1);
cell3.setLeading(4.5f, 1);
table.addCell(cell1);
table.addCell(cell2);
table.addCell(cell3);
document.add(table);
document.close();
当我执行我的代码时,我有这个堆栈:
Exception in thread "main" com.itextpdf.text.DocumentException: com.itextpdf.text.pdf.PdfAConformanceException: All the fonts must be embedded. This one isn't: Helvetica
at com.itextpdf.text.pdf.PdfDocument.add(PdfDocument.java:708)
at com.itextpdf.text.Document.add(Document.java:260)
at test.MainClass.createPdfA(MainClass.java:163)
at test.MainClass.main(MainClass.java:68)