Bagaimana cara mengekstrak font yang disematkan dari PDF sebagai file font yang valid?


161

Saya mengetahui pdftk.exeutilitas yang dapat menunjukkan font mana yang digunakan oleh PDF, dan apakah font tersebut tertanam atau tidak.

Sekarang masalahnya: mengingat saya memiliki file PDF dengan font yang disematkan - bagaimana saya bisa mengekstrak font-font itu dengan cara yang dapat digunakan kembali sebagai file font biasa? Apakah ada alat (lebih disukai gratis) yang bisa melakukan itu? Juga: dapatkah ini dilakukan secara terprogram dengan, katakanlah, iText?

Jawaban:


405

Anda memiliki beberapa opsi. Semua metode ini bekerja di Linux dan juga pada Windows atau Mac OS X. Namun, perlu diketahui bahwa sebagian besar PDF tidak termasuk untuk fontface lengkap, lengkap ketika mereka memiliki font yang tertanam. Kebanyakan mereka hanya memasukkan sebagian mesin terbang yang digunakan dalam dokumen.


Menggunakan pdftops

Salah satu metode yang paling sering digunakan untuk melakukan ini pada sistem * nix terdiri dari langkah-langkah berikut:

  1. Konversikan PDF ke PostScript, misalnya dengan menggunakan XPDF's pdftops(pada Windows: pdftops.exeprogram bantuan.
  2. Sekarang font akan disematkan dalam .pfaformat (PostScript) + Anda dapat mengekstraknya menggunakan editor teks .
  3. Anda mungkin perlu mengonversi file .pfa(ASCII) menjadi .pfb(biner) menggunakan t1utilsdan pfa2pfb.
  4. Dalam PDF tidak pernah ada .pfmatau .afmfile (file metrik font) tertanam (karena penampil PDF memiliki pengetahuan internal tentang ini). Tanpa ini, file font hampir tidak dapat digunakan dengan cara yang menyenangkan secara visual.

Menggunakan fontforge

Metode lain adalah dengan menggunakan editor font Gratis FontForge :

  1. Gunakan kotak dialog "Open Font" yang digunakan saat membuka file.
  2. Kemudian pilih "Ekstrak dari PDF" di bagian filter dialog.
  3. Pilih file PDF dengan font yang akan diekstraksi.
  4. Kotak dialog "Pilih font" terbuka - pilih di sini font mana yang akan dibuka.

Periksa manual FontForge. Anda mungkin perlu mengikuti beberapa langkah spesifik yang tidak selalu mudah untuk menyimpan data font yang diekstraksi sebagai file yang dapat digunakan kembali.


Menggunakan mupdf

Selanjutnya, MuPDF . Aplikasi ini dilengkapi dengan utilitas bernama pdfextract(pada Windows pdfextract.exe:) yang dapat mengekstrak font dan gambar dari PDF. (Jika Anda tidak tahu tentang MuPDF, yang masih relatif tidak dikenal dan baru: "MuPDF adalah penampil PDF ringan gratis dan toolkit yang ditulis dalam portabel C." , yang ditulis oleh pengembang Perangkat Lunak Artifex, perusahaan yang sama yang memberi kami Ghostscript. )
( Pembaruan: Versi MuPDF yang lebih baru telah memindahkan fungsi mantan 'pdfextract' ke perintah 'ekstrak mutool' . Unduh di sini: mupdf.com/downloads )

Catatan: pdfextract.exeadalah program baris perintah. Untuk menggunakannya, lakukan hal berikut:

c:\>  pdfextract.exe  c:\path\to\filename.pdf         # (on Windows)
$>    pdfextract  /path/tofilename.pdf                # (on Linux, Unix, Mac OS X)

Perintah ini akan membuang semua file yang dapat diekstraksi dari file pdf yang dirujuk ke direktori saat ini. Secara umum Anda akan melihat berbagai file: gambar serta font. Ini termasuk PNG, TTF, CFF, CID, dll. Nama gambar akan seperti img-0412.png jika jumlah objek PDF dari gambar adalah 412. Nama font akan seperti FGETYK + LinLibertineI-0966.ttf , jika font Jumlah objek PDF adalah 966.

