32

バックグラウンド:

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

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

SQL Reporting Services 2008 を使用して PDF を作成しています。SQL Reporting Services にはフォントが埋め込まれないという既知の問題があります (一連の要件が満たされない限り - 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 'Reporting Services がフォントの埋め込みを実行するタイミング' の下) PDFを後処理してフォントを手動で埋め込むことです。

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

アプローチ iTextSharp に向けられましたが、ほとんどの例は Java バージョン用であり、iTextSharp バージョンに変換するのに問題があります (iTextSharp のドキュメントが見つかりません)。

私がする必要があることのために、この投稿に取り組んでいます: Itext embed font in a PDF .

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

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

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) に使用できる必要があります。

4

4 に答える 4

37

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

ただし、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 つで利用できることです。

于 2010-11-20T18:00:46.347 に答える
15

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

于 2014-12-20T22:44:50.000 に答える
0

IEEE に提出していた PDF を Mac で使用すると、この問題が発生しました。Adobe Reader と Preview を使用して、これを回避することができました。PCを使用している場合、PDFプリンターはプレビューの代わりに機能すると思います。

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

  1. Adobe Readerでpdfファイルを開いてください。

  2. 画像を右クリックし、[ドキュメント プロパティ] をクリックします。</p>

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

  4. PDF が標準のページ サイズでない場合は、[説明] をクリックしてページ サイズを確認します。これを書き留めます。元。19.4×5.22インチ。

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

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

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

これが役立つことを願っています。

于 2019-05-14T23:32:20.113 に答える