Печать PDF с использованием vb.net - PullRequest
0 голосов
/ 22 июня 2011

Предполагая, что у меня есть все детали PDF-файла (имя файла, имя принтера, страницы и т. Д.). Есть ли способ / код, с помощью которого я могу распечатать PDF-документ? (Отправить в очередь печати)

Но есть три условия: 1. Я уже использовал метод Process.startinfo и мне нужно что-то еще. 2. Я не могу использовать любой внешний COM или любой другой объект, например, AdobePDF 3. Я не могу открыть файл и затем позволить пользователю печатать вручную.

Извините, если я ставлю слишком много условий, но это то, как мне это нужно.

Спасибо!

Ответы [ 4 ]

0 голосов
/ 30 апреля 2016

Звучит так, как будто вам нужно отправить необработанные данные прямо на принтер! (извините, это на C #)

Мне удалось незаметно распечатать на сетевом принтере, преобразовав PDF вбайтовый массив, а затем отправка его непосредственно на принтер с использованием TCP.

Если вам известен IP-адрес вашего принтера, возможно, можно будет отправить файл напрямую на принтер с помощью TcpClient.У меня это работает на моем принтере, но я пробовал его только для PDF-файлов, поэтому я не знаю, насколько хорошо это будет работать для других принтеров / типов файлов.

Вам придется изменить настройки принтератак что это с использованием порта tcp (В устройствах и принтерах выберите ваш принтер (один клик), затем щелкните свойства сервера печати, в открывшемся мастере вы можете добавить новый порт TCP).Вам также нужно будет установить параметры [для принтера, а не для lpc] [2]

Затем я использовал что-то похожее на следующий метод:

    Public Sub SilentPrint(filePath As String, printerIPAddress As string)

        Dim bytes = System.IO.File.ReadAllBytes(filePath)

        Dim client = new TcpClient(printerIPAddress, 9100) '9100 is the default print port for raw data

        using  myStream  = client.GetStream()

            myStream.Write(bytes, 0, bytes.Length)
            myStream.Close()

        End Using

End Sub

Это сработало для меня, но яне могу быть уверен, что это будет работать во всех случаях.

0 голосов
/ 22 июня 2011

Вы должны проверить ABCpdf .

0 голосов
/ 26 февраля 2016

Попробуйте использовать lvbprint через командную строку и следующий код:

http://www.lvbprint.de/html/gsbatchprint1.html

например: C: \ temp \ gsbatchprint64 \ gsbatchprintc.exe -P \ server \ printer-N A3 -O Порт -F C: \ temp \ gsbatchprint64 \ Test * .pdf -I Лоток 3

    ' print a pdf with lvbrint
    Private Function UseLvbPrint(ByVal oPrinter As tb_Printer, fileName As String, portrait As Boolean, sTray As String) As String

        Dim lvbArguments As String
        Dim lvbProcessInfo As ProcessStartInfo
        Dim lvbProcess As Process

        Try

            Dim sPrinterName As String

                If portrait Then
                    lvbArguments = String.Format(" -P ""{0}"" -O Port -N A4 -F ""{1}"" -I ""{2}"" ", sPrinterName, fileName, sTray)
                Else
                    lvbArguments = String.Format(" -P ""{0}"" -O Land -N A4 -F ""{1}"" -I ""{2}"" ", sPrinterName, fileName, sTray)
                End If

            lvbProcessInfo = New ProcessStartInfo()
            lvbProcessInfo.WindowStyle = ProcessWindowStyle.Hidden

            lvbProcessInfo.FileName = LvbLocation
            lvbProcessInfo.Arguments = lvbArguments

            lvbProcessInfo.UseShellExecute = False

            lvbProcessInfo.RedirectStandardOutput = True
            lvbProcessInfo.RedirectStandardError = True


            lvbProcessInfo.CreateNoWindow = False

            lvbProcess = Process.Start(lvbProcessInfo)

            '
            ' Read in all the text from the process with the StreamReader.
            '
            Using reader As StreamReader = lvbProcess.StandardOutput
                Dim result As String = reader.ReadToEnd()
                WriteLog(result)
            End Using

            Using readerErr As StreamReader = lvbProcess.StandardError
                Dim resultErr As String = readerErr.ReadToEnd()
                If resultErr.Trim() > "" Then
                    WriteLog(resultErr)

                    lvbProcess.Close()
                    Return resultErr
                End If
            End Using

            If lvbProcess.HasExited = False Then
                lvbProcess.WaitForExit(3000)
            End If

            lvbProcess.Close()

            Return ""

        Catch ex As Exception
            Return ex.Message 
        End Try
    End Function
0 голосов
/ 22 июня 2011

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

Возможно ли технически написать код, который печатает PDF на принтере без использования какого-либо внешнего COM / объекта? Да, конечно. Это легко? Точно нет. Вам нужно написать свой собственный движок рендеринга PDF, а это тысячи часов работы.

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

Похоже, PDFBox недавно добавил опцию PrintPDF , которая, к сожалению, основана на Java, но на самом деле в этой области не так много бесплатных опций. В моей компании Quick PDF Library есть функция PrintDocument , которая будет печатать PDF для вас, но это не бесплатно и это внешний COM.

Короче говоря: маловероятно, что вы сможете делать то, что пытаетесь делать, без изменения ваших требований и использования сторонней библиотеки.

...