File CFF ( Compact Font Format ) adalah format yang dikenal yang dapat dikonversi ke format lain melalui berbagai konverter untuk digunakan pada sistem operasi yang berbeda.

Sekali lagi: perlu diketahui bahwa sebagian besar file font ini mungkin hanya memiliki sebagian karakter dan mungkin tidak mewakili jenis huruf lengkap.

Pembaruan: (Jul 2013) Versi terbaru mupdftelah melihat perombakan internal dan penggantian nama biner mereka, tidak hanya sekali, tetapi beberapa kali. Utilitas utama yang dulunya adalah 'biner swiss' yang mirip mubusy( disebut terinspirasi oleh busybox?), Yang baru-baru ini diubah namanya menjadi mutool. Ini mendukung sub-perintah info, clean, extract, posterdan show. Sayangnya, dokumentasi resmi untuk alat-alat ini belum mutakhir. Jika Anda menggunakan Mac menggunakan 'MacPorts': maka utilitas diubah namanya untuk menghindari bentrokan nama dengan utilitas lain yang menggunakan nama yang identik, dan Anda mungkin perlu menggunakannya mupdfextract.

Untuk mencapai hasil (secara kasar) setara dengan mutoolseperti yang pdfextractdilakukan alat sebelumnya , jalankan saja mubusy extract .... *

Jadi untuk mengekstrak font dan gambar, Anda mungkin perlu menjalankan salah satu dari perintah berikut:

c:\>  mutool.exe extract filename.pdf      # (on Windows)
$>    mutool     extract filename.pdf      # (on Linux, Unix, Mac OS X)

Unduhan ada di sini: mupdf.com/downloads


Menggunakan gs(Ghostscript)

Kemudian, Ghostscript juga dapat mengekstrak font langsung dari PDF. Namun, itu membutuhkan bantuan dari program utilitas khusus bernama extractFonts.ps, ditulis dalam bahasa PostScript, yang tersedia dari repositori kode sumber Ghostscript .

Sekarang gunakan, Anda harus menjalankan keduanya, file ini extractFonts.psdan file PDF Anda. Ghostscript kemudian akan menggunakan instruksi dari program PostScript untuk mengekstrak font dari PDF. Sepertinya ini di Windows (ya, Ghostscript memahami 'forward slash', /, sebagai pemisah jalur juga di Windows!):

gswin32c.exe                  ^
  -q -dNODISPLAY              ^
   c:/path/to/extractFonts.ps ^
  -c "(c:/path/to/your/PDFFile.pdf) extractFonts quit"

atau di Linux, Unix atau Mac OS X:

gs                          \
  -q -dNODISPLAY            \
   /path/to/extractFonts.ps \
  -c "(/path/to/your/PDFFile.pdf) extractFonts quit"

Saya telah menguji metode Ghostscript beberapa tahun yang lalu. Pada saat itu ekstrak * .ttf (TrueType) baik-baik saja. Saya tidak tahu apakah jenis font lain juga akan diekstraksi sama sekali, dan jika demikian, dengan cara yang dapat digunakan kembali. Saya tidak tahu apakah utilitas tersebut memblokir ekstraksi font yang ditandai sebagai terproteksi.


Menggunakan pdf-parser.py

Akhirnya, pdf-parser.py Didier Stevens : yang ini mungkin tidak mudah digunakan, karena Anda perlu memiliki beberapa pengetahuan tentang struktur PDF internal. pdf-parser.pyadalah skrip Python yang dapat melakukan banyak hal lain juga. Itu juga dapat mendekompresi dan mengekstrak aliran sewenang-wenang dari objek, dan karena itu dapat mengekstrak file font yang tertanam juga.

Tetapi Anda perlu tahu apa yang harus dicari. Mari kita lihat dengan sebuah contoh. Saya memiliki file bernama big.pdf . Sebagai langkah pertama saya menggunakan -sparameter untuk mencari PDF untuk setiap kejadian kata kunci FontFile ( pdf-parser.pytidak memerlukan pencarian case sensitif):

pdf-parser.py -s fontfile big.pdf

