Печать PDF в C #

Я новичок в c #. Я искал во всей сети учебники о том, как печатать PDF, но не смог найти.

Тогда я подумал, возможно ли прочитать его, используя itextpdf, как упомянуто здесь

Чтение содержимого PDF с помощью itextsharp dll в VB.NET или C #

распечатай это. Если да, то как?

30
задан 23.05.2017, 14:54

15 ответов

Очень простой подход заключается в использовании установленного 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

53
ответ дан 11.10.2019, 15:43
  • 1
    Как Вы определяете размер страницы с этим методом? Я должен быть в состоянии определить определенный формат бумаги, который поддерживает принтер по умолчанию. – kindohm 20.04.2012, 19:01
  • 2
    Вы can' t определяют что-либо с помощью того метода. Это только распечатает PDF с помощью принтера по умолчанию и его настроек по умолчанию. Таким образом, если Ваш формат бумаги по умолчанию будет a4, любые большие страницы будут отключены. Это действительно сосет, но за исключением сторонних инструментов I don' t думают, что существует что-либо, что может быть сделано об этом. – yu_ominae 23.08.2013, 05:28
  • 3
    Большой ответ, но примечание, которое Процесс наследовал от компонента, который реализует IDisposable, таким образом, конечно, рекомендуется расположить его или использовать оператор использования, особенно если Вы много раз используете его – yoel halb 16.01.2014, 00:13
  • 4
    Спасибо за обширную рецензию. Я думаю различие между двумя commmands' поведение описано очень хорошо. I' m все еще немного перепутанный на том, почему первая команда перестала работать, когда выполнено как часть конвейера, который генерирует файл, но не, когда выполнено независимо. Также стоящий замечания это it' s поведение, кажется, конфликтует с Вашими событиями поведения без новых строк чтения. Я, возможно, должен вернуться к сценарию и удостовериться я haven' t неправильно истолковал it' s результаты. – RHSeeger 07.02.2020, 04:06

Также возможно сделать это с помощью встроенного веб-браузера, однако заметьте, что, поскольку это может быть локальный файл, а также потому, что он не является браузером напрямую и DOM отсутствует, значит, нет состояния готовности.

Вот код для подхода, который я разработал для управления веб-браузером в выигрышной форме:

    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);
            });
        };
    }
0
ответ дан 11.10.2019, 15:43

Лучший способ автоматически напечатать pdf из C # - использовать принтер «прямой pdf». Вам просто нужно скопировать файл PDF в сетевое имя принтера. Об остальном позаботится сам принтер.

Скорость в 10 раз выше, чем у любых других методов. Тем не менее, требования - это модель принтера, поддерживающая прямую печать в формате PDF и имеющая не менее 128 МБ драм, что легко для любого современного принтера.

0
ответ дан 11.10.2019, 15:43
  • 1
    @adrelanos: Я использую read, потому что это хорошо работало 30 лет назад и все еще делает для меня. Современный стиль должен использовать read -r, потому что read был забит процессом POSIX-ization. Ваш вызов — I' m не собирающийся нарушаться, если Вы используете read -r, пока можно объяснить, от чего это защищает Вас по сравнению с использованием read, и можно объяснить, почему Вы заботитесь о той защите. – Jonathan Leffler 07.02.2020, 04:08

Если у вас установлено Adobe Reader, вы можете просто установить его в качестве принтера по умолчанию. И ВОЙЛА! Вы можете распечатать в PDF!

printDocument1.PrinterSettings.PrinterName = "Adobe PDF";
printDocument1.Print();

Так же просто, как это!

0
ответ дан 11.10.2019, 15:43
  • 1
    Это решило мою проблему. И этот ответ должен быть отмечен Принятый.Спасибо. – K.Sopheak 07.02.2020, 04:07

Это зависит от того, что вы пытаетесь напечатать. Вам нужно стороннее приложение для принтера pdf или, если вы печатаете свои собственные данные, вы можете использовать средство просмотра отчетов в Visual Studio. Он может выводить отчеты в Excel и PDF-файлы.

0
ответ дан 11.10.2019, 15:43
  • 1
    I' ll возвращаются к сценарию и удостоверяются I' m не неправильно истолковывающий что-то. Это было все сделано как часть некоторой работы I' m помогающий с и it' s возможный мы неправильно читаем что-то в нашей поспешности для получения его работа. – RHSeeger 07.02.2020, 04:05

Открывайте, импортируйте, редактируйте, объединяйте, конвертируйте документы Acrobat PDF с помощью нескольких строк кода, используя интуитивно понятный API Ultimate PDF. Используя на 100% управляемый код, написанный на C #, компонент использует многочисленные встроенные функции .NET Framework для повышения производительности. Более того, библиотека совместима с CLS и не использует небезопасных блоков для минимальных требований к разрешениям. Занятия полностью документированы с подробным примером кода, который помогает сократить вашу кривую обучения. Если ваша среда разработки Visual Studio, наслаждайтесь полной интеграцией онлайн-документации. Просто пометьте или выберите ключевое слово и нажмите клавишу F1 в вашей IDE Visual Studio, и онлайн-документация будет отображена мгновенно. Высокопроизводительная и надежная библиотека PDF, которая позволяет легко добавить функциональность PDF в ваши приложения .NET с помощью нескольких строк кода.

PDF Компонент для NET

0
ответ дан 11.10.2019, 15:43
  • 1
    +1: Интересное наблюдение, Gordon. Используя мой файл y в качестве примера, я работал: while read line; do echo $line; done < y; echo $line и действительно получил четыре различных отраженные значения. I' m не верный it' s особенно полезное или интуитивное поведение, но... – Jonathan Leffler 07.02.2020, 04:08

