- PDFSyntax adalah library Python yang berfokus pada Bab 7 “Syntax” dari PDF Specification, digunakan untuk memeriksa dan mengubah struktur dokumen internal file PDF hingga tingkat byte
- Ditulis dari awal dengan Python murni, merupakan library ringan tanpa dependensi, serta menekankan kesederhanaan dan imutabilitas
- Cara penyuntingan dasarnya adalah pembaruan inkremental nondestruktif yang diizinkan oleh spesifikasi PDF: menambahkan bagian perubahan di akhir file asli, dengan kemampuan untuk memutar balik atau menggabungkannya menjadi satu revisi
- CLI menyediakan
overview, disasm, text, fonts, browse, dan lainnya; browse menampilkan sumber PDF secara rapi dan memungkinkan penjelajahan struktur internal melalui HTML statis berisi hyperlink
- Saat ini merupakan proyek yang sedang dikerjakan dengan kualitas beta, API dapat berubah kapan saja, berlisensi MIT, tetapi belum menerima kontribusi eksternal
Pemeriksaan dan transformasi struktur internal PDF
- PDFSyntax adalah library Python untuk memeriksa dan mengubah struktur internal file PDF
- Berfokus pada Bab 7 “Syntax” dari Portable Document Format(PDF) Specification
- Mengimplementasikan pengelolaan struktur dokumen hingga tingkat byte, sehingga digunakan untuk hal-hal berikut
- Akses metadata
- Rotasi halaman
- Operasi baca/tulis PDF
- Akses dan manipulasi objek internal
Arah desain
- Fungsi-fungsi internal diekspos sebagai toolkit API untuk operasi baca/tulis PDF
- Sebagian fitur juga disediakan sebagai CLI agar dapat digunakan di terminal atau browser
- Library ini ditulis dengan Python murni dan tidak memiliki dependensi eksternal
- Menekankan kesederhanaan dan imutabilitas
- Cara penyuntingan default adalah pembaruan inkremental, yaitu menambahkan perubahan ke akhir file asli tanpa menimpa file asli secara langsung
- Jika diperlukan, revisi dapat diputar balik
- Semua revisi juga dapat digabungkan menjadi satu
Instalasi dan penggunaan CLI
pip install pdfsyntax
- Format penggunaan dasar CLI adalah sebagai berikut
pdfsyntax COMMAND FILE
- Jika diinstal dari source, dapat dijalankan dengan format yang lebih panjang
python3 -m pdfsyntax COMMAND FILE
- Perintah utama untuk analisis PDF cepat adalah sebagai berikut
overview: menampilkan informasi teks tentang struktur dan metadata
disasm: menampilkan dump struktur file ke terminal
text: menampilkan teks hasil ekstraksi yang mempertahankan tata letak spasial seperti hasil scan
fonts: menampilkan daftar font yang digunakan
browse: menampilkan sumber PDF secara rapi dan membuat HTML statis dengan hyperlink untuk mendukung penjelajahan struktur internal
Cara menggunakan API
- PDFSyntax sebagian besar terdiri dari fungsi-fungsi sederhana
- Dengan
readfile, PDF dapat dibaca, dan dengan metadata, metadata dapat diperoleh dalam bentuk Python dict
>>> from pdfsyntax import readfile, metadata
>>> doc = readfile("samples/simple_text_string.pdf")
>>> metadata(doc)
- Objek
Doc adalah hampir satu-satunya kelas khusus yang menyimpan status internal dokumen
- Konten yang di-cache atau di-memoize dari file asli
- Perubahan berupa penambahan, modifikasi, dan penghapusan konten
- Riwayat modifikasi yang dilacak melalui pembaruan inkremental
- Fungsi
metadata yang sama juga dapat digunakan sebagai metode objek Doc
>>> doc.metadata()
- Fungsi tingkat rendah seperti
get_object dan update_object dapat digunakan untuk mengakses dan memanipulasi objek internal dokumen secara langsung
- Fungsi tingkat tinggi seperti
rotate juga disediakan
>>> from pdfsyntax import rotate, writefile
>>> doc180 = rotate(doc, 180)
- Dalam contoh rotasi, objek asli tidak diubah; objek baru yang memuat perubahan orientasi yang sedang berlangsung dibuat
- PDF yang telah dimodifikasi dapat ditulis ke disk dengan
writefile
>>> writefile(doc180, "rotated_doc.pdf")
- File hasilnya berbentuk bagian baru yang ditambahkan setelah konten asli, dan perubahan dapat dibatalkan dengan memotong bagian tersebut
Status saat ini dan kebijakan kontribusi
- Proyek ini sedang dikerjakan dan merupakan software berkualitas beta
- API dapat berubah kapan saja
- Daftar pekerjaan berikutnya mencakup item berikut
- Memotong dan menempel halaman
- Kompresi lossless
- Lebih banyak filter
- Peningkatan ekstraksi teks
- Penguatan ekstraksi teks melalui deteksi layout
- PDFSyntax berlisensi MIT
- Saat ini belum menerima kontribusi eksternal
- Ini adalah proyek pribadi dengan waktu yang terbatas
- Setelah lebih dulu berfokus pada roadmap fitur baru dan refactoring, kontribusi akan diterima ketika sudah stabil
1 komentar
Komentar Hacker News
Dulu saya pernah mendapat tugas mengekstrak data dari berbagai PDF, dan membuat alat untuk memvisualisasikan tata letak karakter di halaman serta kotak pembatas semua elemennya
Pada akhirnya proyek itu gagal total, tidak menghasilkan hasil yang diharapkan, dan membuat beberapa orang marah
Kalau sekarang, saya 100% akan memilih memanfaatkan kemampuan LLM untuk mengambil data dari PDF. Waktu itu belum ada pilihan seperti itu
Tergantung ekspektasinya, OCR bisa membawa kita cukup jauh, tetapi menurut pengalaman saya selalu kurang sedikit dari yang benar-benar dibutuhkan
Saya sudah beberapa kali melihat kasus di mana huruf-huruf teks terdiri dari glyph font kustom tanpa pemetaan seperti ASCII, atau bentuk hurufnya digambar sebagai garis, seperti yang sangat umum pada hasil keluaran CAD
Kalau begitu, tidak ada teks teridentifikasi yang bisa diekstrak, jadi akhirnya halaman harus diperiksa ulang dengan OCR
Di https://runtrellis.com/ kami membangun pipeline pemrosesan PDF dari nol berbasis LLM dan vision language model, dan melihat akurasi yang mendekati 100% bahkan pada PDF yang sulit
Kuncinya adalah memakai engine berbasis aturan bersama data referensi untuk melakukan validasi silang pada hasil
Keren sekali. Kalau ini ada di tempat kerja saya dulu, saya pasti akan sering memakainya
Idealnya, akan bagus kalau seperti https://lapo.it/asn1js/ di mana kita tinggal menjatuhkan file dan semua pemrosesan dilakukan secara lokal
Karena punya “hak istimewa” menangani kode untuk mengekstrak data dari PDF, selama beberapa waktu saya memakai versi gratis iText RUPS untuk debugging PDF
Fitur inspeksi internal di sini tampaknya lebih kuat, jadi kelihatannya sangat bagus. Saya ingin mencobanya
Saya ingat pernah ada proyek serupa di GitHub. Itu bisa memvisualisasikan data biner sembarang dengan skema yang diberikan, dan sepertinya ada contoh TCP/IP
Itu terlihat sangat bagus untuk peran tersebut, tetapi pada proyek terakhir saya juga butuh serialisasi, jadi tidak memakainya
https://github.com/HexFiend/HexFiend/blob/master/templates/T...
Menariknya, saya memakai PDF sebagai “Hello World” saat menguji deskriptor format file seperti itu, karena spesifikasi PDF memang sangat aneh
Jika suatu bahasa deskripsi bisa mengekspresikan layout PDF dengan akurat, itu pasti bisa dianggap dirancang dengan baik
Sejauh ini, saya tidak terlalu beruntung kecuali dengan yang memungkinkan keluar dari mode deklaratif untuk “lalu jalankan kode ini”
Ini sepertinya juga akan berguna untuk forensik dan mencari watermark
Terlihat bagus
Akan lebih baik kalau semua byte PDF ditampilkan.
endobjdanxrefsepertinya tidak terlihatAkan sangat bagus kalau ini hadir sebagai library browser. Cukup drag and drop file lalu lihat bagian dalamnya. Tetap mengesankan
Bagus sekali. Ini adalah alat pratinjau keamanan yang sangat berguna. PDF memang menyebalkan
Saya penasaran apakah alat UI yang menangani visualisasinya adalah library
Saya sangat suka format UI-nya, dan ingin memakainya juga untuk membongkar serta men-debug byte stream video
Edit: ternyata sebenarnya cukup sederhana. Pemanfaatan CSS-nya bagus! https://github.com/desgeeko/pdfsyntax/blob/main/docs/simple_...
Dalam konteks serupa, kenapa PDF masih belum tergantikan? Ada XPS, DjVu, XHTML (EPUB), tetapi semuanya tampaknya menargetkan use case yang berbeda, misalnya file HTML yang dipaketkan
Yang saya inginkan adalah format dokumen sederhana yang bisa menyematkan file lain dan metadata tanpa kebesaran Adobe
Harus bisa memberi hyperlink di dalam halaman, teks tidak meluber saat ukuran huruf diubah, dan tetap bisa dicetak secara konsisten
PDF bukan format data, melainkan format deskripsi halaman, jadi semua keputusannya lahir dari kebutuhan agar “halaman” yang sama bisa dicetak meskipun memakai sistem operasi, perangkat lunak, printer, dan ukuran kertas yang berbeda-beda
Alasan utama PDF bertahan lama mungkin karena begitu banyak hal berjalan di atas paradigma dokumen, yaitu melihat “dokumen” sebagai “sekumpulan lembar kertas”
Dari ringkasan setelah kunjungan rumah sakit sampai dokumen registrasi mobil, semuanya sudah punya representasi visual tertentu yang dipilih agar terlihat masuk akal dan pas secara presisi di atas kertas
HTML, misalnya dalam bentuk yang dibuat mandiri dengan gambar dan CSS sebagai data URL, atau ePub, mungkin lebih baik dalam banyak hal
Tetapi tujuannya terlalu berbeda, sehingga kalau Anda mencoba meyakinkan para pembuat PDF saat ini untuk beralih, Anda akan mendengar keluhan bahwa isi akan terlihat sedikit berbeda di tiap perangkat, bahkan pemisahan halaman pun bisa berubah tergantung pengaturannya
Hal menarik terkait ini adalah bahkan Google Docs, yang tampaknya jauh kurang dari separuh kasusnya dicetak atau diubah menjadi PDF, tetap default ke mode halaman, bukan mode “tanpa halaman”
Mode “tanpa halaman” jauh lebih berguna karena menyesuaikan jendela seperti halaman web biasa dan menggulir satu permukaan kontinu tanpa akhir
Persyaratan “teks tidak meluber” membawa banyak detail di belakangnya
Dalam PDF, setiap huruf, karakter, atau glyph pada teks bisa punya posisi x,y yang presisi di atas halaman, kadang bahkan di luar halaman
Jadi konten bisa ditempatkan dengan presisi terlepas dari apa yang ada di sekitarnya. Aplikasi yang menghasilkan PDF harus menempatkan item dengan benar dan mengimplementasikan pemenggalan baris huruf atau kata
XPS adalah yang paling dekat untuk mengimplementasikan ulang PDF, tetapi Microsoft tidak mendapat dukungan yang cukup dari pihak lain dan akhirnya menghilang diam-diam
PostScript, meskipun aneh, adalah bahasa pemrograman lengkap, sedangkan PDF bukan. Artinya, PDF tidak Turing-complete
PDF tidak mendukung alur kontrol, jadi hal-hal yang di PostScript bisa dinyatakan dengan loop sederhana harus diurai menjadi rangkaian deklarasi atau ekspresi sederhana di PDF
Keuntungannya adalah merender PDF tidak membutuhkan interpreter program yang lengkap