我的C#应用程序将一些页面打印到xps文件,但是我发现如果默认打印机是联网打印机,则创建的xps文件无效“XPS查看器无法打开此文档”。
这让我感到困惑,因为我甚至没有写入网络打印机......而是写入文件。
如果我没有将默认打印机设置为联网打印机(默认打印机是“发送到OneNote”或“Microsoft XPS Document Writer”),则下面的代码在执行时正确创建一个包含2个页面的XPS文件:
pageCounter = 0;
PrintDocument p = new PrintDocument();
p.PrintPage += delegate(object sender1, PrintPageEventArgs e1)
{
// 8.5 x 11 paper:
float x0 = 25;
float xEnd = 850 - x0;
float y0 = 25;
float yEnd = 1100 * 2 - y0; // bottom of 2ed page
Font TitleFont = new Font("Times New Roman", 30);
if (pageCounter == 0) // for the first page
{
e1.Graphics.DrawString("My Title", TitleFont, new SolidBrush(Color.Black), new RectangleF(300, 15, xEnd, yEnd));
e1.HasMorePages = true; // more pages
pageCounter++;// next page counter
}
else // the second page
{
e1.Graphics.DrawString("Page 2", TitleFont, new SolidBrush(Color.Black), new RectangleF(300, 15, xEnd, yEnd));
}
};
// now try to print
try
{
p.PrinterSettings.PrintFileName = fileName; // the file name set earlier
p.PrinterSettings.PrintToFile = true; // print to a file (i thought this would ignore the default printer)
p.Print();
}
catch (Exception ex)
{
// for the Bug I have described, this Exception doesn't happen.
// it creates an XPS file, but the file is invalid in the cases mentioned
MessageBox.Show("Error", "Printing Error", MessageBoxButton.OK);
}
所以我的问题是......为什么会发生这种情况,我做错了什么?
答案 0 :(得分:1)
嗯,这里没有具体的问题,但我会告诉你我所知道的。您正在使用默认打印机的驱动程序来生成要保存到文件的输出文档。某些驱动程序输出xps内容,然后打印机将其用于将墨水/碳粉放在页面上。其他驱动程序输出postscript,PCL,PDF或其他一些数据格式。因此,根据默认打印机,您可以使用以下任何一种格式保存数据。
为了确保您实际生成XPS内容,您需要指定" Microsoft XPS Document Writer"作为p.PrinterSettings.PrinterName
中使用的打印机。当然,如果已重命名或删除该打印队列,则可能会失败。您可以使用PrinterSettings.InstalledPrinters
跳过一些箍来尝试确定哪个队列是XPS Document Writer,但是如果打印机已被删除,则会失败。更强大的解决方案是直接使用XpsDocumentWriter
生成XPS内容,但这需要进行一些实质性更改。