是否有任何解决方案(最好是Python)可以修复外部参照表损坏的pdf?
我有一个 pdf,我尝试在 Ghostscript 中将其转换为 png,但收到以下错误:
**** 错误:读取 XREF 表时发生错误。 **** 文件已损坏。 这可能是由于 **** 转换或传输文件时出现问题。
但是,我可以在 Mac 上的“预览”中打开 pdf,并且当我使用“预览”导出 pdf 时,我可以转换导出的 pdf。
有没有办法修复pdf文件而无需手动打开并导出它们?
如果文件在 Ghostscript 中按预期呈现,那么您可以通过 GS 将其运行到 pdfwrite 设备并创建一个不会损坏的新 PDF 文件。
预览(就像 Acrobat)几乎肯定会在后台默默地修复问题。 Ghostscript 也会做同样的事情,但与其他应用程序不同,我们认为您需要知道该文件有问题。首先,这样您就知道它已损坏,其次,如果文件在 Ghostscript(或者实际上是其他应用程序)中渲染不正确,您就知道原因。
请注意,外部参照损坏有两个主要原因;首先,应用程序的开发人员没有足够仔细地阅读规范,并且外部参照中的文件偏移量是正确的,但格式不正确(这种情况并不罕见,GS 的修复将是无害的),其次,该文件确实已被修复。在运输过程中或因编辑而损坏。
在后一种情况下,可能会出现其他问题,Ghostscript 也会尝试警告您这些问题。如果您没有收到任何其他警告或错误,那么它可能只是一个格式错误的外部参照表。
免责声明我是本答案中使用的库
borb
的作者
只需在
borb
中打开并写入 PDF 即可修复一些损坏的 PDF 文档(包括修复损坏的 XREF)。
from borb.pdf import Document
from borb.pdf import PDF
from pathlib import Path
import typing
def fix_pdf(in_path: Path, out_path: Path) -> None:
doc: typing.Optional[Document] = None
with open(in_path, "rb") as fh:
doc = PDF.loads(fh)
with open(out_path, "wb") as fh:
PDF.dumps(fh, doc)
borb
是一个开源的纯Python PDF库,用于创建、修改和读取PDF文档。您可以使用以下方式下载:
pip install borb
或者,您可以通过分叉/下载 GitHub 存储库来从源代码构建。
import os
from PyPDF2 import PdfReader, PdfWriter
def repair_pdf(input_file, output_file):
try:
# Încercăm să citim PDF-ul
reader = PdfReader(input_file)
writer = PdfWriter()
# Copiem toate paginile în noul document
for page in reader.pages:
writer.add_page(page)
# Scriem noul PDF
with open(output_file, 'wb') as f:
writer.write(f)
print(f"PDF reparat cu succes: {input_file} -> {output_file}")
except Exception as e:
print(f"Eroare la repararea PDF-ului {input_file}: {str(e)}")
def process_directory(input_dir, output_dir):
for root, _, files in os.walk(input_dir):
for file in files:
if file.lower().endswith('.pdf'):
input_file = os.path.join(root, file)
output_file = os.path.join(output_dir, f"repaired_{file}")
repair_pdf(input_file, output_file)
# Directorul de intrare și ieșire
input_dir = "D:\\3"
output_dir = "D:\\"
# Ne asigurăm că directorul de ieșire există
os.makedirs(output_dir, exist_ok=True)
# Procesăm toate fișierele PDF din directorul de intrare
process_directory(input_dir, output_dir)
print("Procesarea tuturor fișierelor PDF a fost finalizată.")
我知道我已经迟到了,但是,如果你尝试...
cat my.pdf > temp.pdf && hexdump temp.pdf > newpdf.pdf
或
zip my.pdf && unzip my.pdf
如果您在...中打开文档
utf-8读取模式
...那么您可能更改了一些关键字节,特别是八进制 011、十六进制 0A、十进制 10...这些是换行符或 “新行” 字符,它们对于ascii 编码的文档。
您可以使用 hexdump 对八进制或十六进制行字符串进行十六进制转储,在文档中全面搜索错误的换行符并将其更改回 ascii 换行符。 请务必以encoding='ascii' 或字节模式打开文档。你必须拿出一个字符矩阵...
如果听说有人只是用 zip 压缩文件并解压缩它也可以解决这个问题。
每当在 pdf 中摆弄时,请先制作一个新副本,然后再摆弄它。
TL;博士
on line 17 of your document
you hit a << or ascii 'Line/page Separator' character.
The guilleme or double chevron isnt used for
that in UTF-8, your reader panicked and raised an error
PDF是用postscript写的。如果你想学习如何疯狂地处理 pdf,我建议你学习 postscript。 这个禁止的文字是一个好的开始