以原始文本形式打开并保存后 PDF 损坏

以原始文本形式打开并保存后 PDF 损坏

我在普通文本编辑器中打开了一个 PDF,更改了一行文本,然后再次保存。这似乎导致某些元数据损坏,我不知道如何恢复它。我仍然可以在文本编辑器中打开它,但以 PDF 形式打开它只会显示空白页。

有什么方法可以修复这个文件吗?

答案1

回家写一百遍“PDF 不是文本格式,绝对不能用文本编辑器或文字处理器来编辑!”

PDF 是一种复杂的基于对象的文档格式,它依赖于“目录”(又称外部参照表),该表指向文件中的确切位置。当您在文本编辑器中更改某些内容时,您很可能会在编辑后移动所有内容,从而使外部参照表指向错误的位置。

运行良好的 PDF 查看器会尝试修复此类问题,但很快就会遇到局限性。

此外,您的文本编辑器很可能也弄乱了二进制块,其中一个字节恰好对应于一个行尾字符。……并且您已成功损坏了 PDF,无法修复……

因此,建议您使用备份版本,这是有关您的文件的最佳建议。

答案2

你可以这样做

转到曾经包含该文件或文件夹的文件夹,右键单击它,然后单击恢复以前的版本。

您将看到文件或文件夹的可用先前版本的列表。该列表将包括备份中保存的文件

选择您想要的一个就可以了。

下次如果你要编辑元数据或类似内容,请务必创建备份副本

答案3

PDF 文件是对象列表,对象之后有一个 xref 表,其中包含从文件开头指向每个对象的指针。您可以编辑文本并保持完全相同的字符数,而无需更新指针。或者,如果您更改/添加/删除文本,则必须在您添加的文本之后更新表中的每个 xref 指针以及更新 startxref 指针。这有点棘手,尤其是对于大文件,但这是可行的。

请参阅下面的示例 .pdf xref 表,值是十进制。第一个对象在文件中占 58 个字节,下一个是 346,等等。

xref
0 5
0000000000 65535 f
0000000058 00000 n
0000000346 00000 n
0000000558 00000 n
0000000705 00000 n
0000000782 00000 n

另请参阅必须更新 startxref 指针,xref 表的“xref”起始位于文件起始处 1193 字节处。

startxref
1193

如果这里有指针错误,请原谅!感谢@KJ 指出这些错误,我认为我已经在下面为 uniz 更正了它们。如果使用 windows/dos 行尾,请参阅下面的 xref 表和 startxref 指针值,它们应该适用于此示例。

示例文件 - 测试成功,可将其复制到本地文件并解析为 PDF。使用 evince 测试了 DUH,效果很好,但实际上修复了损坏的外部参照表并忽略了大小错误。很聪明。但就我而言,这不是一次好的测试。抱歉!

如果您更改了 startxref 以下的任何内容,则不必更新任何指针。

如果超过这个值,您就必须调整指针。

%PDF-1.6

% First object defines a stream with red square
1 0 obj
<<
    /Length 54
>>
stream
1 0 0 RG
5 w
100 100 m
200 100 l
200 200 l
100 200 l
s
endstream
endobj

% The second object. Page containing object 1 red square.
% The "R" means "Reference", and `1 0 R` is saying "look at object number 1 0
% It also points to a "Pages" object `3 0 R`.
2 0 obj
<<
    /Type /Page
    /Parent 3 0 R
    /MediaBox [0 0 320 500]
    /Contents [1 0 R]               
>>
endobj

% The third object. "Pages" object. The `2 0 R` is reference to the "Page" object. 1 page in this doc.
3 0 obj
<<
    /Type /Pages
    /Kids [2 0 R ]
    /Count 1
>>
endobj

% The fourth object. A "Catalog" object that provides the main structure of the PDF.
4 0 obj
<<
    /Type /Catalog
    /Pages 3 0 R
>>
endobj

% A fifth object - title
5 0 obj
<<
    /Title (Test PDF Title)
    /Producer (James hand edit emacs FTW)
>>
endobj

% The xref table. Lookup table, lists all the objects with pointer from start of file (emacs count-words-region helps fix up).
% (defun wh/byte-offset-at-point () "Report the byte offset (0-indexed) in the file corresponding to the position of point." (interactive) (message "byte offset: %d" (1- (position-bytes (point)))))
xref
0 5
0000000000 65535 f
0000000058 00000 n
0000000349 00000 n
0000000573 00000 n
0000000729 00000 n
0000000812 00000 n

% The trailer contains some metadata about the PDF.
%   - There are 4 entries in the `xref` table.
%   - The root of the document is object 4 (the "Catalog" object)
trailer
<<
    /Size 5
    /Root 4 0 R
    /Info 5 0 R
>>

% The startxref marker tells us that we can find the xref table ? bytes after the start of the file.
startxref
1229

% WE can add any comments below here without need to adjust pointers. 
% From https://alexwlchan.net/2024/big-pdf/?utm_source=tldrnewsletter
% "it got very fiddly to redo all the lookup tables!"
% https://help.callassoftware.com/a/798383-how-to-create-a-simple-pdf-file
% https://superuser.com/questions/300405/is-it-possible-to-edit-a-pdf-file-directly
% https://www.oreilly.com/library/view/pdf-explained/9781449321581/ch04.html
% https://superuser.com/questions/1045351/pdf-corrupt-after-opening-and-saving-in-raw-text

% The end-of-file marker.
%%EOF

请注意,如果将其复制到使用 dos 样式行尾的 windows/dos 编辑器中,您将必须调整指针,以便 xref 表变成这样:

xref
0 5
0000000000 65535 f
0000000061 00000 n
0000000370 00000 n
0000000604 00000 n
0000000769 00000 n
0000000860 00000 n

并且startxref指针变成这样:

startxref
1286

例如:https://alexwlchan.net/2024/big-pdf/?utm_source=tldrnewsletter“重新做所有的查找表变得非常麻烦!”

他从这里得到了它:https://help.callassoftware.com/a/798383-how-to-create-a-simple-pdf-file

有用参考:https://www.oreilly.com/library/view/pdf-explained/9781449321581/ch04.html

相关内容