web-dev-qa-db-ja.com

既存のPDFにフォントを埋め込むにはどうすればよいですか?

背景:

プログラムで生成しているPDFがあります。 PDFをサーバーから直接プリンターに送信できる必要があります(中間アプリケーション経由ではありません)。現時点では、上記のすべてを実行できます(PDFを生成し、プリンターに送信します)。 )、ただし、フォントがPDFに埋め込まれていないため、プリンターはフォントの置換を行っています。

生成時にフォントが埋め込まれない理由:

SQL Reporting Services 2008を使用してPDFを作成しています。SQLReportingServicesには、フォントが埋め込まれないという既知の問題があります(一連の要件が満たされていない場合--- http://technet.Microsoft.com/en -us/library/ms159713%28SQL.100%29.aspx )。理由を聞かないでください、PDF MSのリストされた要件をすべて満たし、フォントはまだ埋め込まれていないように表示されます-フォントが埋め込まれているかどうかを実際に制御することはできないので、私は受け入れましたこれは機能しておらず、先に進んでいます。Microsoftから提案された回避策( http://blogs.msdn.com/b/donovans/archive/2007/07/20/reporting-services-pdf-renderer- faq.aspx 「ReportingServicesがフォントの埋め込みを行うのはいつですか」)は、PDFを後処理して、フォントを手動で埋め込むことです。

目標すでに生成されたPDFドキュメントを取得し、プログラムで「開いて」フォントを埋め込み、PDFを再保存します。

アプローチ私はiTextSharpに向けられましたが、ほとんどの例はJavaバージョンであり、問​​題が発生していますiTextSharpバージョンへの翻訳(iTextSharpのドキュメントが見つかりません)。

私は私がする必要があることのためにこの投稿に取り組んでいます: PDFのItext埋め込みフォント

しかし、私の人生では、ByteArrayOutputStreamオブジェクトを使用できないようです。それを見つけることができないようです。私は調査して調査しましたが、どのクラスにあるのか、どこにあるのか誰も言っていないようですので、usingステートメントに含めることができます。リフレクターを開けてみたところ、どこにも見つからないようです。

これは私がこれまでに持っているものであり、コンパイルなどが行われます(結果は生成されたPDFの私のbyte []です)。

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();

では、iTextSharpを使用してフォントをPDFに埋め込むのを手伝ってくれる人もいれば、正しい方向に向けてくれる人もいますか?

この目標を達成するためにiTextSharp以外の他のソリューションを使用できることを嬉しく思いますが、無料であり、企業が内部アプリケーション(Affero GPLなど)で使用できる必要があります。

28
hanzworld

これはあなたが探している答えではないかもしれません(あなたは問題を外部ツールではなくプログラムで解決したいので)。

ただし、Ghostscriptコマンドラインを使用して、欠落しているフォントを、それらが埋め込まれていないPDFに振り返って埋め込むことができます。

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

重要なことの1つは、不足しているフォントがすべて、-sFontPath=...スイッチが指すディレクトリの1つで使用できることです。

33
Kurt Pfeifle

Ghostscriptの他に、 Poppler とCairoを使用することもできます。 Popplerからのコマンドpdftocairoがあり、これはPDFからPDF via pdftocairo -pdf input.pdf output.pdf。また、 Fontconfig 構成ファイルで設定されたフォント置換も考慮します。これは、PDFファイルで参照されているすべてのフォントがシステムにないが、インストールした他のどのフォントが見栄えの良い代替品であるかがわかっている場合に非常に役立ちます。処理後、置換フォントが埋め込まれています。

11
Michael Fiedler

PDF IEEEに送信していたMacでこの問題が発生しました。AdobeReaderとPreviewを使用して、これを回避できました。Previewの代わりにPDFプリンターが機能する可能性があると思います。 PCを使用している場合。

これが私が取ったステップです。各図を個別に修正することも、ドキュメント全体を修正することもできます。

  1. AdobeReaderを使用してPDFファイルで開きます。

  2. 画像を右クリックし、「ドキュメントのプロパティ」をクリックします。

  3. 「フォント」をクリックします。フォントが埋め込まれていないかどうかを確認してください。 「Courier」または他のフォント名を言う必要があります。

  4. PDFが標準のページサイズでない場合は、[説明]をクリックしてページサイズを確認してください。これを書き留めてください。例19.4 x5.22インチ.

  5. PDFをプレビューで開きます。 [ファイル]-> [印刷]に移動します。標準のページサイズではないPDFを使用している場合は、[用紙サイズ]をクリックして[カスタム]を選択します。手順4で書き留めたものと同じカスタムページサイズを作成する必要があります。すべての辺の余白を0にゼロにすることを忘れないでください。その後、印刷ダイアログで印刷のスケールを100%に設定する必要があります。

  6. 印刷ダイアログの左下(Macのプレビュー)で、[PDF]をクリックしてPDFを新しいPDFに印刷します。宛先を選択して印刷します。

  7. Adobe Readerで新しいPDFを開き、フォントが埋め込まれていることを確認します。

これがお役に立てば幸いです。

0
Michael