假设我拥有PDF文件的所有详细信息(文件名,打印机名称,页面等)。 有什么方法/代码可用于打印PDF文档吗? (将其发送到打印队列)
但有三个条件: 1.我已经使用了Process.startinfo方法并需要其他方法。 2.我无法使用任何外部COM或任何其他对象,如AdobePDF 3.我无法打开文件,然后让用户手动打印。
很抱歉,如果我提出太多条件,但这就是我需要它的方式。
谢谢!
答案 0 :(得分:0)
要打印PDF,必须先将其渲染为图像。如果您只想在应用程序的屏幕上显示PDF,也是如此。这个想法是PDF是打印纸的电子版本。因此,查看/打印需要相同的基本步骤。
技术上是否可以编写将PDF打印到打印机而不使用任何外部COM /对象的代码?是的,一点没错。这简单吗?绝对不。你必须编写自己的PDF渲染引擎,这需要数千小时的工作。
因此,为了完成此任务,您需要使用第三方库来处理将PDF呈现为图像,然后将图像发送到打印机。
它看起来像PDFBox has recently added a PrintPDF选项,遗憾的是基于Java,但实际上这个领域并没有很多免费选项。我的公司生产快速PDF库有PrintDocument功能,它将为您打印PDF,但它不是免费的,它是一个外部COM。
简而言之:如果不调整您的要求并使用第三方库,您就不太可能做您想做的事情。
答案 1 :(得分:0)
您应该查看ABCpdf。
答案 2 :(得分:0)
尝试通过命令行使用lvbprint和以下代码:
http://www.lvbprint.de/html/gsbatchprint1.html
例如: C:\ temp \ gsbatchprint64 \ gsbatchprintc.exe -P \ server \ printer-N A3 -O Port -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 :(得分:0)
听起来你需要send raw data straight to the printer!(对不起,这是在C#中)
我确实设法通过将PDF转换为字节数组然后使用TCP将其直接发送到打印机来静默打印到网络打印机。
如果您知道打印机的IP地址,则可以使用TcpClient将文件直接发送到打印机。我已经将它用于我的打印机,但只是尝试过它用于PDF,所以我不知道它对其他打印机/文件类型的效果如何。
您必须更改打印机设置,使其为using a tcp port(在设备和打印机中选择您的打印机(单击),然后单击打印服务器属性,在打开的向导中,您可以添加新的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
它对我有用,但我无法确定它是否适用于所有情况。