0

我在 Oracle BI Publisher 中生成了一个 PDF。它包含一个图表和一些文本。尝试使用图像在文档上盖章时 - 添加了图像,但丹麦语字符被破坏。

我像这样运行 iText Stamp:

static void stampPdf() throws IOException, DocumentException {
    PdfReader reader = new PdfReader(PDF_SOURCE_FILE);
    PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(
            PDF_STAMPED_FILE));
    Image img = Image.getInstance(WATERMARK);
    img.setAbsolutePosition(10, 100);
    PdfContentByte under = stamper.getUnderContent(1);
    under.addImage(img);
    stamper.close();
}

结果,我收到以下消息:Document invalid。但是文档会显示,包括添加的图像。丹麦字符已被替换。

所有字体已从文档属性中删除。

有没有人见过这样的东西?我以前做过几次,没有问题。

4

1 回答 1

1

我查看了 PDF,这不是 iText 问题。这是一个“垃圾进,垃圾出”的问题。请在 Acrobat 中打开 PDF 并分析它的语法错误。您将收到以下消息:

垃圾进垃圾出

PDF 的内容流是错误的,即使 Acrobat 也无法分析它并告诉您哪里出了问题。

所以我查看了文件内部,当它看起来好像 iText 看不到页面的页面资源时。页面资源是指字体。如果 iText 看不到页面资源,则 iText 看不到字体,它们会在此过程中丢失。

如果 Acrobat 允许我“分析和修复”,那么我可以创建一个固定的 PDF 并比较修复的内容。但由于 Acrobat 无法修复该文件,因此手动检查完整文件以找出它到底有什么问题需要做很多工作。出于好奇,我在文本编辑器中打开了文档,然后发现:

4 0 obj
<<
/ProcSet [ /PDF /Text ]
/Font << 
/F1 7 0 R
/F2 8 0 R
/F3 11 0 R
>>
/Shading << 
/grad0 10 0 R
/grad0#2 15 0 R
/grad1#2 17 0 R
/grad2#2 19 0 R
/grad3#2 21 0 R
/grad4#2 23 0 R
/grad5#2 25 0 R
>>
>>
endobj

问题是由 names /grad0#2,/grad1#2等引起的……这些不是有效的名称。让我引用 ISO-32000-1:

在 PDF 文件中写入名称时,应使用 SOLIDUS (2Fh) (/) 来引入名称。SOLIDUS 不是名称的一部分,而是一个前缀,表示后面是代表 PDF 文件中名称的字符序列,并应遵循以下规则:

a) 名称中的数字符号 (23h) (#) 应使用其前面的数字符号的 2 位十六进制代码 (23) 写入。

b) 名称中作为常规字符的任何字符(数字符号除外)都应写为本身或使用其前面的数字符号的 2 位十六进制代码。

c) 任何不是常规字符的字符都应使用其 2 位十六进制代码写入,仅以数字符号开头。

在您的情况下,您有一个数字符号 (#),后跟一个 1 位数字。这没有任何意义。PDF 无效。

长话短说:联系 PDF 的制作者并要求他解决问题或不再使用他的工具。

于 2013-08-17T12:42:27.217 回答