PDF'den gömülü fontları geçerli font dosyaları olarak nasıl ayıklayabilirim?


161

pdftk.exePDF tarafından hangi yazı tiplerinin kullanıldığını ve katıştırılmış olup olmadıklarını belirten yardımcı programın farkındayım .

Şimdi sorun: Gömülü fontlara sahip PDF dosyalarım olduğu için - bu fontları normal font dosyaları olarak yeniden kullanılabilecek şekilde nasıl çıkarabilirim? Bunu yapabilen (tercihen ücretsiz) araçlar var mı? Ayrıca: Bu, programsal olarak, örneğin iText ile yapılabilir mi?

Yanıtlar:


405

Birkaç seçeneğiniz var. Tüm bu yöntemler Linux'ta olduğu kadar Windows veya Mac OS X'te de çalışır. Ancak, çoğu PDF'nin gömülü bir yazı tipi olduğunda tam, tam yazı tipini içermediğini unutmayın. Çoğunlukla belgede kullanılan gliflerin alt kümesini içerirler .


kullanma pdftops

* Nix sistemlerinde bunu yapmak için en sık kullanılan yöntemlerden biri aşağıdaki adımlardan oluşur:

  1. PDF'yi PostScript'e dönüştürün, örneğin XPDF'leri kullanarak pdftops(Windows'ta: pdftops.exeyardımcı program).
  2. Artık fontlar .pfa(PostScript) biçiminde gömülecek + bir metin düzenleyici kullanarak bunları çıkarabilirsiniz .
  3. Sen dönüştürmek gerekebilir .pfaa (ASCII) .pfbkullanılarak (ikili) dosyası t1utilsve pfa2pfb.
  4. PDF'lerde hiçbir zaman .pfmveya .afmdosyalar (font metrik dosyaları) gömülü değildir (çünkü PDF görüntüleyici bunlar hakkında dahili bilgiye sahiptir). Bunlar olmadan, yazı tipi dosyaları görsel olarak hoş bir şekilde kullanılamaz.

kullanma fontforge

Başka bir yöntem, FontForge Ücretsiz yazı tipi düzenleyicisini kullanmaktır :

  1. Dosyaları açarken kullanılan "Yazı Tipini Aç" iletişim kutusunu kullanın .
  2. Ardından iletişim kutusunun filtre bölümünde "PDF'den çıkart" ı seçin .
  3. Çıkarılacak yazı tipini içeren PDF dosyasını seçin.
  4. Bir "Yazı tipi seç" iletişim kutusu açılır - burada açılacak yazı tipini seçin.

FontForge kılavuzuna bakın. Çıkarılan yazı tipi verilerini yeniden kullanılabilir bir dosya olarak kaydetmek için mutlaka basit olmayan birkaç özel adımı izlemeniz gerekebilir.


kullanma mupdf

