PDFGuardian adalah aplikasi Python untuk melindungi file PDF dengan password dan kontrol permission yang komprehensif. Aplikasi ini memungkinkan Anda mengatur siapa yang bisa membuka file, dan apa saja yang bisa dilakukan dengan file PDF tersebut.
- Password Protection: Proteksi file PDF dengan user password dan owner password
- Permission Control: Kontrol granular untuk:
- Commenting/Annotasi
- Content Copying
- Content Copying untuk Accessibility
- Editing Konten
- Filling Form Fields
- Printing
- Signing (aproksimasi)
- Library Compatibility: Mendukung PyPDF2 dan pypdf
- Modular Architecture: Struktur kode yang terorganisir dan mudah di-maintain
- Interactive CLI: Interface command-line yang user-friendly
- Python 3.7 atau lebih baru (disarankan Python 3.10+)
- PyPDF2 atau pypdf library
- Windows, macOS, atau Linux
-
Download Python:
- Kunjungi python.org/downloads
- Download versi terbaru Python (misalnya Python 3.12.x)
-
Install Python:
- Jalankan installer yang sudah didownload
- PENTING: Centang "Add Python to PATH" di bagian bawah installer
- Klik "Install Now"
- Tunggu hingga instalasi selesai
-
Verifikasi Instalasi:
python --version
atau
python3 --version
-
Menggunakan Homebrew (disarankan):
# Install Homebrew jika belum ada /bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/HEAD/install.sh)" # Install Python brew install python3
-
Atau download dari python.org:
- Kunjungi python.org/downloads
- Download installer untuk macOS
- Install seperti aplikasi macOS biasa
-
Verifikasi:
python3 --version
# Update package list
sudo apt update
# Install Python 3
sudo apt install python3 python3-pip
# Verifikasi
python3 --versiongit clone https://github.com/zzkydev/PDFGuardian.git
cd PDFGuardian- Download semua file project
- Extract ke folder
D:\DATA KULIAH\Semester 5\ToolsPDF
Buka Command Prompt / Terminal dan navigasikan ke folder project:
cd "D:\FileDirectory\PDFGuardian"Install library yang diperlukan:
pip install PyPDF2atau jika menggunakan Python 3:
pip3 install PyPDF2Alternatif (library yang lebih baru):
pip install pypdfCek apakah semua dependencies terinstall dengan baik:
python -c "import PyPDF2; print('PyPDF2 installed successfully')"python protect_pdf.pyatau
python3 protect_pdf.pypython protect_pdf.pyAplikasi akan meminta path file PDF yang ingin diproteksi:
=== Proteksi Permission PDF (+ password user & owner) ===
Masukkan path file PDF: D:\Documents\myfile.pdf
Aplikasi akan menanyakan berbagai permission satu per satu:
=== Menu Izin (permissions) ===
Izinkan komentar/annotasi? [y/N]: n
Content copying diizinkan? [y/N]: n
Content copy for accessibility diizinkan? [Y/n]: y
Editing konten diizinkan? [y/N]: n
Filling form fields diizinkan? [Y/n]: y
Print diizinkan? [Y/n]: y
Signing diizinkan? (aproksimasi via annotasi & form) [y/N]: n
=== Password settings ===
User password: diperlukan agar file hanya bisa dibuka jika mengisi password.
Owner password: diperlukan agar permission/setting dapat diubah (harus diisi).
Masukkan user password (kosong = file bisa dibuka tanpa password): ******
Masukkan owner password (wajib, jangan lupa simpan): ******
Aplikasi akan menampilkan ringkasan dan meminta konfirmasi:
=== Ringkasan Pengaturan Permissions ===
- Komentar/Annotasi: dilarang
- Content Copying: dilarang
- Copy for Accessibility: diizinkan
- Editing Konten: dilarang
- Filling Form Fields: diizinkan
- Print: diizinkan
- Signing (aproksimasi): dilarang
- User password: ada
- Owner password: diset (tidak ditampilkan)
Lanjutkan dan terapkan pengaturan ini? [Y/n]: y
Berhasil! File tersimpan: D:\DATA KULIAH\Semester 5\ToolsPDF\protected_myfile.pdf
PDFGuardian dirancang dengan arsitektur modular untuk memudahkan maintenance dan pengembangan. Berikut struktur direktori:
ToolsPDF/
├── protect_pdf.py # Main entry point
├── utils/ # Utility modules
│ ├── __init__.py
│ ├── prompts.py # User input prompts
│ └── password.py # Password handling
├── pdf/ # PDF processing modules
│ ├── __init__.py
│ ├── compatibility.py # PyPDF2/pypdf compatibility
│ ├── permissions.py # Permission configuration
│ └── encrypt.py # PDF encryption logic
├── README.md # Dokumentasi ini
└── Tampilan_File_Permissions.png # Screenshot contoh
Fungsi: File utama aplikasi yang mengorkestrasikan semua modul
Tanggung Jawab:
- Menerima input path file PDF dari user
- Validasi file PDF (format dan keberadaan)
- Mengkoordinasikan flow aplikasi dari awal sampai akhir
- Menentukan output path dengan handling file yang sudah ada
- Error handling dan user feedback
Fungsi Utama:
main(): Fungsi utama yang menjalankan seluruh flow aplikasiget_output_path(): Menentukan path output file dengan handling konflik nama
Cara Kerja:
1. Meminta input path PDF dari user
2. Validasi file (format .pdf, file exists, bisa dibuka)
3. Panggil ask_permissions() untuk konfigurasi permission
4. Panggil ask_password() untuk user dan owner password
5. Tampilkan ringkasan dan minta konfirmasi
6. Panggil encrypt_pdf() untuk enkripsi
7. Simpan file dan tampilkan notifikasi suksesFungsi: Menangani semua interaksi dengan user untuk mendapatkan input
Tanggung Jawab:
- Menyediakan fungsi prompt untuk input boolean (yes/no)
- Formatting output boolean ke bahasa Indonesia
- Validasi input user
- Handling default values
Fungsi:
-
prompt_bool(label, default=None):- Meminta input yes/no dari user
- Mendukung default value ([Y/n] atau [y/N])
- Loop hingga mendapat input yang valid
- Return:
TrueatauFalse
-
human_bool(b):- Convert boolean ke string Indonesia
- Return: "diizinkan" atau "dilarang"
Contoh Penggunaan:
from utils.prompts import prompt_bool, human_bool
# Meminta konfirmasi
allow_print = prompt_bool("Print diizinkan?", True) # [Y/n]
# Convert ke string
status = human_bool(allow_print) # "diizinkan" atau "dilarang"
print(f"Status print: {status}")Fungsi: Menangani input password dengan aman
Tanggung Jawab:
- Meminta password dari user tanpa menampilkannya di layar
- Validasi password (kosong atau tidak)
- Konfirmasi untuk password kosong
- Fallback ke input biasa jika getpass tidak tersedia
Fungsi:
ask_password(prompt_text, allow_empty=False):- Menggunakan
getpassuntuk input password yang aman - Jika
allow_empty=False, loop hingga password tidak kosong - Konfirmasi jika user ingin password kosong
- Fallback ke
input()jikagetpassgagal
- Menggunakan
Keamanan:
- Password tidak muncul di terminal saat diketik
- Konfirmasi double-check untuk password kosong
- Exception handling untuk berbagai environment
Contoh Penggunaan:
from utils.password import ask_password
# Meminta user password (boleh kosong)
user_pwd = ask_password("User password", allow_empty=True)
# Meminta owner password (wajib diisi)
owner_pwd = ask_password("Owner password", allow_empty=False)Fungsi: Menjembatani kompatibilitas antara PyPDF2 dan pypdf
Tanggung Jawab:
- Deteksi library PDF yang terinstall (PyPDF2 atau pypdf)
- Import classes dan constants yang sesuai
- Menyediakan fallback permission bitmasks
- Menyediakan interface yang konsisten untuk kedua library
Exports:
PDFReader: Class untuk membaca PDFPDFWriter: Class untuk menulis PDFPermissions: Enum permissions (jika tersedia)ImportSource: String nama library yang digunakanPERM_FLAGS_AVAILABLE: Boolean apakah Permissions enum tersedia- Permission bitmask constants:
PERM_PRINT,PERM_MODIFY_CONTENTS, dll.
Cara Kerja:
1. Try import PyPDF2
- Import PdfReader dan PdfWriter
- Try import Permissions dari PyPDF2.constants
2. Jika PyPDF2 gagal, try import pypdf
- Import PdfReader dan PdfWriter
- Try import Permissions dari pypdf
3. Jika keduanya gagal, exit dengan error message
4. Set flag PERM_FLAGS_AVAILABLE berdasarkan Permissions availability
5. Define fallback bitmask constantsMengapa Penting?:
- PyPDF2 dan pypdf memiliki API yang sedikit berbeda
- Beberapa versi tidak menyediakan Permissions enum
- Modul ini memastikan aplikasi bisa berjalan dengan kedua library
Fungsi: Mengelola konfigurasi permission PDF
Tanggung Jawab:
- Menyimpan konfigurasi permission dalam dataclass
- Convert konfigurasi ke format yang dibutuhkan library
- Interface untuk menanyakan permission ke user
- Menampilkan ringkasan permission
Classes:
PermissionConfig(dataclass):- Menyimpan 7 boolean flags untuk berbagai permission
- Method
display_summary(): Tampilkan ringkasan setting - Method
to_permission_set(): Convert ke set untuk modern API - Method
to_permission_flag(): Convert ke integer bitmask
Fungsi:
ask_permissions():- Menanyakan semua permission ke user secara interaktif
- Return:
PermissionConfigobject
Permission yang Dikelola:
- allow_comments: Izin untuk menambah komentar/annotasi
- allow_copy: Izin untuk copy konten
- allow_accessibility: Izin copy untuk accessibility tools
- allow_edit: Izin untuk edit konten PDF
- allow_fill: Izin untuk mengisi form fields
- allow_print: Izin untuk print dokumen
- allow_sign: Izin untuk signing (aproksimasi)
Contoh Penggunaan:
from pdf.permissions import ask_permissions
# Dapatkan konfigurasi dari user
permissions = ask_permissions()
# Tampilkan ringkasan
permissions.display_summary()
# Convert untuk enkripsi
perm_set = permissions.to_permission_set() # Untuk modern API
perm_flag = permissions.to_permission_flag() # Untuk legacy APIFungsi: Menangani proses enkripsi PDF dengan password dan permissions
Tanggung Jawab:
- Membaca PDF input
- Menerapkan enkripsi dengan password
- Menerapkan permission restrictions
- Menulis PDF terenkripsi ke output
- Validasi PDF
Fungsi Utama:
-
encrypt_pdf(input_path, output_path, user_password, owner_password, permissions):- Fungsi utama untuk enkripsi PDF
- Membaca semua pages dari input PDF
- Menerapkan enkripsi dengan password dan permissions
- Menulis ke output file
- Menangani dua jenis API (permission set dan bitmask)
-
_encrypt_with_permission_set(writer, user_pwd, owner_pwd, permissions):- Internal function untuk modern API (PyPDF2 dengan Permissions enum)
- Menggunakan permission set
- Multiple fallback jika signature berbeda
-
_encrypt_with_permission_flag(writer, user_pwd, owner_pwd, permissions):- Internal function untuk legacy API (bitmask integer)
- Menggunakan integer flags untuk permissions
- Fallback untuk berbagai signature encrypt()
-
validate_pdf(pdf_path):- Validasi apakah file adalah PDF yang valid
- Try membuka dan membaca first page
- Return:
Truejika valid,Falsejika tidak
Cara Kerja Enkripsi:
1. Baca PDF dengan PDFReader
2. Buat PDFWriter baru
3. Copy semua pages ke writer
4. Tentukan metode enkripsi (permission set vs bitmask)
5. Panggil writer.encrypt() dengan parameters yang sesuai
6. Tulis encrypted PDF ke file outputException Handling:
- Multiple try-except untuk handle berbagai signature API
- Fallback ke enkripsi password-only jika permission gagal
- Clear error messages untuk user
- Password menggunakan
getpassuntuk input yang aman (tidak terlihat di terminal) - Owner password wajib diisi untuk mencegah perubahan setting
- User password opsional (jika kosong, file bisa dibuka tanpa password)
- Permission bersifat advisory: Beberapa PDF reader bisa bypass permission restrictions
- Bukan enkripsi end-to-end: Setelah dibuka dengan password, konten bisa diakses
- Tidak cocok untuk dokumen sangat sensitif: Untuk proteksi maksimal, gunakan DRM atau viewer terkendali
- Gunakan owner password yang kuat: Minimal 12 karakter, kombinasi huruf, angka, simbol
- Simpan password dengan aman: Gunakan password manager
- Kombinasikan dengan permission restrictions: Jangan hanya andalkan password
- Backup file original: Simpan file asli sebelum enkripsi
Penyebab: Python version < 3.10 tanpa from __future__ import annotations
Solusi: Sudah fixed dengan menambahkan import di semua file
Penyebab: Library belum terinstall
Solusi:
pip install PyPDF2
# atau
pip install pypdfPenyebab: Permission flag yang tidak valid
Solusi: Sudah fixed dengan menghapus conditional if permissions_flag else None
Penyebab: Password salah atau PDF reader tidak mendukung
Solusi:
- Pastikan menggunakan password yang benar
- Coba PDF reader lain (Adobe Reader, Foxit, dll)
- Check apakah file output benar-benar terenkripsi
- User Password: Password untuk membuka dan membaca file PDF. Jika kosong, file bisa dibuka tanpa password.
- Owner Password: Password untuk mengubah permission dan security settings. Wajib diisi dan harus dijaga kerahasiaannya.
Ya, Anda bisa membiarkan user password kosong. Namun owner password tetap wajib untuk melindungi permission settings.
Anda memerlukan owner password untuk menghilangkan proteksi. Gunakan PDF editor seperti Adobe Acrobat dengan owner password untuk remove security.
Permission PDF bersifat advisory dan bisa di-bypass oleh beberapa tools. Untuk dokumen sangat sensitif, gunakan solusi DRM profesional.
Proses enkripsi menambahkan metadata dan security information ke PDF, yang sedikit meningkatkan ukuran file.
Saat ini aplikasi hanya support satu file per eksekusi. Untuk batch processing, Anda bisa modify source code atau jalankan multiple times.
Kontribusi sangat diterima! Silakan:
- Fork repository
- Buat branch untuk feature (
git checkout -b feature/AmazingFeature) - Commit changes (
git commit -m 'Add some AmazingFeature') - Push ke branch (
git push origin feature/AmazingFeature) - Buat Pull Request
Project ini dibuat untuk keperluan edukasi.
Untuk pertanyaan, bug reports, atau feature requests, silakan buat issue di repository.
- Initial release
- Modular architecture
- Support PyPDF2 dan pypdf
- Interactive CLI
- Comprehensive permission control
- Password protection (user & owner)
PDFGuardian - Melindungi PDF Anda dengan Mudah dan Aman
