【问题标题】:Printing a PDF using vb.net使用 vb.net 打印 PDF
【发布时间】:2011-09-20 06:30:38
【问题描述】:

假设我拥有 PDF 文件的所有详细信息(文件名、打印机名称、页面等)。 有什么方法/代码可以用来打印 PDF 文档吗? (发送到打印队列)

但是有三个条件: 1.我已经使用了Process.startinfo方法,需要别的东西。 2. 我不能使用任何外部 COM 或任何其他对象,如 Adob​​ePDF 3.我无法打开文件,然后让用户手动打印。

对不起,如果我设置了太多条件,但这就是我需要它的方式。

谢谢!

【问题讨论】:

  • 你忘了再添加两个:不能使用 PrintScreen,不能使用相机。

标签: .net vb.net pdf printing adobe


【解决方案1】:

听起来你需要send raw data straight to the printer!(抱歉是C#)

我确实设法通过将 PDF 转换为字节数组,然后使用 TCP 将其直接发送到打印机来静默打印到网络打印机。

如果您知道打印机的 IP 地址,则可以使用 TcpClient 将文件直接发送到打印机。我的打印机可以使用它,但只对 PDF 进行了尝试,所以我不知道它对其他打印机/文件类型的效果如何。

您必须更改您的打印机设置,使其为using a tcp port(在设备和打印机中选择您的打印机(单击),然后单击打印服务器属性,在打开的向导中您可以添加一个新的 TCP 端口) .您还必须将 [printer 设置为 raw 而不是 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

它对我有用,但我不能确定它是否适用于所有情况。

【讨论】:

    【解决方案2】:

    尝试通过命令行和以下代码使用 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 Tray3

        ' 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
    

    【讨论】:

      【解决方案3】:

      您应该查看ABCpdf

      【讨论】:

      • 但是规范说“他不能使用任何其他对象”!
      【解决方案4】:

      为了打印 PDF,必须首先将其呈现为图像。如果您只想在应用程序的屏幕上显示 PDF,也是如此。这个想法是PDF是打印纸的电子版本。因此,查看/打印需要相同的基本步骤。

      在不使用任何外部 COM/对象的情况下编写将 PDF 打印到打印机的代码是否技术上可行?是的,一点没错。这简单吗?绝对不。您必须编写自己的 PDF 渲染引擎,这需要数千小时的工作。

      因此,为了完成此任务,您需要使用第 3 方库来处理将 PDF 渲染为图像,然后将其发送到打印机。

      它看起来像PDFBox has recently added a PrintPDF 选项,不幸的是它是基于 Java 的,但实际上在这个领域并没有很多免费选项。我公司生产的 Quick PDF Library 有一个PrintDocument 功能,可以为您打印 PDF,但它不是免费的,它是一个外部 COM。

      简而言之:如果不调整您的要求并使用 3rd 方库,您不太可能能够做您想做的事情。

      【讨论】:

      • 感谢您的回答罗文!所以基本上我不能做我想做的事。该死的真是个无赖。不过感谢您的帮助!
      • 没问题,不幸的是,PDF 没有什么是简单的。祝你好运!
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-07-29
      • 2017-11-26
      • 1970-01-01
      • 2021-11-02
      • 2015-01-14
      • 2016-10-09
      相关资源
      最近更新 更多