假設我具有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,無法使用相機。 –