Làm cách nào tôi có thể trích xuất phông chữ nhúng từ tệp PDF dưới dạng tệp phông hợp lệ?


161

Tôi biết về pdftk.exetiện ích có thể chỉ ra phông chữ nào được sử dụng bởi PDF và khi chúng được nhúng hay không.

Bây giờ vấn đề: do tôi có các tệp PDF có phông chữ nhúng - làm cách nào tôi có thể trích xuất các phông chữ đó theo cách chúng có thể được sử dụng lại như các tệp phông chữ thông thường? Có công cụ nào (tốt nhất là miễn phí) có thể làm điều đó không? Ngoài ra: điều này có thể được thực hiện theo chương trình với, giả sử, iText không?

Câu trả lời:


405

Bạn có một vài lựa chọn. Tất cả các phương pháp này hoạt động trên Linux cũng như trên Windows hoặc Mac OS X. Tuy nhiên, hãy lưu ý rằng hầu hết các tệp PDF không bao gồm đầy đủ, hoàn chỉnh phông chữ khi chúng có một phông chữ được nhúng. Chủ yếu chúng chỉ bao gồm tập hợp con của glyphs được sử dụng trong tài liệu.


Sử dụng pdftops

Một trong những phương pháp được sử dụng thường xuyên nhất để thực hiện việc này trên các hệ thống * nix bao gồm các bước sau:

  1. Chuyển đổi PDF thành PostScript, ví dụ bằng cách sử dụng XPDF's pdftops(trên Windows: pdftops.exechương trình trợ giúp.
  2. Bây giờ phông chữ sẽ được nhúng ở .pfađịnh dạng (PostScript) + bạn có thể trích xuất chúng bằng trình soạn thảo văn bản .
  3. Bạn có thể cần phải chuyển đổi .pfa(ASCII) thành .pfbtệp (nhị phân) bằng cách sử dụng t1utilspfa2pfb.
  4. Trong các tệp PDF không bao giờ .pfmhoặc .afmcác tệp (tệp số liệu phông chữ) được nhúng (vì trình xem PDF có kiến ​​thức nội bộ về các tệp này). Không có những thứ này, các tệp phông chữ khó có thể sử dụng theo cách trực quan dễ chịu.

Sử dụng fontforge

Một phương pháp khác là sử dụng trình soạn thảo phông chữ miễn phí FontForge :

  1. Sử dụng hộp thoại "Mở phông chữ" được sử dụng khi mở tệp.
  2. Sau đó chọn "Trích xuất từ ​​PDF" trong phần bộ lọc của hộp thoại.
  3. Chọn tệp PDF có phông chữ cần giải nén.
  4. Một "Chọn một font" DialogBox mở ra - chọn ở đây mà phông chữ để mở.

Kiểm tra hướng dẫn sử dụng FontForge. Bạn có thể cần phải làm theo một số bước cụ thể không nhất thiết phải đơn giản để lưu dữ liệu phông chữ được trích xuất dưới dạng tệp có thể sử dụng lại được.


Sử dụng mupdf

Tiếp theo, MuPDF . Ứng dụng này đi kèm với một tiện ích có tên pdfextract(trên Windows pdfextract.exe:) có thể trích xuất phông chữ và hình ảnh từ các tệp PDF. (Trong trường hợp bạn không biết về MuPDF, mà vẫn còn khá vô danh và mới: "MuPDF là một trọng lượng nhẹ xem miễn phí PDF và bộ công cụ viết bằng di C." , được viết bởi các nhà phát triển phần mềm ARTIFEX, cùng một công ty mà đã cho chúng tôi Ghostscript. )
( Cập nhật: Các phiên bản mới hơn của MuPDF đã chuyển chức năng cũ của 'pdfextract' sang lệnh 'mutool extract' . Tải xuống tại đây: mupdf.com/doads )

Lưu ý: pdfextract.exelà một chương trình dòng lệnh. Để sử dụng nó, hãy làm như sau:

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

