2010-11-20 28 views
23

Bối cảnh:Làm cách nào để nhúng phông chữ trong một tệp PDF hiện có?

Tôi có PDF được tạo theo chương trình. Tôi cần để có thể gửi tệp PDF trực tiếp tới máy in từ máy chủ (không phải thông qua một ứng dụng trung gian). Tại thời điểm này tôi có thể thực hiện tất cả các điều trên (tạo PDF, gửi tới máy in), nhưng vì phông chữ không được nhúng trong PDF, máy in đang thực hiện thay thế phông chữ.

Tại sao các phông chữ không được nhúng khi tạo:

tôi đang tạo ra sử dụng SQL Reporting Services PDF của năm 2008. Có một vấn đề được biết đến với SQL Reporting Services ở chỗ nó sẽ không nhúng phông chữ (trừ khi một loạt các yêu cầu được đáp ứng - http://technet.microsoft.com/en-us/library/ms159713%28SQL.100%29.aspx). Đừng hỏi tôi tại sao, PDF đáp ứng tất cả các yêu cầu được liệt kê của MS và phông chữ vẫn hiển thị như không được nhúng - không có kiểm soát thực sự cho dù phông chữ được nhúng, vì vậy tôi đã chấp nhận điều này không hoạt động và . Giải pháp được đề xuất từ ​​Microsoft (http://blogs.msdn.com/b/donovans/archive/2007/07/20/reporting-services-pdf-renderer-faq.aspx trong 'Khi nào Dịch vụ báo cáo thực hiện nhúng phông chữ') là đăng quá trình PDF để nhúng phông chữ theo cách thủ công.

Mục tiêu Tạo tài liệu PDF đã tạo, lập trình 'mở' và nhúng phông chữ, lưu PDF.

Cách tiếp cận Tôi đã chỉ về phía iTextSharp, nhưng hầu hết trong những ví dụ là dành cho các phiên bản Java và tôi đang gặp rắc rối dịch lên phiên bản iTextSharp (Tôi không thể tìm thấy bất kỳ tài liệu cho iTextSharp).

Tôi đang làm việc trên bài đăng này cho những gì tôi cần làm: Itext embed font in a PDF.

Tuy nhiên đối với cuộc sống của tôi, tôi dường như không thể sử dụng đối tượng ByteArrayOutputStream. Nó dường như không thể tìm thấy nó. Tôi đã nghiên cứu và nghiên cứu nhưng không ai có vẻ nói lớp đó là gì hoặc ở đâu tôi tìm thấy nó để tôi có thể đưa nó vào trong các câu lệnh sử dụng. Tôi thậm chí đã mở được Reflector mở và dường như không thể tìm thấy nó ở bất cứ đâu.

Đây là những gì tôi có cho đến nay và nó biên dịch v.v. (kết quả là byte của tôi [] của tệp PDF được tạo).

PdfReader pdf = new PdfReader(result);    
BaseFont unicode = BaseFont.CreateFont("Georgia", BaseFont.IDENTITY_H, BaseFont.EMBEDDED); 
// the next line doesn't work as I need a ByteArrayOutputStream variable to pass in 
PdfStamper stamper = new PdfStamper(pdf, MISSINGBYTEARRAYOUTPUTSTREAMVARIABLE); 
stamper.AcroFields.SetFieldProperty("test", "textfont", unicode, null); 
stamper.Close(); 
pdf.Close(); 

Vì vậy, ai cũng có thể giúp tôi sử dụng iTextSharp để nhúng phông chữ vào PDF hoặc hướng tôi đi đúng hướng?

Tôi rất vui khi sử dụng bất kỳ giải pháp nào khác ngoài iTextSharp để hoàn thành mục tiêu này, nhưng cần phải được miễn phí và có thể được doanh nghiệp sử dụng cho ứng dụng nội bộ (ví dụ: Affero GPL).

+0

Bạn có thể đặt tên cho các phông chữ cần nhúng không? (Một số phông chữ có giấy phép không cho phép nhúng, và phần lớn việc xử lý PDF hoặc tạo phần mềm không tôn trọng các cờ tương ứng trong các tệp phông chữ và chọn không nhúng t ...) –

+0

Chắc chắn! Georgia và Calibri - Tôi đã kiểm tra rằng chúng tôi có các phiên bản TrueType và (tốt, theo Windows) cả hai đều có thẻ 'Khả năng nhúng phông' được đặt thành 'Có thể chỉnh sửa' - Tôi thu thập đây là cài đặt phù hợp? Cảm ơn vì bất kì sự giúp đỡ! – hanzworld

+0

Đối với bất kỳ ai đọc sau này, cả hai phương pháp này đều hoạt động. Dịch vụ báo cáo SQL cuối cùng đã nhúng các phông chữ chính xác sau nhiều bản cập nhật/hotfix và có thể được gửi thẳng tới máy in. Ngoài ra, được gọi là Ghostscript sử dụng ProcessInfo từ .NET có thể xử lý tệp PDF. – hanzworld

Trả lời

29

Đây có thể không phải là câu trả lời bạn đang tìm kiếm (vì bạn muốn giải quyết các vấn đề của mình theo chương trình, không phải bởi một công cụ bên ngoài).

Nhưng bạn có thể sử dụng Ghostscript commandline để nhúng phông chữ bị mất khi nhìn lại để PDF chưa nhúng chúng:

gs \ 
    -sFONTPATH=/path/to/fonts:/another/dir/with/more/fonts \ 
    -o output-pdf-with-embedded-fonts.pdf \ 
    -sDEVICE=pdfwrite \ 
    -dPDFSETTINGS=/prepress \ 
    input-pdf-where-some-fonts-are-not-embedded.pdf 

Một điều quan trọng là các phông chữ bị mất đều có sẵn tại một trong những thư mục trỏ đến bởi công tắc -sFontPath=....

+0

Xin cảm ơn vì điều này - Tôi đã nhanh chóng đi xem kết quả đầu ra này và PDF outputtting thực sự có các phông chữ được nhúng - nhưng nó đã thay thế tất cả các phông chữ bằng Helvetica! Tôi không thể làm cho đầu hoặc đuôi của cách sửa lỗi này. Bất kỳ ý tưởng? – hanzworld

+1

@hanzworld: Bạn có thể cung cấp đầu ra của 'pdffonts.exe original.pdf' và' pdffonts.exe processed.pdf' không? ('pdffonts.exe' là một phần của tiện ích XPDF CLI có tại đây: http://www.foolabs.com/xpdf/download.html –

+0

PDF gốc: tên loại emb sub uni đối tượng ID ------- ---------------- ----------- --- --- --- --------- Calibri TrueType no no không 3 0 Georgia, BoldItalic TrueType không không có 4 0 Calibri, Bold TrueType no no no 0 0 Georgia, nghiêng TrueType no no no 0 0 – hanzworld

8

Bên cạnh Ghostscript, bạn cũng có thể sử dụng Poppler và Cairo.Có một lệnh pdftocairo từ Poppler chuyển đổi PDF sang PDF qua pdftocairo -pdf input.pdf output.pdf. Nó cũng xem xét các thay thế phông chữ được đặt trong tệp cấu hình Fontconfig. Điều này rất hữu ích nếu bạn không có tất cả phông chữ trên hệ thống của mình được tham chiếu trong tệp PDF, nhưng biết phông chữ nào khác bạn đã cài đặt là một thay thế đẹp mắt. Sau khi xử lý, phông chữ thay thế được nhúng.

+1

+ 1: - - Này, tôi không biết điều đó !-) Tôi sẽ tin tưởng bây giờ nó hoạt động như bạn mô tả. Sẽ kiểm tra sau. Nhưng nếu nó không hoạt động, tôi sẽ phải lấy lại của tôi một lần nữa ... :-) –

+0

Điều này dễ hơn nhiều so với sử dụng 'gs' - thậm chí tôi có thể nhớ lệnh này. – fission

+1

Điều này hoạt động tuyệt vời. Chỉ cần một lưu ý cho người dùng cygwin Windows - nếu bạn cố gắng chạy điều này dưới Cygwin nó có thể sử dụng một phông chữ khác nhau thay đổi sự xuất hiện của hình ảnh. Sử dụng [Poppler for Windows] (http://blog.alivate.com.au/poppler-windows/) từ một Command Prompt chuẩn hoạt động rất tốt. Cảm ơn bạn đã đăng câu trả lời này. – zelanix

Các vấn đề liên quan