我需要使用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 Code生成错误消息:
必须嵌入所有字体。这个不是:Helvetica
环顾四周,我发现Helvetica是iTextn的默认文档字体,无法更改,这是一个默认情况下未嵌入的基本PDF字体,如果我有一个Helvetica pfb或ttf,我只能嵌入它文件(我没有也不想购买,因为我不打算在我的文档中使用该字体)。
我的PDF中根本不需要任何Helvetica文本。我需要生成PDF / A-1b,它需要嵌入包括PDF基本字体在内的所有字体。
这是一个Bug吗?如果没有可用的Helvetica字体文件,使用iText生成PDF / A的正确方法是什么?
答案 0 :(得分:1)
我的第一反应是与@rekire的评论一致:这是一个非常奇怪的问题。 PDF / A文件的一个迫切要求是嵌入每种字体。现在,您需要一个PDF / A文档,而不需要嵌入Helvetica等字体。那将是一份没有任何文字的文件。
你没有回应这个反应,但可能的答案可能是:如果你查看我的代码,你清楚地看到我没有使用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代替。当我咨询The Best iText Questions on StackOverflow(我强烈推荐的一本书)时,我发现了以下问题:
这些问题的答案解释了你的例子中出了什么问题。请注意,您可以在官方iText网站的sandbox中找到一些完整的PDF / A示例。