在某些机器上使用 C# 中的 PrintDocument 打印时无法修改页面大小
The page size cannot be modified when printing with PrintDocument in C# on certain machines
这是一个非常简单的程序。按字面意思打印 "Hello World" selected canvas 尺寸。在我的测试中它在 4 台机器上运行良好(包括 Win 7 和 Win 8),但在另外 2 台机器(都是 Windows 7)上不起作用,甚至我 selected ANSI E,打印结果仍然是 ANSI A。
这里有一些注释:
- 我使用 PDFLite、Adobe Acrobat 和 Microsoft XPS 进行打印,
结果是一样的。
- 我可以通过 pdflite 和其他 pdf 编写器在 Ansi E canvas 上成功打印记事本文本文件。其他一些工具也可以通过 PdfLite 成功打印到 ANSI E。
程序基本上:
- select 页面大小为 ANSI E
- 点击打印按钮,弹出select打印机window。
- Select虚拟打印机,例如PDFLite,点击打印。
- 生成 PDF,仍然是 ANSI A。
这是完整的源代码(没有 UI 代码):
private void PrintButton_Click(object sender, RoutedEventArgs e)
{
PrintDocument printDocument = new PrintDocument();
printDocument.DefaultPageSettings.PaperSize = GetPaperSize();
printDocument.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
System.Windows.Forms.PrintDialog printWindowDialog = new System.Windows.Forms.PrintDialog();
printWindowDialog.Document = printDocument;
if (printWindowDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
printDocument.Print();
}
}
private void pd_PrintPage(object sender, PrintPageEventArgs ev)
{
ev.Graphics.DrawString("Hello World", new Font("Arial", 10), Brushes.Black, 5, 0, new StringFormat());
}
private PaperSize GetPaperSize()
{
PaperSize printPreviewPaperSize = new PaperSize("AnsiA", 850, 1100);
switch (((ComboBoxItem)sizeCb.SelectedItem).Content.ToString())
{
case "ANSI A – 8.5'' x 11''":
default:
printPreviewPaperSize = new PaperSize("AnsiA", 850, 1100);
break;
case "ANSI B – 11'' x 17''":
printPreviewPaperSize = new PaperSize("AnsiB", 1100, 1700);
break;
case "ANSI C – 17'' x 22''":
printPreviewPaperSize = new PaperSize("AnsiC", 1700, 2200);
break;
case "ANSI D – 22'' x 34''":
printPreviewPaperSize = new PaperSize("AnsiD", 2200, 3400);
break;
case "ANSI E – 34'' x 44''":
printPreviewPaperSize = new PaperSize("AnsiE", 3400, 4400);
break;
}
return printPreviewPaperSize;
}
所以代码有问题吗?请指教。感谢您的帮助!
本
那是因为对话框中的默认设置替换了您的手册页大小。试试这个,它工作正常。
if (printWindowDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
printDocument.PrinterSettings.DefaultPageSettings.PaperSize = = new PaperSize("AnsiE", 3400, 4400);
printDocument.DefaultPageSettings.PaperSize = new PaperSize("AnsiE", 3400, 4400);
printDocument.Print();
}
这是一个非常简单的程序。按字面意思打印 "Hello World" selected canvas 尺寸。在我的测试中它在 4 台机器上运行良好(包括 Win 7 和 Win 8),但在另外 2 台机器(都是 Windows 7)上不起作用,甚至我 selected ANSI E,打印结果仍然是 ANSI A。
这里有一些注释:
- 我使用 PDFLite、Adobe Acrobat 和 Microsoft XPS 进行打印, 结果是一样的。
- 我可以通过 pdflite 和其他 pdf 编写器在 Ansi E canvas 上成功打印记事本文本文件。其他一些工具也可以通过 PdfLite 成功打印到 ANSI E。
程序基本上:
- select 页面大小为 ANSI E
- 点击打印按钮,弹出select打印机window。
- Select虚拟打印机,例如PDFLite,点击打印。
- 生成 PDF,仍然是 ANSI A。
这是完整的源代码(没有 UI 代码):
private void PrintButton_Click(object sender, RoutedEventArgs e)
{
PrintDocument printDocument = new PrintDocument();
printDocument.DefaultPageSettings.PaperSize = GetPaperSize();
printDocument.PrintPage += new PrintPageEventHandler(this.pd_PrintPage);
System.Windows.Forms.PrintDialog printWindowDialog = new System.Windows.Forms.PrintDialog();
printWindowDialog.Document = printDocument;
if (printWindowDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
printDocument.Print();
}
}
private void pd_PrintPage(object sender, PrintPageEventArgs ev)
{
ev.Graphics.DrawString("Hello World", new Font("Arial", 10), Brushes.Black, 5, 0, new StringFormat());
}
private PaperSize GetPaperSize()
{
PaperSize printPreviewPaperSize = new PaperSize("AnsiA", 850, 1100);
switch (((ComboBoxItem)sizeCb.SelectedItem).Content.ToString())
{
case "ANSI A – 8.5'' x 11''":
default:
printPreviewPaperSize = new PaperSize("AnsiA", 850, 1100);
break;
case "ANSI B – 11'' x 17''":
printPreviewPaperSize = new PaperSize("AnsiB", 1100, 1700);
break;
case "ANSI C – 17'' x 22''":
printPreviewPaperSize = new PaperSize("AnsiC", 1700, 2200);
break;
case "ANSI D – 22'' x 34''":
printPreviewPaperSize = new PaperSize("AnsiD", 2200, 3400);
break;
case "ANSI E – 34'' x 44''":
printPreviewPaperSize = new PaperSize("AnsiE", 3400, 4400);
break;
}
return printPreviewPaperSize;
}
所以代码有问题吗?请指教。感谢您的帮助!
本
那是因为对话框中的默认设置替换了您的手册页大小。试试这个,它工作正常。
if (printWindowDialog.ShowDialog() == System.Windows.Forms.DialogResult.OK)
{
printDocument.PrinterSettings.DefaultPageSettings.PaperSize = = new PaperSize("AnsiE", 3400, 4400);
printDocument.DefaultPageSettings.PaperSize = new PaperSize("AnsiE", 3400, 4400);
printDocument.Print();
}