投稿者 魔界の仮面弁士  (社会人) 投稿日時 2022/7/21 18:01:15
> そもそも PDF 文書側には、「解像度」という情報がありません。
「210mm」のデータを 600 dpi で出力したいという話なら、
 210[mm] * (5 / 127)[inch / mm] * 600[dot / inch] = 4960.6299[dot]
という換算式です。そして、PdfPage 側のサイズは「1/72 インチ単位」。

つまり、幅に関しては
 inch = 「page.Size.Width / 72」
で求まるので、あとは 600dpi で出力したい場合のピクセル数は
 600 * page.Size.Width / 72
で求められるのでは無いでしょうか?
Size で都合が悪い場合は Dimensions から求めるということで。


> pdf をメモ帳等で開いてみると、境界ボックスが /MediaBox や /CropBox などとして
> 座標情報が記録されていることを確認できるかと思います。
> 実際の Dimensions プロパティの内容と比較してみてください。

手元の PDF ファイルを開いてみると、
/Rotate 0
/MediaBox[0.0 0.0 595.276 841.89]
/ArtBox[53.9492 23.8076 538.19 814.538]
などと記録されていました。(PDF 単位 なので、72 で割るとインチになる値)

実際に読み込ませてみたところ
 page.Dimensions.MediaBox
  → new Rect(0.0, 0.0, 595.276, 841.89)
 page.Dimensions.ArtBox
  → new Rect(71.932266235351562, 31.743467330932617, 645.6544189453125, 1054.3072509765625)
として読み込まれました。


> 内部値が 595.276 だったり 595.320 だったりといった差が生まれることがあります。
> 595.276 × 25.4 ÷ 72 ≒ 210.000144 mm
> 595.320 × 25.4 ÷ 72 ≒ 210.015666 mm

上記の誤差はあれど、600 dpi として出力させるとなると、先ほどの
 「600 * page.Size.Width / 72」
の算出式により
 600 * 595.276 / 72 = 4960.6333
 600 * 595.320 / 72 = 4961.0000
となるので、
>> DestinationWidth = 4961, DestinationHeight = 7016 とすることで
の値に合致した値が算出されますね。