Dalam kasus saya, untuk big1.pdf saya , saya mendapatkan hasil ini:

obj 9 0
 Type: /FontDescriptor
 Referencing: 15 0 R
  <<   
    /Ascent 728
    /CapHeight 716
    /Descent -210 
    /Flags 32
    /FontBBox [ -665 -325 2000 1006 ]
    /FontFile2 15 0 R
    /FontName /ArialMT
    /ItalicAngle 0
    /StemV 87
    /Type /FontDescriptor
    /XHeight 519
  >>   

obj 11 0 
 Type: /FontDescriptor
 Referencing: 16 0 R
  <<   
    /Ascent 728
    /CapHeight 716
    /Descent -210 
    /Flags 262176
    /FontBBox [ -628 -376 2000 1018 ]
    /FontFile2 16 0 R
    /FontName /Arial-BoldMT
    /ItalicAngle 0
    /StemV 165
    /Type /FontDescriptor
    /XHeight 519
  >>   

Ini memberitahu saya bahwa ada dua contoh FontFile2di dalam PDF, dan ini ada dalam objek PDF no. 15 dan tidak. 16 masing-masing. Objek no. 15 memegang /FontFile2untuk font / ArialMT , objek no. 16 memegang /FontFile2untuk font / Arial-BoldMT .

Untuk menunjukkan ini dengan lebih jelas:

pdf-parser.py -s fontfile big1.pdf | grep -i fontfile
  /FontFile2 15 0 R
  /FontFile2 16 0 R

Mengintip spesifikasi PDF dengan cepat mengungkapkan kata kunci tersebut /FontFile2terkait dengan 'stream yang mengandung program font TrueType' ( /FontFileakan terkait dengan 'stream yang berisi program font Tipe 1' dan /FontFile3akan terkait dengan 'stream yang berisi program font yang formatnya adalah ditentukan oleh entri Subtipe dalam kamus aliran ' {maka menjadi subtipe Type1C atau CIDFontType0C }.)

Untuk melihat secara spesifik pada objek PDF no. 15 (yang memiliki font / ArialMT ), orang dapat menggunakan -o 15parameter:

pdf-parser.py -o 15 big1.pdf

 obj 15 0
  Type: 
  Referencing: 
  Contains stream
   <<
     /Length1 778552
     /Length 1581435
     /Filter /ASCIIHexDecode
   >>

pdf-parser.pyOutput ini memberi tahu kita bahwa objek ini berisi aliran (yang tidak akan langsung ditampilkan) yang memiliki panjang 1,581.435 Bytes dan dikodekan (== "dikompresi") dengan ASCIIHexEncode dan perlu diterjemahkan (== "de- dikompresi "atau" disaring ") dengan bantuan /ASCIIHexDecodefilter standar .

Untuk membuang aliran apa pun dari suatu objek, pdf-parser.pydapat dipanggil dengan -d dumpnameparameter. Ayo lakukan:

pdf-parser.py -o 15 -d dumped-data.ext big1.pdf

Dump data yang diekstraksi akan berada dalam file bernama dumped-data.ext . Mari kita lihat seberapa besar itu:

ls -l dumped-data.ext
  -rw-r--r--  1 kurtpfeifle  staff  1581435 Apr 11 00:29 dumped-data.ext

Oh, lihat, ini adalah 1,581,435 Bytes. Kami melihat angka ini di output perintah sebelumnya. Membuka file ini dengan editor teks mengonfirmasi bahwa kontennya adalah data yang disandikan ASCII hex.

Membuka file dengan alat baca font seperti otfinfo(ini adalah bagian dari lcdf-typetoolspaket ) akan menyebabkan beberapa kekecewaan pada awalnya:

otfinfo -i dumped-data.ext
  otfinfo: dumped-data.ext: not an OpenType font (bad magic number)

OK, ini karena kami belum (belum) pdf-parser.pymenggunakan sihir penuhnya: untuk membuang aliran yang disaring dan didekodekan. Untuk ini kita harus menambahkan -fparameter:

pdf-parser.py -o 15 -f -d dumped-data-decoded.ext big1.pdf

Berapa ukuran file baru ini?

