Печать Pdf в С#
Я новичок в С#. Я смотрел по всей сети за учебниками о том, как печатать PDF, но не смог найти его.
Тогда я подумал, можно ли читать его с помощью itextpdf, как здесь сказано
Чтение содержимого PDF с помощью dll itextsharp в VB.NET или С#
затем распечатайте его. Если да, то как?
Ответы
Ответ 1
Очень простой подход - использовать установленный 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
Ответ 2
Я написал очень (!) небольшой вспомогательный метод вокруг adobeeader для массового распечатки 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...
Ответ 3
Другой подход, если вы просто хотите напечатать 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 Direct Printing, иначе это будет работать только для файлов PostScript и ASCII. Кроме того, на принтере должен быть установлен сетевой интерфейс, и вам нужно знать его IP-адрес или псевдоним.
Ответ 4
У меня была такая же проблема при печати файла PDF. Там есть пакет, который называется Spire.Pdf и который очень прост в использовании. Бесплатная версия имеет ограничение в 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();
Ответ 5
Вы можете создать PDF-документ, используя PdfSharp. Это библиотека .NET с открытым исходным кодом.
При попытке распечатать документ ухудшается. Я посмотрел на него с открытым исходным кодом. Есть несколько способов сделать это с помощью AcroRd32.exe, но все зависит от версии, и это невозможно сделать без чтения acrobat-читателя.
Наконец я закончил использование VintaSoftImaging.NET SDK. Это стоит денег, но намного дешевле, чем альтернатива, и это решает проблему очень легко.
var doc = new Vintasoft.Imaging.Print.ImagePrintDocument { DocumentName = @"C:\Test.pdf" };
doc.Print();
Это просто печатает на принтере по умолчанию, не показывая. Существует несколько альтернатив и вариантов.
Ответ 6
Использовать PDFiumViewer. Я долго искал, пока не придумал подобное решение, тогда я нашел этот чистый фрагмент кода, который не полагался на отправку необработанных файлов на принтер (что плохо, если они интерпретируются как текстовые файлы..) или используя Acrobat или Ghostscript в качестве помощника (оба должны быть установлены, что является проблемой):
fooobar.com/questions/114120/...
PDFiumViewer поставляется через nuget, приведенный выше пример кода. Передайте нулевые значения для использования принтера по умолчанию.
Ответ 7
Можно использовать Ghostscript для чтения PDF файлов и печати их на именованный принтер.
Ответ 8
Я советую вам попробовать инструмент командной строки 2Printer из:
http://www.doc2prn.com/
Пример командной строки для печати всех файлов PDF из папки "C:\Input" приведен ниже. Вы можете просто вызвать его из своего кода на С#.
2Printer.exe -s "C:\Input *.PDF" -prn "Принтер серии Canon MP610"
Ответ 9
Самый простой способ - создать С# Process и запустить внешний инструмент для печати 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
Ответ 10
Это зависит от того, что вы пытаетесь напечатать. Вам понадобится стороннее приложение для печати PDF-документов, или если вы сами печатаете свои данные, вы можете использовать средство просмотра отчетов в visual studio. Он может выводить отчеты в excel и pdf файлы.
Ответ 11
Кроме того, вы можете использовать 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!");
Вы можете скачать этот пример
Ответ 12
Похоже, что обычные подозреваемые, такие как pdfsharp и migradoc, не могут этого сделать (pdfsharp, только если у вас установлен Acrobat (Reader)).
Я нашел здесь
https://vishalsbsinha.wordpress.com/2014/05/06/how-to-programmatically-c-net-print-a-pdf-file-directly-to-the-printer/
код готов для копирования/вставки. Он использует принтер по умолчанию и из того, что я вижу, он даже не использует никаких библиотек, напрямую отправляя pdf-байты на принтер. Поэтому я предполагаю, что принтер также должен его поддерживать, на одном 10-летнем принтере, который я тестировал, он работал безупречно.
Большинство других подходов - без коммерческих библиотек или приложений - требуют, чтобы вы рисовали себя в контексте устройства печати. Doable, но потребуется некоторое время, чтобы понять это и заставить его работать через принтеры.
Ответ 13
Открывайте, импортируйте, редактируйте, объединяйте, конвертируйте документы Acrobat PDF с помощью нескольких строк кода, используя интуитивно понятный API Ultimate PDF. Используя 100% управляемый код, написанный на С#, этот компонент использует многочисленные встроенные функции .NET Framework для повышения производительности. Более того, библиотека совместима с CLS и не использует небезопасных блоков для минимальных требований к разрешениям. Занятия полностью документированы с подробным примером кода, который помогает сократить время обучения. Если ваша среда разработки Visual Studio, наслаждайтесь полной интеграцией онлайн-документации. Просто пометьте или выберите ключевое слово и нажмите клавишу F1 в вашей Visual Studio IDE, и онлайн-документация будет отображена мгновенно. Высокопроизводительная и надежная библиотека PDF, которая позволяет легко добавить функциональность PDF в ваши приложения .NET с помощью нескольких строк кода.
PDF Компонент для NET
Ответ 14
Если у вас установлен Adobe Reader
, вы можете просто установить его в качестве принтера по умолчанию. И ВОЙЛА! Вы можете распечатать в PDF!
printDocument1.PrinterSettings.PrinterName = "Adobe PDF";
printDocument1.Print();
Просто так просто!
Ответ 15
Иногда Adobe портит макет, например, с помощью принтера Zebra P430i или даже с некоторыми типами PDF-контента.
Мое решение: использовать SUMATRApdf Portable. Вы можете запустить процесс с параметрами в стиле командной строки, как указано в документации sumatrapdf. например. выберите принтер, выберите лоток, дуплекс,... Никаких надстроек, надстроек, специальной установки... просто скопируйте переносимый .EXE в папку назначения проекта и вызовите его из кода С#.
Отпечатки вышли правильно и без хлопот! Надеюсь, что это поможет кому-то, кто искал не-Adobe решение, как я;)
Ответ 16
Лучший способ автоматически распечатать PDF из С# - использовать принтер "прямой PDF". Вам просто нужно скопировать файл PDF в сетевое имя принтера. Об остальном позаботится сам принтер.
Скорость в 10 раз быстрее любых других методов. Тем не менее, требования - это модель принтера, поддерживающая прямую печать PDF и имеющая не менее 128 МБ драм, что легко для любого современного принтера.
Ответ 17
Также можно сделать это со встроенным веб-браузером, однако обратите внимание, что поскольку это может быть локальный файл, а также потому, что он не является фактически браузером напрямую, и нет DOM, поэтому нет готового состояния.
Вот код для подхода, который я разработал на веб-браузере win формы:
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);
});
};
}