我需要从我正在构建的应用程序打印现有的 PDF(由另一个应用程序创建)。 我如何在 C# 中执行此操作并提供一种机制,以便用户可以选择不同的打印机或其他属性。
我查看了 PrintDialog 但不确定它试图打印什么文件,如果有的话,b/c 输出始终是空白页。也许我只是在那里遗漏了一些东西。
我是否需要使用“iTextSharp”(如其他地方所建议的那样)?这对我来说似乎很奇怪,因为我可以“将文件发送到打印机”我只是事先没有任何好的对话框来设置打印机等,而且我真的不想从头开始编写打印对话框但我通过搜索找到的很多例子似乎都是这样做的。
任何建议、示例或示例代码都会很棒!
此外,如果 PDF 是问题所在,则文件可以由其他应用程序以位图或 png 等 diff 格式创建,如果这样可以使事情变得更容易的话。
最佳答案
显示一个带有组合框的小对话框,该组合框的 Items 设置为 PrinterSettings.InstalledPrinters
返回的字符串集合。
如果您可以要求GSView安装在机器上,然后您可以静默打印 PDF。它有点慢而且有点迂回,但至少你不必弹出 Acrobat。
这是我用来打印从 UPS 网络服务返回的一些 PDF 的一些代码:
private void PrintFormPdfData(byte[] formPdfData)
{
string tempFile;
tempFile = Path.GetTempFileName();
using (FileStream fs = new FileStream(tempFile, FileMode.Create))
{
fs.Write(formPdfData, 0, formPdfData.Length);
fs.Flush();
}
try
{
string gsArguments;
string gsLocation;
ProcessStartInfo gsProcessInfo;
Process gsProcess;
gsArguments = string.Format("-grey -noquery -printer \"HP LaserJet 5M\" \"{0}\"", tempFile);
gsLocation = @"C:\Program Files\Ghostgum\gsview\gsprint.exe";
gsProcessInfo = new ProcessStartInfo();
gsProcessInfo.WindowStyle = ProcessWindowStyle.Hidden;
gsProcessInfo.FileName = gsLocation;
gsProcessInfo.Arguments = gsArguments;
gsProcess = Process.Start(gsProcessInfo);
gsProcess.WaitForExit();
}
finally
{
File.Delete(tempFile);
}
}
如您所见,它将 PDF 数据作为字节数组,将其写入临时文件,然后启动 gsprint.exe 以静默方式将文件打印到指定的打印机(“HP Laserjet 5M”)。您可以将打印机名称替换为用户在对话框中选择的任何名称。
打印 PNG 或 GIF 会容易得多——只需扩展 PrintDocument 类并使用 Windows 窗体提供的普通打印对话框即可。
祝你好运!
关于c# - 在 C# 中打印现有的 PDF(或其他文件),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/273675/