Sonra, MuPDF . Bu uygulama , PDF'lerden yazı tiplerini ve görüntüleri ayıklayabilen pdfextract(Windows'ta :) adlı bir yardımcı programla birlikte gelir pdfextract.exe. (Hala nispeten bilinmeyen ve yeni olan MuPDF hakkında bilgi sahibi değilseniz: "MuPDF, bize Ghostscript'i veren aynı şirket olan Artifex Software geliştiricileri tarafından yazılan, ücretsiz hafif bir PDF görüntüleyici ve araç takımıdır." )
( Güncelleme: MuPDF'nin daha yeni sürümleri 'pdfextract'ın eski işlevlerini ' mutool özü ' komutuna taşıdı . Buradan indirin: mupdf.com/downloads )

Not: pdfextract.exebir komut satırı programıdır. Kullanmak için aşağıdakileri yapın:

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

Bu komut, geçerli dizine başvurulan pdf dosyasından tüm çıkarılabilir dosyaları döker. Genellikle çeşitli dosyalar görürsünüz: resimler ve yazı tipleri. Bunlar PNG, TTF, CFF, CID içerir vb görüntü adları gibi olacak img-0412.png görüntünün PDF nesne sayısı 412 fontnames gibi olacak olsaydı FGETYK + LinLibertineI-0966.ttf , yazı tipi yıllardan eğer PDF nesne numarası 966 idi.

CFF ( Kompakt Yazı Tipi Biçimi ) dosyaları, farklı işletim sistemlerinde kullanılmak üzere çeşitli dönüştürücüler aracılığıyla diğer biçimlere dönüştürülebilen tanınmış bir biçimdir.

Tekrar: bu yazı tipi dosyalarının çoğunun yalnızca bir karakter alt kümesine sahip olabileceğini ve tam yazı tipini temsil etmeyebileceğini unutmayın.

Güncelleme: (Tem 2013) Son sürümleri, mupdfikili dosyalarının yalnızca bir kez değil birkaç kez dahili olarak yeniden adlandırılmasını ve yeniden adlandırılmasını gördü. Ana yardımcı program mubusy, daha önce yeniden adlandırılan 'isviçre bıçağı' benzeri bir ikili (ad meşgul kutusundan esinlenildi mi?) İdi mutool. Bunlar alt komutları destekleyen info, clean, extract, posterve show. Ne yazık ki, bu araçlar için resmi belgeler güncel değil (henüz). 'MacPorts' kullanan bir Mac kullanıyorsanız: aynı adları kullanan diğer yardımcı programlarla ad çakışmasını önlemek için yardımcı program yeniden adlandırılmıştır ve kullanmanız gerekebilir mupdfextract.

mutoolÖnceki aracın pdfextractyaptığı gibi (kabaca) eşdeğer sonuçları elde etmek için , çalıştırın mubusy extract .... *

Bu nedenle, yazı tiplerini ve resimleri çıkarmak için aşağıdaki komut satırlarından birini çalıştırmanız gerekebilir:

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

İndirmeler burada: mupdf.com/downloads


gs(Ghostscript) kullanma

Ardından, Ghostscript yazı tiplerini doğrudan PDF'lerden de çıkarabilir. Ancak, Ghostscript kaynak kodu deposundaextractFonts.ps bulunan PostScript dilinde yazılmış özel bir yardımcı programın yardımına ihtiyacı vardır .

Şimdi kullanın, hem bu dosyayı hem de extractFonts.psPDF dosyanızı çalıştırmanız gerekir . Ghostscript daha sonra yazı tiplerini PDF'den çıkarmak için PostScript programındaki talimatları kullanır. Windows'da şöyle görünür (evet, Ghostscript 'eğik çizgi' / /, Windows'ta da bir yol ayırıcı olarak anlar!):

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

veya Linux, Unix veya Mac OS X'te:

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

Birkaç yıl önce Ghostscript yöntemini test ettim. O zaman * .ttf (TrueType) gayet iyi ayıkladı. Diğer yazı tiplerinin de çıkarılıp çıkarılamayacağını bilmiyordum ve eğer öyleyse, yeniden kullanılabilir bir şekilde. Yardımcı program korumalı olarak işaretlenmiş yazı tiplerini ayıklama engel olup olmadığını bilmiyorum.


kullanma pdf-parser.py

Son olarak, Didier Stevens'ın pdf-parser.py : bu muhtemelen kullanımı o kadar kolay değildir, çünkü dahili PDF yapıları hakkında bilgi sahibi olmanız gerekir. pdf-parser.pybir çok şeyi yapabilen bir Python betiğidir. Ayrıca nesnelerden rastgele akışları açabilir ve ayıklayabilir ve bu nedenle gömülü font dosyalarını da ayıklayabilir.

Ama ne arayacağınızı bilmeniz gerekiyor. Bir örnekle görelim. Big.pdf adında bir dosyam var . İlk adım olarak -s, PDF'yi FontFile anahtar kelimesinin herhangi bir oluşumu için aramak için parametreyi kullanıyorum (büyük / pdf-parser.pyküçük harfe duyarlı bir arama gerektirmez):

pdf-parser.py -s fontfile big.pdf

Benim durumumda, big1.pdf'im için bu sonucu alıyorum:

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
  >>   

Bana FontFile2PDF'nin içinde iki örnek olduğunu ve bunların PDF nesnelerinde olduğunu söyler . 15 ve hayır. 16. Nesne no. Şekil 15, /FontFile2for font / ArialMT , nesne no. 16, /FontFile2for font / Arial-BoldMT'yi tutar .

Bunu daha net göstermek için:

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

PDF özellikleri içine hızlı bir Bakma anahtar ortaya /FontFile2bir ilişkindir 'TrueType yazı tipi programı içeren akımı' ( /FontFilebir ilişki olur 'bir tür 1 yazı programı içeren akımı' ve /FontFile3bir ilgili olacaktır biçiminde bir yazı tipi programı içeren 'akışında akış sözlüğündeki Alt tür girişi tarafından belirtildi ' {dolayısıyla bir Type1C veya bir CIDFontType0C alt türü}.)

Özellikle PDF nesnesine bakmak için no. 15 (font / ArialMT'yi tutar ), -o 15parametre şu şekilde kullanılabilir :

pdf-parser.py -o 15 big1.pdf

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

Bu pdf-parser.pyçıktı bize bu nesnenin 1.581.435 Bayt uzunluğunda ve ASCIIHexEncode ile kodlanmış (== "sıkıştırılmış") bir akış içerdiğini (kod çözülmediği (== ") sıkıştırılmış "veya" filtrelenmiş ") standart /ASCIIHexDecodefiltre yardımıyla .

Bir nesneden herhangi bir akışı boşaltmak pdf-parser.pyiçin -d dumpnameparametre ile çağrılabilir . Haydi Yapalım şunu:

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

Çıkarılan veri dökümümüz, dumped-data.ext adlı dosyada olacaktır . Bakalım ne kadar büyük:

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

Oh bak, 1.581.435 Bayt. Bu rakamı önceki komutun çıktısında gördük. Bu dosyayı bir metin düzenleyicisiyle açmak, içeriğinin ASCII onaltılı kodlanmış veri olduğunu doğrular.

Dosyayı bir yazı tipi okuma aracıyla açmak otfinfo(bu lcdf-typetoolspaketin bir parçasıdır ) ilk başta hayal kırıklığına neden olur:

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

Tamam, çünkü pdf-parser.pytam sihrini (henüz) kullanmamıza izin vermedik : filtrelenmiş, kodu çözülmüş bir akışı dökmek. Bunun için -fparametreyi eklemeliyiz :

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

Bu yeni dosyanın boyutu nedir?

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

Oh, bak: bu tam sayı zaten PDF nesnesine de kaydedilmişti. 15 anahtarın değeri olarak sözlük /Length1...

Ne olduğunu filedüşünüyor?

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

otfinfoBize bu konuda ne anlatıyor?

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

Bingo !, bir kazananımız var: pdf-parser.pygerçekten bizim için geçerli bir yazı tipi dosyası çıkardı. Bu dosyanın boyutu (778.552 Byte) göz önüne alındığında, bu yazı tipinin PDF'ye bile tamamen gömülmüş gibi görünüyor ...

Arial-regular.ttf olarak yeniden adlandırabilir ve bu şekilde yükleyebilir ve mutlu bir şekilde kullanabiliriz.


Uyarılar:

  • Her durumda, yazı tipi için geçerli olan lisansı izlemeniz gerekir. Bazı font lisansları ücretsiz kullanıma ve / veya dağıtıma izin vermez. Korsan yazı tipleri, herhangi bir yazılımı veya diğer telif hakkıyla korunan materyalleri korsanlaştırmaya benzer.

  • Orada vahşi olan çoğu PDF zaten tam yazı tipi katmak değil, sadece alt kümeleri. Bir yazı tipinin alt kümesini çıkarmak, yalnızca çok sınırlı bir kapsamda yararlıdır.

Ayrıca, yazı tipi çıkarma çabalarıyla ilgili Artıları ve (daha fazla) Eksileri hakkında aşağıdakileri de okuyun:


3
@ kizzx2: upvote ya benim diğer [PDF] herhangi downvote veya [Ghostscript] cevapları :-) çekinmeyin
Kurt Pfeifle

Mac kullanıyorsanız ve bağlantı noktalarından mupdf yüklerseniz (veya belki de ikili dosyadan), ayıklamaya da mupdfextract denir. Yolda olduğu sürece terminalden çalıştırabilirsiniz.
Orwellophile

@Orwellophile: ipucu için teşekkürler. Hakkındaki bazı ipuçlarını güncelleme fırsatı buldum mupdf. Ayrıca bkz bu ...
Kurt Pfeifle

Onları kontrol edeceğim. Ve bu anlamsız bir yorum değil: Süreciniz HARİKA çalıştı ... (oy verdi) ... yazı tipinin 3 varyasyonunu çıkardı ve adlandırdı ve sonra birleştirmek için fontforge (macports içermeyen) kullandım. Ne yazık ki benim yazı tipi hala büyük "X" harfi eksik ... Oranlar nelerdir: p
Orwellophile

1
@Chris: evet, bunlar iki farklı alt kümedir (büyük bir kısmı bile çakışabilir) .Otomatik olarak birleştirmek için bir seçenek yoktur.
Kurt Pfeifle




3

Bu soru 10 yaşında olmasına rağmen, hala geçerli ve teknoloji değiştikçe geçerli bir cevap var.

Mevcut cevapları ararken bunların hiçbiri , tek tek karakterleri (glifleri) yeniden oluşturmak ve bunları bir web sayfasında doğru bir şekilde görüntülemek için kullanılabilen WOFF (Web Açık Yazı Tipi Biçimi) ( W3C ) ( Wikipedia ) not edin .

IDR Solutions, PDF'den HTML5'e ( link ) ücretsiz çevrimiçi web sayfasını kullanarak PDF'yi zip dosyasına dönüştürün. Elde edilen zip'te woff dosya türlerinin yazı tipi dizini olacaktır. Güncel İnternet tarayıcıları, farkında değilseniz woff dosyalarını destekler. ( başvuru ) Bunlar, FontDrop çevrimiçi sitesinde incelenebilir! ( bağlantı ).

WOFF dosyaları WOFFer'da OTF veya TTF'ye / TTF'ye dönüştürülebilir - WOFF font dönüştürücü

Ayrıca PDF'den HTML5'e kadar olan zip dosyası, PDF'nin her sayfası için bir İnternet tarayıcısında açılabilen bir HTML dosyası içerecektir ve bulduğum veya gördüğüm en iyi ve en doğru PDF çevirilerinden biridir.

Ben sadece WOFF dosyalarını kullanmayı öğrenirken, bu geçmeye değer. Zevk almak.

PS, woff dosya türlerini kullanma hakkında daha fazla bilgi sahibi olduğum için muhtemelen daha fazla bilgi ile güncelleyeceğim, ancak bu yaratıcı ortak alanlar olduğundan, geçecek değerli bir şeyiniz varsa bu cevabı düzenlemekte özgürsünüz.


Teşekkür ederim! Bu çözüm benim için çalışıyor (geçerli bir TTF oluştururken olduğu gibi), ancak denediğim diğer çözümler işe yaramıyor. WOFF tamamlanmamış yazı tiplerini daha iyi işlediğinden mi?
Daan

@Daan Is it because WOFF handles incomplete fonts better?hiçbir fikrim yok. Tahmininiz benim kadar iyi olurdu. Belirttiğim gibi sadece kendimi WOFF hakkında öğreniyorum.
Guy Coder

@Daan Belki de Is it because WOFF handles incomplete fonts better?yeni bir SO sorusu olarak yayınlamalısınız ve daha fazla bilgiye sahip olan diğerleri anlamlı bir cevap görecek ve umacaklardır .
Guy Coder

Bunu yapabilirim. Teşekkürler.
Daan

2

PDF2SVG gelen sürüm 6.0 PDFTron makul bir iş yok. .otfVarsayılan olarak OpenType ( ) yazı tipleri oluşturur. --preserve_fontnames"Kaynak dosyadan alınan font / font-family adlandırma düzenini" korumak için kullanın .

PDF2SVG ticari bir üründür, ancak ücretsiz bir demo yürütülebilir dosyası indirebilirsiniz (SVG çıktısında filigranlar içerir, ancak kullanımı kısıtlamaz). Yazı tiplerini ayıklayan başka PDFTron ürünleri de olabilir, ancak yalnızca son zamanlarda PDF2SVG'yi kendim keşfettim.


Maalesef --preserve_fontnamessen, kısmi fontları örtüşen varsa işi değil - önek, örneğin dahil görünmemektedir MSCIYGiçinde MSCIYG+Ge'ez-1, yani önce partials üzerine yazar.
Chris


0

Bu bir takip olduğunu font-forgebölümünde @Kurt Pfeifle cevabı , Red Hat (ve muhtemelen diğer Linux dağıtımları) için spesifik.

  1. PDF'yi açıp istediğiniz yazı tipini seçtikten sonra, "Dosya -> Yazı Tipleri Oluştur ..." seçeneğini seçmek istersiniz.
  2. Dosyada hatalar varsa, bunları yok saymayı veya dosyayı kaydetmeyi ve düzenlemeyi seçebilirsiniz. "Düzelt" i tıklarsanız hataların çoğu otomatik olarak düzeltilebilir.
  3. "Öğe -> Yazı Tipi Bilgisi ..." ni tıklayın ve "Yazı Tipi Adı", "Aile Adı" ve "İnsan Adı" gibi istediğiniz değerlere ayarlandı. Değilse, bunları değiştirin ve dosyayı bir yere kaydedin. Bu adlar, yazı tipinizin sistemde nasıl görüneceğini belirler.
  4. Dosya adınızı seçin ve "Kaydet ..." i tıklayın.

TTF dosyanızı aldıktan sonra, sisteminize şu şekilde yükleyebilirsiniz:

  1. Klasöre kopyalanıyor /usr/share/fonts(root olarak)
  2. Koşu fc-cache -f /usr/share/fonts/(kök olarak)
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.