修复外部参照表损坏的 pdf

问题描述 投票:0回答:4

是否有任何解决方案(最好是Python)可以修复外部参照表损坏的pdf?

我有一个 pdf,我尝试在 Ghostscript 中将其转换为 png,但收到以下错误:

**** 错误:读取 XREF 表时发生错误。 **** 文件已损坏。 这可能是由于 **** 转换或传输文件时出现问题。

但是,我可以在 Mac 上的“预览”中打开 pdf,并且当我使用“预览”导出 pdf 时,我可以转换导出的 pdf。

有没有办法修复pdf文件而无需手动打开并导出它们?

python pdf ghostscript
4个回答
3
投票

如果文件在 Ghostscript 中按预期呈现,那么您可以通过 GS 将其运行到 pdfwrite 设备并创建一个不会损坏的新 PDF 文件。

预览(就像 Acrobat)几乎肯定会在后台默默地修复问题。 Ghostscript 也会做同样的事情,但与其他应用程序不同,我们认为您需要知道该文件有问题。首先,这样您就知道它已损坏,其次,如果文件在 Ghostscript(或者实际上是其他应用程序)中渲染不正确,您就知道原因。

请注意,外部参照损坏有两个主要原因;首先,应用程序的开发人员没有足够仔细地阅读规范,并且外部参照中的文件偏移量是正确的,但格式不正确(这种情况并不罕见,GS 的修复将是无害的),其次,该文件确实已被修复。在运输过程中或因编辑而损坏。

在后一种情况下,可能会出现其他问题,Ghostscript 也会尝试警告您这些问题。如果您没有收到任何其他警告或错误,那么它可能只是一个格式错误的外部参照表。


3
投票

免责声明我是本答案中使用的库

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 存储库来从源代码构建。


0
投票
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ă.")

-3
投票

我知道我已经迟到了,但是,如果你尝试...

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。 这个禁止的文字是一个好的开始

© www.soinside.com 2019 - 2024. All rights reserved.