如何用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
相关产品推荐
相关产品推荐

