Там, где я работаю, у нас есть много отсканированных документов, мы хотим оцифровать их без потери общего формата документа, документ может иметь множество пар ключ-значение, таких как формы, заголовки, надписи, текст в изображениях и т. д. Нас это не особо волнует. о потере изображений, но мы хотим, чтобы текст отображался на том месте, где он был бы.
Я создал простое приложение реагирования с машинописным текстом, в котором вы выбираете несколько файлов, а затем, подключаясь к функциям анализа 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, но я прочитал документацию для других облачных сервисов, и все они в основном имеют одну и ту же идею, но если вы знаете какой-то другой сервис, который я мог бы использовать, я был бы согласен его изменить.






Текст размещен в читабельной и несколько структурированной форме. Если идеальное выравнивание не требуется, упрощение логики размещения может помочь сохранить общий поток документа.
Код:
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 соответствуют отсканированному документу. Неправильный размер или ориентация страницы может привести к смещению текста.