0

レポートビューアからレポートを印刷する他の方法が見つからなかったので、グーグルで調べたところitextがシャープであることがわかったので、最初にレポートを生成し、ソースファイルにPDFが作成され、次に印刷ボタンをクリックすると、ちょうどあったPDFが印刷されますクライアント マシンで pdf の印刷オプションを起動することによって作成されましたが、私が抱えている問題は、複数のユーザーがレポートを生成して pdf を印刷すると、リソースが既に使用されているというエラーが表示されることです。お知らせください。この問題の回避策、またはクライアント マシンでレポートを印刷できるその他の方法がある場合は??

印刷に使用するコード

using iTextSharp.text.pdf;
using iTextSharp.text;

Warning[] warnings;
    string[] streamids;
    string mimeType;
    string encoding;
    string extension;

byte[] bytes = ReportViewer1.LocalReport.Render("PDF", null, out mimeType,
out encoding, out extension, out streamids, out warnings);

FileStream fs = new FileStream(HttpContext.Current.Server.MapPath("output.pdf"),
FileMode.Create);
fs.Write(bytes, 0, bytes.Length);
fs.Close();
//Open existing PDF
Document document = new Document(PageSize.LETTER);
PdfReader reader = new PdfReader(HttpContext.Current.Server.MapPath("output.pdf"));

//Getting a instance of new PDF writer
 PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(
 HttpContext.Current.Server.MapPath("Print.pdf"), FileMode.Create));
 document.Open();
 PdfContentByte cb = writer.DirectContent;
 int i = 0;
 int p = 0;
int n = reader.NumberOfPages;
Rectangle psize = reader.GetPageSize(1);

float width = psize.Width;
float height = psize.Height;

//Add Page to new document
while (i < n)
{
document.NewPage();
p++;
i++;
PdfImportedPage page1 = writer.GetImportedPage(reader, i);
cb.AddTemplate(page1, 0, 0);
            }

//Attach javascript to the document
 PdfAction jAction = PdfAction.JavaScript("this.print(true);\r", writer);
 writer.AddJavaScript(jAction);
 document.Close();

//Attach pdf to the iframe
frmPrint.Attributes["src"] = "Print.pdf";

外部ボタンを使用して、レポート ビューアからレポートを印刷する別のより高速な方法はありますか?

4

1 に答える 1

4

PDF を生成してファイルから読み取らないでください。ファイルが書き込み用に開かれると、そのファイルはロックされ、他のユーザーはアクセスできなくなります。レポートインスタンスごとに一意のディレクトリまたはファイル名を作成しない限り、これは複数ユーザー環境では非常に安全ではありません (これも悪いことです。ファイルシステムが必然的に孤立したレポートでいっぱいになるか、一時ディレクトリのアクセス許可を処理する必要があるためです。楽しいもの)。iTextSharp は、バイト配列を生成するために使用できる MemoryStream へのレンダリングをサポートし、それをブラウザにストリーミングできます。

C# 3.0からメモリストリームを使用する例MemoryStream を使用して itextsharp pdf をデータベースに保存する

function byte[] CreatePdf(){
            byte[] result;
            using (MemoryStream ms = new MemoryStream())
            {
                Document pDoc = new Document(PageSize.A4, 0, 0, 0, 0);
                PdfWriter writer = PdfWriter.GetInstance(pDoc, ms);
                pDoc.Open();

                //here you can create your own pdf.

                pDoc.Close();
                result = ms.GetBuffer();
            }

            return result;
}

編集

このコード:

byte[] bytes = ReportViewer1.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamids, out warnings);

FileStream fs = new FileStream(HttpContext.Current.Server.MapPath("output.pdf"),
FileMode.Create);
fs.Write(bytes, 0, bytes.Length);
fs.Close();
//Open existing PDF
Document document = new Document(PageSize.LETTER);
PdfReader reader = new PdfReader(HttpContext.Current.Server.MapPath("output.pdf"));

実行しているのは、reportviewer からの出力 (既に PDF を含むバイト配列です) を取得し、それをファイルに書き込み、iTextSharp を使用してファイルを開くことだけです。私が見ることができることから、iTextSharp PDFReader オブジェクトはバイト配列を使用してインスタンス化することもできるので、そのすべてのコードをスキップして実行してみませんか:

byte[] bytes = ReportViewer1.LocalReport.Render("PDF", null, out mimeType, out encoding, out extension, out streamids, out warnings);

PdfReader reader = new PdfReader(bytes);

そして、コードの残りの部分はそのままにしておきますか?

于 2015-10-21T20:28:08.953 に答える