web-dev-qa-db-ja.com

PDF C#で印刷する方法

この問題をほぼ2日間解決しようとしています。ネットには多くの良い解決策がありますが、私の仕事にぴったりの解決策はありません。

タスク:

  • PDFプログラムで印刷
  • 固定プリンターで行う
  • ユーザーに複数のButton_Clickを実行させないでください。
  • 静かに-より多くの、より良い
  • クライアント側で行う

最初のソリューション:

Forms.WebBrowserで実行

Adobe Readerがインストールされている場合、WebブラウザにPDFを表示するプラグインがあります。このソリューションではニースのプレビューがあり、webbrowserControlName.Print()でコントロールをトリガーしてそのコンテンツを印刷できます。

問題-まだPrintDialogがあります。


開始引数を使用してAcroRd32.exeを開始

次のCMDコマンドを使用すると、Adobe Readerを使用してPDFを印刷できます。

InsertPathTo ..\AcroRd32.exe/t "C:\ sample.pdf" "\ printerNetwork\printerName"

問題-AcroRd32.exeへの絶対パスが必要です| Adobe Readerウィンドウが開いており、印刷タスクの準備ができるまで開く必要があります。


Windowsのプリセットを使用

Process process = new Process();

process.StartInfo.FileName = pathToPdf; 
process.StartInfo.Verb = "printto";
process.StartInfo.Arguments = "\"" + printerName + "\""; 
process.Start();

process.WaitForInputIdle();
process.Kill();

問題-まだAdobe Readerウィンドウがポップアップ表示されますが、印刷が完了すると通常は閉じます。

解決策-クライアントにFoxit Readerを使用するよう説得します(最後の2行のコードは使用しないでください)。


Convert PDF Pages to Drawing.Image

コードを使用してそれを行う方法はわかりませんが、これが機能するようになったとき、残りは簡単です。 Printing.PrintDocumentはすべての要求を満たすことができます。


それらのPDFからDrawing.Imageを取得するアイデアや、それを行う別のアプローチはありますか?

よろしく、マックス

21
Mx.

私が見つけた最も柔軟で、最も簡単で最高のパフォーマンスの方法は、GhostScriptを使用することでした。プリンター名で直接Windowsプリンターに印刷できます。

"C:\ Program Files\gs\gs9.07\bin\gswin64c.exe" -dPrinted -dBATCH -dNOPAUSE -sDEVICE = mswinpr2 -dNoCancel -sOutputFile = "%printer%printer name" "- pdfdocument.pdf "

これらのスイッチを追加して、ドキュメントをA4ページに縮小します。

-sPAPERSIZE = a4 -dPDFFitPage

商用ライブラリがオプションの場合は、 Amyuni PDF Creator。Net。

ライブラリで直接印刷する:
PDFファイルを開いて直接印刷するために送信するには、メソッド IacDocument.Print を使用できます。C#のコードは次のようになります。このような:

// Open PDF document from file<br>
FileStream file1 = new FileStream ("test.pdf", FileMode.Open, FileAccess.Read);
IacDocument doc1 = new IacDocument (null);
doc1.Open (file1, "" );
// print document to a specified printer with no Prompt
doc1.Print ("My Laser Printer", false);

画像へのエクスポート(必要に応じて印刷):
選択肢1:メソッド IacDocument.ExportToJPeg を使用して、PDF)のすべてのページをJPGイメージに変換して印刷またはDrawing.Imageを使用した表示

選択肢2:メソッド IacDocument.DrawCurrentPage とメソッド System.Drawing.Graphics.FromImage を使用して、各ページをビットマップに描画できます。 C#のコードは次のようになります。

FileStream myFile = new FileStream ("test.pdf", FileMode.Open, FileAccess.Read);
IacDocument doc = new IacDocument(null);
doc.Open(myFile);
doc.CurrentPage = 1;
Image img = new Bitmap(100,100);
Graphics gph = Graphics.FromImage(img);
IntPtr hdc = gph.GetHDC();
doc.DrawCurrentPage(hdc, false);
gph.ReleaseHdc( hdc );

免責事項:私はAmyuni Technologiesで働いています

3
yms

別のアプローチでは、.NETのスプーラー機能を使用して、事前にフォーマットされたプリンターデータをプリンターに送信します。ただし、残念ながらwin32スプーラーAPIを使用する必要があります

