Programing

PDF에서 포함 된 글꼴을 유효한 글꼴 파일로 추출하려면 어떻게해야합니까?

lottogame 2020. 6. 9. 07:38
반응형

PDF에서 포함 된 글꼴을 유효한 글꼴 파일로 추출하려면 어떻게해야합니까?


pdftk.exePDF에서 사용하는 글꼴을 표시 할 수 있는 유틸리티를 알고 있으며 글꼴이 포함되어 있는지 여부를 알고 있습니다.

이제 문제 : 포함 된 글꼴이있는 PDF 파일이 있다고 가정하면 일반 글꼴 파일로 재사용 할 수있는 방식으로 해당 글꼴을 추출하려면 어떻게해야합니까? 그렇게 할 수있는 도구가 있습니까? 또한 : iText를 사용하여 프로그래밍 방식으로 수행 할 수 있습니까?


몇 가지 옵션이 있습니다. 이러한 모든 방법은 Windows 및 Mac OS X뿐만 아니라 Linux에서도 작동합니다. 그러나 대부분의 PDF에는 글꼴이 포함 된 완전한 글꼴이 포함되어 있지 않습니다. 대부분 문서에 사용 된 글리프 하위 집합 만 포함 합니다.


사용 pdftops

* nix 시스템에서 가장 자주 사용되는 방법 중 하나는 다음 단계로 구성됩니다.

  1. XPDF를 사용하여 (예 pdftops: Windows : pdftops.exe도우미 프로그램) PDF를 포스트 스크립트로 변환하십시오 .
  2. 이제 글꼴이 .pfa(PostScript) 형식 으로 임베드되고 텍스트 편집기를 사용하여 추출 할 수 있습니다 .
  3. 당신은 변환해야 할 수도 있습니다 .pfaA를 (ASCII)를 .pfb사용하여 (바이너리) 파일 t1utilspfa2pfb.
  4. PDF에는 파일이 .pfm없거나 .afm파일 (글꼴 메트릭 파일)이 포함되어 있습니다 (PDF 뷰어는이 파일에 대한 내부 지식을 가지고 있기 때문에). 이러한 글꼴이 없으면 글꼴 파일을 시각적으로 만족스럽게 사용할 수 없습니다.

사용 fontforge

또 다른 방법은 Free font editor FontForge 를 사용하는 것입니다 .

  1. 파일을 열 때 사용되는 "글꼴 열기" 대화 상자를 사용하십시오.
  2. 그런 다음 대화 상자의 필터 섹션에서 "PDF에서 추출"을 선택하십시오 .
  3. 추출 할 글꼴이있는 PDF 파일을 선택하십시오.
  4. "글꼴 선택" 대화 상자가 열립니다 - 열 폰트있는 여기를 선택합니다.

FontForge 매뉴얼을 확인하십시오. 추출 된 글꼴 데이터를 재사용 가능한 파일로 저장하기 위해 반드시 간단한 것은 아닌 몇 가지 특정 단계를 수행해야 할 수도 있습니다.


사용 mupdf

다음으로 MuPDF . 이 응용 프로그램에는 PDF에서 글꼴과 이미지를 추출 할 수 있는 유틸리티 pdfextract(Windows pdfextract.exe:)가 있습니다. (여전히 비교적 알려지지 않은 새로운 MuPDF에 대해 모르는 경우 : "MuPDF는 휴대용 C로 작성된 무료 경량 PDF 뷰어 및 툴킷입니다."( Artifex Software 개발자, Ghostscript를 제공 한 회사) )
( 업데이트 : 최신 버전의 MuPDF는 'pdfextract' 의 이전 기능을 'mutool extract' 명령으로 옮겼 습니다. 여기에서 다운로드하십시오 : mupdf.com/downloads )

참고 : pdfextract.exe명령 줄 프로그램입니다. 사용하려면 다음을 수행하십시오.

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

