2

我需要使用 iText 创建一些简单但符合 PDF/A-1b 的 PDF 文件。

我的第一种方法如下所示:

Document document = new Document(Pagesize.A4); 
ByteArrayOutputStream pdfBuffer = new ByteArrayOutputStream); 

PdfAWriter pdfAWriter 
  = PdfAWriter.geInstance (document, pdfBuffer, PdfAConformanceLevel.PDFA_1B);
pdfAWriter.createXmpMetadata();

Font fixedFont = FontFactory.getFont("Courier New", BaseFont.CP1252, BaseFont.EMBEDDED, 10, Font.NORMAL); 

document.open();

Chunk chunk = new Chunk("Hello World", fixedFont);
Paragraph paragraph = new Paragraph(chunk); 
document.add(paragraph);  

document.close();

// this is pseudo code to transfer the Buffer to a real file
writeByteArrayToFile(pdfBuffer.toByteArray());

Thos 代码生成错误消息:

必须嵌入所有字体。这不是:Helvetica

环顾四周,我发现 Helvetica 是 iTextn 的默认文档字体,无法更改,这是默认情况下不嵌入的基本 PDF 字体,只有当我有 Helvetica pfb 或 ttf 文件时才能嵌入它(我没有也不想购买,因为我根本不打算在我的文档中使用该字体)。

我的 PDF 中根本不需要任何 Helvetica 文本。我需要生成 PDF/A-1b,它需要嵌入所有字体,包括 PDF Base Fonts。

那么这是一个Bug吗?如果没有可用的 Helvetica 字体文件,使用 iText 生成 PDF/A 的正确方法是什么?

4

1 回答 1

1

我的第一反应与@rekire 的评论一致:这是一个非常奇怪的问题。PDF/A 文件的一项必要要求是嵌入每种字体。现在您要的是不嵌入字体(如 Helvetica)的 PDF/A 文档。那将是一份没有任何文字的文件。

您没有对此反应作出回应,但可能的答复是:如果您查看我的代码,您会清楚地看到我没有使用 Helvetica,我使用的是"Courier New". 如果我使用 Courier New,为什么需要 Helvetica?

这是我的第二反应:你没有使用Courier New!这条线是不够的:

Font fixedFont = FontFactory.getFont("Courier New", BaseFont.CP1252, BaseFont.EMBEDDED, 10, Font.NORMAL);

我没有看到你courier.ttf在任何地方注册。因此 iText 不知道在哪里可以找到 Courier New。它使用 Helvetica 代替。当我在 StackOverflow 上查阅 The Best iText Questions(我强烈推荐的一本书)时,我发现了以下问题:

这些问题的答案解释了您的示例中出了什么问题。请注意,您会在iText 官方网站的沙箱中找到一些完整的 PDF/A 示例。

于 2015-01-22T15:10:38.573 回答