From 4e7653b07eef11e442c3df86b86101f88aa10c18 Mon Sep 17 00:00:00 2001 From: abcprintf Date: Mon, 17 Mar 2025 13:19:00 +0700 Subject: [PATCH] feat: add PDF unlocking functionality and update documentation --- .gitignore | 37 ++++++++++++++++++++++++++++++++++++- README.md | 3 +++ files/simple.pdf | Bin 0 -> 13474 bytes unlock-pdf.ipynb | 14 +++++++++++--- unlock_pdf.py | 22 ++++++++++++++++++++++ 5 files changed, 72 insertions(+), 4 deletions(-) create mode 100644 files/simple.pdf create mode 100644 unlock_pdf.py diff --git a/.gitignore b/.gitignore index 7106684..7e95728 100644 --- a/.gitignore +++ b/.gitignore @@ -316,7 +316,42 @@ pyrightconfig.json .history .ionide +### macOS ### +# General +.DS_Store +.AppleDouble +.LSOverride + +# Icon must end with two \r +Icon + + +# Thumbnails +._* + +# Files that might appear in the root of a volume +.DocumentRevisions-V100 +.fseventsd +.Spotlight-V100 +.TemporaryItems +.Trashes +.VolumeIcon.icns +.com.apple.timemachine.donotpresent + +# Directories potentially created on remote AFP share +.AppleDB +.AppleDesktop +Network Trash Folder +Temporary Items +.apdisk + +### macOS Patch ### +# iCloud generated files +*.icloud + # End of https://www.toptal.com/developers/gitignore/api/python,visualstudiocode,jupyternotebooks,pycharm files/*.pdf -outputs/*.pdf \ No newline at end of file +outputs/*.pdf + +!files/simple.pdf \ No newline at end of file diff --git a/README.md b/README.md index 21ef438..b07c67d 100644 --- a/README.md +++ b/README.md @@ -14,4 +14,7 @@ pip install -r requirements.txt ### Usage ```bash jupyter lab + +// run the script +python unlock_pdf.py locked.pdf unlocked.pdf password ``` \ No newline at end of file diff --git a/files/simple.pdf b/files/simple.pdf new file mode 100644 index 0000000000000000000000000000000000000000..04d31539c2dec8bdf83f5bcb5dc87bfa932f1502 GIT binary patch literal 13474 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

U^6{hAvk5fKSo)Dk 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 Cg>w%8 literal 0 HcmV?d00001 diff --git a/unlock-pdf.ipynb b/unlock-pdf.ipynb index e0b64fd..567c746 100644 --- a/unlock-pdf.ipynb +++ b/unlock-pdf.ipynb @@ -28,7 +28,7 @@ }, { "cell_type": "code", - "execution_count": null, + "execution_count": 3, "id": "79a889a5-ec8f-4d3f-a4f4-3f03708cc866", "metadata": {}, "outputs": [ @@ -36,13 +36,21 @@ "name": "stdout", "output_type": "stream", "text": [ - "✅ PDF ปลดล็อกสำเร็จ! บันทึกที่: ./outputs/K-BANK-HOME-unlocked.pdf\n" + "✅ PDF ปลดล็อกสำเร็จ! บันทึกที่: ./outputs/simple-unlocked.pdf\n" ] } ], "source": [ - "unlock_pdf(\"./files/.pdf\", \"./outputs/-unlocked.pdf\", \"\")" + "unlock_pdf(\"./files/simple.pdf\", \"./outputs/simple-unlocked.pdf\", \"123456789A\")" ] + }, + { + "cell_type": "code", + "execution_count": null, + "id": "5a2473a7-6aae-406f-b835-d4e43124b7d5", + "metadata": {}, + "outputs": [], + "source": [] } ], "metadata": { diff --git a/unlock_pdf.py b/unlock_pdf.py new file mode 100644 index 0000000..6f6a728 --- /dev/null +++ b/unlock_pdf.py @@ -0,0 +1,22 @@ +import sys +import pikepdf + +def unlock_pdf(input_pdf, output_pdf, password): + try: + pdf = pikepdf.open(input_pdf, password=password) + pdf.save(output_pdf) + print(f"✅ PDF ปลดล็อกสำเร็จ! บันทึกที่: {output_pdf}") + except pikepdf._qpdf.PasswordError: + print("❌ รหัสผ่านไม่ถูกต้อง") + sys.exit(1) + +if __name__ == "__main__": + if len(sys.argv) != 4: + print("⚠️ ใช้งาน: python unlock_pdf.py ") + sys.exit(1) + + input_pdf = sys.argv[1] + output_pdf = sys.argv[2] + password = sys.argv[3] + + unlock_pdf(input_pdf, output_pdf, password)