0

新しい PDF ドキュメントとして保存せずに、変更した PDF ドキュメントを印刷する必要があります。以下のコードは問題なく動作します。しかし、私はこれをまったく別の方法で行いたいと思っています。同時に、脳の遅れがあり、解決策が見えません。

私のコード例

byte[] result;

using (MemoryStream ms = new MemoryStream())
{
    PdfReader pdfReader = new PdfReader("c:\\templatePdf.pdf");
    PdfStamper pdfStamper = new PdfStamper(pdfReader, ms);

    /* abbreviated but here I alter the template pdf */

    pdfStamper.FormFlattening = true;
    pdfStamper.Close();
    result = ms.GetBuffer();
}

/* Instead of saving a new file I would rather like to print
   the altered template pdf in memory and then discard it */
using (FileStream fs = File.Create("C:\\Test.pdf"))
{
    fs.Write(result, 0, (int)result.Length);
}

Process process = new Process();
process.StartInfo.FileName = "C:\\Test.pdf";
process.StartInfo.Verb = "printto";
process.StartInfo.Arguments = "\"" + ppr_PrinterDropDown.Text + "\"";
process.Start();
File.Delete("C:\\Test.pdf");
4

3 に答える 3

1

ファイルベースの API を使用している場合、ファイルなしでそれを行うのは困難です。名前付きパイプサーバーをセットアップできるかもしれませんが、率直に言って、それは大きな問題です。ただし、印刷をサポートする完全に管理された PDF ライブラリを探してみたくなりました。しかし、最終的には...ファイルシステムが実際にどのような害を及ぼしているのでしょうか? おそらく多くはありません。ただし、いくつかの調整を提案する場合があります。

  1. 一時領域 ( Path.GetTempPath()) を使用します。C:\Test
  2. ファイルを削除する前に、プロセスが完了するのを待ちます
于 2013-01-17T23:18:36.317 に答える
0

最初にメモリ ストリームに書き込む必要があります。次に、メモリ ストリーム メソッド「WriteTo」を使用して、以下のコードに示すようにページのレスポンスに書き込むことができます。

   MemoryStream filecontent = null;
   filecontent =//CommonUtility.ExportToPdf(inputXMLtoXSLT);(This will be your MemeoryStream Content)
   Response.ContentType = "image/pdf";
   string headerValue = string.Format("attachment; filename={0}", formName.ToUpper() + ".pdf");
   Response.AppendHeader("Content-Disposition", headerValue);

   filecontent.WriteTo(Response.OutputStream);

   Response.End();

FormName は与えられた fileName です。このコードは、PopUp を呼び出して、生成された PDF ファイルをダウンロード可能にします。

于 2014-02-20T17:08:25.317 に答える
0

かんたんだよ。難しいのは、印刷ステータスの完了と総ページ数に関する有用な情報を取得することです。

var pq = LocalPrintServer.GetDefaultPrintQueue();
var theJob = pq.AddJob();
try{
    using(var js = theJob.JobStream){
        var buffer = File.ReadAllBytes("yourPathToPdf");
        js.Write(buffer,0,buffer.Length);
    }
    var done=false;
    while(!done)
    {
        pq.Refresh();
        theJob.Refresh();
        done = theJob.IsCompleted || theJob.IsDeleted || theJob.IsPrinted;
    }
}
catch(Exception ex){
    //handle this
}
finally{
    theJob?.Dispose();
    pq?.Dispose();
}

もちろん、これはお使いのプリンターがネイティブの PDF サポートを備えていることを前提としています。それ以外の場合は、クライアントで自分でレンダリング作業を行い、生のストリームとしてではなく送信する必要があります。

于 2016-01-06T19:34:52.990 に答える