在C#中打印PDF

51

我是c#的新手,我在网上寻找有关如何打印pdf的教程,但没有找到。

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

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

然后打印它。如果可以的话,怎么做?

16个回答

77

一种非常简单的方法是使用已安装的Adobe Reader或其他能够打印PDF的PDF查看器:

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

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


9
非常好的答案,但请注意Process继承自实现IDisposable接口的Component类,因此建议将其处理掉或使用using语句,特别是在多次使用时。 - yoel halb
4
哦,你正在使用带有“打印”动词的ShellExecute。是的,请注意Adobe Reader的最新版本在打印后似乎无法正确关闭窗口。此外,这可能不会是一个静默打印命令;它会显示打印选项弹出窗口。 - Nyerguds
1
我使用sumatra.exe通过命令行打印(只需1个exe,无需任何膨胀软件),顺便说一下,您可以配置打印选项:https://www.sumatrapdfreader.org/docs/Command-line-arguments.html - oo_dev
请注意,PDFview4NET现在不是免费的。他们的解决方案价格在数百美元之间。 - Stephan Ghequiere

30
我写了一个小助手方法,围绕着AdobeReader来批量打印PDF文件,使用C#语言实现...
  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;
  }

顺便提一下,不能仅仅依赖于方法的返回值...


2
@ColtonMilne,我记得在控制面板中显示的名称是相同的... 从代码方面来看:试试使用system.drawing.printing.printersettings.installedprinters属性! - santa
1
据我所知,一旦你将作业投入到打印池中,它就成为了“他的事情”-因此你需要与打印池交流:http://www.codeproject.com/Articles/51085/Monitor-jobs-in-a-printer-queue-NET - santa

17

另一种方法是,如果您只想以编程方式打印PDF文件,则可以使用LPR命令:

https://learn.microsoft.com/en-us/windows-server/administration/windows-commands/lpr

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

例如:

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

您也可以使用打印机的IP地址代替别名。

前提是您的打印机支持PDF直接打印,否则这只适用于PostScript和ASCII文件。另外,打印机需要安装网络接口并且您需要知道它的IP地址或别名。


15
使用PDFiumViewer。我搜索了很长时间直到找到类似的解决方案,然后我发现这段干净的代码不依赖于将原始文件发送到打印机(如果它们被解释为文本文件,则会出现问题...)或者使用Acrobat或Ghostscript作为帮助程序(两者都需要安装,这很麻烦):https://dev59.com/XG025IYBdhLWcg3wRT1K#41751184。PDFiumViewer通过nuget提供,上面的代码示例是完整的。传递null值以使用默认打印机。

3
PdfiumViewer可以让我打印PDF文档。不要浪费时间在spire.pdf上(示例/文档已过时,且即使注册了电子邮件仍未提供有效许可证)。 - SwissCoder
1
PDFiumViewer 又获得了 +1。在 .NET Core 中,还有一个名为 PdfiumViewer.Updated 的包。你仍然需要在 x64x86 文件夹中放置 pdfium.dll(参见:https://github.com/pvginkel/PdfiumBuild)。PDFiumViewer 还可以轻松控制页面方向和布局。 - clamchoda
根据其Git存储库中所述,项目所有者已经放弃/归档了该项目。 - undefined

8
我在打印PDF文件时遇到了同样的问题。有一个名为Spire.Pdf的NuGet包非常容易使用。免费版本有10页限制,但在我的情况下,这是最好的解决方案,因为我不想依赖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();

6
Spire PDF是需要付费许可的商业软件。推荐其他软件包的评论应明确开源和商业购买之间的区别。免费版本会在PDF中打印一个横幅,因此即使您打印小文件,它也会显示出来。 - Michael
1
这个回答相当老了。那时唯一的限制是页面数量。所以现在它有一个像你说的横幅。让新用户知道这一点很好。 - Murilo

5
您可以使用开源的.NET库PdfSharp来创建PDF文档。
但是,当尝试打印该文档时,情况会变得更糟。我已经到处寻找开源的解决方法。虽然有一些使用AcroRd32.exe的方法,但这取决于版本,并且需要保持安装了Adobe阅读器的计算机处于开启状态。
最终,我使用了VintaSoftImaging.NET SDK。它需要一些费用,但比其他替代方案便宜得多,并且非常容易解决问题。
var doc = new Vintasoft.Imaging.Print.ImagePrintDocument { DocumentName = @"C:\Test.pdf" };
doc.Print();

这只是默认打印机的简单打印方式,不会显示任何内容。有几种替代方案和选项。


1
请前往Github上的PDFsharp获取最新版本的源代码。 - stomy
1
PDFsharp使用Adobe的acrord32.exe进行打印。请参见源代码 - stomy

5

自动从C#打印PDF的最佳方式是使用打印机的“直接PDF”功能。您只需将PDF文件复制到打印机的网络共享名称即可,其余操作由打印机自己处理。

速度比任何其他方法快10倍。但要求打印机型号支持直接PDF打印,并且具有至少128 MB的DRAM,这对于任何现代打印机来说都很容易达到。


2

我编写并发布了一个小型的Nuget包,可用于将PDF文件打印到打印机驱动程序。它还可以打印到XPS文件或PDF文件。这里是链接


2
您还没有提供任何“如何”和依赖项,能否请您提供一下?此外,它能在 .Net Core 上运行吗? - Imran Faruqi

1
最简单的方法是创建C#进程并启动外部工具来打印您的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


1
但是,如果您不介意进行一些额外的编程工作(使用Java),那么您可以使用开源Apache PDFBox [链接](https://pdfbox.apache.org/index.html)替换RawFilePrinter.exe。 - Jireugi

1

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接