Импортируйте несколько аннотаций в Pdftron с помощью NodeJS

#node.js #pdf #pdftron

Вопрос:

В моем приложении аннотации хранятся в базе данных в виде отдельных аннотаций. Для одного документа в таблице документов я храню множество аннотаций (несколько строк xfdf) в таблице аннотаций. Я написал код для создания pdf-файла и импорта этих аннотаций. Я ссылался на следующие ссылки для этого кода,

параметры,

  • аннотации : список аннотаций со строкой 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);