Требуется распечатать документ в формате .pdf.
Ранее я осуществлял печать через Adobe Reader при помощи iTextSharp таким образом:
public void PrintPdfFile()
{
RegistryKey adobe = Registry.LocalMachine.OpenSubKey(@"SOFTWARE\Microsoft\Windows\CurrentVersion\App Paths\AcroRd32.exe");
if(adobe != null)
{
string path = adobe.GetValue("").ToString();
Process process = new Process();
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
process.StartInfo.Verb = "print";
string pdfFileName = Application.StartupPath + @"\\Source\\PDF\\2.pdf";
process.StartInfo.FileName = path;
process.StartInfo.Arguments = @"/p /h " + pdfFileName;
process.StartInfo.UseShellExecute = false;
process.StartInfo.CreateNoWindow = true;
process.Start();
process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
if (process.HasExited == false)
{
if (!process.WaitForExit(5000))
process.Kill();
}
process.EnableRaisingEvents = true;
process.Close();
}
}
Этот метод не совсем подходит, так как во-первых для его работы требуется предустановленный Adobe Reader и он отправляет на печать через раз (до сих пор не пойму с чем это связано, но в коде всё работает как положено, но иногда в очередь печати не добавляется).
Для того что бы получить результат, начал изворачиваться: конвертировал .pdf в .png и пушил на печать стандартным PrintPreviewDialog-ом, но проблема в том, что изображение конвертирую из .pdf в .png с dpi 150 (если меньше, то картинка документ мутнеет), и оно не влезает на лист печати. Я подумал, что будет хорошей идеей делать вот так:
var img = Image.FromFile(outputFolder + @"2.png");
Bitmap img_resize = new Bitmap(img, new Size(1124, 794));
e.Graphics.DrawImage(img, new Point(0, 0));
Результат не удовлетворил, всё так же мутнеет документ, из-за уменьшения разрешения.
Далее я попробовал воспользоваться Spire.PDF, установив его через NuGet
Install-Package Spire.PDF
и использовав в коде вот так:
PdfDocument pdfdocument = new PdfDocument();
pdfdocument.LoadFromFile(inputFolder);
pdfdocument.PrintDocument.PrinterSettings.Copies = 1;
pdfdocument.PrintDocument.Print();
pdfdocument.Dispose();
Результат не хуже, чем при печати через Adobe Reader, но сверху на каждом документе красуется:
Evaluation Warning: The version can be used only for evaluation purpose...
Этот вариант следовательно тоже не совсем подходит.
Далее я попробовал попросту пушить на принтер файл:
int count = 0;
string directoryName = Application.StartupPath + @"/InputFolder/";
foreach (string pdfFilePath in Directory.EnumerateFiles(directoryName))
{
count++;
var file = File.ReadAllBytes(pdfFilePath);
var printQueue = LocalPrintServer.GetDefaultPrintQueue();
using (var job = printQueue.AddJob())
using (var stream = job.JobStream)
{
stream.Write(file, 0, file.Length);
}
}
Он встаёт в очередь, но не печатается...
И далее я попробовал RawPrint, поставив его всё так же из NuGet
Install-Package RawPrint
и использовав в коде вот так:
PrinterSettings printerSettings = new PrinterSettings();
string printerName = printerSettings.PrinterName;
IPrinter printer = new Printer();
printer.PrintRawFile(printerName, inputFolder, "2.pdf");
При выполнении файл встаёт в очередь, но не печатается.
Так же я пробовал этот класс
Использую в коде вот так:
//Send file for Printing from RawPrinterHelper
string FileName = inputFolder;
PrinterSettings printer = new PrinterSettings();
string PrinterName = printer.PrinterName;
RawPrinterHelper.SendFileToPrinter(PrinterName, FileName);
Результат такой же, как с RawPrint -- при выполнении файл встаёт в очередь, но не печатается.
Т.е. я уже все перепробовал, что смог натыкать гуглом, но 100% рабочего варианта не смог найти. Подскажите, пожалуйста, как осуществить печать .pdf файла?