ls -l dumped-data-decoded.ext
  -rw-r--r--  1 kurtpfeifle  staff  778552 Apr 11 00:39 dumped-data-decoded.ext

Oh, lihat: nomor pastinya juga sudah tersimpan di objek PDF no. 15 kamus sebagai nilai untuk kunci /Length1...

Apa filepikir itu?

file dumped-data-decoded.ext
  dumped-data-decoded.ext: TrueType font data

Apa yang otfinfomemberitahu kita tentang itu?

otfinfo -i dumped-data-decoded.ext
  Family:              Arial
  Subfamily:           Regular
  Full name:           Arial
  PostScript name:     ArialMT
  Version:             Version 5.10
  Unique ID:           Monotype:Arial Regular:Version 5.10 (Microsoft)
  Designer:            Monotype Type Drawing Office - Robin Nicholas, Patricia Saunders 1982
  Manufacturer:        The Monotype Corporation
  Trademark:           Arial is a trademark of The Monotype Corporation.
  Copyright:           © 2011 The Monotype Corporation. All Rights Reserved.
  License Description: You may use this font to display and print content as permitted by
                       the license terms for the product in which this font is included.
                       You may only (i) embed this font in content as permitted by the 
                       embedding restrictions included in this font; and (ii) temporarily 
                       download this font to a printer or other output device to help
                       print content.
  Vendor ID:           TMC

Jadi Bingo !, kami memiliki pemenang: pdf-parser.pymemang mengekstrak file font yang valid untuk kami. Mengingat ukuran file ini (778.552 Bytes), sepertinya font ini telah tertanam bahkan sepenuhnya dalam PDF ...

Kita bisa mengganti namanya menjadi arial-regular.ttf dan menginstalnya seperti itu dan dengan senang hati menggunakannya.


Peringatan:

  • Bagaimanapun Anda harus mengikuti lisensi yang berlaku untuk font. Beberapa lisensi font tidak memungkinkan penggunaan dan / atau distribusi gratis. Pembajakan font seperti membajak perangkat lunak atau materi berhak cipta lainnya.

  • Sebagian besar PDF yang ada di luar sana tidak menyematkan font lengkap, tetapi hanya subset. Mengekstraksi subset font hanya berguna dalam cakupan yang sangat terbatas, jika ada.

Harap baca juga yang berikut tentang Pro dan (selengkapnya) Kontra mengenai upaya ekstraksi font:


3
@ kizzx2: jangan ragu untuk menaikkan atau menurunkan semua jawaban [PDF] atau [Ghostscript] saya yang lain :-)
Kurt Pfeifle

Jika Anda menggunakan Mac dan menginstal mupdf dari ports (atau mungkin dari binary juga), ekstraksi juga disebut mupdfextract. Anda bisa menjalankannya dari terminal, asalkan ada di jalur.
Orwellophile

@Orwellophile: terima kasih atas petunjuknya. Saya menganggapnya sebagai kesempatan untuk memperbarui beberapa petunjuk saya tentang mupdf. Lihat juga ini ...
Kurt Pfeifle

Saya akan memeriksanya. Dan begitulah ini bukan komentar sia-sia: Proses Anda bekerja AWESOMELY ... (memilih) ... itu diekstraksi dan bernama 3 variasi font, dan kemudian saya menggunakan fontforge (juga bebas dari macports) untuk bergabung. Sayangnya font saya masih hilang huruf kapital "X" ... Apa kemungkinannya: p
Orwellophile

1
@ Chris: ya, ini adalah dua himpunan bagian yang berbeda (yang mungkin tumpang tindih di sebagian besar bahkan). Tidak ada pilihan untuk secara otomatis menggabungkan mereka.
Kurt Pfeifle




3

Meskipun pertanyaan ini berumur 10 tahun, pertanyaan ini masih berlaku dan seiring perubahan teknologi, jawaban yang valid pun demikian.

Dalam mencari jawaban saat ini, tidak ada yang memperhatikan WOFF (Web Open Font Format) ( W3C ) ( Wikipedia ) yang dapat digunakan untuk membuat ulang karakter individu (mesin terbang) dan menampilkannya di halaman web secara akurat.

