Visual Basic 中学校 掲示板 投稿の管理
タグのない投稿を抽出
統計
RSS
Visual Basic 中学校
投稿一覧
.netでPDFページを画像化する時の解像度指定
この投稿へのリンク
https://keijiban.umayadia.com/ThreadDetail.aspx?ThreadId=30774#CommentId85366
この投稿の削除
削除パスワード
削除する
コメント本文
投稿者
魔界の仮面弁士
 (社会人)
投稿日時
2022/7/22 17:42:21
>> 「600 * page.Size.Width / 72」
ごめんなさい。この投稿は私の勘違いでした。
PdfPageRenderOptions に渡す値は
DestinationWidth = 「page.Size.Width * dpi / 96」
DestinationHeight = 「page.Size.Height * dpi / 96」
で求められそうです。※ UInt32 に丸める必要あり
>> /MediaBox[0.0 0.0 595.276 841.89]
>> page.Dimensions.MediaBox
>> → new Rect(0.0, 0.0, 595.276, 841.89)
これはデバッグ時のミスで、実際は
new Rect(0.0, 0.0, 793.70135498046875, 1122.52001953125)
でした。申し訳ありません。
>> /ArtBox[53.9492 23.8076 538.19 814.538]
>> page.Dimensions.ArtBox
>> → new Rect(71.932266235351562, 31.743467330932617, 645.6544189453125, 1054.3072509765625)
こちらは (96/72) 倍のルールに合致していますね。
53.9492 * (96 / 72) = 71.9322666666
23.8076 * (96 / 72) = 31.7434666666
(538.190 - 53.9492) * (96 / 72) = 645.6544
(814.538 - 23.8076) * (96 / 72) = 1054.3072
> MediaBox[ 0 0 595.32 841.92]のような記載(弁士様が提示の値に近い値)があるのですが、
> このPDFのpage.Size.Dimensions.MediaBoxの値を見てみると{0,0,793.76,1122.56}に
「595.32」「841.92」が、A4 サイズを示していることは間違いないはずです。
PDF の仕様上、それが points 単位(1/72インチ単位)なのは確実なので、
595.32 pt だと、72 で割って 8.268333333 in。
841.92 pt だと、72 で割って 11.69333333 in。
つまり 210.0156666 mm × 11.69333333 mm 相当であることを示しており、
A4 用紙 210.0 mm × 297.0 mm(8.26772 in × 11.6929 in) に合致します。
しかし、それを PdfPage クラスを通じて読み取ると、元の値の (96/72) 倍の値となり、
.Dimensions.MediaBox 等から返される値も 4 / 3 倍になるようですね。
595.32 * (96 / 72) = 793.76
1122.56 * (96 / 72) = 1496.746666666
72 という値の根拠は、PDF 側のルール(1/72 インチ単位)によるもの。
96 という単位は、Windows におけるDIUs 単位(1/96 インチ単位)とすれば、意味としては通ります。
https://docs.microsoft.com/ja-jp/xamarin/xamarin-forms/creating-mobile-apps-xamarin-forms/summaries/chapter05#pixels-points-dps-dips-and-dius
今の所、.Size や .Dimensions の単位系について言及された公式資料は発見できていません。
OS の何かの設定(画面の DPI 設定とか?)や、PDF ファイル依存の何かによって
異なる単位系になることがあるか否かと問われると…現状は心当たりがありません。
何か追加情報が得られるまでは、とりあえず固定値と思っておいて良いのではないでしょうか。
PdfPage クラスのソースコードを読み取ることが出来れば良いのだけれどなぁ。