假设我具有PDF文件(文件名,打印机名称,页面等)的所有详细信息。 有什么方法/代码可以用来打印PDF文档? (发送到打印队列)使用vb.net打印PDF
但有三个条件: 1.我已经使用了Process.startinfo方法并需要其他的东西。 2.我无法使用任何外部COM或任何其他对象,如AdobePDF 3.我无法打开文件,然后让用户手动打印。
对不起,如果我把太多的条件,但这就是我需要它。
谢谢!
假设我具有PDF文件(文件名,打印机名称,页面等)的所有详细信息。 有什么方法/代码可以用来打印PDF文档? (发送到打印队列)使用vb.net打印PDF
但有三个条件: 1.我已经使用了Process.startinfo方法并需要其他的东西。 2.我无法使用任何外部COM或任何其他对象,如AdobePDF 3.我无法打开文件,然后让用户手动打印。
对不起,如果我把太多的条件,但这就是我需要它。
谢谢!
为了打印PDF文件,它必须首先渲染为图像。如果您只想在应用程序的屏幕上显示PDF,也是一样。这个想法是,PDF是一张纸的电子版。因此,查看/打印需要相同的基本步骤。
是否技术上可行编写的代码可以在不使用任何外部COM /对象的情况下将PDF打印到打印机上?是的,一点没错。这简单吗?绝对不。你将不得不编写自己的PDF渲染引擎,这是数千小时的工作。
因此,要完成此任务,您需要使用第三方库来处理将PDF呈现为图像,然后将图像发送到打印机。
它看起来像PDFBox has recently added a PrintPDF选项,这是不幸的Java基础,但实际上并没有在这方面的很多免费选项。我公司生产的快速PDF库有一个PrintDocument功能,它将为您打印PDF,但它不是免费的,它是一个外部COM。
简而言之:如果不调整自己的需求并使用第三方库,您将无法完成自己想做的事情。
尝试使用通过命令行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
这听起来像你需要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
它为我工作,但我不能确定它会在所有情况下工作。
您忘了再添加两个:无法使用PrintScreen,无法使用相机。 –