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

