PDF memiliki kekosongan tambahan dalam semua kata setelah dijalankan melalui Ghostscript

10

PDF ini diproduksi oleh Abbyy Finereader 10:

http://ebooks.zeitr.org/from_abbyy.pdf

Anda dapat menyalin & menempelkan kalimat pertama dan mendapatkan hasil teks ini (sangat bagus):

Der »Bund Deutscher Gymnastik-Schulleiter« «pada 20 November 1955 anläßlich einer Zusammenkunft der Leiterinnen und Leiter der privaten deutschen Gymnastik-Ausbildungsstätten gegründet.

Setelah beberapa pemrosesan dengan Ghostscript 9.02 (Windows 64 bit) saya mendapatkan file ini:

http://ebooks.zeitr.org/after_ghostscript.pdf

Sekarang kalimat pertama terlihat aneh - ada ruang ekstra sebelum karakter terakhir dari setiap kata.

Der »Bun d Deutsche r GymnastikSchulleiter« hari ke 20 Novembe r 195 5 bulan lalu oleh Zusammenkunf t der Leiterin n un d Leite r de r private n deutsche n GymnastikAusbildungsstätte n gegründet.

Ini memiliki efek negatif utama yang Anda tidak dapat mencari seluruh kata di Acrobat Reader. Saya dapat mereproduksi efek dengan parameter minimal yang ditetapkan untuk Ghostscript:

-sDEVICE=pdfwrite ^
-dBATCH ^
-dNOPAUSE ^
-sstdout="myStdOut" ^
-sOutputFile="myDestFile.pdf" ^
 mySourceFile.pdf

Ada ide?

Kurt Pfeifle
sumber
@Erwin Jurschitza: maukah Anda menjaga tautan file from_abbyy.pdf Anda sementara waktu, sehingga dapat diambil bahkan setelah beberapa bulan?
Kurt Pfeifle
@ipitas: Tidak masalah, ada di Amazon S3.

Jawaban:

8

Saya menemukan ini masalah yang menarik dan melihat lebih dekat ...

Pertama, saya menggunakan qpdfalat commandline untuk mengompres aliran data PDF sehingga saya bisa lebih baik melihat kode sumber dari kedua file:

qpdf.exe ^
   --qdf ^
     from_abbyy.pdf ^
     qdf--from_abbyy.pdf

qpdf.exe ^
   --qdf ^
     after_ghostscript.pdf ^
     qdf--after_ghostscript.pdf

Melihat salah satu kejadian pertama di mana ruang ekstra dimasukkan (itu adalah string asli "Bund Deutscher Gymnastik-Schulleiter" berubah menjadi "Bun d Deutsche r GymnastikSchulleiter" ), saya menemukan cuplikan PDF berikut:

Dalam qdf - from_abbyy.pdf:

( Deutsche) Tj
0 Tc
(r) Tj
1 0 0 1 143.236 265.140 Tm     %% Tm = 'text matrix' operator
3.569 Tw
0.706 Tc
( Gymnastik-Schulleite) Tj

Dalam qdf - after_ghostscript.pdf:

( Deutsche)Tj
0 Tc
36.235 0 Td                    %% extra Td = 'move text current point' operator
(r)Tj
2.16501 0 Td                   %% Td = 'move text current point' instead of Tm
3.569 Tw
0.706 Tc
( Gymnastik-Schulleite)Tj

Untuk memberi Anda sedikit gambaran tentang arti dari operator grafis PDF yang digunakan di sini, berikut adalah daftar singkatnya:

Tj - show text
Tc - set character spacing
Tm - set text matrix
Tw - set word spacing
Td - move text current point

Seperti yang Anda lihat, Ghostscript mengganti operator Tm( matriks teks ) asli dengan yang Td( pindahkan titik teks saat ini ), dan itu juga menambahkan tambahan 2.16501 0 Td... Saya tidak tahu mengapa ini. Saya akan mengirimkan laporan bug ke bugzilla Ghostscript [*] dan melihat apakah mereka tertarik untuk menyelesaikannya.