Похоже, что обычные подозреваемые, такие как pdfsharp и migradoc, не могут этого сделать (pdfsharp, только если у вас установлен Acrobat (Reader)).

Я нашел здесь

https://vishalsbsinha.wordpress.com/2014/05/06/how-to-programmatics-c-net-print-a-pdf-file-directly Код к принтеру /

готов к копированию / вставке. Он использует принтер по умолчанию и, насколько я вижу, он даже не использует никаких библиотек, напрямую отправляя PDF-байты на принтер. Поэтому я предполагаю, что принтер также должен поддерживать его, на одном 10-летнем принтере, который я тестировал, он работал безупречно.

Большинство других подходов - без коммерческих библиотек или приложений - требуют, чтобы вы рисовали себя в контексте устройства печати. Выполнимо, но потребуется время, чтобы разобраться и заставить его работать на всех типах принтеров.

0
ответ дан 11.10.2019, 15:43
  • 1
    это решило мою проблему чтения слов от текстового файла, не имея новой строки в конце текстового файла. – tauseef_CuriousGuy 07.02.2020, 04:08

Самый простой способ - создать C # 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

1
ответ дан 11.10.2019, 15:43
  • 1
    спасибо. У меня есть та же проблема, и это работало на меня – craken 07.02.2020, 04:07

Можно использовать Ghostscript для чтения файлов PDF и распечатывать их на указанном принтере.

1
ответ дан 11.10.2019, 15:43
  • 1
    Это к работам требует echo -e – George Vasiliou 07.02.2020, 04:05

Используйте PDFiumViewer. Я долго искал, пока не нашел похожее решение, потом нашел этот чистый кусок кода, который не полагается на отправку необработанных файлов на принтер (что плохо, если их интерпретируют как текстовые файлы ...) или использование Acrobat или Ghostscript в качестве помощника (оба должны быть установлены, что создает трудности):

https://stackoverflow.com/a/41751184/586754

PDFiumViewer поставляется через nuget, приведенный выше пример кода завершен. Передайте нулевые значения для использования принтера по умолчанию.

3
ответ дан 11.10.2019, 15:43

У меня была такая же проблема при печати файла PDF. Есть пакет nuget под названием 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();
6
ответ дан 11.10.2019, 15:43
  • 1
    на человечности 12.04 завершения, кажется, живут в:/etc/bash_completion.d/git и не/etc/bash_complete.d/git – Maks 31.12.2019, 06:12

PDF-документ можно создать с помощью PdfSharp . Это библиотека с открытым исходным кодом .NET.

При попытке распечатать документ стало еще хуже. Я всегда искал способ сделать это с открытым исходным кодом . Есть несколько способов сделать это, используя AcroRd32.exe , но все это зависит от версии, и это невозможно сделать, если Acrobat Reader остается открытым.

В конце концов я использовал VintaSoftImaging.NET SDK . Это стоит некоторых денег, но намного дешевле, чем альтернатива, и это решает проблему очень легко.

var doc = new Vintasoft.Imaging.Print.ImagePrintDocument { DocumentName = @"C:\Test.pdf" };
doc.Print();

Это просто печатает на принтер по умолчанию, не показывая. Есть несколько альтернатив и вариантов.

3
ответ дан 11.10.2019, 15:43
  • 1
    You' очень приветствующееся ре. – Shawn Chin 31.12.2019, 06:11

Другой подход, если вы просто хотите напечатать файл 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-адрес или псевдоним.

10
ответ дан 11.10.2019, 15:43

я написал очень (!) Маленький вспомогательный метод вокруг 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;
  }

нельзя полагаться на возвращаемое значение метода btw .. .

24
ответ дан 11.10.2019, 15:43
  • 1
    Я люблю Вас!!!!! – Odys 21.03.2012, 19:17
  • 2
    @Santa: Это только работало бы в машине Windows. Если бы кто-то выполнил это от Mac или Linux, то он не работал бы, даже если у них есть Adobe. Или я пропускаю что-то? – PCPGMR 05.06.2013, 17:47
  • 3
    @PCPGMR you' абсолютно правильное ре! – santa 06.06.2013, 12:22
  • 4
    Как был бы я находить свой принтер для " Printer" строковая переменная? – Milne 08.06.2013, 00:51
  • 5
    @ColtonMilne afair it' s то же имя, которое обнаруживается в панели управления... от кода: дайте system.drawing.printing.printersettings.installedprinters свойству выстрел! – santa 11.06.2013, 14:29
  • 6
    Я добрался __git_complete: command not found при выполнении этого – phuclv 31.12.2019, 06:12

Советую попробовать инструмент командной строки 2Printer по адресу: http://www.doc2prn.com/

Пример командной строки для печати всех файлов PDF из папки «C: \». Вход "ниже. Вы можете просто вызвать его из своего кода C #.

2Printer.exe -s "C: \ Input * .PDF" -prn "Принтер серии Canon MP610"

1
ответ дан 11.10.2019, 15:43
  • 1
    @LЖ°uVД©nhPhú c у меня была та же проблема. Это было, потому что я имел эти __git_complete функция в моем пакете завершения удара (установленный через домашнее пиво с brew install bash-completion), который в настоящее время не получался в моем профиле удара. Должна была добавить эта строка к ~/.bash_profile: [ -f /usr/local/etc/bash_completion ] && . /usr/local/etc/bash_completion – jangosteve 31.12.2019, 06:12

Теги

Похожие вопросы