Печать PDF в C #

Как я могу получить путь к файлу из этого типа URI контента?

У вас нет, так как нет никакого файла вообще за Uri, не говоря уже о том, к которому вы можете получить доступ. Это Uri может указывать на:

  • Локальный файл на внешнем хранилище
  • Локальный файл на внутренней памяти для другого приложения
  • Локальный файл на съемном носителе
  • Локальный файл, который зашифрован и должен быть дешифрован на лету
  • Поток байтов, хранящихся в столбце BLOB в базе данных
  • Часть содержимого, которое должно быть загружено другим приложением первым
  • ... и т. д.

Все другие приложения, такие как Facebook, Google+ это делает

Нет, это не так. Они используют ContentResolver и:

  • openInputStream() для чтения в байтах, связанных с содержимым
  • getType(), чтобы получить тип MIME, связанный с содержимым
  • query() и OpenableColumns, чтобы получить размер и отображаемое имя, связанные с контентом
29
задан Community 23 May 2017 в 11: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

51
ответ дан PVitt 23 May 2017 в 11:54
поделиться

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

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

0
ответ дан Thái Linh 23 May 2017 в 11:54
поделиться

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

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

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

0
ответ дан PiggyChu515 23 May 2017 в 11:54
поделиться

Также возможно сделать это с помощью встроенного веб-браузера, однако заметьте, что, поскольку это может быть локальный файл, а также потому, что он не является браузером напрямую и 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);
            });
        };
    }
-1
ответ дан yoel halb 23 May 2017 в 11:54
поделиться

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

0
ответ дан Dave81 23 May 2017 в 11:54
поделиться

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

1
ответ дан Mark Redman 23 May 2017 в 11:54
поделиться

Похоже, что обычные подозреваемые, такие как 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
ответ дан Andreas Reiff 23 May 2017 в 11:54
поделиться

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

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

0
ответ дан alexanoid 23 May 2017 в 11:54
поделиться

Самый простой способ - создать 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
ответ дан zuko 23 May 2017 в 11:54
поделиться

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

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

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

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

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

3
ответ дан Poxet 23 May 2017 в 11:54
поделиться

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

9
ответ дан Lessan Vaezi 23 May 2017 в 11:54
поделиться

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

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

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

3
ответ дан Andreas Reiff 23 May 2017 в 11:54
поделиться

У меня была такая же проблема при печати файла 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
ответ дан Murilo 23 May 2017 в 11:54
поделиться

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

23
ответ дан santa 23 May 2017 в 11:54
поделиться

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

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

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

1
ответ дан Mikhael Bolgov 23 May 2017 в 11:54
поделиться
Другие вопросы по тегам:

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