25

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

PrintDialogを確認しましたが、印刷しようとしているファイルがあるかどうかはわかりません。b/c出力は常に空白のページです。多分私はそこに何かが欠けているだけです。

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

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

また、PDFが問題である場合、ファイルは他のアプリによってビットマップやpngなどの差分形式で作成される可能性があります。

4

6 に答える 6

23

によって返される文字列コレクションに項目が設定されたコンボボックスを含む小さなダイアログを表示します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 フォームが提供する通常の印刷ダイアログを使用するだけです。

幸運を!

于 2008-11-07T21:40:35.933 に答える
2

これは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
于 2008-11-07T22:18:01.100 に答える
1

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

于 2009-11-04T16:50:14.347 に答える
1

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

于 2008-11-07T21:31:28.760 に答える
1

このタスクについて多くの調査とグーグル検索を行った後、Microsoft は、他のアプリケーションを必要とせずに PDF を印刷するための優れた KB をリリースしました。Adobe や Ghostprint に電話する必要はありません。ファイルをディスクに保存せずに印刷できるので、非常に簡単です。

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

于 2015-02-27T21:58:34.693 に答える
1

私は自分のプロジェクトで同じことをしていますが、うまくいきました

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

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

于 2012-06-21T04:09:17.483 に答える