25

私はこの問題を2日近く解決しようとしています。ネット上には多かれ少なかれ良い解決策がたくさんありますが、私の仕事に完全に適合するものは1つではありません。

タスク:

  • プログラムでPDFを印刷する
  • 固定プリンターで行う
  • ユーザーに複数のButton_Clickを実行させないでください
  • 黙ってください-多ければ多いほど良いです
  • クライアント側で行う

最初の解決策:

Forms.WebBrowserでそれを行う

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

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


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

次のCMDコマンドを使用すると、AdobeReaderを使用して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();

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

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


PDFページをDrawing.Imageに変換します

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


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

よろしく、マックス

4

12 に答える 12

6

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

"C:\Program Files\gs\gs9.07\bin\gswin64c.exe" -dPrinted -dBATCH -dNOPAUSE -sDEVICE=mswinpr2 -dNoCancel -sOutputFile="%printer%プリンター名" " pdfdocument.pdf "

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

-sPAPERSIZE=a4 -dPDFFitPage

于 2013-10-11T13:58:49.590 に答える
3

もう 1 つの方法は、.NET のスプーラ機能を使用して、フォーマット済みのプリンタ データをプリンタに送信することです。残念ながら、win32 スプーラ API を使用する必要があります。

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

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

于 2012-07-20T13:14:21.163 に答える
3

商用ライブラリがオプションである場合は、Amyuni PDF Creator を試すことができます。ネット。

ライブラリを使用して直接印刷する:
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 内のすべてのページを、Drawing.Image を使用して印刷または表示できる JPG 画像に変換できます。

選択肢 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で働いています

于 2012-07-23T15:09:33.980 に答える
1

Ghostscriptを使用して PDF を画像形式に変換できます。

次の例では、単一の PDF を一連の PNG ファイルに変換します。

private static void ExecuteGhostscript(string input, string tempDirectory)
{
    // %d will be replaced by ghostscript with a number for each page
    string filename = Path.GetFileNameWithoutExtension(input) + "-%d.png";
    string output = Path.Combine(tempDirectory, filename);

    Process ghostscript = new Process();
    ghostscript.StartInfo.FileName = _pathToGhostscript;
    ghostscript.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;

    ghostscript.StartInfo.Arguments = string.Format(
        "-dSAFER -dBATCH -dNOPAUSE -sDEVICE=png16m -r300 -sOutputFile=\"{0}\" \"{1}\"", output, input);

    ghostscript.Start();
    ghostscript.WaitForExit();
}

代わりに Adob​​e Reader を使用する場合は、そのウィンドウを非表示にすることができます。

process.StartInfo.WindowStyle = ProcessWindowStyle.Hidden;
于 2012-07-20T21:19:35.637 に答える
1

タグに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 ServiceWindows Formsと一緒に使用しないでくださいSystem.Drawing.Printing。上記のコードを使用した PDF 印刷で問題は 1 つもありません。

お使いのプリンターが PDF ファイルの直接印刷をサポートしていない場合、これは機能しないことに注意してください。

于 2014-12-11T18:01:04.850 に答える
0

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

コード サンプルを次に示します (主要な関数はPrintOptionsPrintDocumentです)。

/* 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);
于 2014-01-17T05:46:44.440 に答える
0

PrintDocumentクラスの使い方は?

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

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

HTH

于 2012-07-20T12:53:40.703 に答える
0
        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();
        }
于 2012-09-30T20:14:51.660 に答える