Cara Penyuntingan Teks dalam PDF Berfungsi: Aliran Kandungan, Pengekodan Fon, dan Mengapa Hanya Satu Baris pada Satu Masa
Halaman PDF tidak mempunyai perenggan atau kotak teks, hanya arahan untuk melukis glif dengan sesuatu fon pada sesuatu kedudukan. Menyunting satu baris bermakna memadam arahan lama dan menulis yang baharu di tempat yang sama, dan itulah yang menentukan apa yang boleh dan tidak boleh disunting.

Halaman PDF tidak mempunyai perenggan dan tidak mempunyai kotak teks. Ia mempunyai senarai arahan: pada kedudukan ini, dengan fon dan saiz ini, lukis glif-glif ini. Menukar teks bermakna memadam arahan yang melukis baris itu dan menulis arahan baharu pada kedudukan yang sama, dengan fon, saiz dan warna yang sama. Itulah sebabnya Sunting PDF menyunting satu baris pada satu masa dan tidak boleh membungkus teks: ia berpunca daripada cara teks disimpan.
Rupa satu baris teks dalam fail
Kandungan sesebuah halaman terletak dalam aliran kandungan, program kecil yang terdiri daripada operator. Empat operator melakukan kebanyakan kerja untuk teks: BT dan ET mengapit satu blok teks, Tf memilih fon dan saiz, Td bergerak ke kedudukan seterusnya, dan Tj melukis satu rentetan. Dengan fon piawai, kes paling mudah kelihatan seperti ini:
BT /F1 18 Tf 20 150 Td (Hello World) Tj ET
Maksudnya: pilih fon F1 pada 18 mata, bergerak ke x 20, y 150, dan lukis Hello World. PDF yang dicetak daripada Chrome biasanya kelihatan berbeza: tanda kurung tidak lagi mengandungi aksara tetapi nombor glif daripada fon, dan Tm menetapkan kedudukan sekali sahaja. Berikut ialah baris Hello World from Georgia daripada halaman yang dieksport oleh Chrome, dengan setiap empat digit perenambelasan mewakili satu nombor glif:
BT /F4 24 Tf 1 0 0 -1 30 52 Tm <002b0048004f004f00520003003a00520055004f0047000300490055005200500003002a004800520055004a004c0044> Tj ET
002b ialah H, 0048 ialah e, 004f ialah l, 0003 ialah ruang kosong, 003a ialah W, dan seterusnya. Nombor ini hanya bermakna dalam satu fon itu; ia bukan Unicode. Apabila anda menyalin teks, pemapar menukar nombor itu kembali kepada aksara menggunakan jadual carian yang disimpan di tempat lain dalam fail.
Ada dua akibatnya. Pertama, tiada apa-apa dalam aliran kandungan yang menyatakan "ini perenggan": pemisah baris hanyalah Td atau Tm lain yang menggerakkan kedudukan ke baris seterusnya, dan bilangan baris dalam satu perenggan perlu disimpulkan daripada kedudukan. Kedua, untuk menulis aksara baharu ke dalam baris, anda memerlukan nombor aksara itu dalam fon tersebut, sedangkan fon selalunya hanya mengandungi glif yang digunakan semasa fail ditulis. Itulah hasil subsetting fon.
Anda boleh mengembangkan aliran dengan qpdf:
qpdf --qdf --object-streams=disable in.pdf out.pdf
Buka out.pdf dalam penyunting teks dan cari Tj untuk melihat setiap rentetan yang dilukis pada halaman. Untuk kandungan lain dalam PDF, lihat Apa yang Terkandung dalam PDF: Objek, Aliran, dan Jadual Rujukan Silang.
Cara penyunting membina semula "baris" daripada glif
Penyunting perlu mengumpulkan glif yang bertaburan menjadi baris yang boleh diklik pengguna terlebih dahulu. Glif dengan fon, saiz dan warna yang sama, yang jaraknya daripada glif sebelumnya tidak lebih daripada satu saiz fon, tergolong dalam jujukan glif yang sama; pemisah baris, fon baharu atau warna baharu menamatkan jujukan itu. Teks yang berjalan dari kanan ke kiri, atau secara menegak, tidak dikumpulkan dan tidak boleh dibuka untuk penyuntingan.
Dua akibat boleh diperhatikan secara langsung. Baris yang mencampurkan dua fon, seperti baris Cina dengan satu perkataan Inggeris di dalamnya, dipecahkan kepada dua jujukan bersebelahan yang diklik secara berasingan. Selepas suntingan, perkara yang sama berlaku: jika teks baharu menggunakan fon lain, baris menjadi dua jujukan, dan menyunting satu daripadanya membiarkan yang satu lagi tidak berubah.
Menyunting satu baris: padam teks lama, kemudian tulis yang baharu
Pemadaman menggunakan bentuk penghitaman khusus teks: glif dalam kawasan baris dibuang daripada aliran kandungan, imej dan garisan dibiarkan, dan tiada kotak berwarna dilukis di atas teks lama, jadi penyalinan dan carian tidak lagi menemuinya. Ia hanya mengubah kandungan halaman; jika teks yang sama turut muncul dalam anotasi atau dalam sifat dokumen, kedua-duanya tidak terjejas.
Penulisan menambah arahan teks baharu pada penghujung aliran kandungan halaman, bermula daripada kedudukan garis asas baris asal dan menggunakan semula saiz dan warnanya. Selepas baris di atas diubah kepada Hello World 2, yang ditambah pada penghujung halaman ialah:
q 1 0 0 1 22.5 148.92 cm 0 0 0 rg
/Span <</ActualText <feff00480065006c006c006f00200057006f0072006c006400200032>>> BDC
BT /F4 18 Tf 0 0 Td <002b0048004f004f00520003003a00520055004f00470003> Tj ET
BT /F9 18 Tf 102.18 0 Td (2) Tj ET
EMC
Q
BT pertama menggunakan fon asal F4 dan nombor glif asal, jadi Hello World digunakan semula tepat seperti sedia ada. Angka "2" tiada dalam subset fon asal, jadi BT kedua memulakan fon Helvetica piawai baharu (F9) untuk melukisnya. q dan Q mengehadkan transformasi koordinat dan warna blok ini kepada blok itu sendiri; penyunting juga membungkus kandungan asal dalam sepasang q/Q, supaya keadaan yang tidak seimbang pada penghujung halaman asal tidak menjejaskan teks baharu. Beginilah rupa satu jujukan; nombornya berbeza mengikut fail.
Penambahan pada penghujung membawa tiga akibat:
- Teks baharu dilukis paling akhir, di atas segala yang lain pada halaman. Teks yang tadinya berada di bawah imej atau blok berwarna muncul di atasnya selepas suntingan.
- Alat yang mengekstrak teks mengikut tertib aliran kandungan (seperti
pdftotext -raw) membaca baris yang disunting paling akhir pada halaman itu, manakala pengekstrakan mengikut kedudukan (pdftotext -layout) tidak menunjukkan perubahan. Halaman kelihatan sama, tetapi tertib bacaan telah berubah. - Penyunting melampirkan ActualText pada teks baharu, yang memberitahu pemapar aksara sebenar yang diwakili oleh glif itu. Satu glif boleh dipetakan kepada beberapa aksara, dan mencarinya daripada nombor glif sahaja kadangkala memulangkan aksara keserasian (contohnya 文 terbaca sebagai radikal Kangxi ⽂); ActualText memastikan apa yang anda salin ialah apa yang anda taip.
Fon mana yang melukis teks baharu
Menggunakan semula fon asal ialah pilihan paling selamat, kerana bentuk glif, ketebalan dan lebarnya sepadan dengan teks di sebelahnya. Sama ada ia boleh digunakan semula bergantung pada sama ada penyunting dapat mengetahui kod yang dimiliki sesuatu aksara dalam fon itu:
- Fon komposit seperti yang di atas (Type0, nombor glif dua bait, pengekodan Identity-H): cari aksara dalam fon untuk mendapatkan nombor glifnya, dan gunakannya jika ditemui. Jika tidak ditemui, aksara itu tiada dalam subset.
- Fon ringkas satu bait (TrueType, Type1) dengan pengekodan WinAnsi atau MacRoman: pemetaan daripada aksara kepada bait adalah tetap, dan lebar diambil daripada jadual lebar dalam fail.
- Fon dengan pengekodan suai (Differences) atau yang bergantung pada pengekodan terbina dalam fon: tiada pemetaan yang boleh dipercayai, jadi penyunting tidak meneka dan beralih kepada fon sandaran, jika tidak teks akan menjadi bercelaru.
Apabila sesuatu aksara tiada dalam fon asal, fon sandaran digunakan. Huruf Latin biasa menggunakan yang paling hampir antara Helvetica, Times dan Courier, fon piawai yang dimiliki setiap pemapar, jadi tiada apa-apa yang perlu dibenamkan. Segala yang lain, seperti aksara Han, kana, Hangul, Thai, huruf Latin beraksen, Cyrillic dan Greek, menggunakan fon Noto sumber terbuka: pelayan mengambil aksara dalam permintaan dan memotong hanya glif itu daripada fon penuh dengan pustaka subsetting sumber terbuka HarfBuzz, biasanya beberapa KB, dan pelayar membenamkannya dalam fail anda. Bentuk serantau aksara Han mengikut bahasa antara muka: Ringkas, Tradisional, Jepun atau Korea.
Glif dibenamkan dan bukannya hanya menulis nama fon kerana fon yang dirujuk melalui nama sahaja digantikan dengan apa-apa fon sandaran yang dipilih setiap pemapar, dan ketebalannya boleh berbeza antara pemapar; apabila dibenamkan, setiap pemapar menunjukkan bentuk yang sama.
Mengapa hanya satu baris pada satu masa
Penyunting tidak mempunyai enjin reka letak. Setiap kedudukan glif adalah tetap dalam fail; teks baharu hanya disusun ke kanan dari titik permulaan menggunakan lebar fon, tanpa logik "bungkus pada tepi", dan tiada apa-apa selepasnya dialihkan. Panjangkan satu baris dan aksara tambahan terus berjalan ke kanan, dan apa-apa yang melepasi tepi halaman tidak dapat dilihat. Menulis semula perenggan atau menambah baris pada jadual memerlukan reka letak baharu, yang bermakna kembali kepada fail sumber tempat PDF itu dibuat.
Lebar juga hanyalah lebar maju milik fon itu sendiri (jarak titik tulis beralih ke kanan selepas setiap glif), tanpa kerning dan tanpa penggantian glif. Teks yang tidak memerlukan shaping (penentuan bentuk dan kedudukan glif mengikut konteks: Latin, Cyrillic, Greek dan aksara Han) disusun dengan betul. Tanda nada Thai memerlukan pemosisian glif supaya terletak di tempat yang betul, yang tidak dilakukan oleh penyunting, jadi kedudukannya mungkin tersasar. Arab memerlukan bentuk glif yang bergantung pada konteks dan reka letak kanan ke kiri, Ibrani memerlukan reka letak kanan ke kiri, dan aksara India memerlukan konsonan dan tanda vokal digabungkan menjadi glif; semuanya memerlukan shaping teks penuh, yang kini tidak dilakukan oleh penyunting, jadi menaip aksara ini ditolak dan bukannya menghasilkan aksara yang salah.
Dua had lagi datang daripada fail itu sendiri. Kandungan halaman yang diimbas ialah satu imej tanpa operator teks, jadi tiada apa-apa untuk dipadam atau diubah. Selepas fail bertandatangan digital disunting, kandungan asal yang dilindungi oleh tandatangan telah berubah, dan tandatangan tidak lagi sah.
Semak sendiri
Anda boleh melihat perubahan yang diterangkan di atas dalam fail yang dimuat turun dengan tiga arahan:
pdftotext -raw edited.pdf - # ekstrak mengikut tertib aliran kandungan: teks lama hilang, baris yang disunting paling akhir
pdffonts edited.pdf # senarai fon: fon asal yang digunakan semula, dan subset fon baharu yang dibenamkan
qpdf --qdf --object-streams=disable edited.pdf edited.qdf # kembangkan aliran kandungan; blok BT ... ET yang ditambah berada di penghujung
Bacaan lanjut
- Mengapa Subsetting Fon Merosakkan Penyuntingan tetapi Tidak Bacaan: mengapa fon asal boleh kekurangan satu aksara, dan apa yang berlaku apabila itu terjadi.
- Apa yang Terkandung dalam PDF: Objek, Aliran, dan Jadual Rujukan Silang: gambaran keseluruhan tentang aliran kandungan, objek dan struktur fail.
- Sunting Teks dalam PDF Dalam Talian: Betulkannya Tanpa Fail Sumber: cara menggunakannya, apa yang sesuai dengannya, dan bila perlu kembali kepada fail sumber.