OCR — Azure Document Intelligence для воссоздания документа в цифровом виде

Там, где я работаю, у нас есть много отсканированных документов, мы хотим оцифровать их без потери общего формата документа, документ может иметь множество пар ключ-значение, таких как формы, заголовки, надписи, текст в изображениях и т. д. Нас это не особо волнует. о потере изображений, но мы хотим, чтобы текст отображался на том месте, где он был бы.

Я создал простое приложение реагирования с машинописным текстом, в котором вы выбираете несколько файлов, а затем, подключаясь к функциям анализа AzureDocumentIntelligence, я получаю ответ типа

{
  "content": "the complete found text in the document"
  "pages": [{
    "lines":[{
      "content": "the text for this line"
      "polygon": [xx,xx,xx,xx,xx,xx,xx,xx] //coordinates of where the text should be
    }]
  }]
}

Мне удалось создать текстовый файл со всем содержимым, и это было хорошим началом, однако теперь я хочу каждый раз воссоздавать документ, в котором текст всегда находится в точном положении, и генерировать из него PDF-файл. Я подумал, что смогу сделать это, используя полигон и библиотеку pdf-lib. Но есть много проблем с тем, что я пробовал, поскольку оно, похоже, не понимает координаты и просто помещает все в одно и то же место.

Это мой метод:

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.info(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;
}

Мне не нужен идеальный документ, мне нужно, чтобы он поддерживал общий поток страницы. Кто-нибудь знает, что я могу сделать?

Кроме того, в настоящее время я использую Azure, но я прочитал документацию для других облачных сервисов, и все они в основном имеют одну и ту же идею, но если вы знаете какой-то другой сервис, который я мог бы использовать, я был бы согласен его изменить.

Зод: сила проверки и преобразования данных
Зод: сила проверки и преобразования данных
Сегодня я хочу познакомить вас с библиотекой Zod и раскрыть некоторые ее особенности, например, возможности валидации и трансформации данных, а также...
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Как заставить Remix работать с Mantine и Cloudflare Pages/Workers
Мне нравится библиотека Mantine Component , но заставить ее работать без проблем с Remix бывает непросто.
Угловой продивер
Угловой продивер
Оригинал этой статьи на турецком языке. ChatGPT используется только для перевода на английский язык.
TypeScript против JavaScript
TypeScript против JavaScript
TypeScript vs JavaScript - в чем различия и какой из них выбрать?
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Синхронизация localStorage в масштабах всего приложения с помощью пользовательского реактивного хука useLocalStorage
Не все нужно хранить на стороне сервера. Иногда все, что вам нужно, это постоянное хранилище на стороне клиента для хранения уникальных для клиента...
Что такое ленивая загрузка в Angular и как ее применять
Что такое ленивая загрузка в Angular и как ее применять
Ленивая загрузка - это техника, используемая в Angular для повышения производительности приложения путем загрузки модулей только тогда, когда они...
0
0
133
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Текст размещен в читабельной и несколько структурированной форме. Если идеальное выравнивание не требуется, упрощение логики размещения может помочь сохранить общий поток документа.

  • Преобразуйте координаты в соответствии с системой координат PDF. Нарисуйте текст на основе ограничивающей рамки, заданной координатами многоугольника.

Код:

import { PDFDocument, StandardFonts } from 'pdf-lib';
import { AnalyzeResultOutput } from './types'; // Ensure you have a type definition for AnalyzeResultOutput

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

  for (const page of data.pages) {
    const { width, height } = page;
    const pdfPage = pdfDoc.addPage([width, height]);

    for (const line of page.lines ?? []) {
      console.info(line);
      const { content, polygon } = line;

      // Calculate the bounding box dimensions
      const xMin = Math.min(polygon[0], polygon[2], polygon[4], polygon[6]);
      const xMax = Math.max(polygon[0], polygon[2], polygon[4], polygon[6]);
      const yMin = Math.min(polygon[1], polygon[3], polygon[5], polygon[7]);
      const yMax = Math.max(polygon[1], polygon[3], polygon[5], polygon[7]);

      // Transform the coordinates for PDF
      const x = xMin;
      const y = height - yMax;

      const size = 12;
      const textWidth = xMax - xMin;
      const textHeight = yMax - yMin;

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

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

export default createPdf;
  • Ограничивающая рамка рассчитывается с использованием минимального и максимального значений x и y из координат многоугольника. Это определяет область, в которой должен быть размещен текст.

  • Координата Y преобразуется в соответствии с системой координат PDF: const y = height - yMax;. Это перемещает начало координат из верхнего левого угла в нижний левый.

  • pdfPage.drawText(content, { x, y, size, font: timesRomanFont, maxWidth: textWidth, lineHeight: textHeight });. Текст рисуется в пределах рассчитанных размеров ограничительной рамки.

ПРИМЕЧАНИЕ. Убедитесь, что размер и ориентация страницы PDF соответствуют отсканированному документу. Неправильный размер или ориентация страницы может привести к смещению текста.

Другие вопросы по теме