Lệnh này sẽ kết xuất tất cả các tệp có thể trích xuất từ ​​tệp pdf được tham chiếu vào thư mục hiện tại. Nói chung, bạn sẽ thấy một loạt các tập tin: hình ảnh cũng như phông chữ. Chúng bao gồm PNG, TTF, CFF, CID, v.v ... Tên hình ảnh sẽ giống như img-0412.png nếu số đối tượng PDF của hình ảnh là 412. Tên phông chữ sẽ giống như FGETYK + LinLibertineI-0966.ttf , nếu phông chữ là Số đối tượng PDF là 966.

Các tệp CFF ( Định dạng phông chữ nhỏ gọn ) là một định dạng được công nhận có thể được chuyển đổi sang các định dạng khác thông qua nhiều bộ chuyển đổi để sử dụng trên các hệ điều hành khác nhau.

Xin nhắc lại: lưu ý rằng hầu hết các tệp phông chữ này có thể chỉ có một tập hợp con các ký tự và có thể không đại diện cho kiểu chữ hoàn chỉnh.

Cập nhật: (Tháng 7 năm 2013) Các phiên bản gần đây mupdfđã thấy việc chia sẻ lại nội bộ và đổi tên các tệp nhị phân của chúng, không chỉ một lần, mà nhiều lần. Tiện ích chính được sử dụng là một nhị phân 'dao giống nhau' được gọi mubusy(tên lấy cảm hứng từ busybox?), Gần đây đã được đổi tên thành mutool. Những hỗ trợ các tiểu lệnh info, clean, extract, postershow. Thật không may, tài liệu chính thức cho các công cụ này không cập nhật (chưa). Nếu bạn đang sử dụng máy Mac bằng 'MacPorts': thì tiện ích đã được đổi tên để tránh xung đột tên với các tiện ích khác sử dụng tên giống nhau và bạn có thể cần phải sử dụng mupdfextract.

Để đạt được kết quả tương đương (gần như) mutoolnhư công cụ trước đây pdfextractđã làm, chỉ cần chạy mubusy extract .... *

Vì vậy, để trích xuất phông chữ và hình ảnh, bạn có thể cần chạy một trong các dòng lệnh sau:

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

Tải xuống ở đây: mupdf.com/doads


Sử dụng gs(Ghostscript)

Sau đó, Ghostscript cũng có thể trích xuất phông chữ trực tiếp từ các tệp PDF. Tuy nhiên, nó cần sự trợ giúp của một chương trình tiện ích đặc biệt có tên extractFonts.ps, được viết bằng ngôn ngữ PostScript, có sẵn từ kho lưu trữ mã nguồn Ghostscript .

Bây giờ sử dụng nó, bạn cần chạy cả hai, tệp này extractFonts.psvà tệp PDF của bạn. Ghostscript sau đó sẽ sử dụng các hướng dẫn từ chương trình PostScript để trích xuất các phông chữ từ PDF. Có vẻ như thế này trên Windows (vâng, Ghostscript hiểu 'dấu gạch chéo về phía trước', /, như một dấu phân cách đường dẫn cũng trên Windows!):

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

hoặc trên Linux, Unix hoặc Mac OS X:

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

Tôi đã thử nghiệm phương pháp Ghostscript vài năm trước. Tại thời điểm nó đã giải nén * .ttf (TrueType) tốt. Tôi không biết liệu các loại phông chữ khác cũng sẽ được trích xuất hay không, và nếu vậy, theo cách có thể sử dụng lại. Tôi không biết liệu tiện ích có chặn trích xuất phông chữ được đánh dấu là được bảo vệ hay không.


Sử dụng pdf-parser.py

Cuối cùng, pdf-parser.py của Didier Stevens : cái này có lẽ không dễ sử dụng, vì bạn cần có một số bí quyết về cấu trúc PDF bên trong. pdf-parser.pylà một kịch bản Python cũng có thể làm rất nhiều thứ khác. Nó cũng có thể giải nén và trích xuất các luồng tùy ý từ các đối tượng và do đó nó cũng có thể trích xuất các tệp phông chữ nhúng.

