标记文件时 - 丹麦字符消失,PDF无效

时间:2013-08-05 13:31:32

标签: itext

我在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();
}

因此,我收到以下消息:文档无效。但是文档显示,包括添加的图像。丹麦人物已被取代。

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

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

1 个答案:

答案 0 :(得分:1)

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

Garbage In, Garbage Out

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

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

  

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

     

a)名称中的数字标志(23h)(#)应使用其编写   2位十六进制代码(23),前面是NUMBER SIGN。

     

b)名称中的任何字符都是常规字符(NUMBER除外)   SIGN)应自行编写或使用其2位十六进制编写   代码,前面有NUMBER SIGN。

     

c)任何不是a的角色   常规字符应使用其2位十六进制代码编写,   仅以NUMBER SIGN开头。

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

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