Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
.netでPDFページを画像化する時の解像度指定
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30774#CommentId85361
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
魔界の仮面弁士
 (社会人)
投稿日時
2022/7/21 17:31:10
PdfPageRenderOptions の SourceRect に描画元の領域を指定し、
Destination{Width|Height} を指定することで切り出します。
https://qiita.com/shotasakamoto/items/f5a011dffd4e9117e4ea
PdfPageRenderOptions.DestinationHeight
PdfPageRenderOptions.DestinationWidth
の単位は デバイス依存ピクセル (DIPs) なので、
実際の出力先(プリンター、画面、画像ファイルなど)が求める解像度に応じて
算出したピクセル値をセットします。
ページのサイズは、各 PdfPage の Size プロパティ (Windows.Foundation.Size クラス) から
得られますので、DestinationWidth に対して dpi に応じた値を乗算して UInt32 化して渡します。
https://docs.microsoft.com/ja-jp/uwp/api/windows.data.pdf.pdfpage.size?view=winrt-22621
あるいはトンボ付き PDF などに備えて、Dimensions プロパティから
境界ボックス「MediaBox」「CropBox」「BleedBox」「TrimBox」「ArtBox」のそれぞれを
Rect クラスとして得る方法もあります;マナさんが実際に試されたのはこの方法ですよね。
※境界ボックスの意味については下記を参照。
https://www.antenna.co.jp/pdf/reference/pdf-point.html
pdf をメモ帳等で開いてみると、境界ボックスが /MediaBox や /CropBox などとして
座標情報が記録されていることを確認できるかと思います。
実際の Dimensions プロパティの内容と比較してみてください。
> プログラム側でPDFのサイズが分からないと
上記で述べた通り、ページのインチ数なら得られます。
> この96dpiというのがどの環境でも適用できるのかが分からず、
その値は PDF 側の解像度ではなく、画像出力時の解像度にあたるものかと。
恐らくは Windows 系なので 96 を採用したということで。
そもそも PDF 文書側には、「解像度」という情報がありません。
PDF で使われるすべての座標やサイズは、
1/72 インチを 1 単位とした座標系で記録される仕様です。
これはあくまでもインチというデバイス非依存の長さ情報であって、
ドットやピクセルといったデバイス依存の長さ情報ではありません。
デバイス依存であるということは、出力系(プリンターなのか、画面なのかなど)によって
1 インチあたりの物理サイズ、いわゆる dpi が決まることになります。
拡大縮小表示する場合もそうですよね。
強いて言えば、ページ内に埋め込まれた画像データにおいては、
DPI 情報が埋め込まれていることもあります(DPI を含まない事もあります)。
ただしこれは、ドキュメントを光学スキャナなどで撮影して画像ファイル化した際に、
元資料のサイズを表すための「参考値」に使われる程度のものであり、
PDF ページの解像度を示しているわけではありません。
また、A4 サイズ(短辺 210.00mm) の PDF ファイルを作ったとしても、出力ソフトによって
内部値が 595.276 だったり 595.320 だったりといった差が生まれることがあります。
とはいえ、インチやミリメートルに換算すると
595.276 ÷ 72 ≒ 8.2677222 in
595.320 ÷ 72 ≒ 8.2683333 in
595.276 × 25.4 ÷ 72 ≒ 210.000144 mm
595.320 × 25.4 ÷ 72 ≒ 210.015666 mm
という値ですので、精度的には無視できる程度でしょうけれどね。