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

如何将任意PDF转换为含元素坐标的结构化XML格式?

任意PDF转含坐标信息XML的解决方案

以下是针对需求的可行方案与工具库,涵盖从元素提取到XML生成的完整流程:

1. PyMuPDF(fitz)

这是Python生态中高效且兼容性极强的PDF处理库,能直接提取所有类型的PDF元素并附带精确坐标:

  • 核心能力:提取文本块(带bbox边界框,包含左上角X/Y坐标及宽高)、图片(带rect位置信息)、矢量图形(路径、线条等的坐标集合);支持遍历页面所有元素,保留层级关系。
  • 基础示例代码:
import fitz
import xml.etree.ElementTree as ET

root = ET.Element("pdf_document")
doc = fitz.open("input.pdf")

for page_num, page in enumerate(doc):
    page_elem = ET.SubElement(root, "page", number=str(page_num+1), width=str(page.rect.width), height=str(page.rect.height))
    
    # 提取文本块
    for block in page.get_text("dict")["blocks"]:
        if block["type"] == 0:  # 文本块
            text_elem = ET.SubElement(page_elem, "text", x=str(block["bbox"][0]), y=str(block["bbox"][1]), width=str(block["bbox"][2]-block["bbox"][0]), height=str(block["bbox"][3]-block["bbox"][1]))
            text_elem.text = " ".join([line["text"] for line in block["lines"]])
    
    # 提取图片
    for img in page.get_images():
        xref = img[0]
        img_rect = page.get_image_rects(xref)[0]
        img_elem = ET.SubElement(page_elem, "image", x=str(img_rect.x0), y=str(img_rect.y0), width=str(img_rect.width), height=str(img_rect.height), xref=str(xref))
    
    # 提取图形/绘图
    for drawing in page.get_drawings():
        draw_elem = ET.SubElement(page_elem, "graphic")
        for path in drawing["items"]:
            if path[0] == "l":  # 直线
                line_elem = ET.SubElement(draw_elem, "line", x1=str(path[1][0]), y1=str(path[1][1]), x2=str(path[1][2]), y2=str(path[1][3]))
            # 可扩展处理矩形、曲线等其他图形类型

tree = ET.ElementTree(root)
tree.write("output.xml", encoding="utf-8", xml_declaration=True)
  • 优势:纯Python实现,无需额外依赖Java,处理速度快,对复杂PDF支持良好;若需处理扫描版PDF,可结合Tesseract OCR将图像转成可提取的文本元素。

2. PDFBox(Java + Python wrapper)

Apache开源的专业PDF处理库,对PDF元素的解析深度更高,适合处理复杂文档:

  • 核心能力:支持提取文本(带字符级坐标)、表格、图片、矢量图形,能保留元素的Z-order层级;可通过Python的pdfbox模块调用。
  • 基础使用:
    1. 安装依赖:pip install pdfbox(需提前安装Java环境)
    2. 提取元素后自行组织XML结构,可通过其API获取每个元素的边界框、位置属性。
  • 优势:原生支持PDF规范的所有元素类型,对特殊格式PDF(如内嵌复杂图形、加密文档)兼容性更好。

3. 组合工具(Tabula-py + PyMuPDF)

如果需要精准提取表格结构与坐标,可结合专用工具:

  • Tabula-py:专门用于提取PDF表格,能返回表格的整体边界框及每个单元格的位置、内容;
  • 配合PyMuPDF提取文本、图形、图片,最后将所有元素数据整合到XML中。

XML生成通用规范

建议按以下结构组织XML,确保信息清晰:

<pdf_document>
  <page number="1" width="595" height="842">
    <text x="100" y="200" width="300" height="20">示例文本内容</text>
    <image x="150" y="300" width="200" height="150" xref="5"/>
    <table x="100" y="400" width="400" height="100">
      <cell x="100" y="400" width="100" height="25">单元格1</cell>
    </table>
    <graphic>
      <line x1="100" y1="500" x2="500" y2="500"/>
    </graphic>
  </page>
</pdf_document>

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 17:05:19