Cara melihat dan mengedit kode file PDF

12

Saya bertanya-tanya bagaimana cara melihat dan mengedit kode file PDF?

  1. Dengan melihat, saya tidak ingin melihat format biner, jadi saya pikir hexdumpmungkin bukan yang saya inginkan. Saya sudah mencoba gedit, tetapi tidak ada metode penyandian yang dapat digunakan untuk mendekode konten PDF.

  2. Dengan mengedit, saya ingin mencari /Fitdan mengubahnya /XYZdengan misalnya. Tapi perintah saya sed s/\/Fit/\/XYZ/ < 1.pdf > 2.pdfsepertinya tidak mengubah tampilan PDF saya seperti yang saya harapkan, meskipun tidak melaporkan kesalahan. Saya bertanya-tanya apakah sedsebenarnya dapat bekerja pada file PDF seolah-olah itu teks biasa?

Konteks pertanyaan saya dapat ditemukan dari pertanyaan ini . OS saya adalah Ubuntu 10.10.

Tim
sumber

Jawaban:

9

Anda dapat menggunakan sedfile biner (setidaknya GNU; beberapa implementasi mungkin mengalami masalah dengan file yang mengandung karakter nol atau tidak diakhiri dengan karakter baris baru). Tetapi perintah yang Anda gunakan hanya menggantikan kemunculan pertama /Fitpada setiap baris, dan baris cukup banyak tidak berarti dalam file PDF. Anda harus mengganti semua kemunculan:

 sed s/\/Fit/\/XYZ/g

Akan lebih kuat hanya mengganti /Fitjika tidak diikuti oleh kata konstituen (misalnya tidak mengganti /Fitness; Saya tidak tahu apakah file Anda berisi kejadian /Fityang akan menyebabkan masalah). Ini salah satu caranya:

perl -pe 's!/Fit\b!/XYZ!g'
Gilles 'SANGAT berhenti menjadi jahat'
sumber
Terima kasih! Sekarang berhasil! (1) Saya bertanya-tanya bagaimana cara mencari karakter dalam konten biner? Apakah pertama-tama menyandikan karakter kueri sebelum pencarian? (2) Pada perintah terakhir, apa artinya !, \bdan gartinya? Bisakah itu dilakukan tanpa perl hanya dengan sed?
Tim
1
@Tim (1) Sed memuat data ke dalam memori, mengoperasikannya, dan mencetaknya. Mengapa perlu mengkodekan sesuatu? (2) gberarti mengganti semua kemunculan pada setiap baris, baik sed dan perl. !adalah pemisah; Anda dapat memilih (hampir) karakter apa saja sebagai pemisah untuk sperintah (ini berlaku dalam sed dan perl). \bberarti batas kata; itu ada di perl tetapi tidak di sed.
Gilles 'SO- berhenti bersikap jahat'
Tentang (1), karena karakter yang Anda berikan untuk sed dalam perintah dapat dibaca oleh manusia. Jika konten yang dicari sepenuhnya biner, bagaimana cara menemukan kata kueri di sana?
Tim
@Tim Text adalah data biner yang kebetulan dapat dibaca manusia.
Gilles 'SANGAT berhenti menjadi jahat'
1
@Tim Ya, Anda bisa mengirimkan data biner dalam kueri. Anda harus memasukkan karakter secara harfiah dalam kode sumber sed atau shell Anda.
Gilles 'SANGAT berhenti menjadi jahat'
17

Mengenai pertanyaan pertama Anda ("melihat kode sumber, tetapi tidak ada biner"): ada beberapa opsi yang Anda miliki untuk mengurangi kompresi aliran biner internal yang dilampirkan ke banyak objek.

Alat favorit saya untuk ini adalah QPDF , tersedia di semua platform OS utama. Perintah berikut ini akan menghapus semua stream dan semua stream objek:

 qpdf --qdf --object-streams=disable orig.pdf expanded.pdf

Sekarang Anda dapat membuka PDF Anda di editor teks apa pun. (Mungkin masih ada beberapa gumpalan biner di sana: misalnya, file font dan profil ICC, yang tidak masuk akal untuk diperluas QPDF).

Untuk kembali kompres- yang expanded.pdflagi setelah mengedit, Anda dapat menjalankan:

 qpdf expanded.pdf orig2.pdf

(Hati-hati saat mengedit PDF secara manual! Anda perlu tahu banyak tentang sintaks internal agar dapat melakukan ini dengan benar. Segera setelah Anda menambah atau menghapus satu byte, Anda bisa mendapatkan pesan kesalahan dari pembaca PDF yang mungkin tidak lagi dapat membukanya, karena ToC internal PDF rusak, yang didasarkan pada perhitungan byte-offset. Hanya mengganti Fitdengan XYZstring harus baik-baik saja, meskipun ...)

