2 poin oleh GN⁺ 2025-02-11 | 1 komentar | Bagikan ke WhatsApp
  • 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

  • Dapat diinstal dari PyPI
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

 
GN⁺ 2025-02-11
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

    • Mem-parsing data dari PDF sembarang itu nyaris seperti tugas terkutuk. PDF bisa berisi gambar juga, jadi kurang lebih seperti langsung menjadikan JPEG sebagai target
      Tergantung ekspektasinya, OCR bisa membawa kita cukup jauh, tetapi menurut pengalaman saya selalu kurang sedikit dari yang benar-benar dibutuhkan
    • LLM bisa membantu menyusun urutan karakter yang diekstrak dari halaman, tetapi mendapatkan isi sebenarnya tetap sulit
      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
    • Saya pernah mengalami hal serupa di pekerjaan sebelumnya, dan pendekatan parsing berbasis aturan sangat sulit dibuat dengan benar serta sering gagal pada edge case
      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
    • Dulu saya pernah mengekstrak gambar CAD 2D dari PDF dan mengubahnya menjadi 3D penuh, cukup menyenangkan
    • pdfjs melakukan semua pekerjaan semacam itu dan cukup tangguh. Saya baru-baru ini memakainya untuk mengekstrak data tabel dari laporan bank selama 10 tahun
  • 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

    • Mungkin https://kaitai.io/?
      Itu terlihat sangat bagus untuk peran tersebut, tetapi pada proyek terakhir saya juga butuh serialisasi, jadi tidak memakainya
    • HexFiend juga punya bahasa template untuk visualisasi data biner. Berbasis Tcl
      https://github.com/HexFiend/HexFiend/blob/master/templates/T...
    • Dalam konteks ini, kata “sembarang” perlu dipakai dengan hati-hati
      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

    • Terdengar menarik. Saya kurang paham, bagaimana ini bisa dipakai untuk mendeteksi watermark? Apakah tanda tangan juga bisa dideteksi dengan cara yang sama?
  • Terlihat bagus
    Akan lebih baik kalau semua byte PDF ditampilkan. endobj dan xref sepertinya tidak terlihat

    • Betul, akan segera saya perbaiki
  • Akan sangat bagus kalau ini hadir sebagai library browser. Cukup drag and drop file lalu lihat bagian dalamnya. Tetap mengesankan

    • Maksudnya ekstensi browser? Bukan bermaksud kasar, saya hanya ingin memastikan saya memahaminya dengan benar
  • 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_...

    • Betul. Saya mengutamakan kesederhanaan, dan interaksi yang disediakan HTML dan CSS dasar sudah cukup untuk use case saya :)
  • 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

    • Menurut saya alasan PDF menjadi format yang “tidak menyenangkan” untuk pengeditan, pembacaan di perangkat, dan ekstraksi informasi semantik alih-alih informasi presentasi bukan karena dosa atau kebesaran Adobe
      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
    • Use case-nya berbeda
      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
    • Hal menarik tentang PDF yang baru saya sadari belakangan adalah bahwa PDF adalah subset dari PostScript, dan itulah sebagian penyebab bobotnya
      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
    • Begitu percakapan seperti ini dimulai, kubu LaTeX langsung muncul, lalu siapa pun yang sebenarnya bisa memberi kontribusi berarti pada standar jadi terhambat oleh diskusi itu
    • Salah satu alasannya adalah tidak satu pun format lain itu yang benar-benar cocok untuk percetakan komersial begitu saja