web-dev-qa-db-ja.com

既存のPDF(またはその他のファイル)をC#で印刷する

私が作成しているアプリケーションから、既存のPDF(別のアプリで作成された)を印刷する必要があります。これをC#で実行し、ユーザーが別のプリンターまたは他のプロパティを選択できるようにするメカニズムを提供するにはどうすればよいですか。

PrintDialogを確認しましたが、印刷しようとしているファイルがある場合は、出力が常に空白のページであるかどうかはわかりません。たぶん私はそこに何かが足りないのです。

「iTextSharp」を使用する必要がありますか(他の場所で提案されています)? 「ファイルをプリンターに送信する」ことができるので、それは私には奇妙に思われます。プリンターなどを設定するための事前のナイスダイアログがなく、印刷ダイアログを一から書きたくありません。しかし、検索で見つけた多くの例はまさにそれをしたようです。

アドバイス、例、サンプルコードは素晴らしいです!

また、PDFが問題である場合、他のアプリがビットマップやpngなどのdiff形式でファイルを作成すると、作業が簡単になります。

23
Cody

アイテムが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フォームによって提供される通常の印刷ダイアログを使用するだけです。

幸運を!

23

これは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
2
anonymous

PDFを印刷できるAcrobatまたはその他のアプリケーションが必要です。そこからP/Invokeを実行して ShellExecute にし、ドキュメントを印刷します。

1
plinth

このタスクについて多くの調査とグーグルを行った後、Microsoftは他のアプリケーションを必要とせずにPDFを印刷するための素晴らしいKBをリリースしました。アドビやゴーストプリントを呼び出す必要はありません。ファイルをディスクに保存せずに印刷できるため、作業が非常に簡単になります。

http://support2.Microsoft.com/?kbid=322091

1
Marko

PDFsharpを使用することもできます。これは、PDFの作成と操作のためのオープンソースライブラリです。 http://www.pdfsharp.net/

1
David Duffett

私のプロジェクトでも同じことをやっていて、うまくいきました

それがあなたを助けることができるかどうか見てください...

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コマンド... 参照リンク

1
Parvej Solkar