Namun perlu dicatat, bahwa masalah ini tidak terjadi, jika saya menggunakan Linux Acrobat Reader 9.4.2 dan menggunakan menu action "File -> Save as Text ..." . Dalam hal ini, tidak ada ruang tambahan (tetapi beberapa linebreak tambahan). Di Linux juga, teks tidak dapat dicari dengan benar, dan juga menunjukkan spasi tambahan saat melakukan copy'n'paste ....


[*] Saya akan memperbarui di sini dengan nomor bug ketika saya selesai melakukannya.


Memperbarui:

Setelah merenungkan sedikit tentang Tmoperator yang diganti , saya sekarang berpikir ini seharusnya tidak menjadi akar masalah.

Ketika menyadari itu, saya mencoba membuat konversi dengan Ghostscript v8.71 bukannya v9.02. Dan apa yang harus saya katakan? Masalah copy'n'paste tidak terjadi dengan output v8.71!

Itu berarti: ada masalah dalam Ghostscript 9.02 yang tidak ada di 8.71. Kemungkinan besar itu ada hubungannya dengan metrik font yang tertanam dalam output PDF. Karena kutipan PDF yang dikutip di atas sama dalam output v8.71 seperti pada output v9.02 ....

Pembaruan 2:

URL entri bug di bugzilla Ghostscript:

Pembaruan 3:

Bug ini tampaknya telah diperbaiki sementara waktu. Saya tidak melihat itu terjadi dengan versi Ghostscript saya sudah lagi mengujinya dengan: Git saat ini (v9.10GIT) atau dengan Ghostscript v9.06.

Kurt Pfeifle
sumber
@ Pipitas: Terima kasih banyak untuk menganalisis ini!
5

Jika Anda memindai halaman dengan teks ke dalam PDF dan menjalankan aplikasi OCR di atasnya, maka teks akan ditambahkan ke halaman, tetapi "mode rendering teks" diatur ke tidak terlihat. Itu ada di sana, tetapi tidak ditampilkan di layar (atau di atas kertas jika dicetak). Apa yang Anda lihat atau cetak adalah gambar yang dipindai asli.

Bagaimana kita bisa membuat teks yang tidak terlihat terlihat?

Nah, kita bisa mengedit PDF ... Kode PDF untuk mengatur rendering teks menjadi tak terlihat adalah ini:

3 Tr

Anda tidak dapat menemukan string ini (belum) di from_abbyy.pdf asli atau di from_ghostscript.pdf karena bagian dari PDF dikompresi. Jadi kami membuka kompresi mereka sejauh mungkin dengan bantuan qpdf:

qpdf \
 --qdf \
   from_abbyy.pdf \
   qdf--from_abbyy.pdf

qpdf \
 --qdf \
   after_ghostscript.pdf \
   qdf--after_ghostscript.pdf

Sekarang kita dapat menemukan string di atas dengan mudah (dan hanya ada satu kejadian di setiap file).

Mari kita beralih ini ke salah satu mode rendering teks yang terlihat. Secara keseluruhan, kita dapat memilih di antara 8 mode rendering teks ini:

 0 -  fill glyph shapes
 1 -  stroke glyph shapes
 2 -  fill, then stroke glyph shapes
 3 -  neither fill nor stroke glyph shapes (invisible)
 4 -  fill and add to path for clipping glyph shapes
 5 -  stroke glyph shapes and add to path for clipping
 6 -  fill, then stroke glyph shapes and add path for clipping
 7 -  add glyph shapes to path for clipping

Jika saya menggunakan mode "isi", teks dari OCR mungkin akan terlihat tidak begitu bagus di atas gambar pemindaian yang mendasarinya. Karena itu saya lebih suka varian "stroke". Jadi saya cukup mengubah baris di atas untuk membaca

 1 Tr

