(手动创建简单PDF使用PDF参考-1.7)Adobe Reader席要求在关闭PDF时保存?

(手动创建简单PDF使用PDF参考-1.7)Adobe Reader席要求在关闭PDF时保存?,pdf,pdf-generation,adobe-reader,Pdf,Pdf Generation,Adobe Reader,我使用以下PDF代码生成了一个PDF,它工作正常,但当我试图关闭时,它要求我保存。我分析了我的PDF代码以检测问题。我已确定开始外部参照偏移大小和外部参照偏移位置中存在问题。我已做了足够的更改,但无法解决此问题(是否要在关闭前保存更改“xxx.pdf”)。 这是我的PDF代码 %PDF-1.4 %âãÏÓ 1 0 obj << /Type/Catalog /Pages 2 0 R >> endobj 2 0 obj << /Type/Pages /MediaB

我使用以下PDF代码生成了一个PDF,它工作正常,但当我试图关闭时,它要求我保存。我分析了我的PDF代码以检测问题。我已确定开始外部参照偏移大小和外部参照偏移位置中存在问题。我已做了足够的更改,但无法解决此问题(是否要在关闭前保存更改“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
%PDF-1.4
%âãÏÓ
10 obj
>
endobj
20 obj
>
endobj
30 obj
>
endobj
40 obj
>>
>>
endobj
50 obj
流动
英国电信
/F1 18 Tf
0克
1001100.0400.0TM
(kersom)Tj
ET
尾流
endobj
60 obj
endobj
70 obj
endobj
80 obj
>
endobj
外部参照
0 9
0000000000 65535 f
00000000150万元
00000000 6300000N
0000000 148 00000 n
0000000 228 00000 n
0000000 34000000n
0000000 4420 00000N
000000049900000N
0000000 5350 00000n
拖车
>
起始外部参照
606
%%EOF

使用Adobe Reader保存表单,并在二进制级别进行比较。你会发现一点不同。例如:交叉引用表被重建,因为您没有考虑“回车”字符,在您没有预料到的地方有空白,等等

Adobe Reader还修复了以下错误:

4 0 obj
<<
/ExtGState <</GS1 7 0 R>>
/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]
/Font<< /F1 8 0 R >>
>>
>>
40对象
>>
>>

您有一个以此处结尾的双字典(删除
>
)一次。这是您复制/粘贴的PDF中的至少一个错误。

使用Adobe Reader保存表单,并在二进制级别进行比较。你会发现一点不同。例如:交叉引用表被重建,因为您没有考虑“回车”字符,在您没有预料到的地方有空白,等等

Adobe Reader还修复了以下错误:

4 0 obj
<<
/ExtGState <</GS1 7 0 R>>
/ProcSet[/PDF/Text/ImageB/ImageC/ImageI]
/Font<< /F1 8 0 R >>
>>
>>
40对象
>>
>>

您有一个以此处结尾的双字典(删除
>
)一次。这是您复制/粘贴的PDF中的至少一个错误。

收到原始格式的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
[…]由以下内容之一组成的两个字符的行尾序列:SP CR、SP LF或CR LF。因此,条目的总长度应始终正好为20字节

(第7.5.4节的交叉参考表)

因此,OP的PDF中的问题是,每个交叉引用表条目只有一个字节的行尾序列,即LF,而它必须有一个2字节的行尾序列,或者SP CRSP LF,或者CR LF


这使得每个条目都短了一个字节,这反过来会导致从该表中查找返回完全断裂的字节序列。

收到原始格式的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
[…]由以下内容之一组成的两个字符的行尾序列:SP CR、SP LF或CR LF。因此,条目的总长度应始终正好为20字节

(第7.5.4节的交叉参考表)

因此,OP的PDF中的问题是,每个交叉引用表条目只有一个字节的行尾序列,即LF,而它必须有一个2字节的行尾序列,或者SP CRSP LF,或者CR LF


这使得每个条目都短了一个字节,这反过来会导致从该表中查找返回完全中断的字节序列。

请以二进制形式提供该文件。在您提供的文本形式中,不清楚在何处使用了哪些空格(尤其是哪一行结束)。因此,startxref偏移大小和外部参照偏移位置中的问题无法在该表单中解决。@mkl:对不起!请忍受我的不便。我不明白“文件是二进制的”。您希望我上载PDF文件(或)将PDF转换为流。上载PDF文件,具体取决于您的文件服务器,请确保您不在文本模式下进行上载(如果使用ftp上载,请使用二进制模式)@mkl:我已将PDF文件共享给以下邮件ID:mkl@wir-很酷。我明天会看的。请提供二进制文件。在您提供的文本形式中,不清楚在何处使用了哪些空格(尤其是哪一行结束)。因此,startxref偏移大小和外部参照偏移位置中的问题无法在该表单中解决。@mkl:对不起!请忍受我的不便。我不明白“文件是二进制的”。您希望我上载PDF文件(或)将PDF转换为流。上载PDF文件,具体取决于您的文件服务器,请确保您不在文本模式下进行上载(如果使用ftp上载,请使用二进制模式)@mkl:我已将PDF文件共享给以下邮件ID:mkl@wir-sind cool.orgI明天再看。:我更正了错误,但正如你所说的,这是错误之一。我正在使用缓冲写入器写入PDF文件,以便知道文件中的字符位置和内容。我希望我正在计算所有对象的偏移量包含我所知的字符。1.什么是回车字符?2.在什么情况下,p