Menggunakan halaman web online gratis dengan IDR Solutions, PDF ke HTML5 ( tautan ), konversikan PDF ke file zip. Dalam zip yang dihasilkan akan menjadi direktori font dari tipe file woff. Browser Internet saat ini mendukung file woff jika Anda tidak menyadarinya. ( referensi ) Ini dapat diperiksa di situs online FontDrop! ( tautan ).

File WOFF dapat dikonversi ke / dari OTF atau TTF di WOFFer - WOFF font converter

Juga file zip dari PDF ke HTML5 akan berisi file HTML untuk setiap halaman PDF yang dapat dibuka di browser Internet dan merupakan salah satu terjemahan PDF terbaik dan paling akurat yang saya temukan atau lihat.

Sementara saya baru belajar cara menggunakan file WOFF, ini layak untuk diteruskan. Nikmati.

NB, saya mungkin akan memperbarui dengan lebih banyak info karena saya belajar lebih banyak tentang menggunakan tipe file woff, tetapi karena ini adalah creative commons, jangan ragu untuk mengedit jawaban ini jika Anda memiliki sesuatu yang bernilai untuk disampaikan.


Terima kasih! Solusi ini bekerja untuk saya (seperti dalam membuat TTF yang valid) sedangkan yang lain saya sudah coba tidak. Apakah karena WOFF menangani font yang tidak lengkap dengan lebih baik?
Daan

@ Kan Is it because WOFF handles incomplete fonts better?saya tidak tahu. Tebakan Anda akan menjadi tambang yang bagus. Seperti yang saya catat saya sendiri hanya belajar tentang WOFF.
Guy Coder

@Daan Mungkin Anda harus memposting Is it because WOFF handles incomplete fonts better?sebagai pertanyaan SO baru dan orang lain dengan lebih banyak pengetahuan akan melihat dan mudah-mudahan memberikan jawaban yang bermakna.
Guy Coder

Saya mungkin melakukan itu. Terima kasih.
Daan

2

PDF2SVG versi 6.0 dari PDFTron melakukan pekerjaan yang masuk akal. Ini menghasilkan font OpenType ( .otf) secara default. Gunakan --preserve_fontnamesuntuk melestarikan "skema penamaan font / font-family seperti yang diperoleh dari file sumber."

PDF2SVG adalah produk komersial, tetapi Anda dapat mengunduh demo yang dapat dieksekusi gratis (yang mencakup tanda air pada output SVG tetapi tidak membatasi penggunaan). Mungkin ada produk PDFTron lain yang juga mengekstrak font, tapi saya sendiri baru saja menemukan PDF2SVG.


Sayangnya --preserve_fontnamestidak berfungsi jika Anda memiliki font parsial yang tumpang tindih - sepertinya tidak menyertakan awalan, misalnya, MSCIYGdi MSCIYG+Ge'ez-1, jadi timpa parsial sebelumnya.
Chris


0

Ini adalah tindak lanjut ke font-forgebagian jawaban @Kurt Pfeifle , khusus untuk Red Hat (dan mungkin juga distro Linux lainnya).

  1. Setelah membuka PDF dan memilih font yang Anda inginkan, Anda harus memilih opsi "File -> Generate Fonts ...".
  2. Jika ada kesalahan dalam file, Anda dapat memilih untuk mengabaikannya atau menyimpan file dan mengeditnya. Sebagian besar kesalahan dapat diperbaiki secara otomatis jika Anda mengklik "Perbaiki" cukup kali.
  3. Klik "Elemen -> Info Font ...", dan "Fontname", "Nama Keluarga" dan "Nama untuk Manusia" semuanya disetel ke nilai yang Anda suka. Jika tidak, modifikasi mereka dan simpan file di suatu tempat. Nama-nama ini akan menentukan bagaimana font Anda muncul di sistem.
  4. Pilih nama file Anda dan klik "Simpan ..."

Setelah Anda memiliki file TTF Anda, Anda dapat menginstalnya di sistem Anda dengan

  1. Menyalinnya ke folder /usr/share/fonts(sebagai root)
  2. Menjalankan fc-cache -f /usr/share/fonts/(sebagai root)
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.