Melihat PDF yang dimodifikasi ini, saya tidak suka, karena linewidth default terlalu tebal untuk selera saya. Juga, warna garis luar garis hitam (standar); Saya lebih suka merah sehingga memiliki kontras dengan bentuk yang awalnya dipindai. Oleh karena itu saya menambahkan beberapa kode ke bagian depan baris ini yang menetapkan linewidth menjadi seperempat poin:

 .25 w

dan beberapa lainnya untuk mengatur warna stroke menjadi merah:

 1 0 0 RG

Baris lengkap sekarang terbaca:

 .25 w 1 0 0 RG 1 Tr

Itu saja.

Perhatikan, bahwa manipulasi kecil kami telah merusak file, karena "TOC" (dalam istilah teknis: xreftabelnya) sekarang tidak lagi valid. Acrobat Reader atau Acrobat Professional akan tetap membukanya (tanpa mengeluh bahkan) dan diam-diam "memperbaiki" bagian xref dari file tersebut. Pemirsa PDF lain mungkin menolak file tersebut, tetapi untuk saat ini kami tidak peduli ...

Berikut screenshot dari hasilnya: diperbesar ke lebar jendela (Screenshot pertama diperbesar menjadi lebar jendela.) diperbesar hingga 800% (Screenshot kedua diperbesar menjadi 800%.)

Garis merah adalah teks pindaian yang dibuat terlihat sekarang, seperti yang kita inginkan.

Saya melakukan prosedur yang sama seperti diuraikan di atas untuk kedua file from_abbyy.pdf dan after_ghostscript.pdf . Saya membuka kedua hasil dalam 2 contoh Acrobat Reader yang berbeda. Jika kita membuat keduanya memperbesar nilai yang sama dan memaksimalkan kedua jendela, maka mudah untuk beralih tampilan antara kedua file melalui [alt]+[tab]. Ini adalah cara yang baik untuk mengungkapkan bahkan perbedaan render terbaik antara dua file PDF.

Hasil saya adalah: bahkan tidak ada satu pixel pun yang berbeda antara input Ghostscript (v9.02) dan outputnya untuk file ini. Tetapi ada perbedaan yang cukup besar jika Anda ingin menyalin teks bukan ...

Kurt Pfeifle
sumber
1

Saya tidak melihat masalah yang dijelaskan. Saya membuka file PDF 'setelah' dengan Acrobat Professional 9.0 dan teksnya disalin dan ditempelkan dengan benar.

Ghostscript sepenuhnya menginterpretasikan file PDF, dan menghasilkan file PDF baru berdasarkan apa yang ditafsirkannya, itu tidak memiliki hubungan dengan file asli selain dari itu mencatat posisi teks.

Karena serangkaian fitur PDF yang kaya, karakter dapat diposisikan di tempat yang sama dengan menggunakan beberapa metode berbeda. Jadi tidak ada yang salah atau tidak terduga dalam cara GS memproduksi file PDF.

Mengingat bahwa teks dapat disimpan dengan benar, ini adalah masalah heuristik Acrobat yang memutuskan apakah dua karakter 'terdekat' berdekatan atau memiliki ruang di antara, ketika ditangani sebagai ASCII berturut-turut.

Saya tidak percaya masalahnya bisa menjadi metrik font yang tertanam karena alasan sederhana bahwa font tersebut tidak tertanam :-) Font yang digunakan adalah Helvetica, yang tidak tertanam dalam dokumen, dan karenanya Acrobat (setidaknya untuk saya) menggunakan ArialMT. Perhatikan bahwa file PDF 'asli' juga tidak mengandung font.

Saya akhirnya akan melihat bug yang dilaporkan, tetapi tidak akan segera dan saya ragu ada yang bisa (atau akan) kami lakukan. Sepertinya saya ini adalah konsekuensi tak terhindarkan dari heuristik. Ini mungkin membantu untuk menanamkan font meskipun, sehingga setidaknya mereka akan konsisten.

