我已经生成了一个PDF使用下面的PDF代码它工作正常,但是当我试图关闭时,它要求我保存。我已经分析了我的PDF代码来检测问题。我发现 startxref 偏移大小和 xref 偏移位置存在问题。我已经做了足够的更改,但我无法解决这个问题(你想要吗?)在关闭之前保存更改' xxx.pdf' 这是我的PDF代码
%PDF-1.4
%âãÏÓ
1 0 obj
<<
/Type/Catalog
/Pages 2 0 R
>>
endobj
2 0 obj
<<
/Type/Pages
/MediaBox[0 0 612.0 792.0]
/Count 1
/Kids [ 3 0 R ]
>>
endobj
3 0 obj
<<
/Type/Page
/Parent 2 0 R
/Resources 4 0 R
/Contents 5 0 R
>>
endobj
4 0 obj
<<
/ExtGState <</GS1 7 0 R>>
/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]
/Font<< /F1 8 0 R >>
>>
>>
endobj
5 0 obj
<</Length 44>>
stream
BT
/F1 18 Tf
0 g
1 0 0 1 100.0 400.0 Tm
(kersom) Tj
ET
endstream
endobj
6 0 obj<</Producer(Xxxxxxxx XXX Xxxxxxxx - 1.1)>>
endobj
7 0 obj
<</ca 0.35/CA 0.35>>
endobj
8 0 obj
<<
/Type /Font
/Subtype /Type1
/BaseFont /Helvetica
>>
endobj
xref
0 9
0000000000 65535 f
0000000015 00000 n
0000000063 00000 n
0000000148 00000 n
0000000228 00000 n
0000000340 00000 n
0000000442 00000 n
0000000499 00000 n
0000000535 00000 n
trailer
<<
/Info 6 0 R
/Root 1 0 R
/Size 9
>>
startxref
606
%%EOF
答案 0 :(得分:3)
以原始格式收到示例PDF后,问题立即变得清晰:交叉引用表中的偏移是正确的,但表本身未正确构建。
让我们看一下十六进制转储:
显然,交叉引用表中的每个条目大小为19个字节。
现在让我们看一下PDF规范:
每个条目的长度应为20个字节,包括行尾标记。 [...]使用中条目的格式应为:
nnnnnnnnnn ggggg n eol
其中:
nnnnnnnnnn shall be a 10-digit byte offset in the decoded stream ggggg shall be a 5-digit generation number n shall be a keyword identifying this as an in-use entry eol shall be a 2-character end-of-line sequence
[...] 2个字符的行结束序列,由以下之一组成:SP CR,SP LF或CR LF。因此,条目的总长度应始终精确为20字节
(ISO 32000-1的第7.5.4节交叉引用表)
因此,OP的PDF中的问题是每个交叉引用表条目的行尾序列只有一个字节, LF ,而它必须有一个2字节行结束序列, SP CR , SP LF 或 CR LF 。
这会使每个条目的一个字节太短,从而导致该表的查找返回完全破坏的字节序列。
答案 1 :(得分:2)
使用Adobe Reader保存表单并在二进制级别进行比较。你会发现一点点差异。例如:交叉引用表已重建,因为您没有考虑到“回车”和“回车”。人物,有空白,你没有期待它等等......
Adobe Reader还修复了以下错误:
4 0 obj
<<
/ExtGState <</GS1 7 0 R>>
/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]
/Font<< /F1 8 0 R >>
>>
>>
你有一个双字典在这里结束(删除>>
)一次。您已复制/粘贴的PDF中至少有一个错误。