Пусть кукловод сгенерирует отчеты о доступности доступа в формате PDF

#pdf #puppeteer

#PDF #кукловод

Вопрос:

Я создаю PDF-файлы с помощью Puppeteer, результирующий PDF выглядит красиво, но в нем отсутствуют отчеты о доступности PDF. Основными проблемами были заголовок PDF и язык PDF. Я попытался установить оба через значения EXIF ( Title , Language ), в некоторых случаях заголовок отображается, но по-прежнему не удается выполнить отчет о проверке доступности Acrobat Pro. Я использовал другой отчет о проверке доступности ( http://checkers.eiii.eu/en/pdfcheck / ) и там заголовок задан успешно, но не язык.

Я использовал --export-tagged-pdf в качестве параметра запуска, который исправил многие другие проблемы.

У кого-нибудь есть идея, как я мог бы передать отчет о доступности, пожалуйста? В основном языковой параметр. Я использую Node.js чтобы сгенерировать PDF-файлы, даже если есть другая библиотека для редактирования PDF-файла после того, как это было бы действительно полезно, я не смог этого понять.

Комментарии:

1. Смогли ли вы решить эту проблему?

2. Я смог удовлетворить требования к названию и языку, используя дополнительный pdf-lib пакет для изменения существующего pdf. pdfDoc.setLanguage("en-us");pdfDoc.setTitle("Some title"); К сожалению, я не могу удовлетворить требование «закладок».

Ответ №1:

Столкнувшись с той же проблемой, мне удалось получить все необходимые метаданные и данные XMP, кроме идентификатора PDF-UA. Я использовал библиотеку JS «pdf-lib» (https://pdf-lib.js.org/docs/api/classes/pdfdocument ) для установки метаданных и exiftool-vendored для ввода данных XMP shema.

   const pdfLib = require('pdf-lib');
  const exiftool = require("exiftool-vendored").exiftool
  const fs = require('fs');
  const distexiftool = require('dist-exiftool');

  const pdfData = await fs.readFile('your-pdf-document.pdf');
  const pdfDoc = await pdfLib.PDFDocument.load(pdfData);

  const nowDate = new Date();
  const meta_creator = "The author";
  const meta_author = "The author";
  const meta_producer = "The producer";
  const meta_title = "Your PDF title";
  const meta_subject = "Your PDF subject";
  const meta_creadate = `${nowDate.getFullYear()}-${nowDate.getMonth() 1}-${nowDate.getDate()}`;
  const meta_keywords = ["keyword1", "keyword2", "keyword3", "keyword4"];

  // Implement PDF Title
  pdfDoc.setSubject(meta_subject);

  // Implement required "DisplayDocTitle" pdf var
  pdfDoc.setTitle(meta_title, {
    showInWindowTitleBar: true,
    updateMetadata: true
  });

  // Implement PDF language
  pdfDoc.setLanguage("en-EN");

  // Save file in order exiftool can load it
  const pdfBytes = await pdfDoc.save();
  await fs.promises.writeFile("your-pdf-document.pdf", pdfBytes);

  // We use "distexiftool" to get the TAGS from PDF/UA well formed XMP file "pdfUA-ID.xmp" and assign data to "your-pdf-document.pdf"
  execFile(distexiftool, ["-j","-xmp<=pdfUA-ID.xmp", "your-pdf-document.pdf"], (error, stdout, stderr) => {
        if (error) {
            console.error(`exec error: ${error}`);
            return;
        }
        afterTagsOperation()
    });

    async function afterTagsOperation(){
      // Open the file and write XMP tags with exiftool
      await exiftool.write("your-pdf-document.pdf", { 'xmp:Author': meta_author });
      await exiftool.write("your-pdf-document.pdf", { 'xmp:Creator': meta_creator });
      await exiftool.write("your-pdf-document.pdf", { 'xmp:CreateDate': meta_creadate });
      await exiftool.write("your-pdf-document.pdf", { 'xmp:Producer': meta_producer });
      await exiftool.write("your-pdf-document.pdf", { 'xmp:Title': meta_title });
      await exiftool.write("your-pdf-document.pdf", { 'xmp:Subject': meta_subject });
      await exiftool.write("your-pdf-document.pdf", { 'xmp:Keywords': meta_keywords });
      await exiftool.write("your-pdf-document.pdf", { 'xmp:Trapped': 'false' });
      await exiftool.write("your-pdf-document.pdf", { 'xmp:DocumentID': `uuid:${nowDate.getTime()}` });
      await exiftool.write("your-pdf-document.pdf", { 'xmp:Title': meta_title });
      await exiftool.write("your-pdf-document.pdf", { 'xmp:Subject': meta_subject });
      await exiftool.write("your-pdf-document.pdf", { 'xmp:Keywords': meta_keywords });
      await exiftool.write("your-pdf-document.pdf", { 'xmp:Trapped': 'false' });
      await exiftool.write("your-pdf-document.pdf", { 'xmp:Identifier': nowDate.getTime() });
      await exiftool.write("your-pdf-document.pdf", { 'xmp:PDFVersion': `v${nowDate.getTime()}` });
      await exiftool.write("your-pdf-document.pdf", { 'xmp-xmpMM:DocumentID': `uuid:${nowDate.getTime()}` });
      await exiftool.write("your-pdf-document.pdf", { 'xmp-dc:format': `application/pdf` });
      await exiftool.write("your-pdf-document.pdf", { 'xmp-dc:title': meta_title });

      // We save the file
      const pdfBytes = await pdfDoc.save();
      await fs.promises.writeFile("your-pdf-document.pdf", pdfBytes);
    }


  

Комментарии:

1. Привет, Андрей, я только что отредактировал свой ответ, потому что я только что нашел способ получить отсутствующий идентификатор PDF / UA, назначив ТЕГИ из файла соответствия XMP файлу PDF, а затем изменив некоторые теги, чтобы настроить данные.