Ken
sumber
@ user701996: Menarik - tidak ada masalah dengan Acrobat Pro 9.0? Acrobat Reader X saya (10.0.1, Windows) memiliki masalah.
@ user701996: Saya membuka file di Acrobat Professional 9.4.4. Copy'n'paste dari after -file tidak berfungsi. Simpan sebagai Teks ... namun berhasil ....
Kurt Pfeifle
@ user701996: Sekalipun font tidak disematkan, metrik font adalah . Hmmm, kecuali fontnya adalah salah satu dari 'Basis 14' .... Jadi, Anda mungkin benar dalam hal ini. Saya akan melihat lebih dekat.
Kurt Pfeifle
@ user701996: Anda terdengar seperti salah satu dari orang-orang Ghostscript. Apakah kamu?
Kurt Pfeifle
1

Dari laporan bug Ghostscript di:

http://bugs.ghostscript.com/show_bug.cgi?id=692206


Saya sekarang dapat mereproduksi masalah ini, dan ini bukan regresi dari 8,71, ini merupakan perkembangan (dan perubahan Adobe).

8,71 dikirimkan bersama bug yang menyebabkannya menulis CMU ToUnicode yang tidak valid. Dokumentasi Adobe yang menyesatkan dan kontradiktif menyebabkan CMap ditulis sebagai CMap, padahal sebenarnya ToUnicode CMaps memiliki aturannya sendiri, yang tidak kompatibel.

ToUnicode CMaps biasanya hanya digunakan untuk mencari dan menyalin / menempel. Sesuai namanya, kode tersebut digunakan untuk memetakan kode karakter ke titik kode Unicode. ToUnicode CMap dalam file PDF 8,71 tidak digunakan, karena tidak valid, yang ada di versi yang lebih baru adalah valid, dan Acrobat diketahui menggunakannya.

Tampaknya dalam Acrobat Reader hingga dan termasuk 9.2 keberadaan data ToUnicode tidak ada bedanya. Pada titik tertentu setelah 9.2 mekanisme pencarian, berubah, dan Acrobat tampaknya menggunakan dua mekanisme yang berbeda tergantung pada apakah ada ToUnicode CMap. Saya tidak memiliki akses ke Acrobat Pro setelah 9.2 dan hanya baru saja menginstal Reader X, saya tidak memiliki apa-apa di antaranya.

Metode 'no Unicode' bekerja di semua versi Acrobat, metode 'Unicode' gagal pada versi yang lebih baru.

Saya menunjukkan ini dengan spasi putih referensi ke ToUnicode CMap dari FontDescriptor. Jika diperlukan saya dapat membuat berbagai file tersedia, tetapi mereka besar karena mereka didekompresi.

Karena pencarian adalah upaya heuristik dalam PDF, maka tidak mungkin untuk menjamin hasilnya. Perubahan perilaku adalah karena Acrobat, bukan Ghostscript, dan perubahan dalam Ghostscript adalah untuk memperbaiki bug yang sebenarnya, jadi sebuah perkembangan, bukan regresi.

Ken
sumber
0

Untuk memeriksa apakah masalah ini terhubung ke 'font yang tertanam' atau tidak, saya telah membuat konversi lain, di Linux. Saya menggunakan perintah ini untuk membuat Ghostscript menyematkan font yang digunakan:

gs \
 -o after_ghostscriptonlinux.pdf \
 -sDEVICE=pdfwrite \
 -dPDFSETTINGS=/prepress \
 -sEmbedAllFonts=true \
  from_abbyy.pdf

Ghostscript akan menampilkan hasil ini:

GPL Ghostscript SVN PRE-RELEASE 9.02 (2011-02-07)
Copyright (C) 2010 Artifex Software, Inc.  All rights reserved.
This software comes with NO WARRANTY: see the file PUBLIC for details.
Processing pages 1 through 1.
Page 1
Loading NimbusSanL-Regu font from %rom%Resource/Font/NimbusSanL-Regu... 2776276 1420923 2081124 778943 3 done.
Loading NimbusSanL-ReguItal font from %rom%Resource/Font/NimbusSanL-ReguItal... 2853416 1529123 2137980 831640 3 done.
Loading NimbusSanL-Bold font from %rom%Resource/Font/NimbusSanL-Bold... 2970748 1643508 2194836 886454 3 done.

