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

基于Azure Document Intelligence重构扫描文档PDF定位问题求助

问题描述

我们有大量扫描文档,需在保留整体格式的前提下完成数字化(可丢弃图片,仅需还原文本对应位置),文档包含表单、标题、段落等结构。
已基于React+TypeScript搭建简易应用,通过Azure Document Intelligence的分析接口获取包含文本内容及坐标(polygon)的返回结果。目前已实现生成含完整文本的TXT文件,但尝试用pdf-lib根据polygon坐标生成PDF时,文本无法准确定位,全部堆叠在一起。

当前实现代码如下:

async function createPdf(data: AnalyzeResultOutput) {
  const pdfDoc = await PDFDocument.create();
  const timesRomanFont = await pdfDoc.embedFont(StandardFonts.TimesRoman);

  for (const page of data.pages) {
    const pdfPage = pdfDoc.addPage();

    for (const line of page.lines ?? []) {
      console.log(line);
      const { content, polygon } = line;
      const x = polygon![0];
      const y = polygon![1];

      const size = 12;
      pdfPage.drawText(content, {
        x,
        y,
        size,
        maxWidth: Math.abs(polygon![0] - polygon![2]),
        font: timesRomanFont,
      });
    }
  }

  const pdfBytes = await pdfDoc.save();
  return pdfBytes;
}

仅需还原页面大致排版,请问该如何调整?另外也可替换其他具备同类能力的云服务。


解决方案

一、调整pdf-lib代码解决定位问题

文本堆叠核心是坐标体系不匹配,以及缺少字体大小、行高的适配,具体调整如下:

  1. 修正坐标体系
    Azure Document Intelligence的坐标以左上角为原点,而pdf-lib的PDF坐标以左下角为原点,需做转换:
const pageHeight = page.height;
// 转换y坐标:pdfY = 页面高度 - Azure返回的y坐标
const pdfY = pageHeight - y;
  1. 适配字体大小
    不要固定用12号字,根据Azure返回的行高(polygon的y轴差值)估算字体大小:
// 计算行高:polygon[3] - polygon[1] 是Azure返回的行高度(左上角为原点,y值向下增大)
const lineHeight = polygon![3] - polygon![1];
// 字体大小取行高的80%左右,避免文本溢出
const fontSize = lineHeight * 0.8;
  1. 修正maxWidth计算
    Azure的polygon四个点中,x1是左边界,x3是右边界,maxWidth直接取polygon![2] - polygon![0](无需绝对值,x3必然大于x1):
const maxWidth = polygon![2] - polygon![0];
  1. 完整调整后的代码
async function createPdf(data: AnalyzeResultOutput) {
  const pdfDoc = await PDFDocument.create();
  const timesRomanFont = await pdfDoc.embedFont(StandardFonts.TimesRoman);

  for (const page of data.pages) {
    // 创建和原页面尺寸一致的PDF页面
    const pdfPage = pdfDoc.addPage([page.width, page.height]);
    const pageHeight = page.height;

    for (const line of page.lines ?? []) {
      const { content, polygon } = line;
      if (!polygon) continue;

      const x = polygon[0];
      const azureY = polygon[1];
      // 转换坐标体系
      const y = pageHeight - azureY;
      // 计算行高和字体大小
      const lineHeight = polygon[3] - polygon[1];
      const fontSize = lineHeight * 0.8;
      // 计算文本宽度限制
      const maxWidth = polygon[2] - polygon[0];

      pdfPage.drawText(content, {
        x,
        y,
        size: fontSize,
        maxWidth,
        font: timesRomanFont,
        lineHeight: lineHeight,
      });
    }
  }

  const pdfBytes = await pdfDoc.save();
  return pdfBytes;
}

二、替代云服务推荐

如果不想调整代码,可直接选用支持导出结构化PDF的OCR服务:

  • Google Cloud Vision API:支持文档分析,可直接导出带排版的PDF,或获取更精准的文本位置信息,坐标适配PDF更简单。
  • AWS Textract:专门的文档分析服务,能识别表单、段落结构,返回的文本坐标可直接用于PDF生成,还支持导出可搜索PDF。
  • 百度智能云OCR:国内服务,文档识别能力强,支持返回文本位置、字体大小等信息,适配国内网络环境。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 12:37:10