#node.js #pdf #pdftron
Вопрос:
В моем приложении аннотации хранятся в базе данных в виде отдельных аннотаций. Для одного документа в таблице документов я храню множество аннотаций (несколько строк xfdf) в таблице аннотаций. Я написал код для создания pdf-файла и импорта этих аннотаций. Я ссылался на следующие ссылки для этого кода,
- https://www.pdftron.com/documentation/web/guides/features/forms/import-data/
- https://groups.google.com/g/pdfnet-sdk/c/gXaG5X-zpR8
параметры,
- аннотации : список аннотаций со строкой xfdf
- Загруженный файл : pdf-файл в качестве буфера
- isFlatternAnnotations — это логическая опция для сглаживания аннотаций
async importAnnotationsToDocument(
annotations: any,
downloadedFile: any,
isFlatternAnnotations: any,
) {
await PDFNet.initialize();
const pdfDocument = await PDFNet.PDFDoc.createFromBuffer(downloadedFile);
pdfDocument.lock();
let fdfDocument = null;
annotations.forEach(async annotation => {
fdfDocument = await PDFNet.FDFDoc.createFromXFDF(annotation.xfdfString);
await pdfDocument.fdfMerge(fdfDocument);
});
if (isFlatternAnnotations === 'true') {
await pdfDocument.flattenAnnotations();
}
const documentBuffer = await pdfDocument.saveMemoryBuffer(
PDFNet.SDFDoc.SaveOptions.e_remove_unused,
);
const documentBufferResponse = Buffer.from(documentBuffer);
PDFNet.shutdown();
return documentBufferResponse;
}
Однако я заметил, что код работает только await pdfDocument.flattenAnnotations();
в том случае, если он запущен. Если он не запущен, аннотации не объединяются в документе.
А также, если он выполняется один раз, аннотации отображаются без выравнивания. Но если я добавлю одну и ту же строку три раза, она будет работать правильно.
Я думаю, что то, как я это сделал, неправильно. Мне нужна ваша помощь, чтобы правильно написать этот код.
Следующий код работает правильно, но для этого должен быть правильный способ.
async importAnnotationsToDocument(
annotations: any,
downloadedFile: any,
isFlatternAnnotations: any,
) {
await PDFNet.initialize();
const pdfDocument = await PDFNet.PDFDoc.createFromBuffer(downloadedFile);
pdfDocument.lock();
let fdfDocument = null;
annotations.forEach(async annotation => {
fdfDocument = await PDFNet.FDFDoc.createFromXFDF(annotation.xfdfString);
await pdfDocument.fdfMerge(fdfDocument);
});
if (isFlatternAnnotations === 'true') {
await pdfDocument.flattenAnnotations();
await pdfDocument.flattenAnnotations();
await pdfDocument.flattenAnnotations();
} else {
// This shows the annotations without flattening
await pdfDocument.flattenAnnotations();
}
const documentBuffer = await pdfDocument.saveMemoryBuffer(
PDFNet.SDFDoc.SaveOptions.e_remove_unused,
);
const documentBufferResponse = Buffer.from(documentBuffer);
PDFNet.shutdown();
return documentBufferResponse;
}
Ниже приведена строка xfdf для одной аннотации
<?xml version="1.0" encoding="UTF-8"?>
<xfdf xmlns="http://ns.adobe.com/xfdf/" xml:space="preserve">
<fields />
<add>
<square page="0"
rect="387.88,525.73,525,609.07"
color="#FFCD45" flags="print"
name="d1aa1a2a-822f-507b-6ff6-d61bcc6bd862"
title="test.title" subject="Rectangle"
date="D:20210405104448 08'00'"
interior-color="#FFCD45"
opacity="0.5"
creationdate="D:20210405104445 08'00'" />
</add>
<modify /><delete />
</xfdf>
Комментарии:
1. Существует два типа файлов XFDF с PDFNet: обычные и командные. Вы можете определить командные, посмотрев на XFDF и посмотрев, есть ли <добавить><добавить><изменено><изменено><удалить> элементы верхнего уровня. Если это формат ваших строк XFDF, то вы используете другой API. Если эти значения присутствуют, дайте мне знать, и я могу дать дальнейшие рекомендации (в идеале вы можете привести пример в своем вопросе об одной из этих строк XFDF).
2. @Ryan Извините за очень поздний ответ. Я добавил строку xfdf.
3. Спасибо за обновление, это подтверждает, что вы используете альтернативный формат XFDF. Смотрите мой новый ответ о том, как применить эти функции на стороне сервера.
Ответ №1:
Вы загружаете вариант XFDF под названием Command, который вы можете увидеть здесь в документации. https://www.pdftron.com/documentation/web/guides/xfdf/
Следующий код описывает, как вы загружаете и применяете XML-данные команды XFDF к PDFDoc
экземпляру.
let fdfDoc = await pdfDoc.fdfExtract(PDFNet.PDFDoc.ExtractFlag.e_both);
await fdfDoc.saveAsXFDF('data.xfdf');
fdfDoc = await PDFNet.FDFDoc.createFromXFDF('data.xfdf');
await fdfDoc.mergeAnnots(str);
await pdfDoc.fdfUpdate(fdfDoc);
await pdfDoc.refreshAnnotAppearances();
Комментарии:
1. @daratha-galkissa Добавила одну дополнительную строку кода, чтобы обеспечить создание внешнего вида для аннотаций.
2. Этот код работает. Спасибо вам за вашу помощь
Ответ №2:
API pdfDocument.flattenAnnotations()
по умолчанию выравнивает только поля форм, а не аннотации. https://www.pdftron.com/api/pdfnet-node/PDFNet.PDFDoc.html#flattenAnnotations__anchor
Поэтому я бы рекомендовал изменить вызов на
pdfDocument.flattenAnnotations(false);