Nhưng bạn cần biết những gì cần tìm. Hãy xem nó với một ví dụ. Tôi có một tập tin tên big.pdf . Bước đầu tiên tôi sử dụng -stham số để tìm kiếm PDF cho bất kỳ sự xuất hiện nào của từ khóa FontFile ( pdf-parser.pykhông yêu cầu tìm kiếm phân biệt chữ hoa chữ thường):

pdf-parser.py -s fontfile big.pdf

Trong trường hợp của tôi, đối với big1.pdf của tôi , tôi nhận được kết quả này:

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

Nó cho tôi biết rằng có hai trường hợp FontFile2bên trong PDF và những trường hợp này không có trong các đối tượng PDF. 15 và không. 16, tương ứng. Đối tượng không. 15 giữ /FontFile2cho phông chữ / ArialMT , đối tượng không. 16 giữ /FontFile2cho phông chữ / Arial-BoldMT .

Để thể hiện điều này rõ hơn:

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

Việc xem nhanh thông số kỹ thuật PDF cho thấy từ khóa /FontFile2liên quan đến 'luồng chứa chương trình phông chữ TrueType' ( /FontFilesẽ liên quan đến 'luồng chứa chương trình phông chữ Loại 1'/FontFile3sẽ liên quan đến 'luồng chứa chương trình phông chữ có định dạng được chỉ định bởi mục Subtype trong từ điển luồng ' {do đó là kiểu con Type1C hoặc CIDFontType0C }.)

Để xem cụ thể đối tượng PDF không. 15 (chứa phông chữ / ArialMT ), người ta có thể sử dụng -o 15tham số:

pdf-parser.py -o 15 big1.pdf

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

pdf-parser.pyĐầu ra này cho chúng ta biết rằng đối tượng này chứa một luồng (nó sẽ không hiển thị trực tiếp) có độ dài 1.581.435 Byte và được mã hóa (== "đã nén") bằng ASCIIHexEncode và cần được giải mã (== "de- được nén "hoặc" được lọc ") với sự trợ giúp của /ASCIIHexDecodebộ lọc tiêu chuẩn .

Để kết xuất bất kỳ luồng nào từ một đối tượng, pdf-parser.pycó thể được gọi với -d dumpnametham số. Hãy làm nó:

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

Kết xuất dữ liệu được trích xuất của chúng tôi sẽ nằm trong tệp có tên dumped-data.ext . Chúng ta hãy xem nó lớn như thế nào:

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

Hãy nhìn xem, nó là 1.581.435 Byte. Chúng ta đã thấy con số này trong đầu ra của lệnh trước đó. Mở tệp này bằng trình soạn thảo văn bản xác nhận rằng nội dung của nó là dữ liệu được mã hóa hex ASCII.

Mở tệp bằng một công cụ đọc phông chữ như otfinfo(đây là một phần của lcdf-typetoolsgói ) sẽ dẫn đến một số thất vọng lúc đầu:

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

OK, điều này là do chúng tôi chưa (chưa) pdf-parser.pysử dụng phép thuật đầy đủ của nó: để đổ một luồng được giải mã, được lọc. Đối với điều này, chúng ta phải thêm -ftham số:

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

Kích thước của tập tin mới này là bao nhiêu?

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

Ồ, nhìn kìa: con số chính xác đó cũng đã được lưu trong đối tượng PDF. 15 từ điển làm giá trị cho khóa /Length1...

filenghĩ gì về nó?

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

Điều gì otfinfocho chúng ta biết về nó?

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

Vì vậy, Bingo!, Chúng tôi có một người chiến thắng: pdf-parser.pythực sự đã trích xuất một tệp phông chữ hợp lệ cho chúng tôi. Với kích thước của tệp này (778.552 Byte), có vẻ như phông chữ này đã được nhúng thậm chí hoàn toàn trong tệp PDF ...

