对此添加一个新的答案,因为在 .net 中打印 PDF 的问题已经存在很长时间了,并且大多数答案早于 Google Pdfium 库,该库现在有一个 .net 包装器。对我来说,我自己正在研究这个问题,但一直一片空白,尝试做一些黑客解决方案,例如生成 Acrobat 或其他 PDF 阅读器,或者遇到昂贵且许可条款不太兼容的商业库。但 Google Pdfium 库和 PdfiumViewer .net 包装器是开源的,因此对于许多开发人员(包括我自己)来说是一个很好的解决方案。 PdfiumViewer 根据 Apache 2.0 许可证获得许可。
您可以在此处获取 NuGet 包:
https://www.nuget.org/packages/PdfiumViewer/ https://www.nuget.org/packages/PdfiumViewer/
你可以在这里找到源代码:
https://github.com/pvginkel/PdfiumViewer https://github.com/pvginkel/PdfiumViewer
下面是一些简单的代码,可以从 PDF 文件的文件名中静默打印任意数量的副本。您也可以从流中加载 PDF(这就是我们通常的做法),并且您可以通过查看代码或示例轻松地弄清楚这一点。还有一个 WinForm PDF 文件视图,因此您还可以将 PDF 文件渲染到视图中或对其进行打印预览。对于我们来说,我只需要一种方法来根据需要将 PDF 文件静默打印到特定打印机。
public bool PrintPDF(
string printer,
string paperName,
string filename,
int copies)
{
try {
// Create the printer settings for our printer
var printerSettings = new PrinterSettings {
PrinterName = printer,
Copies = (short)copies,
};
// Create our page settings for the paper size selected
var pageSettings = new PageSettings(printerSettings) {
Margins = new Margins(0, 0, 0, 0),
};
foreach (PaperSize paperSize in printerSettings.PaperSizes) {
if (paperSize.PaperName == paperName) {
pageSettings.PaperSize = paperSize;
break;
}
}
// Now print the PDF document
using (var document = PdfDocument.Load(filename)) {
using (var printDocument = document.CreatePrintDocument()) {
printDocument.PrinterSettings = printerSettings;
printDocument.DefaultPageSettings = pageSettings;
printDocument.PrintController = new StandardPrintController();
printDocument.Print();
}
}
return true;
} catch {
return false;
}
}