C# 使用itext sharp打印pdf文件,但不适用于多个用户

C# 使用itext sharp打印pdf文件,但不适用于多个用户,c#,asp.net,pdf,itextsharp,reportviewer2008,C#,Asp.net,Pdf,Itextsharp,Reportviewer2008,我找不到任何其他方法从report viewer打印报告,所以我在谷歌上搜索了一下,找到了itext sharp,所以首先我生成了报告,然后在源文件中创建了pdf,然后我单击“打印”按钮,它会打印刚刚在客户端机器上打开pdf打印选项创建的pdf,但我遇到的问题是,当多个用户生成报告并打印pdf时,他们收到一个错误,说资源已在使用中,您能告诉我是否有解决此问题的方法,或者我可以在客户端计算机上打印报告的任何其他方法吗 我用来打印的代码 using iTextSharp.text.pdf; usin

我找不到任何其他方法从report viewer打印报告,所以我在谷歌上搜索了一下,找到了itext sharp,所以首先我生成了报告,然后在源文件中创建了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";
使用iTextSharp.text.pdf;
使用iTextSharp.text;
警告[]警告;
字符串[]流线;
字符串模拟类型;
字符串编码;
字符串扩展;
byte[]bytes=ReportViewer1.LocalReport.Render(“PDF”),null,out mimeType,
输出编码、输出扩展、输出流ID、输出警告);
FileStream fs=newfilestream(HttpContext.Current.Server.MapPath(“output.pdf”),
FileMode.Create);
fs.Write(字节,0,字节.长度);
fs.Close();
//打开现有PDF
文档=新文档(页面大小.字母);
PdfReader=newpdfReader(HttpContext.Current.Server.MapPath(“output.pdf”);
//获取新PDF writer的实例
PdfWriter writer=PdfWriter.GetInstance(文档,新文件流(
HttpContext.Current.Server.MapPath(“Print.pdf”)、FileMode.Create);
document.Open();
PdfContentByte cb=writer.DirectContent;
int i=0;
int p=0;
int n=reader.NumberOfPages;
矩形psize=reader.GetPageSize(1);
浮动宽度=psize.宽度;
浮动高度=psize.高度;
//将页面添加到新文档
而(i

是否有其他更快捷的方法使用外部按钮从报表查看器打印报表?

不要生成PDF文件并从中读取。打开文件进行写入时,文件将被锁定,其他用户将无法访问。在多用户环境中,这是非常不安全的,除非您为每个报表实例创建一个唯一的目录或文件名(这也很糟糕,因为它将不可避免地使您的文件系统充满孤立的报表,或者您必须处理临时目录权限等有趣的事情)。iTextSharp支持渲染到MemoryStream,MemoryStream可用于生成字节数组,而字节数组又可流式传输到浏览器

使用来自的memorystream的示例

编辑

此代码:

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

然后就让剩下的代码保持不变?

不要生成PDF文件并从中读取。打开文件进行写入时,文件将被锁定,其他用户将无法访问。在多用户环境中,这是非常不安全的,除非您为每个报表实例创建一个唯一的目录或文件名(这也很糟糕,因为它将不可避免地使您的文件系统充满孤立的报表,或者您必须处理临时目录权限等有趣的事情)。iTextSharp支持渲染到MemoryStream,MemoryStream可用于生成字节数组,而字节数组又可流式传输到浏览器

使用来自的memorystream的示例

编辑

此代码:

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

然后让剩下的代码保持不变?

但是如何设置内存流来读取reportviewer的字节呢?这是否意味着他们的客户需要安装acrobat??如果客户端不使用pdf,如果我可以将内容从内存流式传输到web表单上,那就太好了。但是如何设置内存流来读取reportviewer的字节呢?这是否意味着他们的客户需要安装acrobat??如果客户端不使用pdf,如果我可以将内容从内存流式传输到web表单上,那就太好了