Chúng ta có thể đổi tên nó thành arial-normal.ttf và cài đặt nó như vậy và vui vẻ sử dụng nó.


Hãy cẩn thận:

  • Trong mọi trường hợp, bạn cần phải tuân theo giấy phép áp dụng cho phông chữ. Một số giấy phép phông chữ không cho phép sử dụng và / hoặc phân phối miễn phí. Phông chữ vi phạm giống như vi phạm bản quyền bất kỳ phần mềm hoặc tài liệu có bản quyền khác.

  • Hầu hết các tệp PDF ngoài tự nhiên không nhúng phông chữ đầy đủ mà chỉ có các tập hợp con. Trích xuất một tập hợp con của một phông chữ chỉ hữu ích trong một phạm vi rất hạn chế, nếu có.

Ngoài ra, vui lòng đọc phần sau về Ưu và (thêm) Nhược điểm liên quan đến nỗ lực trích xuất phông chữ:


3
@ kizzx2: vui lòng upvote hoặc downvote bất kỳ câu trả lời [PDF] hoặc [Ghostscript] nào khác của tôi :-)
Kurt Pfeifle

Nếu bạn đang ở trên Mac và cài đặt mupdf từ các cổng (hoặc có lẽ từ nhị phân nữa), quá trình trích xuất cũng được gọi là mupdfextract. Bạn có thể chạy nó từ thiết bị đầu cuối, miễn là nó nằm trong đường dẫn.
Orwellophile

@Orwellophile: cảm ơn vì gợi ý. Tôi lấy đó làm cơ hội để cập nhật một số gợi ý của mình mupdf. Cũng xem điều này ...
Kurt Pfeifle

Tôi sẽ kiểm tra chúng. Và vì vậy đây không phải là một nhận xét vô nghĩa: Quá trình của bạn đã TUYỆT VỜI ... (đã bỏ phiếu) ... nó đã trích xuất và đặt tên cho 3 biến thể của phông chữ, và sau đó tôi đã sử dụng fontforge (cũng miễn phí từ macports) để hợp nhất. Thật không may, phông chữ của tôi vẫn thiếu chữ in hoa "X" ... Tỷ lệ cược là gì: p
Orwellophile

1
@Chris: có, đây là hai tập hợp con khác nhau (có thể trùng nhau trong một phần rất lớn). Không có tùy chọn nào để tự động hợp nhất chúng.
Kurt Pfeifle

26

Sử dụng dịch vụ trực tuyến http://www.extractpdf.com . Không cần cài đặt gì cả.


Trong trường hợp của tôi, nó chỉ có thể trích xuất phông chữ Loại 1 chứ không phải TrueType
koppor

Tôi đã trích xuất phông chữ bằng cách sử dụng trang web này và sao chép nó tại ~/.fonts, và bản sao và dán đang hoạt động!
Eduardo Santana



3

Mặc dù câu hỏi này đã được 10 năm nhưng nó vẫn có giá trị và vì công nghệ thay đổi nên câu trả lời hợp lệ.

Khi tìm kiếm các câu trả lời hiện tại nhận thấy không ai trong số họ lưu ý WOFF (Định dạng phông chữ mở Web) ( W3C ) ( Wikipedia ) có thể được sử dụng để tạo lại các ký tự riêng lẻ (glyphs) và hiển thị chúng chính xác trong một trang web.

Sử dụng trang web trực tuyến miễn phí của IDR Solutions, PDF sang HTML5 ( liên kết ), chuyển đổi PDF thành tệp zip. Trong zip kết quả sẽ là một thư mục phông chữ của các loại tệp woff. Các trình duyệt Internet hiện tại hỗ trợ các tập tin woff nếu bạn không biết. ( tham khảo ) Chúng có thể được kiểm tra tại trang web trực tuyến FontDrop! ( liên kết ).

Các tệp WOFF có thể được chuyển đổi thành / từ OTF hoặc TTF tại WOFFer - trình chuyển đổi phông chữ WOFF