Kurt Pfeifle
sumber
1
Anda juga dapat menambah atau menghapus teks. Ketika panjang aliran objek berubah, byte offset dapat dihitung ulang dengan menggunakan fix-qdfprogram yang merupakan bagian dari qpdf. Anda masih harus sedikit berhati-hati. Lihat qpdf.sourceforge.net/files/qpdf-manual.html#ref.qdf
H. Rittich
@ H.Rittich: Terima kasih atas komentarnya ... Menurut Anda, bagaimana hal ini membuka perspektif baru tentang masalahnya? Apakah Anda pikir kami tidak tahu bahwa kami dapat menambah atau menghapus teks dengan cara ini?
Kurt Pfeifle
@KursPfeifle: Saya tidak membuat asumsi tentang apa yang Anda ketahui. Jawabannya menyatakan bahwa mengedit PDF dengan cara ini perlu mempertahankan byte byte dari objek dalam file. Namun demikian, dimungkinkan untuk mengubah offset byte ketika kemudian memperbaikinya dengan menggunakan fix-qdf. Oleh karena itu, jika Anda ingin mengganti string dengan string dengan panjang yang berbeda, itu mungkin, tetapi Anda perlu menggunakan fix-qdfalat ini. Saya akan mengatakan, bahwa ini adalah tambahan yang berguna untuk jawabannya.
H. Rittich
@ H.Rittich: Terima kasih telah memberikan perspektif Anda. Ketika saya menekankan perlunya melestarikan byte byte objek, saya tidak ingin memberi nasihat kepada orang-orang tentang BAGAIMANA mereka harus melakukan ini. Jika Anda mengucapkan komentar Anda sedikit berbeda, saya akan mengerti maksud komentar Anda lebih cepat.
Kurt Pfeifle
1

sedberorientasi garis, yang membuatnya tidak cocok untuk file biner, yang disusun sebagai blok bukan garis.
Coba gunakan bbe (bbe-.sourceforge.net) sebagai gantinya.

Atau, baik Emacs (GNU dan XEmacs) dan vim membuka file PDF dengan mulus. Tentu saja, ini tidak terlalu tercetak, karena merupakan gabungan teks dan biner, tetapi cukup untuk keperluan pengeditan Anda.
Ada plugin Pdftk untuk vim yang membuat segalanya lebih mudah, unduh di sini (file zip).
Seperti yang mungkin Anda ketahui, kedua editor di atas memiliki kemampuan pencarian dan penggantian yang kuat.

Juga, mengonversi mode PDF ke QDF sebelum membuat pengeditan file PDF sangat mudah.

Philomath
sumber
Anda juga dapat mencoba mengedit dengan sedmenggunakan -bsakelar. jika berhasil saya akan menambahkan ini ke jawaban saya.
Philomath
@Tim: apa yang Anda maksud dengan "tidak menunjukkan apa-apa", hanya kosong? ada pesan kesalahan? Juga, dapatkah Anda mencoba dengan XEmacs? (Mereka bertiga bekerja untuk saya).
Philomath
Sudahlah -b, ini spesifik cygwin.
Philomath
Emacs mengatakan "File 1.pdf besar (9MB), benar-benar terbuka? (Y atau n)". Saya memilih "y", dan kemudian tidak ada apa-apa di sana.
Tim
Kemungkinan besar masalah Emacs, apakah Anda memiliki XEmacs? (Saya baru saja membuka 31 MB PDF tanpa masalah).
Philomath
0

Gunakan LibreOffice atau OpenOffice untuk membuka PDF, melihatnya, mengganti hal-hal, menulis PDF baru, dll. Saya pikir Anda bahkan dapat menggunakannya dari baris perintah atau secara terprogram jika ada banyak dokumen untuk diproses.

Perhatikan bahwa PDF dari beberapa sumber, misalnya Pemindai, sering berisi halaman sebagai gambar daripada sebagai teks sehingga Anda akan kurang beruntung dengan mereka untuk menggunakan pencarian dan ganti.

Steve Barnes
sumber
3
(1/2) Waspadai fakta berikut: LibreOffice bukan editor PDF asli. Ketika membuka PDF, itu mengkonversi semua halaman ke gambar vektor (yang dapat menjaga bagian raster dari PDF asli sebagai bagian raster) dan membukanya di LibreOffice Draw bagian dari rangkaian LibreOffice. Kemudian, ketika menyimpan file PDF yang diedit, itu akan menjadi file PDF yang diekspor dari format Draw LibreOffice asli (dengan sufiks .odg ) ke PDF.
Kurt Pfeifle
3
(2/2) Alur kerja ini mungkin memiliki efek samping yang tidak diharapkan. Selain itu, aplikasi LibreOffice Draw mungkin tidak dapat mengimpor semua elemen dengan benar dari PDF asli. Namun, dalam banyak kasus masih dapat menjadi alat yang berguna untuk semua orang yang tidak memiliki sarana yang lebih baik tersedia.
Kurt Pfeifle