Прочитайте значения полей PDF Acroform в JavaScript - PullRequest
0 голосов
/ 12 июня 2019

Мне нужно проанализировать файл PDF с большим количеством полей Acroform и извлечь имя поля (/ T в разметке PDF) и значение (/ V в разметке PDF) для каждого поля.Я хотел бы сделать это на стороне клиента в JavaScript, но я не нахожу существующие примеры или библиотеки, которые, кажется, делают это.Есть ли у кого-нибудь какие-либо предложения о том, как подойти к нему?

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

Ответы [ 2 ]

2 голосов
/ 13 июня 2019

В компании, в которой я работаю, есть PDFTron WebViewer SDK , который позволяет читать все поля формы, читать / редактировать значения, всю клиентскую часть в браузере, а также разрешать пользователю просматривать весь PDF и вручную заполните любые поля.

Образец: https://www.pdftron.com/webviewer/demo/pdf-forms

Мне нужно проанализировать файл PDF с большим количеством полей Acroform и извлечь имя поля (/ T в разметке PDF) и значение (/ V в разметке PDF) для каждого поля.

Вы можете увидеть живой код в примере pdf-форм, сшитом выше, но этот код ниже будет перебирать все поля и выводить значение, если оно есть, на консоль.

viewerElement.addEventListener('ready', function() {
  var viewerInstance = viewer.getInstance();

  const docViewer = viewerInstance.docViewer;
  const annotManager = docViewer.getAnnotationManager();
  const fieldManager = annotManager.getFieldManager();

  const checkField = (field) => {
    // Do something with data
    const { name, value } = field;
    console.log(name + ' ' + value);
    // Check children fields
    field.children.forEach(checkField);
  }

  docViewer.on('annotationsLoaded', function() {
    fieldManager.forEachField(checkField);
  });
});

Я возьму значения полей из PDF и сохраню их в базы данных.

Если вы просто хотите получить значения полей, вы можете легко получить это из WebViewer в формате PDF ISO XFDF XML, который вы можете отправить на свой сервер и объединить с PDF, используя любой PDF SDK, который поддерживает XFDF. Таким образом, вы можете избежать передачи всего PDF туда-сюда и просто отправить гораздо меньшие значения полей формы в виде XML.

var xmlXfdfFieldData = annotManager.exportAnnotations({fields:true, widgets:false, links:false});

для некоторых полей мне нужно будет запросить дополнительный ввод до сохранения.

Интерфейс WebViewer UI / UX полностью настраиваемый, поэтому вы можете взаимодействовать / запрашивать у пользователя, какие поля обновлять.

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

https://www.pdftron.com/documentation/web/guides/form-samples#customizing-form-fields

0 голосов
/ 12 июня 2019

Оказывается, не так сложно разобрать, что мне нужно, из PDF, и библиотека, вероятно, будет излишней.Вот код, который я использую:

function importPdf(event) {
  const reader = new FileReader();
  reader.onload = function () {
    const matches = reader.result.match(/((obj)[\s\S]*?(endobj))/g);
    matches.forEach(match => {
      const tIndex = match.indexOf('/T (');
      const vIndex = match.indexOf('/V (');
      if(tIndex > -1 && vIndex > -1) {
        const fieldNameSegment = match.substring(tIndex + 4);
        const fieldNameValue = fieldNameSegment.substring(0,fieldNameSegment.indexOf(')'));
        const valueSegment = match.substring(vIndex + 4);
        const dataValue = valueSegment.substring(0, valueSegment.indexOf(')'));
        console.log(fieldNameValue, dataValue);
      }
    });
  }
  reader.readAsText(event.target.files[0]);
}
<input type="file" id="file-input" onchange="importPdf(event)">
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...