end0tknr's kipple - web写経開発

太宰府天満宮の狛犬って、妙にカワイイ

pypdf for python で pdf のページへ javascriptイベント追加

adobe acrobat pro ver.2023+javascriptでpdfへの閲覧期限設定 - end0tknr's kipple - web写経開発

先程の上記entryの続き?として、 pypdf for python で pdf のページへ javascriptイベントを追加します。

pypdfのドキュメントには、add_js()の説明がありますが、 add_js()は、pdfのファイルを開いた際のイベント追加するものですので、 今回は、独自に追加します。

https://pypdf.readthedocs.io/en/latest/modules/PdfWriter.html?highlight=add_js#pypdf.PdfWriter.add_js

Step1 - pdfファイルの内部構造を確認

例えば、adobe acrobat pro では以下の手順で、pdfファイルの内部構造を確認できます。

Step2 - pypdf for python での実装

import sys
from pypdf import PdfReader, PdfWriter
from pypdf.generic import NameObject, create_string_object, DictionaryObject

new_pdf_path = "new.pdf"

js_code = """
var nowDate    = new Date();
var createDate = this.info.CreationDate;
var diffDays   = Math.floor((nowDate-createDate) / (1000*60*60*24));

if( diffDays > 60 ) {
    this.pageNum = 0;
    app.alert( "This pdf is expired." );
    this.closeDoc();
}
"""

def main():
    org_pdf_path = sys.argv[1]
    pdf_reader = PdfReader( open(org_pdf_path, "rb") )
    pdf_writer = PdfWriter()
    pdf_writer.add_metadata( pdf_reader.metadata )

    for page in pdf_reader.pages :
        js_obj = DictionaryObject()
        js_obj.update({ NameObject("/JS"): create_string_object(js_code),
                        NameObject("/S"): NameObject("/JavaScript") })
        o_obj = DictionaryObject()
        o_obj.update({ NameObject("/O"): js_obj})
        page[NameObject('/AA')] = o_obj

        pdf_writer.add_page(page)

    with open(new_pdf_path, "wb") as output_pdf:
        pdf_writer.write(output_pdf)

if __name__ == '__main__':
    main()