我在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();
}
因此,我收到以下消息:文档无效。但是文档显示,包括添加的图像。丹麦人物已被取代。
所有字体都已从文档属性中删除。
有没有人见过这样的东西?我以前做了好几次,没有问题。
答案 0 :(得分: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
问题是由名称/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制作人并要求他解决问题或再也不要使用他的工具。