Visual C#.NETを使用して生データをプリンタに送信する方法

プリンタがPDFネイティブにドキュメントをサポートしている場合にのみ、このアプローチを使用できます。

3
Turbot

Printto動詞を使用するコードのわずかに異なるバージョンを見つけました。私はそれを試していないが、多分それはあなたを助ける:

http://vbcity.com/forums/t/149141.aspx

1
Hinek

タグにWindows Formsがあることを知っています。ただし、一般的なタイトルのため、一部の人々はWPFアプリケーションでその名前空間を使用できるかどうか疑問に思うかもしれません。

コードは次のとおりです。

var file = File.ReadAllBytes(pdfFilePath);
var printQueue = LocalPrintServer.GetDefaultPrintQueue();

using (var job = printQueue.AddJob())
using (var stream = job.JobStream)
{
    stream.Write(file, 0, file.Length);
}

現在、この名前空間はWPFアプリケーションで使用する必要があります。 ASP.NETまたはWindows Serviceではうまく動作しません。 Windows Formsがあるため、System.Drawing.Printingと共に使用しないでください。上記のコードを使用したPDF印刷に関する問題は1つもありません。

プリンターがPDFファイルのダイレクト印刷をサポートしていない場合、これは機能しません。

1
B.K.

July 2018、OPに対する回答はまだありません。 1)2)クローズドソースプロジェクトのPDFを静かに印刷する自由な方法はありません。

1)最も確実にプロセス、つまりAdobe AcrobatまたはFoxit Readerを使用できます

2)無料ソリューションにはGPL(GNUのGeneral Public License)があります。つまり、ソフトウェアを無料で提供する場合でも、社外の人にソースコードを公開する必要があります。

OPが言うように、Drawing.ImageにPDFを取得できる場合、.NETメソッドで印刷できます。残念ながら、これを行うソフトウェアには支払いまたはGPLも必要です。

0
John Doe

私は多くのことを試しましたが、私にとって最も効果的なのは、コマンドラインからSumatraPDFを起動することでした。

// Launch SumatraPDF Reader to print
String arguments = "-print-to-default -silent \"" + fileName + "\"";
System.Diagnostics.Process.Start("SumatraPDF.exe", arguments);

これには多くの利点があります。

  1. SumatraPDFは、Adobe Acrobat Readerよりもはるかに高速です。
  2. UIは読み込まれません。印刷するだけです。
  3. SumatraPDFをスタンドアロンアプリケーションとして使用して、アプリケーションに含めることができるため、独自のpaを使用できます。私はライセンス契約を読んでいないことに注意してください。おそらく自分でチェックアウトする必要があります。
0
Ian

必要なことを正確に行う商用ソリューションに興味がある場合は、いくつかのオプションがあります。私の会社では、これらのオプションの1つを Debenu Quick PDF Library という開発者ツールキットで提供しています。

コードサンプルは次のとおりです(主要な機能は PrintOptions および PrintDocument ):

/* Print a document  */

// Load a local sample file from the input folder

DPL.LoadFromFile("Test.pdf", "");

// Configure print options

iPrintOptions = DPL.PrintOptions(0, 0, "Printing Sample")

// Print the current document to the default 
// printing using the options as configured above.
// You can also specify the specific printer.

DPL.PrintDocument(DPL.GetDefaultPrinterName(), 1, 1, iPrintOptions);
0
Rowan

PrintDocumentクラスの使用はどうですか?

http://msdn.Microsoft.com/en-us/library/system.drawing.printing.printdocument.aspx

(例に基づいて)印刷するファイルのファイル名を渡すだけです。

HTH

0
Gavin
        Process proc = new Process();
        proc.StartInfo.FileName = @"C:\Program Files\Adobe\Acrobat 7.0\Reader\AcroRd32.exe";
        proc.StartInfo.Arguments = @"/p /h C:\Documents and Settings\brendal\Desktop\Test.pdf";
        proc.StartInfo.UseShellExecute = false;
        proc.StartInfo.CreateNoWindow = true;
        proc.Start();

        for (int i = 0; i < 5; i++)
        {
            if (!proc.HasExited)
            {
                proc.Refresh();
                Thread.Sleep(2000);
            }
            else
                break;
        }
        if (!proc.HasExited)
        {
            proc.CloseMainWindow();
        }
0
Roshana