2011-06-22 105 views
0

PDFファイル(ファイル名、プリンタ名、ページなど)の詳細がすべてあるとします。 PDF文書を印刷するための方法やコードはありますか? (印刷キューに送信してください)vb.netを使用したPDFの印刷

しかし、次の3つの条件があります。 1.私は既にProcess.startinfoメソッドを使用しており、他に必要なものがあります。 2.外部COMやAdobePDF のようなオブジェクトは使用できません。3.ファイルを開いて、手動で印刷させます。

申し訳ありませんが、私はあまりにも多くの条件を入れているが、それは私がそれを必要とする方法です。

ありがとうございます!

+1

あなたは2つ以上追加するのを忘れました:PrintScreenを使用できません。カメラを使用できません。 –

答えて

0

PDFを印刷するには、まず画像としてレンダリングする必要があります。アプリケーションの画面にPDFを表示したいだけの場合も同じです。アイデアは、PDFは印刷された紙の電子版であるということです。したがって、表示/印刷するのに同じ基本ステップが必要です。

技術的に可能なのは外部COM /オブジェクトを使用せずにPDFをプリンタに印刷するコードを記述することはできますか?そのとおり。易しいですか?絶対違う。独自のPDFレンダリングエンジンを作成する必要があり、それは何千時間もの作業です。

このタスクを実行するには、サードパーティのライブラリを使用して、PDFを画像に変換してからプリンタに送信する必要があります。

残念ながらJavaベースのPDFBox has recently added a PrintPDFオプションのようですが、この領域には実際には多くの無料オプションはありません。私の会社の制作Quick PDF LibraryにはPrintDocument機能がありますが、PDFはあなたのために印刷されますが、無料ではなく外部のCOMです。

要約:要件を調整したり、サードパーティのライブラリを使用したりすることなく、あなたがしようとしていることを実行することはできません。

+0

答えていただきありがとうございます。だから基本的に私が望むことはできません。ダンはバマーだしかし、助けてくれてありがとう! – Andy

+0

問題はありませんが、残念なことにPDFの場合は何も簡単です。がんばろう! – Rowan

0

は、コマンドライン、次のコードを介してlvbprintを使用してみてください C:\ TEMP \ gsbatchprint64 \ gsbatchprintc.exe -P \サーバー\プリンタ-N A3 -Oポート-FC:\ TEMP \ gsbatchprint64 \テスト*の.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 
0

あなたがsend raw data straight to the printer!に必要のようですね(申し訳ありません、それはC#でだ)

私は、PDFをバイト配列に変換し、それをTCPを使ってプリンタに直接送ることで、ネットワークプリンタに静かに印刷することができました。

プリンタのIPアドレスが分かっている場合は、TcpClientを使用してプリンタに直接ファイルを送信することができます。私はこれを自分のプリンタで動作させることにしましたが、PDF用に試しただけなので、他のプリンタ/ファイルタイプでどれくらいうまく動作するかわかりません。

using a tcp portに変更する必要があります(デバイスとプリンタでプリンタを選択してから、プリントサーバーのプロパティをクリックして、新しいTCPポートを追加できます)。 [プリンタを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 

私にとってはうまくいったが、すべてのケースでうまくいくとは確信できない。

関連する問題