













我们需要从两个维度来看:一个是PDF文件本身的标准/版本,另一个是内容的构成方式。
以下是详细的分类说明:
PDF 格式由 Adobe 公司制定,随着时间的推移,发布了不同的版本标准,每个版本支持的功能不同:
这决定了 PDF 内部的数据结构。虽然后缀名都是 .pdf,但内部原理截然不同:
pdfplumber 或 pymupdf 直接提取文本。pytesseract, paddleocr)识别才能获取文字。
import fitz # pip install pymupdf
def analyze_pdf_content(pdf_path):
"""
综合判断 PDF 类型
返回: 类型字符串和详细信息
"""
try:
doc = fitz.open(pdf_path)
page = doc[0] # 分析第一页
# 1. 尝试提取文本
text = page.get_text("text")
text_len = len(text.strip())
# 2. 获取图片列表
image_list = page.get_images()
image_count = len(image_list)
# 3. 判断逻辑
result = {}
# 阈值设定:如果文本字符数超过 100,基本确定有文字层
TEXT_THRESHOLD = 100
if text_len > TEXT_THRESHOLD:
result['type'] = "矢量 PDF (Text-based)"
result['reason'] = f"检测到文本层 (字符数: {text_len})"
else:
# 文本很少,检查是否是纯图片
if image_count > 0:
result['type'] = "图像型 PDF (Image-based)"
result['reason'] = f"文本极少 (字符数: {text_len}) 且包含 {image_count} 张图片"
else:
# 文本很少,也没图片,可能是矢量绘图(如CAD图)或空白页
result['type'] = "其他类型 (可能是纯矢量图形或空白)"
result['reason'] = f"文本极少且无图片"
result['text_length'] = text_len
result['image_count'] = image_count
doc.close()
return result
except Exception as e:
return {"type": "Error", "reason": str(e)}
# ================= 使用示例 =================
if __name__ == "__main__":
# 这里替换成你的文件路径
# pdf_file = "test_word.pdf"
# pdf_file = "test_scan.jpg.pdf"
# 为了演示,我们假设文件存在,你可以取消注释运行
# info = analyze_pdf_content(pdf_file)
# print(f"文件类型: {info['type']}")
# print(f"判断依据: {info['reason']}")
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。