web-dev-qa-db-ja.com

ファイル文書をプリンターに送信して印刷するにはどうすればよいですか?

基本的な前提は次のとおりです。

ユーザーがギズモをクリックすると、PDFファイルがデスクトップに吐き出されます。このファイルをプリンターキューに送信し、ローカル接続プリンターに印刷する方法はありますか?

string filePath = "filepathisalreadysethere";
SendToPrinter(filePath); //Something like this?

彼はこのプロセスを何度も行います。教室の生徒ごとに、小さなレポートカードを印刷する必要があります。だから私は各生徒に対してPDFを生成し、ユーザーがpdf、print、pdf、print、pdf、printを生成するのではなく、印刷プロセスを自動化したいと思います。

これにアプローチする方法についての提案はありますか? Windows XP Windows Forms .NET 4で実行しています。

私はこれを見つけました StackOverflow 受け入れられた答えが示唆する質問:

ファイルを作成したら、コマンドラインからそれらを印刷できます(そのためにSystem.Diagnostics名前空間にあるCommandクラスを使用できます)

どうすればこれを達成できますか?

60

Acrobat Readerに「印刷」動詞を使用して(ここで既に述べたように)ファイルを印刷するように指示できます。その後、プログラムでAcrobat Readerを閉じる必要もあります。

private void SendToPrinter()
{
   ProcessStartInfo info = new ProcessStartInfo();
   info.Verb = "print";
   info.FileName = @"c:\output.pdf";
   info.CreateNoWindow = true;
   info.WindowStyle = ProcessWindowStyle.Hidden;

   Process p = new Process();
   p.StartInfo = info;
   p.Start();

   p.WaitForInputIdle();
   System.Threading.Thread.Sleep(3000);
   if (false == p.CloseMainWindow())
      p.Kill();
}

これによりAcrobat Readerが開き、PDFをデフォルトのプリンターに送信するように指示され、3秒後にAcrobatがシャットダウンされます。

アプリケーションとともに他の製品を出荷する場合は、GhostScript(無料)、またはコマンドラインPDF http://www.commandlinepdf。 com / (商用)。

注:サンプルコードは、PDF inPDFを印刷するために現在登録されているアプリケーション、これはほとんどの人のマシンのAdobe Acrobat Readerです。ただし、Foxit( http://のような別のPDFビューアーを使用する可能性がありますwww.foxitsoftware.com/pdf/reader/ )。ただし、サンプルコードは引き続き機能します。

61

.netでPDFを印刷するという質問としてこれに新しい回答を追加することは長い間行われており、ほとんどの回答はGoogle Pdfiumライブラリよりも前のもので、現在は.netラッパーを持っています。私にとってはこの問題を自分で調査し、Acrobatや他のPDFリーダーを生成するなどのハッキングソリューションを実行しようとするか、高価で互換性の低いライセンスがない商用ライブラリを実行するただし、Google PdfiumライブラリとPdfiumViewer .netラッパーはオープンソースであるため、私も含め、多くの開発者にとって素晴らしいソリューションです。PdfiumViewerは、Apache 2.0ライセンスの下でライセンスされています。

NuGetパッケージは次の場所から入手できます。

https://www.nuget.org/packages/PdfiumViewer/

ソースコードは次の場所にあります。

https://github.com/pvginkel/PdfiumViewer

以下は、ファイル名からPDFファイルの任意の数のコピーを静かに印刷する簡単なコードです。PDFをストリームから読み込むこともできます(これは通常の方法です)。コードや例を見ると簡単にわかります。また、WinForm PDFファイルビューがあるため、PDFファイルをビューにレンダリングしたり、私たちにとっては、PDFファイルをオンデマンドで特定のプリンターに静かに印刷する方法が必要でした。

public bool PrintPDF(
    string printer,
    string paperName,
    string filename,
    int copies)
{
    try {
        // Create the printer settings for our printer
        var printerSettings = new PrinterSettings {
            PrinterName = printer,
            Copies = (short)copies,
        };

        // Create our page settings for the paper size selected
        var pageSettings = new PageSettings(printerSettings) {
            Margins = new Margins(0, 0, 0, 0),
        };
        foreach (PaperSize paperSize in printerSettings.PaperSizes) {
            if (paperSize.PaperName == paperName) {
                pageSettings.PaperSize = paperSize;
                break;
            }
        }

        // Now print the PDF document
        using (var document = PdfDocument.Load(filename)) {
            using (var printDocument = document.CreatePrintDocument()) {
                printDocument.PrinterSettings = printerSettings;
                printDocument.DefaultPageSettings = pageSettings;
                printDocument.PrintController = new StandardPrintController();
                printDocument.Print();
            }
        }
        return true;
    } catch {
        return false;
    }
}
55
Kendall Bennett

タグにはWindows Forms...と書かれていますが、WPFアプリケーションメソッドに興味がある人は、System.Printingが魅力のように機能します。

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);
}

まだ含まれていない場合は、System.Printing参照を含めることを忘れないでください。現在、このメソッドはASP.NETまたはWindows Serviceではうまく機能しません。 Windows Formsがあるため、System.Drawing.Printingと共に使用しないでください。上記のコードを使用したPDF印刷に関する問題は1つもありません。

ただし、お使いのプリンターがPDFファイル形式のダイレクトプリントをサポートしていない場合、この方法ではうまくいきません。

27
B.K.

これはわずかに修正されたソリューションです。プロセスは、少なくとも1秒間アイドル状態になったときに強制終了されます。たぶん、X秒のtimeofを追加し、別のスレッドから関数を呼び出す必要があります。

