投稿者 マナ  (社会人) 投稿日時 2022/7/21 10:12:30
こんにちは!
現在作成しているツールでは、PDFのページを画像化(今の所24ビットpng)するために、
別途Ghostscriptをインストールし、VBからこれを呼び出すようなことをしています。
ただ、以下の問題があります。

・Ghostscriptのインストールが必要。
・PDFに組み込まれたフォント名表記によってはGhostscript側でエラーとなる。
 (cmapのフォント名定義の修正が必要)
・Ghostscriptのセキュリティの問題でバージョン変更があるが、
 バグのあるバージョンもあったりするので、管理が大変。

そこで調べてみると、こちらの掲示板にPDFの画像化に関する質問と回答がありました。

■Vb.netでPDFをTiffに変換したい
 http://rucio.cloudapp.net/ThreadDetail.aspx?ThreadId=30630

こちらを参考に、画像化に成功しました。
ただ、解像度の指定方法が分かりませんでした。
Ghostscriptでは解像度指定があり、例えばA4縦のPDFを600dpi指定で
4961×7016ピクセルのpng画像を作成できていました。

とりあえずは、PdfPageのRenderToStreamAsyncに渡すPdfPageRenderOptionsで
DestinationWidth = 4961, DestinationHeight = 7016 とすることで
直接サイズ指定を行うことにより、目的の画像を取得できました。

ただ、扱うPDFはA4縦とは限らない(B5やレターサイズ、あるいは横向き)
ので、どうやって指定dpiのサイズを計算すればいいか分かりません。

色々と調べると、以下のブログで、C#ですが、200dpiの指定を行う方法が記載されていました。

■C#でPDFを表示する(WPF)
 https://water2litter.net/rye/post/c_pdf_render/

//実際のコード
PdfPageRenderOptions renderOptions = new PdfPageRenderOptions();
renderOptions.DestinationWidth = (uint)Math.Round(page.Dimensions.ArtBox.Width / 96.0 * 200.0);

おそらく上記の200.0というのがdpiを示しているものと思いますが、
その隣の96.0という数値は何を意味しているのでしょうか?
この値は固定にして、これをそのまま参考にしてもいいのでしょうか?