2

NodeJS PDFKit ( http://pdfkit.org/ ) を使用して作成している pdf ファイルに JavaScript コードを埋め込むことは可能ですか?

PDFSharp を使用して C# で JavaScript を埋め込む方法を知っています。PDFSharp によって作成された 2 つのファイル (JavaScript が埋め込まれたファイルと含まれていないファイル) を調べると、次のような違いがあります。

オブジェクトの最後として挿入される追加のオブジェクトに JavaScript を含むもの:

30 0 obj
<<
/S/JavaScript
/JS(this.print\(true\); )
>>
endobj
31 0 obj
<<
/Names[(EmbeddedJS)30 0 R]
>>
endobj

この場合、私が埋め込んでいる js はthis.print\(true\);. また、その後、オブジェクト参照のオフセットもそれに応じて異なります。

そして、これもあります:

/Names
<<
/JavaScript 31 0 R
>>

pdf の 2 番目のオブジェクトの参照。このオブジェクト全体は次のようになります。

2 0 obj
<<
/Type/Catalog
/Pages 3 0 R
/Names
<<
/JavaScript 31 0 R
>>
>>
endobj

そして、このコードをpdfkitによって生成されたpdfに挿入しようとすると、破損したファイルが得られます。足りないものはありますか?pdfkit を使用して javascript を pdf に埋め込むより良い方法はありますか?

PS。もちろん、適切なオブジェクト番号を計算し、オフセットなどを調整します。

4

2 に答える 2

0

PDFSharp によって行われた方法よりも、JS を埋め込むより直接的な方法を見ました

次のようになります。

0 1 obj
<< 
  /Type /Catalog
  /Pages 0 2 R % a standard catalog entry
  /Names << % the Javascript entry
    /JavaScript <<
      /Names [
        (EmbeddedJS)
        <<
          /S /JavaScript
          /JS (
            app.alert('Hello, World!');
          )
        >>
      ]
    >>
  >> % end of the javascript entry
>>
endobj

私は先に進み、概念実証としてハッキーな方法を実装しました。

const originalToString = Object.prototype.toString;
Object.prototype.toString = function() {
  if (this.hasOwnProperty('rawForPdfKit')) {
    return 'hey, pdfkit, this is totally not an object, we pinky promise, please fall back to raw concatenation';
  }
  return originalToString.call(this);
};

function generatePdf() {
  const Raw = (function () {
    function Raw(rawData) {
      this.rawData = rawData;
      this.rawForPdfKit = true;
    }
    Raw.prototype.toString = function () {
      return this.rawData;
    };
    return Raw;
  }());

  const doc = new PdfDocument();
  const raw = new Raw(`<<
    /JavaScript <<
      /Names [
        (EmbeddedJS)
        <<
          /S /JavaScript
          /JS (
            this.print();
          )
        >>
      ]
    >>
  >>`);

  doc['_root'].data.Names = raw;

  ...
}

必須の警告: このメソッドは PDFKit のプライベート API と実装の詳細に依存しているため、PDFKit のアップグレードでいつでも何かが壊れる可能性があります。

于 2018-11-13T18:08:55.230 に答える