Добавление нового ответа на этот вопрос, поскольку вопрос печати PDF в .net существует давно, и большинство ответов предшествует библиотеке Google Pdfium, которая теперь имеет оболочку .net. Что касается меня, я сам исследовал эту проблему и все время терял сознание, пытаясь найти хакерские решения, такие как порождение Acrobat или других программ для чтения PDF-файлов, или наткнуться на коммерческие библиотеки, которые дороги и не очень совместимы с условиями лицензии. Но библиотека Google Pdfium и оболочка PdfiumViewer .net с открытым исходным кодом, поэтому являются отличным решением для многих разработчиков, включая меня. PdfiumViewer лицензируется под лицензией Apache 2.0.
Вы можете получить пакет NuGet здесь:
https://www.nuget.org/packages/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;
}
}