Como posso extrair tipos de letra incorporados de um PDF como ficheiros de tipos de letra válidos?
Estou ciente do utilitário {[[0]} que pode indicar quais fontes são usadas por um PDF, e se eles estão incorporados ou não.
Agora o problema: dado que eu tinha ficheiros PDF com tipos de letra incorporados -- como é que posso extrair esses tipos de letra de uma forma que sejam reutilizáveis como ficheiros de tipos de letra normais? Existem (de preferência livres) ferramentas que possam fazer isso? Também: isto pode ser feito programaticamente com, digamos, iText?
8 answers
Usando pdftops
Um dos métodos mais frequentemente utilizados para o fazer nos sistemas nix consiste nos seguintes passos:
- converter o PDF para PostScript, para exemplo ao usar o XPDF
pdftops
(no programa auxiliar do Windows:pdftops.exe
. - agora os tipos de letra serão incorporados no formato
.pfa
(PostScript) + você poderá extraí-los com um editor de texto. - poderá ter de converter o
.pfa
(ASCII) para um ficheiro.pfb
(binário) usando ot1utils
epfa2pfb
. - em PDFs nunca existem
.pfm
ou.afm
ficheiros (ficheiros métricos de tipo de letra) incorporados (porque o visualizador de PDF tem conhecimento interno sobre estes). Sem estes, os ficheiros de tipos de letra são dificilmente utilizáveis de uma forma visualmente agradável.
Usando fontforge
Outro método é usar o editor de tipos de Letra Livre FontForge:
- Use a janela "abrir o tipo de letra" usada ao abrir os ficheiros.
- depois seleccione "extrair do PDF" na secção de filtragem da janela.
- Seleccione o ficheiro PDF com o tipo de letra a extrair.
- a "escolha um tipo de letra" abre a janela -- seleccione aqui qual o tipo de letra abrir.
Verifique o manual do FontForge. Você pode precisar seguir alguns passos específicos que não são necessariamente simples, a fim de salvar os dados extraídos da fonte como um arquivo que é reutilizável.
Usando mupdf
Próximo., MuPDF. Esta aplicação vem com um utilitário chamado pdfextract
(no Windows: pdfextract.exe
) que pode extrair fontes e imagens de PDFs. (No caso de você não saber sobre MuPDF, que ainda é relativamente desconhecido e novo: "MuPDF é um visualizador de PDF leve livre e toolkit escrito em portable C." , escrito por Artifex Software developers, a mesma empresa que nos deu Ghostscript.)(Update: as versões mais recentes do MuPDF moveram a funcionalidade anterior de 'pdfextract' para o comando 'mutool extract' . Transfere-o para aqui: mupdf.com/downloads)
Nota: pdfextract.exe
é um programa de linha de comandos. Para usá - lo, faça o :
c:\> pdfextract.exe c:\path\to\filename.pdf # (on Windows)
$> pdfextract /path/tofilename.pdf # (on Linux, Unix, Mac OS X)
Este comando irá descarregar todos os ficheiros extraíveis do ficheiro pdf referenciado na pasta actual. Geralmente você vai ver uma variedade de arquivos: imagens, bem como fontes. Estes incluem PNG, TTF, CFF, CID, etc. Os nomes das imagens serão como img-0412.png se o número do objeto PDF da imagem fosse 412. Os nomes das fontes serão como FGETYK+LinLibertineI-0966.ttf , se o número do objeto do font PDF fosse 966.
CFF (Tipo de letra compacto Os arquivos Format são um formato reconhecido que pode ser convertido para outros formatos através de uma variedade de conversores para uso em diferentes sistemas operacionais.
De Novo: esteja ciente de que a maioria destes ficheiros de tipos de letra pode ter apenas um subconjunto de caracteres e pode não representar a fonte completa.
Atualização: (Jul 2013) versões recentes de mupdf
viram uma remodelação interna e renomeação de seus binários, não apenas uma vez, mas várias vezes. O utilitário principal usado para ser um binário tipo canivete chamado mubusy
(nome inspirado em busybox?), que mais recentemente foi renomeada para mutool
. Estes suportam os sub-comandos info
, clean
, extract
, poster
e show
Infelizmente, a documentação oficial para essas ferramentas não está atualizada (ainda). Se você estiver em um Mac usando 'MacPorts': então o utilitário foi renomeado para evitar conflitos de nomes com outros utilitários usando nomes idênticos, e você pode precisar usar mupdfextract
.
Para alcançar o equivalente (aproximadamente) resultados com mutool
como a sua ferramenta anterior pdfextract
, apenas executar mubusy extract ...
.*
Para extrair fontes e imagens, poderá ter de executar uma das seguintes linhas de comando:
c:\> mutool.exe extract filename.pdf # (on Windows)
$> mutool extract filename.pdf # (on Linux, Unix, Mac OS X)
Downloads estão aqui: mupdf.com/downloads
Usando gs
(Ghostscript)
Então ... , Ghostscript também pode extrair fontes diretamente de PDFs. No entanto, precisa da ajuda de um programa de utilidade especial chamado extractFonts.ps
, escrito na linguagem PostScript, que está disponível no Ghostscript source code repository .
Agora use-o, você precisa executar ambos, este arquivo extractFonts.ps
e seu arquivo PDF. Ghostscript irá então usar as instruções do programa PostScript para extrair as fontes do PDF. Ele se parece com isso no Windows (sim, Ghostscript entende o 'forward slash', /, como um separador de caminho também no Windows!):
gswin32c.exe ^
-q -dNODISPLAY ^
c:/path/to/extractFonts.ps ^
-c "(c:/path/to/your/PDFFile.pdf) extractFonts quit"
Ou no Linux, Unix ou Mac OS X:
gs \
-q -dNODISPLAY \
/path/to/extractFonts.ps \
-c "(/path/to/your/PDFFile.pdf) extractFonts quit"
Eu testei. o método Ghostscript há alguns anos. Na época extraiu *.ttf (TrueType) muito bem. Não sei se outros tipos de letra também serão extraídos, e se assim for, de uma forma reutilizável. Não sei se o utilitário bloqueia a extracção de fontes marcadas como protegidas.
Usando pdf-parser.py
Finalmente, Didier Stevens.' pdf-parser.py: este provavelmente não é tão fácil de usar, porque você precisa ter algum know-how sobre PDF interno estrutura. pdf-parser.py
é um script em Python que pode fazer muitas outras coisas também. Ele também pode descomprimir e extrair fluxos arbitrários de objetos, e, portanto, também pode extrair arquivos de fonte embutidos.
Mas precisas de saber o que procurar. Vamos ver com um exemplo. Tenho um ficheiro chamado big.pdf . Como primeiro passo, eu uso o -s
parâmetro para procurar o PDF para qualquer ocorrência da palavra-chave FontFile (pdf-parser.py
não requer um sensíveis a maiúsculas e minúsculas procurar):
pdf-parser.py -s fontfile big.pdf
No meu caso, para o meu big1.pdf , eu tenho este resultado:
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
>>
Diz-me que existem duas instâncias de FontFile2
dentro do PDF, e estas estão nos objectos PDF n. º 15 e N. º 16, respectivamente. O objecto n. o 15 contém o /FontFile2
para o tipo de letra /ArialMT , o objecto n. o 16 contém o /FontFile2
para o tipo de letra /Arial-BoldMT.
Para mostrar isto mais claramente:
pdf-parser.py -s fontfile big1.pdf | grep -i fontfile
/FontFile2 15 0 R
/FontFile2 16 0 R
Uma espreitadela rápida na especificação PDF revela a palavra-chave /FontFile2
refere-se a uma 'stream que contém um tipo de letra TrueType programa' (/FontFile
estaria relacionada com um 'stream que contém um Tipo de letra type 1 programa' e /FontFile3
estaria relacionada com um 'stream contendo uma fonte de programa cujo formato é especificado pelo Subtipo de entrada no fluxo de dicionário' {daí a ser um Type1C ou CIDFontType0C subtipo}.)
Para olhar especificamente para o objecto PDF no. 15 (que contém a fonte /ArialMT), pode-se usar a -o 15
parâmetro:
pdf-parser.py -o 15 big1.pdf
obj 15 0
Type:
Referencing:
Contains stream
<<
/Length1 778552
/Length 1581435
/Filter /ASCIIHexDecode
>>
Esta pdf-parser.py
saída nos diz que este objeto contém uma sequência (o que não vai diretamente display) que tem um comprimento de 1.581.435 Bytes e é codificado ( == "comprimido") com ASCIIHexEncode e precisa ser decodificado ( ==de "de-comprimido" ou "filtrada") com a ajuda do padrão /ASCIIHexDecode
filtro.
Para despejar qualquer fluxo de um objecto, pdf-parser.py
pode ser chamado com o -d dumpname
parâmetro. Vamos a isso.
pdf-parser.py -o 15 -d dumped-data.ext big1.pdf
A nossa extracção o dump de dados estará no ficheiro chamado dados descartados.ext . Vamos ver quão grande é.
ls -l dumped-data.ext
-rw-r--r-- 1 kurtpfeifle staff 1581435 Apr 11 00:29 dumped-data.ext
Olha, são 1.581.435 Bytes. Vimos esta figura na saída do comando anterior. Abrir este ficheiro com um editor de texto confirma que o seu conteúdo é de dados codificados ASCII hex.
Abrir o ficheiro com uma ferramenta de leitura de tipos de letra como otfinfo
(esta é uma parte do lcdf-typetools
dimensão da) vai levar a alguma decepção no início:
otfinfo -i dumped-data.ext
otfinfo: dumped-data.ext: not an OpenType font (bad magic number)
Ok, isto é porque nós ... não (ainda) deixou pdf-parser.py
fazer uso da sua magia completa: despejar um fluxo filtrado e descodificado. Para isso, temos de acrescentar o -f
parâmetro:
pdf-parser.py -o 15 -f -d dumped-data-decoded.ext big1.pdf
Qual é o tamanho deste novo ficheiro?
ls -l dumped-data-decoded.ext
-rw-r--r-- 1 kurtpfeifle staff 778552 Apr 11 00:39 dumped-data-decoded.ext
Oh, veja: esse número exato também já estava armazenado no dicionário objeto PDF no. 15 como o valor da chave /Length1
...
file dumped-data-decoded.ext
dumped-data-decoded.ext: TrueType font data
O que é que nos diz sobre isso?
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
Então Bingo!, temos um vencedor: de facto, extrai um ficheiro de tipo de letra válido para nós. Dado o tamanho deste ficheiro (778.552 Bytes), parece que este tipo de letra foi incorporado até completamente no PDF...
Podíamos mudar o nome para arial-regular.ttf e instalá-lo como tal e aproveitá-lo alegremente.
Advertências:
-
em qualquer caso, você precisa seguir a licença que se aplica à fonte. Algumas licenças de tipos de letra não permitem o uso e/ou distribuição gratuitos. Piratear fontes é como piratear qualquer software ou outro material protegido por direitos autorais.
-
a maioria dos PDFs que estão em estado selvagem lá fora não incorporam a fonte completa de qualquer maneira, mas apenas subconjuntos. Extrair um subconjunto de uma fonte só é útil em um escopo muito limitado, se de todo.
- http://typophile.com/node/34377 - já não está disponível , mas pode ser visto na máquina Wayback em https://web.archive.org/web/20110717120241/typophile.com/node/34377
Utilizar o serviço em linha http://www.extractpdf.com não é preciso instalar nada.
Eventualmente encontrou o pacote do instalador do FontForge Windows e abriu o PDF através do programa instalado. Foi um prazer, tão feliz.
Http://www.verypdf.com/app/pdf-font-extractor/pdf-font-extracting-tool.html Uma maneira mais fácil de extrair fontes (Windows).
Ao procurar as respostas actuais, nenhuma delas reparou no WOFF (Web Open Font Format) ( W3C) (Wikipedia ) que pode ser usado para recriar os caracteres individuais (glifos) e exibi-los em uma página web com precisão.
Usando a página web online gratuita pela IDR Solutions, PDF para HTML5 ( link ), converter um PDF para um arquivo zip. Na o zip resultante será uma pasta de tipos de letra dos tipos de ficheiros woff. Os navegadores de Internet actuais suportam ficheiros woff se não estiver ciente. ([[12]}referência Estes podem ser examinados no site online FontDrop! (ligação .
Os ficheiros WOFF podem ser convertidos para/de OTF ou TTF em WOFFer - WOFF font converter
Também o arquivo zip de PDF para HTML5 irá conter um arquivo HTML para cada página do PDF que pode ser aberto em um navegador da Internet e é um dos melhores e mais traduções PDF precisas que eu encontrei ou vi.
Enquanto eu estou apenas aprendendo a usar arquivos WOFF, isso vale a pena passar adiante. Desfrutar.
PS, eu provavelmente vou atualizar com mais informações à medida que eu aprender mais sobre o uso de tipos de arquivos woff, mas como isso é Creative commons, sinta-se livre para editar esta resposta se você tem algo de valor para passar adiante.
Uma das melhores ferramentas online disponíveis atualmente para extrair fontes pdf é http://www.pdfconvertonline.com/extract-pdf-fonts-online.html
PDF2SVG a versão 6.0 de PDFTron faz um trabalho razoável. Produz tipos de letra OpenType (.otf
) por omissão. Use --preserve_fontnames
para preservar " o esquema de nomes do tipo de letra/família de tipos de letra, tal como foi obtido no ficheiro de código."
PDF2SVG é um produto comercial, mas você pode baixar um executável demo gratuito (que inclui marcas d'água na saída SVG, mas não restringe o uso de outra forma). Pode haver outros produtos PDFTron que também extraem fontes, mas só recentemente descobri Eu próprio.
Esta é uma sequência para a secção font-forge
da resposta de @Kurt Pfeifle, específica do Red Hat (e possivelmente de outras distros Linux).
- Depois de abrir o PDF e seleccionar o tipo de letra que deseja, irá querer seleccionar "ficheiro -> gerar tipos de letra..." Opcao.
- Se houver erros no ficheiro, pode optar por ignorá-los ou gravar o ficheiro e editá-los. A maioria dos erros podem ser corrigidos automaticamente se você clicar em "Corrigir" vezes suficientes.
- Carregue Em " Elemento -> Tipo De Letra Informacao...", e "Fontname"," nome de família "e" nome para humanos " são todos definidos para valores que você gosta. Se não, modifique-os e salve o arquivo em algum lugar. Estes nomes irão determinar como o seu tipo de letra aparece no sistema.
- Seleccione o nome do seu ficheiro e carregue em "Gravar..."
- Copiar para a pasta
/usr/share/fonts
(como root) - em execução
fc-cache -f /usr/share/fonts/
(como raiz)