이 명령은 현재 디렉토리로 참조되는 pdf 파일에서 추출 가능한 모든 파일을 덤프합니다. 일반적으로 이미지뿐만 아니라 글꼴과 같은 다양한 파일이 표시됩니다. 여기에는 PNG, TTF, CFF, CID 등이 포함됩니다. 이미지 의 PDF 객체 번호가 412 인 경우 이미지 이름은 img-0412.png같습니다 . 글꼴 이름은 글꼴의 경우 FGETYK + LinLibertineI-0966.ttf같습니다. PDF 객체 번호는 966입니다.

CFF ( Compact Font Format ) 파일은 다양한 운영 체제에서 사용하기 위해 다양한 변환기를 통해 다른 형식으로 변환 할 수있는 인식 된 형식입니다.

다시 말하지만, 이러한 글꼴 파일의 대부분 은 문자 하위 집합 만 가질 수 있으며 완전한 서체를 나타내지 않을 수도 있습니다.

업데이트 : (2013 년 7 월) 최신 버전의 mupdf이진 파일은 한 번이 아니라 여러 번 내부에서 재배치 및 이름 바꾸기가 수행되었습니다. 주요 유틸리티는 (스위스 mubusy박스에서 영감을 얻은 이름) 이라는 '스위스 나이프'와 비슷한 바이너리 였으며 최근에는로 이름이 변경되었습니다 mutool. 이러한 하위 명령을 지원 info, clean, extract, postershow. 불행히도 이러한 도구에 대한 공식 문서는 아직 최신 상태가 아닙니다. 'MacPorts'를 사용하는 Mac 인 경우 : 동일한 이름을 사용하는 다른 유틸리티와 이름이 충돌하지 않도록 유틸리티 이름이 바뀌 었으므로를 사용해야 mupdfextract합니다.

mutool이전 도구 와 동일한 결과를 얻으려면 . *를 pdfextract실행하십시오 mubusy extract .... *

글꼴과 이미지를 추출하려면 다음 명령 줄 중 하나를 실행해야합니다.

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

다운로드는 여기 : mupdf.com/downloads


사용 gs(고스트)

그런 다음 Ghostscript 는 PDF에서 직접 글꼴을 추출 할 수도 있습니다. 그러나 extractFonts.psPostScript 언어로 작성된 특수 유틸리티 프로그램 인 Ghostscript 소스 코드 저장소 에서 사용할 수 있는 특수 유틸리티 프로그램의 도움이 필요 합니다 .

이제이 파일 extractFonts.ps과 PDF 파일을 모두 실행해야 합니다. 그런 다음 Ghostscript는 PostScript 프로그램의 지침을 사용하여 PDF에서 글꼴을 추출합니다. Windows에서는 다음과 같이 보입니다 (예, Ghostscript는 Windows에서도 경로 구분 기호로 '슬래시'를 이해합니다).

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

또는 Linux, Unix 또는 Mac OS X에서 :

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

몇 년 전에 고스트 스크립트 방법을 테스트했습니다. 당시에는 * .ttf (TrueType)를 잘 추출했습니다. 다른 글꼴 유형도 전혀 추출되는지, 그렇다면 재사용 가능한 방식으로 알 수 없습니다. 유틸리티가 보호 된 것으로 표시된 글꼴의 추출을 차단하는지 여부를 모르겠습니다.


사용 pdf-parser.py

마지막으로 Didier Stevens의 pdf-parser.py : 내부 PDF 구조에 대한 노하우가 필요하기 때문에 사용하기 쉽지 않을 것입니다. pdf-parser.py파이썬 스크립트는 다른 많은 것들도 할 수 있습니다. 또한 개체에서 임의의 스트림을 압축 해제하고 추출 할 수 있으므로 포함 된 글꼴 파일도 추출 할 수 있습니다.

But you need to know what to look for. Let's see it with an example. I have a file named big.pdf. As a first step I use the -s parameter to search the PDF for any occurrence of the keyword FontFile (pdf-parser.py does not require a case sensitive search):

pdf-parser.py -s fontfile big.pdf

In my case, for my big1.pdf, I get this result:

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

It tells me that there are two instances of FontFile2 inside the PDF, and these are in PDF objects no. 15 and no. 16, respectively. Object no. 15 holds the /FontFile2 for font /ArialMT, object no. 16 holds the /FontFile2 for font /Arial-BoldMT.

