Распечатать существующий PDF (или другие файлы) в C # - PullRequest
23 голосов
/ 08 ноября 2008

Из приложения, которое я создаю, мне нужно распечатать существующие PDF-файлы (созданные другим приложением). Как я могу сделать это в C # и предоставить механизм, чтобы пользователь мог выбрать другой принтер или другие свойства.

Я посмотрел на PrintDialog, но не уверен, какой файл он пытается напечатать, если таковой имеется, т.к. выходные данные всегда являются пустой страницей. Может быть, я просто что-то там упускаю.

Нужно ли использовать «iTextSharp» (как это было предложено еще где)? Мне это кажется странным, так как я могу «отправить файл на принтер». У меня просто нет приятного диалогового окна для настройки принтера и т. Д., И я не хочу писать диалоговое окно печати с нуля. но, похоже, множество примеров, которые я нашел при поиске, сделали именно это.

Любой совет, примеры или пример кода будут великолепны!

Также, если проблема связана с PDF, файлы могут быть созданы другим приложением в формате diff, например, в формате bitmap или png, если это облегчает задачу.

Ответы [ 6 ]

23 голосов
/ 08 ноября 2008

Отображение небольшого диалогового окна с комбинированным списком, в котором для его элементов установлен набор строк, возвращаемый PrinterSettings.InstalledPrinters.

Если вы можете сделать требование, чтобы GSView был установлен на машине, вы можете без вывода сообщений распечатать PDF-файл. Это немного медленно и оканчивается, но, по крайней мере, вам не нужно открывать Acrobat.

Вот код, который я использую для распечатки некоторых PDF-файлов, которые я получаю от веб-службы UPS:

    private void PrintFormPdfData(byte[] formPdfData)
    {
        string tempFile;

        tempFile = Path.GetTempFileName();

        using (FileStream fs = new FileStream(tempFile, FileMode.Create))
        {
            fs.Write(formPdfData, 0, formPdfData.Length);
            fs.Flush();
        }

        try
        {
            string gsArguments;
            string gsLocation;
            ProcessStartInfo gsProcessInfo;
            Process gsProcess;

            gsArguments = string.Format("-grey -noquery -printer \"HP LaserJet 5M\" \"{0}\"", tempFile);
            gsLocation = @"C:\Program Files\Ghostgum\gsview\gsprint.exe";

            gsProcessInfo = new ProcessStartInfo();
            gsProcessInfo.WindowStyle = ProcessWindowStyle.Hidden;
            gsProcessInfo.FileName = gsLocation;
            gsProcessInfo.Arguments = gsArguments;

            gsProcess = Process.Start(gsProcessInfo);
            gsProcess.WaitForExit();
        }
        finally
        {
            File.Delete(tempFile);
        }
    }

Как видите, он принимает данные PDF в виде байтового массива, записывает их во временный файл и запускает gsprint.exe для автоматической печати файла на указанном принтере («HP Laserjet 5M»). Вы можете заменить имя принтера тем, которое выберет пользователь в диалоговом окне.

Печать PNG или GIF будет намного проще - просто расширьте класс PrintDocument и используйте обычный диалог печати, предоставляемый Windows Forms.

Удачи!

2 голосов
/ 08 ноября 2008

Хотя это VB, вы можете легко перевести его. Кстати, Adobe не появляется, он только печатает PDF, а затем уходит.

''' <summary>
''' Start Adobe Process to print document
''' </summary>
''' <param name="p"></param>
''' <remarks></remarks>
Private Function printDoc(ByVal p As PrintObj) As PrintObj
    Dim myProcess As New Process()
    Dim myProcessStartInfo As New ProcessStartInfo(adobePath)
    Dim errMsg As String = String.Empty
    Dim outFile As String = String.Empty
    myProcessStartInfo.UseShellExecute = False
    myProcessStartInfo.RedirectStandardOutput = True
    myProcessStartInfo.RedirectStandardError = True

    Try

        If canIprintFile(p.sourceFolder & p.sourceFileName) Then
            isAdobeRunning(p)'Make sure Adobe is not running; wait till it's done
            Try
                myProcessStartInfo.Arguments = " /t " & """" & p.sourceFolder & p.sourceFileName & """" & " " & """" & p.destination & """"
                myProcess.StartInfo = myProcessStartInfo
                myProcess.Start()
                myProcess.CloseMainWindow()
                isAdobeRunning(p)
                myProcess.Dispose()
            Catch ex As Exception
            End Try
            p.result = "OK"
        Else
            p.result = "The file that the Document Printer is tryng to print is missing."
            sendMailNotification("The file that the Document Printer is tryng to print" & vbCrLf & _
            "is missing. The file in question is: " & vbCrLf & _
            p.sourceFolder & p.sourceFileName, p)
        End If
    Catch ex As Exception
        p.result = ex.Message
        sendMailNotification(ex.Message, p)
    Finally
        myProcess.Dispose()
    End Try
    Return p
End Function
1 голос
/ 28 февраля 2015

После долгих исследований и поисков в этой задаче Microsoft выпустила великолепную КБ для печати PDF без каких-либо других приложений. Не нужно называть Adobe или Ghostprint. Он может печатать без сохранения файла на диск, что делает жизнь очень простой.

http://support2.microsoft.com/?kbid=322091

1 голос
/ 21 июня 2012

Я делаю то же самое для своего проекта, и он работал для меня

Посмотри, может ли это тебе помочь ...

Process p = new Process();
p.EnableRaisingEvents = true; //Important line of code
p.StartInfo = new ProcessStartInfo()
{
    CreateNoWindow = true,
    Verb = "print",
    FileName = file,
    Arguments = "/d:"+printDialog1.PrinterSettings.PrinterName
};   
try
{
    p.Start();
} 
catch 
{ 
    /* your fallback code */ 
}

Вы также можете играть с различными вариантами окон

Команда PRINT для получения желаемого результата ... Ссылочная ссылка

1 голос
/ 04 ноября 2009

Вы также можете использовать PDFsharp - это библиотека с открытым исходным кодом для создания и управления PDF-файлами. http://www.pdfsharp.net/

1 голос
/ 08 ноября 2008

Вам понадобится Acrobat или другое приложение, которое может распечатать PDF. Оттуда вы P / Invoke на ShellExecute , чтобы распечатать документ.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...