PageSettings.PrintableArea の幅と高さの値に問題があります。幅、高さ、およびサイズのプロパティは、値を「取得または設定」すると主張しています。また、inflate() 関数は、渡された値に基づいてサイズを変更すると主張しています。
ただし、値を変更するこれらの試みはすべてうまくいきませんでした。Inflate() は無視されます (エラーは発生せず、機能したかのように通過しますが、値は変更されません。
高さ、幅、またはサイズを設定しようとすると、「'System.Drawing.Printing.PageSettings.PrintableArea' の戻り値は変数ではないため変更できません」というコンパイラ エラーが発生します。
これは、説明の「またはセット」の部分が嘘であることを意味するように感じます。
これを知りたい理由: (誰かがいつも尋ねます...) ほとんどの場合、かなりうまく機能している印刷アプリケーション (C#、WinForm) があります。プリンター設定とページ設定オブジェクトを設定して、印刷ダイアログのプリンター プロパティに表示される内容を制御できます。ただし、Microsoft Office Document Image Writer では、これらの設定が無視されることがあり、別の表示がされていても用紙サイズが 0, 0 に戻ります。表示される値に関しては WYSIWYG にしたいので、用紙サイズを元のサイズに戻しますが、印刷可能領域が間違っていると、結果の画像が不安定になります。結果のイメージは、用紙サイズの値ではなく、印刷可能領域のサイズです。これには理由があるのか 、それともそうしないようにする方法があるのか 疑問に思っています.
前もって感謝します。:)
アップデート:
//ignored
PrintDocument.DefaultPageSettings.PrintableArea.Inflate(XOffset, YOffset);
//causes compiler error
PrintDocument.DefaultPageSettings.PrintableArea.Size = new SizeF((float)DimensionsPaperSize.Width, (float)DimensionsPaperSize.Height);
PrintDocument.DefaultPageSettings.PrintableArea.Height = DimensionsPaperSize.Height;
PrintDocument.DefaultPageSettings.PrintableArea.Width = DimensionsPaperSize.Width;
更新 2:
正しく印刷される私の (カスタム サイズ) プリンターの場合、PaperSize を変更すると、それに合わせて PrintableArea と PageBounds が自動的に変更されます。MDIW で PaperSize を変更すると、PageBounds のみが変更されます。何が原因なのかわかりません。
結論:
Nobugz は、PrintableArea を設定できない (通常は設定する必要がない) 理由と、その inflate() 関数が無視される理由を説明する素晴らしい仕事をしてくれたので、それを答えとしてマークします。
この質問をするように促した永続的な問題に関しては、私はまだ途方に暮れています。「ScaleTranform」の提案に応えて、PaperSize および Graphics オブジェクトには既に正しい値が設定されているため、これらの値をいじっても役に立たない可能性があります。そのルートに沿ってできることは、正しいサイズの画像を PrintableArea で取得しているガベージ値にサイズ変更することだと思います。PaperSize を明示的に設定しても PrintableArea を適切に変更できない場合は、バグに関連する動作であると想定します。
この問題に遭遇したのは私だけのようで、イライラしています。少なくとも、これまでのところ、この動作は MODIW でしか観察していません。誰の参考のためにも、できるだけ多くの情報が公開されています。VS2008 で開発している 32 ビットの Win7 を実行しています。問題を再現するには、次の手順を実行します。
PrintDialog PrintDlg = new PrintDialog();
PrintDocument PrintDoc = new PrintDocument();
PrintDoc.PrintPage += new System.Drawing.Printing.PrintPageEventHandler(DocumentPrintPage);
PrintDlg.PrinterSettings.PrinterName = printerName; //MODIW
PrintDoc = AlterPaperSize(PrintDoc); //A function that just changes the papersize
PrintDlg.Document = PrintDoc;
PrintDlg.PrinterSettings = PrintDoc.PrinterSettings;
if (PrintDlg.ShowDialog() == DialogResult.OK)
{
if ((PrintDoc.DefaultPageSettings.PaperSize.Width == 0) &&
(PrintDoc.DefaultPageSettings.PaperSize.Height == 0))
{
PrintDoc.DefaultPageSettings.PaperSize = DimensionsPaperSize;
}
PrintDoc.Print();
}