adobe acrobat pro ver.2023+javascriptでpdfへの閲覧期限設定 - end0tknr's kipple - web写経開発
先程の上記entryの続き?として、 pypdf for python で pdf のページへ javascriptイベントを追加します。
pypdfのドキュメントには、add_js()の説明がありますが、 add_js()は、pdfのファイルを開いた際のイベント追加するものですので、 今回は、独自に追加します。
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()