2011-06-22 114 views
0

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

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

对不起,如果我把太多的条件,但这就是我需要它。

谢谢!

+1

您忘了再添加两个:无法使用PrintScreen,无法使用相机。 –

回答

0

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

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

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

它看起来像PDFBox has recently added a PrintPDF选项,这是不幸的Java基础,但实际上并没有在这方面的很多免费选项。我公司生产的快速PDF库有一个PrintDocument功能,它将为您打印PDF,但它不是免费的,它是一个外部COM。

简而言之:如果不调整自己的需求并使用第三方库,您将无法完成自己想做的事情。

+0

感谢您的回答罗文!所以基本上我不能做我想做的事。当那是一个无赖。但感谢您的帮助! – Andy

+0

没问题,不幸的是,当谈到PDF时没有什么是简单的。祝你好运! – Rowan

0

您应该检出ABCpdf

+0

啊..这很好......谢谢杰克! – Andy

+0

但规范说“他不能使用任何其他物体”! –

0

尝试使用通过命令行lvbprint和以下代码:

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

例如: C:\ TEMP \ gsbatchprint64 \ gsbatchprintc.exe -P \服务器\打印机-N A3 -O端口-FC:\ TEMP \ gsbatchprint64 \测试的* .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

这听起来像你需要send raw data straight to the printer!(对不起它在C#)

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

如果您知道打印机的IP地址,则可以使用TcpClient将文件直接发送到打印机。我有这个为我的打印机工作,但只尝试它的PDF文件,所以我不知道它会如何适用于其他打印机/文件类型。(在设备和打印机中选择您的打印机(单击),然后单击打印服务器属性,在打开的向导中您可以添加一个新的TCP端口)。您需要更改您的打印机设置以使它为using a tcp port。您还必须将[打印机设置为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 

它为我工作,但我不能确定它会在所有情况下工作。