You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何用Python提取PDF中的内嵌PDF?导出原文件问题求助

提取PDF内嵌PDF失败,导出后仍是原文件

我有一个仅包含1页和1个内嵌PDF附件的PDF文件,尝试多种Python方法提取内嵌PDF,但保存后得到的仍是包含内嵌文件的原PDF。带页面参数的方法会报错,试过Stack Overflow上的各类方案都出现相同问题,以下是试过的代码:

尝试过的代码1(检测到内嵌文件但导出错误)

import fitz  # PyMuPDF

doc = fitz.open(filepath_PDF)  # open the PDF
count = doc.embfile_count()
print("number of embedded files:", count)

if count > 0:
    buff = doc.embfile_get(0)
    with open("extracteddd.pdf", "wb") as fout:
        fout.write(buff)
    print("Extracted PDF saved.")
else:
    print("No embedded files found.")

尝试过的代码2(获取到二进制数据但导出错误)

import PyPDF2 as pf  

pdf = pf.PdfReader(filepath_PDF)  

catalog = pdf.trailer['/Root']  
fDetail = catalog['/Names']['/EmbeddedFiles']['/Names']  
soup = fDetail[1].get_object()  

file = soup['/EF']['/F'].get_data()

fout = open("testss.pdf", "wb")   # open output file
fout.write(file)
fout.close()

需要非手动的解决方案,其他编程语言也可接受。


解决方案1:先验证提取内容是否为有效PDF

先确认提取的字节流是否真的是目标PDF,在保存前检查开头是否为%PDF-(PDF文件的标准签名):

import fitz  # PyMuPDF

doc = fitz.open(filepath_PDF)
count = doc.embfile_count()
print("内嵌文件数量:", count)

if count > 0:
    buff = doc.embfile_get(0)
    # 验证是否为PDF文件
    if buff.startswith(b'%PDF-'):
        with open("extracted_embedded.pdf", "wb") as fout:
            fout.write(buff)
        print("内嵌PDF提取成功")
    else:
        print("提取到的内容不是PDF,可能原PDF的内嵌文件存储方式特殊")
        # 打印内嵌文件元数据,确认信息
        info = doc.embfile_info(0)
        print("内嵌文件元数据:", info)
else:
    print("未找到内嵌文件")

解决方案2:从页面注释中提取内嵌文件

部分PDF会把附件放在页面注释里,而非全局的EmbeddedFiles目录,试试用pdfrw处理:

from pdfrw import PdfReader, PdfWriter

reader = PdfReader(filepath_PDF)
# 遍历所有页面的注释
for page in reader.pages:
    if '/Annots' in page:
        for annot in page['/Annots']:
            annot_obj = annot.resolve()
            # 判断是否为文件附件注释
            if annot_obj.get('/Subtype') == '/FileAttachment':
                file_data = annot_obj['/FS']['/EF']['/F'].stream
                # 验证并保存
                if file_data.startswith(b'%PDF-'):
                    with open("extracted_from_annot.pdf", "wb") as f:
                        f.write(file_data)
                    print("从页面注释中提取到内嵌PDF")
                    exit()
print("未找到内嵌PDF")

解决方案3:使用命令行工具pdftk

如果Python方法无效,试试跨平台命令行工具pdftk,一键提取所有内嵌文件:

pdftk input.pdf unpack_files output extracted_*.pdf

执行后会生成extracted_开头的文件,其中就是你要的内嵌PDF。


内容的提问来源于stack exchange,提问作者ilia

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 06:33:21