Como posso extrair fontes incorporadas de um PDF como arquivos de fonte válidos?


161

Estou ciente do pdftk.exeutilitário que pode indicar quais fontes são usadas por um PDF e se estão incorporadas ou não.

Agora, o problema: dado que eu tinha arquivos PDF com fontes incorporadas - como posso extrair essas fontes de forma que elas sejam reutilizáveis ​​como arquivos de fonte comuns? Existem ferramentas (de preferência gratuitas) que podem fazer isso? Além disso: isso pode ser feito programaticamente com, digamos, o iText?

Respostas:


405

Você tem várias opções. Todos esses métodos funcionam no Linux e no Windows ou Mac OS X. No entanto, lembre-se de que a maioria dos PDFs não inclui uma fonte completa e completa quando ela está incorporada. Principalmente eles incluem apenas o subconjunto de glifos usado no documento.


Usando pdftops

Um dos métodos mais usados ​​para fazer isso nos sistemas * nix consiste nas seguintes etapas:

  1. Converta o PDF em PostScript, por exemplo, usando XPDF pdftops(no Windows:pdftops.exe programa auxiliar.
  2. Agora as fontes serão incorporadas no .pfaformato (PostScript) + você pode extraí-las usando um editor de texto .
  3. Pode ser necessário converter o arquivo .pfa(ASCII) em um .pfbarquivo (binário) usando os t1utilsbotõespfa2pfb .
  4. Nos PDFs, nunca há .pfmou .afmarquivos (arquivos métricos de fonte) incorporados (porque o visualizador de PDF tem conhecimento interno sobre eles). Sem isso, os arquivos de fonte dificilmente podem ser usados ​​de uma maneira visualmente agradável.

Usando fontforge

Outro método é usar o editor de fontes gratuito FontForge :

  1. Use o caixa de diálogo "Abrir fonte" usada ao abrir arquivos.
  2. Então selecione "Extrair do PDF" na seção de filtro da caixa de diálogo.
  3. Selecione o arquivo PDF com a fonte a ser extraída.
  4. Uma caixa de diálogo "Escolha uma fonte" é aberta - selecione aqui qual fonte abrir.

Verifique o manual do FontForge. Pode ser necessário seguir algumas etapas específicas que não são necessariamente diretas para salvar os dados da fonte extraídos como um arquivo reutilizável.


Usando mupdf

Em seguida, MuPDF . Este aplicativo vem com um utilitário chamado pdfextract(no Windows pdfextract.exe:) que pode extrair fontes e imagens de PDFs. (Caso você não conheça o MuPDF, que ainda é relativamente desconhecido e novo: "O MuPDF é um visualizador de PDF leve e um kit de ferramentas gratuitos, escritos em C. portátil" , escrito pelos desenvolvedores da Artifex Software, a mesma empresa que nos forneceu o Ghostscript. )
( Atualização: As versões mais recentes do MuPDF mudaram a funcionalidade anterior de 'pdfextract' para o comando 'mutool extract' . Faça o download aqui: mupdf.com/downloads )

Nota: pdfextract.exeé um programa de linha de comando. Para usá-lo, faça o seguinte:

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

Este comando irá despejar todos os arquivos extraíveis do arquivo pdf referenciado no diretório atual. Geralmente você verá uma variedade de arquivos: imagens e fontes. Eles incluem PNG, TTF, CFF, CID etc. Os nomes das imagens serão img-0412.png se o número de objeto PDF da imagem for 412. Os nomes das fontes serão FGETYK + LinLibertineI-0966.ttf , se os O número do objeto PDF era 966.

Os arquivos CFF ( Compact Font 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.

Novamente: lembre-se de que a maioria desses arquivos de fonte pode ter apenas um subconjunto de caracteres e não representar o tipo de letra completo.

Atualização: (jul 2013) Versões recentes de mupdfviram uma remodelação interna e renomeação de seus binários, não apenas uma vez, mas várias vezes. O principal utilitário costumava ser um binário chamado 'faca suíça' mubusy(nome inspirado no busybox?), Que mais recentemente foi renomeado mutool. Estes apoiar os sub-comandos info, clean, extract, postere show. Infelizmente, a documentação oficial para essas ferramentas ainda não está atualizada. Se você estiver em um Mac usando 'MacPorts': o utilitário foi renomeado para evitar conflitos de nomes com outros utilitários usando nomes idênticos, e talvez você precise usá-lo mupdfextract.

Para alcançar os resultados (aproximadamente) equivalentes com mutoola ferramenta anterior pdfextract, basta executar mubusy extract .... *

Portanto, para extrair fontes e imagens, você pode precisar 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)

Os downloads estão aqui: mupdf.com/downloads


Usando gs(Ghostscript)

Em seguida, o Ghostscript também pode extrair fontes diretamente de PDFs. No entanto, ele precisa da ajuda de um programa utilitário especial chamado extractFonts.ps, escrito em linguagem PostScript, disponível no repositório de código-fonte Ghostscript .

Agora use-o, você precisa executar ambos, este arquivo extractFonts.pse seu arquivo PDF. O Ghostscript utilizará as instruções do programa PostScript para extrair as fontes do PDF. Parece assim no Windows (sim, o Ghostscript entende a 'barra', /, 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 atrás. No momento, ele extraiu * .ttf (TrueType) muito bem. Não sei se outros tipos de fontes também serão extraídos e, se houver, de uma maneira reutilizável. Não sei se o utilitário bloqueia a extração de fontes marcadas como protegidas.


Usando pdf-parser.py

Finalmente, o pdf-parser.py de Didier Stevens : este provavelmente não é tão fácil de usar, porque você precisa ter algum conhecimento sobre estruturas internas de PDF. pdf-parser.pyé um script Python que também pode fazer muitas outras coisas. Ele também pode descompactar e extrair fluxos arbitrários de objetos e, portanto, também pode extrair arquivos de fonte incorporados.

Mas você precisa saber o que procurar. Vamos ver com um exemplo. Eu tenho um arquivo chamado big.pdf . Como primeira etapa, uso o -sparâmetro para pesquisar no PDF qualquer ocorrência da palavra-chave FontFile ( pdf-parser.pynão requer uma pesquisa com distinção entre maiúsculas e minúsculas):

pdf-parser.py -s fontfile big.pdf

No meu caso, para o meu big1.pdf , recebo 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 FontFile2dentro do PDF, e estas estão nos objetos PDF no. 15 e não. 16, respectivamente. Objeto no. 15 contém a /FontFile2fonte / ArialMT , objeto no. 16 mantém a /FontFile2fonte / Arial-BoldMT .

Para mostrar isso mais claramente:

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

Uma rápida espiada na especificação do PDF revela que a palavra-chave /FontFile2se refere a um 'fluxo contendo um programa de fonte TrueType' ( /FontFilese relacionaria a um 'fluxo contendo um programa de fonte Tipo 1' e /FontFile3a um 'fluxo contendo um programa de fonte cujo formato é especificado pela entrada Subtype no dicionário de fluxo ' {sendo, portanto, um subtipo Type1C ou CIDFontType0C }.)

Para examinar especificamente o objeto PDF no. 15 (que contém a fonte / ArialMT ), pode-se usar o -o 15parâmetro:

pdf-parser.py -o 15 big1.pdf

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

Essa pdf-parser.pysaída nos diz que esse objeto contém um fluxo (que não será exibido diretamente) que possui um comprimento de 1.581.435 bytes e é codificado (== "compactado") com ASCIIHexEncode e precisa ser decodificado (== " comprimido "ou" filtrado ") com a ajuda do /ASCIIHexDecodefiltro padrão .

Para despejar qualquer fluxo de um objeto, pdf-parser.pypode ser chamado com o -d dumpnameparâmetro Vamos fazer isso:

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

Nosso despejo de dados extraído estará no arquivo chamado dumped-data.ext . Vamos ver o quão grande é:

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

Oh, olha, são 1.581.435 bytes. Vimos essa figura na saída do comando anterior. A abertura deste arquivo com um editor de texto confirma que seu conteúdo são dados codificados em hexadecimal ASCII.

Abrir o arquivo com uma ferramenta de leitura de fontes como otfinfo(isso faz parte do lcdf-typetoolspacote ) causará algumas decepções no início:

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

OK, é porque ainda não deixamos de pdf-parser.pyusar toda a sua magia: despejar um fluxo decodificado e filtrado. Para isso, temos que adicionar o -fparâmetro:

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

Qual é o tamanho desse novo arquivo?

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 objeto PDF no. 15 dicionário como o valor da chave /Length1...

O que filepensa que é?

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

O que otfinfonos 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 pdf-parser.pyfato, extraímos um arquivo de fonte válido para nós. Dado o tamanho deste arquivo (778.552 bytes), parece que essa fonte foi incorporada completamente no PDF ...

Nós poderíamos renomeá-lo para arial-regular.ttf e instalá-lo como tal, e felizmente utilizá-lo.


Ressalvas:

  • De qualquer forma, você precisa seguir a licença que se aplica à fonte. Algumas licenças de fontes 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 existentes no mercado não incorpora a fonte completa, mas apenas subconjuntos. Extrair um subconjunto de uma fonte é útil apenas em um escopo muito limitado, se houver.

Leia também o seguinte sobre os prós e os contras dos esforços de extração de fontes:


3
@ kizzx2: sinta-se livre para upvote ou downvote qualquer dos meus outros [PDF] ou [Ghostscript] respostas :-)
Kurt Pfeifle

Se você estiver no Mac e instalar o mupdf a partir de portas (ou talvez também de binário), a extração também será chamada mupdfextract. Você pode executá-lo a partir do terminal, desde que esteja no caminho.
Orwellophile

@ Orwellophile: obrigado pela dica. Aproveitei a oportunidade para atualizar algumas das minhas dicas mupdf. Veja também esta ...
Kurt Pfeifle

Eu vou vê-los. E apenas para que este não seja um comentário inútil: seu processo funcionou IMPRESSIONANTE ... (votado para cima) ... ele extraiu e nomeou três variações da fonte e, em seguida, usei o fontforge (também livre de macports) para mesclar. Infelizmente minha fonte ainda está faltando a letra "X" ... Quais são as chances: p
Orwellophile

1
@ Chris: sim, esses são dois subconjuntos diferentes (que podem se sobrepor em grande parte mesmo). Não há opção para mesclá-los automaticamente.
Kurt Pfeifle




3

Embora essa pergunta tenha 10 anos, ela ainda é válida e, à medida que a tecnologia muda, uma resposta válida também.

Ao pesquisar as respostas atuais, nenhuma delas notou o WOFF (Web Open Font Format) ( W3C ) ( Wikipedia ), que pode ser usado para recriar os caracteres individuais (glifos) e exibi-los em uma página da web com precisão.

Usando a página on-line gratuita da IDR Solutions, PDF para HTML5 ( link ), converta um PDF em um arquivo zip. No zip resultante, haverá um diretório de fontes dos tipos de arquivo woff. Os navegadores de Internet atuais suportam arquivos woff, se você não estiver ciente. ( referência ) Estes podem ser examinados no site online FontDrop! ( link ).

Arquivos WOFF podem ser convertidos para / de OTF ou TTF no conversor de fontes WOFFer - WOFF

Além disso, o arquivo zip de PDF para HTML5 conterá um arquivo HTML para cada página do PDF que pode ser aberta em um navegador da Internet e é uma das melhores e mais precisas traduções de PDF que encontrei ou vi.

Enquanto eu apenas estou aprendendo a usar arquivos WOFF, vale a pena passar adiante. Aproveitar.

PS: provavelmente atualizarei com mais informações à medida que aprender mais sobre o uso de tipos de arquivo woff, mas como isso é comum, peça-lhe que edite essa resposta se você tiver algo de valor a transmitir.


Obrigado! Esta solução funciona para mim (como na criação de um TTF válido), enquanto as outras que tentei não. É porque WOFF lida com fontes incompletas melhor?
Daan

@ Daan Is it because WOFF handles incomplete fonts better?, não faço ideia. Seu palpite seria uma mina tão boa. Como observei, estou apenas aprendendo sobre o WOFF.
Guy Coder

@ Daan Talvez você deva postar Is it because WOFF handles incomplete fonts better?como uma nova pergunta de SO e outras pessoas com mais conhecimento verão e esperamos fornecer uma resposta significativa.
Guy Coder

Eu posso fazer isso. Obrigado.
Daan

2

O PDF2SVG versão 6.0 do PDFTron faz um trabalho razoável. Produz fontes OpenType ( .otf) por padrão. Use --preserve_fontnamespara preservar "o esquema de nomeação de fonte / família de fontes, conforme obtido no arquivo de origem".

O PDF2SVG é um produto comercial, mas você pode baixar um executável de demonstração gratuito (que inclui marcas d'água na saída SVG, mas não restringe o uso). Pode haver outros produtos PDFTron que também extraem fontes, mas só recentemente descobri o PDF2SVG.


Infelizmente --preserve_fontnames, não funciona se você tiver fontes parciais e sobrepostas - parece não incluir o prefixo, por exemplo, o MSCIYGin MSCIYG+Ge'ez-1, portanto substitui as anteriores anteriores.
Chris


0

Este é um seguimento da font-forgeseção da resposta de @Kurt Pfeifle , específica da Red Hat (e possivelmente de outras distribuições do Linux).

  1. Após abrir o PDF e selecionar a fonte desejada, selecione a opção "Arquivo -> Gerar fontes ...".
  2. Se houver erros no arquivo, você poderá ignorá-los ou salvar o arquivo e editá-los. A maioria dos erros pode ser corrigida automaticamente se você clicar em "Corrigir" vezes suficientes.
  3. Clique em "Elemento -> Informações da fonte ..." e "Nome da fonte", "Nome da família" e "Nome para seres humanos" estão todos definidos com os valores que você gosta. Caso contrário, modifique-os e salve o arquivo em algum lugar. Esses nomes determinarão como sua fonte aparecerá no sistema.
  4. Selecione o nome do arquivo e clique em "Salvar ..."

Depois de ter seu arquivo TTF, você pode instalá-lo em seu sistema

  1. Copiando para a pasta /usr/share/fonts(como root)
  2. Em execução fc-cache -f /usr/share/fonts/(como root)
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.