欢迎来到尧图网

客户服务 关于我们

您的位置:首页 > 健康 > 养生 > 处理 Markdown 转换过程中损坏的 PDF 文件

处理 Markdown 转换过程中损坏的 PDF 文件

2025/2/25 3:23:14 来源:https://blog.csdn.net/weixin_40941102/article/details/145701726  浏览:    关键词:处理 Markdown 转换过程中损坏的 PDF 文件

本文讨论了在使用 Python 和 markitdown 库将 PDF 文件转换为 Markdown 时遇到的常见问题,即遇到损坏或无效的 PDF 文件。我们将探讨问题、原因,并提供包含代码示例的强大解决方案。

问题:

在处理大量文件(尤其是 PDF 文件)时,您可能会遇到损坏、不完整或无效的 PDF 文档。尝试使用 pdfminer 等库(markitdown 依赖于它)转换这些文件将导致错误,从而停止转换过程,并可能导致脚本崩溃。常见的错误消息是 pdfminer.psexceptions.PSEOF: Unexpected EOF,表示 PDF 解析器意外到达文件末尾。

原因:

  • 下载不完整: PDF 文件可能只是部分下载或在传输过程中损坏。
  • 文件损坏: PDF 文件可能由于存储问题或其他不可预见的情况而损坏。
  • PDF 格式无效: 即使文件扩展名为 .pdf,该文件也可能不符合 PDF 规范。
  • 软件问题: 用于创建 PDF 的软件可能引入了错误。

解决方案:

关键是实施错误处理和验证,以优雅地跳过有问题的文件,并继续处理其余文件。以下是解决方案的详细信息:

  1. PDF 验证: 在尝试转换 PDF 之前,我们将实现一个函数来检查它是否是有效的 PDF。此函数将尝试使用 pdfminer 解析 PDF。如果解析失败,我们则认为 PDF 无效。

    from pdfminer.pdfparser import PDFParser
    from pdfminer.pdfdocument import PDFDocumentdef is_valid_pdf(filepath):try:with open(filepath, 'rb') as f:parser = PDFParser(f)doc = PDFDocument(parser)  # 尝试创建文档return Trueexcept Exception:  # 任何异常都意味着它可能无效return False
    
  2. 将验证集成到文件处理函数中: 我们将修改 find_ppt_and_pdf 函数以使用 is_valid_pdf 函数。

    import os
    from markitdown import MarkItDowndef find_ppt_and_pdf(directory):# ... (函数其余部分)for file in files:if file.endswith((".ppt", ".pptx", ".pdf")):full_path = os.path.join(root, file)if file.endswith(".pdf"):if not is_valid_pdf(full_path):print(f"跳过无效的 PDF:{full_path}")continue  # 跳到下一个文件# ... (文件处理代码的其余部分,包括有问题的文件的跳过)
    
  3. 处理转换过程中的异常: 我们将使用 try-except 块来捕获 markitdown 转换过程中的异常。这使我们能够处理错误而不会使脚本崩溃。

    try:md = MarkItDown()result = md.convert(full_path)# ...
    except Exception as e:print(f"处理 {full_path} 时出错:{e}")continue # 跳到下一个文件
    
  4. 解决有问题的文件的跳过: 由于路径分隔符不一致,原始代码尝试跳过特定文件存在缺陷。我们使用 os.path.normpath() 在比较之前对路径进行规范化,从而确保跨操作系统的一致行为。

    problematic_file = os.path.normpath('../../code/tensorflow-b2.4.0/bazelcache/bazel/_bazel_root/39de0dbcfb68c8735bd088c62fa061a4/external/snappy/testdata/paper-100k.pdf')
    if os.path.normpath(full_path) == problematic_file:print(f"跳过有问题的的文件:{full_path}")continue
    

完整代码:

import os
from markitdown import MarkItDown
from pdfminer.pdfparser import PDFParser
from pdfminer.pdfdocument import PDFDocumentdef is_valid_pdf(filepath):# ... (上面定义的函数)def find_ppt_and_pdf(directory):# ... (上面定义的函数,包含所有更改)if __name__ == "__main__":# ... (主执行块)

结论:

通过实施这些更改,您的脚本在处理潜在的 PDF 文件时将更加强大。验证步骤确保仅处理有效的 PDF,并且异常处理可防止错误导致转换过程停止。规范化的路径比较确保可以可靠地跳过特定文件。此方法使您可以有效地转换大量文件,即使其中一些文件已损坏或无效。

版权声明:

本网仅为发布的内容提供存储空间,不对发表、转载的内容提供任何形式的保证。凡本网注明“来源:XXX网络”的作品,均转载自其它媒体,著作权归作者所有,商业转载请联系作者获得授权,非商业转载请注明出处。

我们尊重并感谢每一位作者,均已注明文章来源和作者。如因作品内容、版权或其它问题,请及时与我们联系,联系邮箱:809451989@qq.com,投稿邮箱:809451989@qq.com

热搜词