2011-06-22 156 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 

它爲我工作,但我不能確定它會在所有情況下工作。