To show this more clearly:

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

A quick peeking into the PDF specification reveals the the keyword /FontFile2 relates to a 'stream containing a TrueType font program' (/FontFile would relate to a 'stream containing a Type 1 font program' and /FontFile3 would relate to a 'stream containing a font program whose format is specified by the Subtype entry in the stream dictionary' {hence being either a Type1C or a CIDFontType0C subtype}.)

To look specifically at PDF object no. 15 (which holds the font /ArialMT), one can use the -o 15 parameter:

pdf-parser.py -o 15 big1.pdf

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

This pdf-parser.py output tells us that this object contains a stream (which it will not directly display) that has a length of 1.581.435 Bytes and is encoded ( == "compressed") with ASCIIHexEncode and needs to be decoded ( == "de-compressed" or "filtered") with the help of the standard /ASCIIHexDecode filter.

To dump any stream from an object, pdf-parser.py can be called with the -d dumpname parameter. Let's do it:

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

Our extracted data dump will be in the file named dumped-data.ext. Let's see how big it is:

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

Oh look, it is 1.581.435 Bytes. We saw this figure in the previous command's output. Opening this file with a text editor confirms that its content is ASCII hex encoded data.

Opening the file with a font reading tool like otfinfo (this is a part of the lcdf-typetools package) will lead to some disappointment at first:

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

OK, this is because we did not (yet) let pdf-parser.py make use of its full magic: to dump a filtered, decoded stream. For this we have to add the -f parameter:

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

What's the size is this new file?

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

Oh, look: that exact number was also already stored in the PDF object no. 15 dictionary as the value for key /Length1...

What does file think it is?

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

What does otfinfo tell us about it?

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

So Bingo!, we have a winner: pdf-parser.py did indeed extract a valid font file for us. Given the size of this file (778.552 Bytes), it looks like this font had been embedded even completely in the PDF...

We could rename it to arial-regular.ttf and install it as such and happily make use of it.


Caveats:

  • In any case you need to follow the license that applies to the font. Some font licences do not allow free use and/or distribution. Pirating fonts is like pirating any software or other copyrighted material.

  • Most PDFs which are in the wild out there do not embed the full font anyway, but only subsets. Extracting a subset of a font is only useful in a very limited scope, if at all.

Please do also read the following about Pros and (more) Cons regarding font extraction efforts:


Use online service http://www.extractpdf.com. No need to install anything.


Eventually found the FontForge Windows installer package and opened the PDF through the installed program. Worked a treat, so happy.


http://www.verypdf.com/app/pdf-font-extractor/pdf-font-extracting-tool.html IMO easiest way to extract fonts (Windows).


PDF2SVG version 6.0 from PDFTron does a reasonable job. It produces OpenType (.otf) fonts by default. Use --preserve_fontnames to preserve "the font/font-family naming scheme as obtained from the source file."

PDF2SVG is a commercial product, but you can download a free demo executable (which includes watermarks on the SVG output but doesn't otherwise restrict usage). There may be other PDFTron products that also extract fonts, but I only recently discovered PDF2SVG myself.


One of the best online tools currently available to extract pdf fonts is http://www.pdfconvertonline.com/extract-pdf-fonts-online.html


This is a followup to the font-forge section of @Kurt Pfeifle's answer, specific to Red Hat (and possibly other Linux distros).

  1. After opening the PDF and selecting the font you want, you will want to select "File -> Generate Fonts..." option.
  2. If there are errors in the file, you can choose to ignore them or save the file and edit them. Most of the errors can be fixed automatically if you click "Fix" enough times.
  3. Click "Element -> Font Info...", and "Fontname", "Family Name" and "Name for Humans" are all set to values you like. If not, modify them and save the file somewhere. These names will determine how your font appears on the system.
  4. Select your file name and click "Save..."

Once you have your TTF file, you can install it on your system by

  1. Copying it to folder /usr/share/fonts (as root)
  2. Running fc-cache -f /usr/share/fonts/ (as root)

참고URL : https://stackoverflow.com/questions/3488042/how-can-i-extract-embedded-fonts-from-a-pdf-as-valid-font-files

반응형