Ghostscript telah menyematkan font dari keluarga font yang bernama NimbusSanL . Jadi tidak ada lagi ArialMT , seperti yang digunakan untuk rendering di layar oleh Acrobat Reader sebagai pengganti Helvetica yang hilang (lihat juga komentar dari pengguna701996 di atas). Perhatikan, Ghostscript akan mengganti nama font itu menjadi Helvetica segera setelah tertanam. Tapi itu bukan masalah, karena NimbusSanL diciptakan sebagai tiruan dari Helvetica ...

Namun, bahkan untuk output PDF ini, copy'n'paste dari Acrobat Reader tidak akan berfungsi dengan baik. Terlepas dari kenyataan bahwa Reader tidak perlu lagi menggunakan ArialMT untuk menggantikan Helvetica. Pembaca sekarang menggunakan kloning NimbusSanL / Helvetica yang tertanam.

Sejauh ini kami telah menetapkan fakta-fakta ini tentang teks copy'n'pasting dari Acrobat Reader atau Acrobat Professional:

  • Output of Ghostscript v9.02 tidak berfungsi dengan cukup baik untuk file ini.
  • Itu masalahnya apakah font tertanam oleh GS atau tidak.
  • Itu berlaku untuk GS pada Windows XP serta GS di Linux.

  • Output of Ghostscript v8.71 TIDAK berfungsi dengan baik untuk file ini.

  • Itu masalahnya apakah font tertanam oleh GS atau tidak.
  • Itu berlaku untuk GS pada Windows XP serta GS di Linux.

  • Bahkan untuk output di mana copy'n'paste rusak, Simpan sebagai Teks ... tidak.

Saya masih tidak mengerti mengapa ini harus terjadi. Tapi itu jelas terlihat sebagai semacam (mungkin minor) regresi Ghostscript dalam perjalanan dari v8.71 ke 9.02.

Sekarang mari kita coba perangkat lunak penampil PDF lainnya dengan PDF 'kritis':

  • Adobe Reader X di dalam Wine di Linux: copy'n'paste dibuat dengan cara yang sama dengan v9.4.4.
  • Evince v2.32.2 di Linux: copy'n'paste works.
  • PDFXChange Viewer 2.5 (build 191) pada Windows XP Prof: copy'n'paste works.
  • MuPDF reader 0.8 di Linux: tidak tahu bagaimana cara menyalin 'n'paste - tetapi' search 'bekerja dengan sempurna.
  • Ditemukan s.th. disebut "PDF Viewer 0.1.7" di Linux: copy'n'paste works.
  • SumatraPDF v1.5 di dalam Wine di Linux: copy'n'paste works.
  • SumatraPDF v1.5.1 pada Windows XP: copy'n'paste works.
  • FoxitReader 4.3.1.0113 pada Windows XP: copy'n'paste works.
  • Nitro PDF Reader di dalam Wine di Linux: copy'n'paste berfungsi.

Catatan, masih ada perbedaan lain, tetapi sangat kecil antara semua pembaca PDF 'berfungsi' di mana putusan saya adalah copy'n'paste works . Seperti tanda hubung yang hilang di sini, atau beberapa spasi ganda di antara kata-kata di sana, dan hal-hal lain semacam itu ... Saya tidak memiliki penjelasan saat ini mengapa ini mungkin, tapi mungkin itu penyebab utama yang sama mengapa ada kesenjangan besar antara produk Adobe (yang tidak memiliki copy'n'paste yang berfungsi untuk file ini) yang satu memiliki dan yang lainnya di dunia.

Kurt Pfeifle
sumber