Ngoài ra, tệp zip từ PDF sang HTML5 sẽ chứa tệp HTML cho mỗi trang PDF có thể mở trong trình duyệt Internet và là một trong những bản dịch PDF chính xác và tốt nhất tôi đã tìm thấy hoặc xem.

Mặc dù tôi chỉ đang học cách sử dụng các tệp WOFF, nhưng điều này đáng để thực hiện. Thưởng thức.

PS, tôi có thể sẽ cập nhật thêm thông tin khi tôi tìm hiểu thêm về cách sử dụng các loại tệp woff, nhưng vì đây là dấu phẩy sáng tạo, vui lòng chỉnh sửa câu trả lời này nếu bạn có thứ gì đó có giá trị để vượt qua.


Cảm ơn bạn! Giải pháp này hiệu quả với tôi (như trong việc tạo TTF hợp lệ) trong khi các giải pháp khác tôi đã thử không làm. Có phải vì WOFF xử lý phông chữ không đầy đủ tốt hơn?
Daan

@Daan Is it because WOFF handles incomplete fonts better?Mình không có ý kiến. Dự đoán của bạn sẽ là tốt như của tôi. Như tôi đã lưu ý, tôi chỉ đang tìm hiểu về WOFF.
Guy Coder

@Daan Có lẽ bạn nên đăng bài Is it because WOFF handles incomplete fonts better?dưới dạng câu hỏi SO mới và những người khác có nhiều kiến ​​thức sẽ thấy và hy vọng cung cấp câu trả lời có ý nghĩa.
Guy Coder

Tôi có thể làm điều đó. Cảm ơn.
Daan

2

PDF2SVG phiên bản 6.0 từ PDFTron làm một công việc hợp lý. Nó tạo phông chữ OpenType ( .otf) theo mặc định. Sử dụng --preserve_fontnamesđể bảo tồn "lược đồ đặt tên phông chữ / phông chữ như thu được từ tệp nguồn."

PDF2SVG là một sản phẩm thương mại, nhưng bạn có thể tải xuống bản thực thi demo miễn phí (bao gồm hình mờ trên đầu ra SVG nhưng không hạn chế sử dụng). Có thể có các sản phẩm PDFTron khác cũng trích xuất phông chữ, nhưng tôi chỉ mới phát hiện ra PDF2SVG gần đây.


Thật không may --preserve_fontnames, không hoạt động nếu bạn có các phông chữ chồng chéo, một phần - dường như không bao gồm tiền tố, ví dụ: MSCIYGin MSCIYG+Ge'ez-1, vì vậy sẽ ghi đè lên các phần trước.
Chris


0

Đây là phần tiếp theo của font-forgephần câu trả lời của @Kurt Pfeifle , dành riêng cho Red Hat (và có thể các bản phân phối Linux khác).

  1. Sau khi mở tệp PDF và chọn phông chữ bạn muốn, bạn sẽ muốn chọn tùy chọn "Tệp -> Tạo phông chữ ...".
  2. Nếu có lỗi trong tệp, bạn có thể chọn bỏ qua chúng hoặc lưu tệp và chỉnh sửa chúng. Hầu hết các lỗi có thể được sửa tự động nếu bạn nhấp vào "Khắc phục" đủ số lần.
  3. Nhấp vào "Phần tử -> Thông tin phông chữ ..." và "Tên phông chữ", "Tên gia đình" và "Tên cho con người" đều được đặt thành các giá trị bạn thích. Nếu không, sửa đổi chúng và lưu tập tin ở đâu đó. Những tên này sẽ xác định cách phông chữ của bạn xuất hiện trên hệ thống.
  4. Chọn tên tệp của bạn và nhấp vào "Lưu ..."

Khi bạn có tệp TTF, bạn có thể cài đặt nó trên hệ thống của mình bằng cách

  1. Sao chép nó vào thư mục /usr/share/fonts(như root)
  2. Chạy fc-cache -f /usr/share/fonts/(với quyền root)
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.