私が作成しているアプリケーションから、既存のPDF(別のアプリで作成された)を印刷する必要があります。これをC#で実行し、ユーザーが別のプリンターまたは他のプロパティを選択できるようにするメカニズムを提供するにはどうすればよいですか。
PrintDialogを確認しましたが、印刷しようとしているファイルがある場合は、出力が常に空白のページであるかどうかはわかりません。たぶん私はそこに何かが足りないのです。
「iTextSharp」を使用する必要がありますか(他の場所で提案されています)? 「ファイルをプリンターに送信する」ことができるので、それは私には奇妙に思われます。プリンターなどを設定するための事前のナイスダイアログがなく、印刷ダイアログを一から書きたくありません。しかし、検索で見つけた多くの例はまさにそれをしたようです。
アドバイス、例、サンプルコードは素晴らしいです!
また、PDFが問題である場合、他のアプリがビットマップやpngなどのdiff形式でファイルを作成すると、作業が簡単になります。
アイテムがPrinterSettings.InstalledPrinters
によって返された文字列コレクションに設定されているコンボボックスを含む小さなダイアログを表示します。
GSView をマシンにインストールする必要がある場合は、PDFをサイレント印刷できます。少し遅くて回り道ですが、少なくともAcrobatをポップアップする必要はありません。
UPS Webサービスから返されたPDFを印刷するために使用するコードを以下に示します。
private void PrintFormPdfData(byte[] formPdfData)
{
string tempFile;
tempFile = Path.GetTempFileName();
using (FileStream fs = new FileStream(tempFile, FileMode.Create))
{
fs.Write(formPdfData, 0, formPdfData.Length);
fs.Flush();
}
try
{
string gsArguments;
string gsLocation;
ProcessStartInfo gsProcessInfo;
Process gsProcess;
gsArguments = string.Format("-grey -noquery -printer \"HP LaserJet 5M\" \"{0}\"", tempFile);
gsLocation = @"C:\Program Files\Ghostgum\gsview\gsprint.exe";
gsProcessInfo = new ProcessStartInfo();
gsProcessInfo.WindowStyle = ProcessWindowStyle.Hidden;
gsProcessInfo.FileName = gsLocation;
gsProcessInfo.Arguments = gsArguments;
gsProcess = Process.Start(gsProcessInfo);
gsProcess.WaitForExit();
}
finally
{
File.Delete(tempFile);
}
}
ご覧のように、PDFデータをバイト配列として受け取り、それを一時ファイルに書き込み、gsprint.exeを起動して、指定されたプリンター( "HP Laserjet 5M ")。プリンタ名は、ユーザーがダイアログボックスで選択したものに置き換えることができます。
PNGまたはGIFを印刷する方がはるかに簡単です。PrintDocumentクラスを拡張し、Windowsフォームによって提供される通常の印刷ダイアログを使用するだけです。
幸運を!
これはVBですが、簡単に翻訳できます。Adobeがポップアップしないのは、PDFを印刷してから消えるだけです。
''' <summary>
''' Start Adobe Process to print document
''' </summary>
''' <param name="p"></param>
''' <remarks></remarks>
Private Function printDoc(ByVal p As PrintObj) As PrintObj
Dim myProcess As New Process()
Dim myProcessStartInfo As New ProcessStartInfo(adobePath)
Dim errMsg As String = String.Empty
Dim outFile As String = String.Empty
myProcessStartInfo.UseShellExecute = False
myProcessStartInfo.RedirectStandardOutput = True
myProcessStartInfo.RedirectStandardError = True
Try
If canIprintFile(p.sourceFolder & p.sourceFileName) Then
isAdobeRunning(p)'Make sure Adobe is not running; wait till it's done
Try
myProcessStartInfo.Arguments = " /t " & """" & p.sourceFolder & p.sourceFileName & """" & " " & """" & p.destination & """"
myProcess.StartInfo = myProcessStartInfo
myProcess.Start()
myProcess.CloseMainWindow()
isAdobeRunning(p)
myProcess.Dispose()
Catch ex As Exception
End Try
p.result = "OK"
Else
p.result = "The file that the Document Printer is tryng to print is missing."
sendMailNotification("The file that the Document Printer is tryng to print" & vbCrLf & _
"is missing. The file in question is: " & vbCrLf & _
p.sourceFolder & p.sourceFileName, p)
End If
Catch ex As Exception
p.result = ex.Message
sendMailNotification(ex.Message, p)
Finally
myProcess.Dispose()
End Try
Return p
End Function
PDFを印刷できるAcrobatまたはその他のアプリケーションが必要です。そこからP/Invokeを実行して ShellExecute にし、ドキュメントを印刷します。
このタスクについて多くの調査とグーグルを行った後、Microsoftは他のアプリケーションを必要とせずにPDFを印刷するための素晴らしいKBをリリースしました。アドビやゴーストプリントを呼び出す必要はありません。ファイルをディスクに保存せずに印刷できるため、作業が非常に簡単になります。
PDFsharpを使用することもできます。これは、PDFの作成と操作のためのオープンソースライブラリです。 http://www.pdfsharp.net/
私のプロジェクトでも同じことをやっていて、うまくいきました
それがあなたを助けることができるかどうか見てください...
Process p = new Process();
p.EnableRaisingEvents = true; //Important line of code
p.StartInfo = new ProcessStartInfo()
{
CreateNoWindow = true,
Verb = "print",
FileName = file,
Arguments = "/d:"+printDialog1.PrinterSettings.PrinterName
};
try
{
p.Start();
}
catch
{
/* your fallback code */
}
ウィンドウのさまざまなオプションで遊ぶこともできます
目的の出力を取得するためのPRINTコマンド... 参照リンク