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

如何在Microsoft Azure Document Intelligence生成的可搜索PDF中替换或屏蔽文本?

基于Azure Document Intelligence修改PDF内容并保留原结构

要实现分析result文本后替换/屏蔽内容并保留原PDF结构,你需要结合Azure Document Intelligence的布局定位能力,搭配Python PDF处理库(如PyMuPDF)完成,具体步骤如下:

核心思路

Azure Document Intelligence返回的AnalyzeResult包含每个文本块的精确坐标(位置、大小),利用这些定位信息,你可以在原PDF上对目标文本进行覆盖(屏蔽)或替换操作,最终保存修改后的PDF。

具体实现步骤及代码

1. 完成基础的Azure文档分析

先执行基础的文档分析流程,获取AnalyzeResult和原PDF文件:

import os
from azure.core.credentials import AzureKeyCredential
from azure.ai.documentintelligence import DocumentIntelligenceClient
from azure.ai.documentintelligence.models import AnalyzeOutputOption, AnalyzeResult

endpoint = os.environ["DOCUMENTINTELLIGENCE_ENDPOINT"]
key = os.environ["DOCUMENTINTELLIGENCE_API_KEY"]
path_to_sample_documents = "你的原PDF路径.pdf"

document_intelligence_client = DocumentIntelligenceClient(endpoint=endpoint, credential=AzureKeyCredential(key))

with open(path_to_sample_documents, "rb") as f:
    poller = document_intelligence_client.begin_analyze_document(
        "prebuilt-read",
        body=f,
        output=[AnalyzeOutputOption.PDF],
    )
result: AnalyzeResult = poller.result()

2. 定位需要修改的文本

遍历result中的页面和文本块,找到目标文本并记录其坐标信息。比如要屏蔽所有包含"敏感信息"的文本块:

# 定义要处理的目标文本
target_text = "敏感信息"
# 存储需要修改的文本位置(页面索引 + 坐标)
text_to_redact = []

for page_idx, page in enumerate(result.pages):
    for paragraph in page.paragraphs:
        if target_text in paragraph.content:
            # 获取文本块的边界框坐标(left, top, width, height)
            bbox = paragraph.bounding_box
            # 转换为PyMuPDF需要的矩形格式:(x0, y0, x1, y1)
            rect = (bbox[0], bbox[1], bbox[0]+bbox[2], bbox[1]+bbox[3])
            text_to_redact.append((page_idx, rect))

3. 使用PyMuPDF修改PDF

先安装依赖:pip install pymupdf,再根据需求选择屏蔽或替换文本的逻辑:

示例1:屏蔽文本(用黑色块覆盖)

import fitz  # PyMuPDF

# 打开原PDF
doc = fitz.open(path_to_sample_documents)

for page_idx, rect in text_to_redact:
    page = doc[page_idx]
    # 绘制黑色矩形覆盖目标文本
    page.draw_rect(rect, color=(0,0,0), fill=(0,0,0))

# 保存修改后的PDF
doc.save("修改后的文档_屏蔽版.pdf")
doc.close()

示例2:替换文本(保留原位置)

如果需要替换文本,先覆盖原内容再写入新文本:

import fitz

doc = fitz.open(path_to_sample_documents)
replace_text = "已脱敏"

for page_idx, page in enumerate(result.pages):
    pdf_page = doc[page_idx]
    for word in page.words:
        if word.content == target_text:
            bbox = word.bounding_box
            rect = fitz.Rect(bbox[0], bbox[1], bbox[0]+bbox[2], bbox[1]+bbox[3])
            # 用白色块覆盖原文本
            pdf_page.draw_rect(rect, color=(1,1,1), fill=(1,1,1))
            # 在原位置写入新文本(可根据实际调整字号、字体)
            pdf_page.insert_text(
                (bbox[0], bbox[1]+bbox[3]/2),
                replace_text,
                fontsize=10,
                color=(0,0,0)
            )

doc.save("修改后的文档_替换版.pdf")
doc.close()

注意事项

  • AnalyzeResult中的坐标与PyMuPDF坐标系一致,无需额外转换
  • 对于复杂布局,建议细化到word级别的定位,避免误改其他内容
  • 若要精准匹配原文本字体,可通过pdf_page.get_fontlist()获取原PDF字体信息

内容的提问来源于stack exchange,提问作者Droid-Bird

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.14 15:55:58