从我正在构建的应用程序中,我需要打印现有的PDF(由另一个应用程序创建).如何在C#中执行此操作并提供一种机制,以便用户可以选择其他打印机或其他属性.
我看过PrintDialog,但不确定它试图打印什么文件,如果有的话,b/c输出总是一个空白页面.也许我只是错过了一些东西.
我是否需要使用"iTextSharp"(如其他地方所建议的那样)?这对我来说似乎很奇怪,因为我可以"将文件发送到打印机"我手边没有任何好的对话框来设置打印机等.我真的不想从头开始编写打印对话框但似乎我通过搜索找到的很多例子都是这样的.
任何建议,示例或示例代码都会很棒!
此外,如果PDF是问题,文件可以由另一个应用程序以差异格式创建,如位图或png,如果这使事情更容易.
显示一个带有组合框的小对话框,其组合项设置为返回的字符串集合PrinterSettings.InstalledPrinters
.
如果您可以要求在机器上安装GSView,则可以静默打印PDF.这有点慢和迂回,但至少你不必弹出Acrobat.
这是我用来打印一些从UPS Web服务中获取的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窗体提供的普通打印对话框.
祝好运!