【问题标题】:How to define a default font to create a PDF with a PdfPTable and the PdfAWriter class from iText 5.3.3 library如何定义默认字体以使用 iText 5.3.3 库中的 PdfPTable 和 PdfAWriter 类创建 PDF
【发布时间】:2012-11-11 17:49:48
【问题描述】:

我正在使用 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)

【问题讨论】:

    标签: fonts itext pdfptable


    【解决方案1】:

    你的代码有不同的错误,字体不是最大的问题。

    我尽可能地复制/粘贴了您的代码:http://itextsupport.com/files/stackoverflow/PdfATest.java

    • 我不得不更改字体,因为我的 PC 上没有 NewYorker.ttf。
    • 我没有嵌入完整的字体;这似乎有点矫枉过正。
    • 我添加了一行来创建 XMP 数据(这在 PDF/A 中是强制性的)。
    • 我添加了一个颜色配置文件(也是必需的;我选择了sRGB)。

    我运行了代码,它没有抛出任何异常。你可以自己查看结果:http://itextsupport.com/files/stackoverflow/pdfa.pdf

    当然:如果您看到蓝色条显示 这是 PDF/A1b,请不要相信 Adob​​e Reader。您需要在 Preflight 工具中检查一致性,如下图所示:

    我的猜测:

    • 也许您认为“new yorker”是字体的实际 PostScript 名称是错误的。
    • 为什么使用“UTF-8”作为编码。文档明确指出,如果要使用 Unicode,则需要使用 Identity-H。

    我无法重现您的问题,因此建议您尝试运行我的代码。

    【讨论】:

    • 顺便说一句,通常这将是一个付费支持问题(您使用的是 iText 的 AGPL 版本),但无论如何我都进行了调查,因为您的问题指向了错误的方向。我想确保自己不是,我想我也可以免费分享我的发现;-)
    • 谢谢,现在可以使用了。我不知道 XMP 数据和颜色配置文件在 PDF/A 中也是必需的...
    • 好的,请采纳。这样一来,您的接受率就会提高,人们会更愿意回答您的问题。
    • 你能看看这里的问题吗? stackoverflow.com/q/52736441/3169868
    • @BrunoLowagie 您能否更新此答案中提供的代码链接?
    猜你喜欢
    • 2015-08-23
    • 1970-01-01
    • 1970-01-01
    • 2011-11-23
    • 1970-01-01
    • 2011-06-23
    • 2014-08-25
    • 2015-10-18
    • 1970-01-01
    相关资源
    最近更新 更多