private void SendToPrinter()
{
  ProcessStartInfo info = new ProcessStartInfo();
  info.Verb = "print";
  info.FileName = @"c:\output.pdf";
  info.CreateNoWindow = true;
  info.WindowStyle = ProcessWindowStyle.Hidden;

  Process p = new Process();
  p.StartInfo = info;
  p.Start();

  long ticks = -1;
  while (ticks != p.TotalProcessorTime.Ticks)
  {
    ticks = p.TotalProcessorTime.Ticks;
    Thread.Sleep(1000);
  }

  if (false == p.CloseMainWindow())
    p.Kill();
}
9
user1027167

次のコードスニペットは、PdfiumViewerライブラリを使用してpdfファイルを印刷するための Kendall Bennettの コードの適応です。主な違いは、ファイルではなくストリームが使用されることです。

public bool PrintPDF(
    string printer,
    string paperName,
    int copies, Stream stream)
        {
            try
            {
                // Create the printer settings for our printer
                var printerSettings = new PrinterSettings
                {
                    PrinterName = printer,
                    Copies = (short)copies,
                };

            // Create our page settings for the paper size selected
            var pageSettings = new PageSettings(printerSettings)
            {
                Margins = new Margins(0, 0, 0, 0),
            };
            foreach (PaperSize paperSize in printerSettings.PaperSizes)
            {
                if (paperSize.PaperName == paperName)
                {
                    pageSettings.PaperSize = paperSize;
                    break;
                }
            }

            // Now print the PDF document
            using (var document = PdfiumViewer.PdfDocument.Load(stream))
            {
                using (var printDocument = document.CreatePrintDocument())
                {
                    printDocument.PrinterSettings = printerSettings;
                    printDocument.DefaultPageSettings = pageSettings;
                    printDocument.PrintController = new StandardPrintController();
                    printDocument.Print();
                }
            }
            return true;
        }
        catch (System.Exception e)
        {
            return false;
        }
    }

私の場合、PdfSharpというライブラリを使用してPDFファイルを生成し、ドキュメントをStreamに保存します。

        PdfDocument pdf = PdfGenerator.GeneratePdf(printRequest.html, PageSize.A4);
        pdf.AddPage();

        MemoryStream stream = new MemoryStream();
        pdf.Save(stream);
        MemoryStream stream2 = new MemoryStream(stream.ToArray());

私が他の開発者に役立つかもしれないことを指摘したいことの1つは、Windows 10 64ビットを実行しているにもかかわらず印刷が機能するために、pdfuimネイティブdllの32ビットバージョンをインストールしなければならなかったことです。 Visual StudioのNuGetパッケージマネージャーを使用して、次の2つのNuGetパッケージをインストールしました。

  • PdfiumViewer
  • PdfiumViewer.Native.x86.v8-xfa
8
Casper Kjær

System.Diagnostics.Process.Start は、ドキュメントの印刷に使用できます。 UseShellExecuteをTrueに設定し、動詞を「print」に設定します。

3
Neil
2
danyolgiax

簡単な方法:

var pi=new ProcessStartInfo("C:\file.docx");
pi.UseShellExecute = true;
pi.Verb = "print";
var process =  System.Diagnostics.Process.Start(pi);
2
RolandoCC

エドウィンが上記に答えたのは知っていますが、彼が印刷する文書は1つだけです。このコードを使用して、特定のディレクトリからすべてのファイルを印刷します。

public void PrintAllFiles()
{
    System.Diagnostics.ProcessStartInfo info = new System.Diagnostics.ProcessStartInfo();
    info.Verb = "print";
    System.Diagnostics.Process p = new System.Diagnostics.Process();
    //Load Files in Selected Folder
    string[] allFiles = System.IO.Directory.GetFiles(Directory);
    foreach (string file in allFiles)
    {
        info.FileName = @file;
        info.CreateNoWindow = true;
        info.WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden;
         p.StartInfo = info;
        p.Start();
    }
    //p.Kill(); Can Create A Kill Statement Here... but I found I don't need one
    MessageBox.Show("Print Complete");
}

本質的には、指定されたディレクトリ変数Directory内の各ファイルを循環します->私にとっては@ "C:\ Users\Owner\Documents\SalesVaultTesting \"で、これらのファイルをデフォルトプリンターに出力します。

2
iato

これは遅い答えですが、System.IO名前空間のFile.Copyメソッドを使用して、ファイルをプリンターに送信することもできます。

System.IO.File.Copy(filename, printerName);

これはうまくいきます

2

DevExpress PdfDocumentProcessor.Print(PdfPrinterSettings) メソッドを使用できます。

public void Print(string pdfFilePath)
{
      if (!File.Exists(pdfFilePath))
          throw new FileNotFoundException("No such file exists!", pdfFilePath);

      // Create a Pdf Document Processor instance and load a PDF into it.
      PdfDocumentProcessor documentProcessor = new PdfDocumentProcessor();
      documentProcessor.LoadDocument(pdfFilePath);

      if (documentProcessor != null)
      {
          PrinterSettings settings = new PrinterSettings();

          //var paperSizes = settings.PaperSizes.Cast<PaperSize>().ToList();
          //PaperSize sizeCustom = paperSizes.FirstOrDefault<PaperSize>(size => size.Kind == PaperKind.Custom); // finding paper size

          settings.DefaultPageSettings.PaperSize = new PaperSize("Label", 400, 600);

          // Print pdf
          documentProcessor.Print(settings);
      }
}
0
stomy