在C#中打印Pdf

我是新来的C#。 我在网上查找关于如何打印PDF的教程,但找不到一个。

然后我想,可以使用itextpdf来读取它,就像这里提到的那样

在VB.NET或C#中使用itextsharp dll读取PDF内容

然后打印它。 如果是这样,怎么样?

一个非常简单的方法是使用安装的Adobe Reader或任何其他能够打印的PDF阅读器:

Process p = new Process( ); p.StartInfo = new ProcessStartInfo( ) { CreateNoWindow = true, Verb = "print", FileName = path //put the correct path here }; p.Start( ); 

另一种方法是使用第三方组件,例如PDFView4NET

我在adobereader上写了一个非常(!)的小辅助方法来从c#中批量打印pdf:

  public static bool Print(string file, string printer) { try { Process.Start( Registry.LocalMachine.OpenSubKey( @"SOFTWARE\Microsoft\Windows\CurrentVersion" + @"\App Paths\AcroRd32.exe").GetValue("").ToString(), string.Format("/h /t \"{0}\" \"{1}\"", file, printer)); return true; } catch { } return false; } 

一个不能依赖的方法btw的返回值…

另一种方法,如果您只是希望以编程方式打印PDF文件,则使用LPR命令: http : //www.microsoft.com/resources/documentation/windows/xp/all/proddocs/en-us/lpr.mspx ?MFR = TRUE

LPR也可用于较新版本的Windows(例如Vista / 7),但您需要在可选Windows组件中启用它。

例如:

 Process.Start("LPR -S printerdnsalias -P raw C:\files\file.pdf"); 

您也可以使用打印机IP地址而不是别名。

这假设您的打印机支持PDF直接打印,否则这将只适用于PostScript和ASCII文件。 此外,打印机需要安装networking接口,您需要知道它的IP地址或别名。

您可以使用PdfSharp创buildPDF文档。 这是一个开源的.NET库。

当试图打印文件变得更糟。 我已经看到了一个开源的做法。 使用AcroRd32.exe有一些方法,但这一切都取决于版本,没有Acrobat Reader保持打开状态,就无法完成。

我终于结束了使用VintaSoftImaging.NET SDK 。 它花了一些钱,但比替代品便宜得多,它解决了这个问题真的很容易。

 var doc = new Vintasoft.Imaging.Print.ImagePrintDocument { DocumentName = @"C:\Test.pdf" }; doc.Print(); 

这只是打印到默认打印机没有显示。 有几个select和select。

我在打印PDF文件时遇到同样的问题。 有一个名为Spire.Pdf的nuget包,使用起来非常简单。 免费版本有10页的限制,但是,在我的情况下,这是最好的解决scheme,一旦我不想依靠Adobe Reader,我不想安装任何其他组件。

https://www.nuget.org/packages/Spire.PDF/

 PdfDocument pdfdocument = new PdfDocument(); pdfdocument.LoadFromFile(pdfPathAndFileName); pdfdocument.PrinterName = "My Printer"; pdfdocument.PrintDocument.PrinterSettings.Copies = 2; pdfdocument.PrintDocument.Print(); pdfdocument.Dispose(); 

我build议你尝试使用2Printer命令行工具: http : //www.doc2prn.com/

打印文件夹“C:\ Input”中的所有PDF文件的命令行示例如下。 你可以简单地从你的C#代码中调用它。

2Printer.exe -s“C:\ Input * .PDF”-prn“Canon MP610 series Printer”

使用PDFiumViewer。 我search了很长时间,直到我想出了一个类似的解决scheme,然后我发现这个干净的一段代码,不依赖发送原始文件到打印机(这是坏的,如果他们被解释为文本文件..)或使用Acrobat或Ghostscript作为帮手(都需要安装,这是一个麻烦):

https://stackoverflow.com/a/41751184/586754

PDFiumViewer通过nuget来,上面的代码示例是完整的。 传入空值以使用默认打印机。

最简单的方法是创buildC#过程并启动外部工具来打印您的PDF文件

 private static void ExecuteRawFilePrinter() { Process process = new Process(); process.StartInfo.FileName = "c:\\Program Files (x86)\\RawFilePrinter\\RawFilePrinter.exe"; process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden; process.StartInfo.Arguments = string.Format("-p \"c:\\Users\\Me\\Desktop\\mypdffile.pdf\" \"gdn02ptr006\""); process.Start(); process.WaitForExit(); } 

上面的代码启动RawFilePrinter.exe(类似于2Printer.exe),但有更好的支持。 这不是免费的,但通过捐赠可以让你在任何地方使用它并重新分配你的应用程序。 最新版本下载: http : //bigdotsoftware.pl/rawfileprinter

这取决于你想要打印什么。 您需要第三方的PDF打印机应用程序,或者如果您要打印自己的数据,则可以在Visual Studio中使用报告查看器。 它可以输出报告到excel和pdf文件。

可以使用Ghostscript读取PDF文件并将其打印到指定的打印机。

另外,您可以使用Total PDF Printer X

 string src="C:\\test\\test1.pdf"; string PrintName="Name Of Printer"; PDFPrinterX Cnv = new PDFPrinterX(); Cnv.Print(src, PrintName, "-log c:\\Printer.log"); MessageBox.Show("Print complete!"); 

你可以下载这个例子

看起来像pdfsharp和migradoc通常的嫌疑人是不能这样做(pdfsharp只有当你有Acrobat(Reader)安装)。

我在这里find了

https://vishalsbsinha.wordpress.com/2014/05/06/how-to-programmatically-c-net-print-a-pdf-file-directly-to-the-printer/

代码准备好复制/粘贴。 它使用默认的打印机,从我可以看到它甚至不使用任何库,直接发送到打印机的PDF字节。 所以我假设打印机也需要支持它,在一台10年前的打印机上,我testing了它的工作完美无瑕。

大多数其他方法 – 没有商​​业图书馆或应用程序 – 要求您在打印设备上下文中绘制自己。 可用,但需要一段时间才能弄明白,并使其在打印机上工作。

也可以使用embedded式网页浏览器来实现,但请注意,由于这可能是一个本地文件,也因为它实际上并不是直接浏览器,并且没有DOM,所以没有就绪状态。

下面是我在一个双赢的Web浏览器控件上制定的方法的代码:

  private void button1_Click(object sender, EventArgs e) { webBrowser1.Navigate(@"path\to\file"); } private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e) { //Progress Changed fires multiple times, however after the Navigated event it is fired only once, //and at this point it is ready to print webBrowser1.ProgressChanged += (o, args) => { webBrowser1.Print();//Note this does not print only brings up the print preview dialog //Should be on a separate task to ensure the main thread //can fully initialize the print dialog Task.Factory.StartNew(() => { Thread.Sleep(1000);//We need to wait before we can send enter //This assumes that the print preview is still in focus Action g = () => { SendKeys.SendWait("{ENTER}"); }; this.Invoke(g); }); }; }