2013-04-22 114 views
1

我有一个pdf模板,我想为数据库中的每个记录生成。 我发现这个,但它只适用于物理文件。如何使这项工作只在内存中? 我尝试使用MemoryStream的,但我不能与PdfReaderitextsharp multipage pdf格式

阅读本
using iTextSharp.text.pdf; 
using System; 
using System.IO; 

public partial class Default2 : System.Web.UI.Page 
{ 
    protected void Page_Load(object sender, EventArgs e) 
    { 

    } 
    protected void Button1_Click(object sender, EventArgs e) 
    { 
     string uniqueidstr = Guid.NewGuid().ToString(); 

     string file = Server.MapPath("~/Reports/PrimaVisita.pdf"); 

     string MasterPdfFile = Server.MapPath("./MstrCopyFile" + uniqueidstr + ".pdf").ToString(); 

     PdfCopyFields copy = new PdfCopyFields(new FileStream(MasterPdfFile, FileMode.CreateNew)); 

     for (int i = 0; i < 10; i++) 
     { 
      PdfReader tmpReader = new PdfReader(file); 
      string tmpfilepath = Server.MapPath("./tmpFile" + uniqueidstr + i.ToString() + ".pdf").ToString(); 

      FileStream tmpOutFileStream = new FileStream(tmpfilepath, FileMode.CreateNew); 
      PdfStamper tmpOutStamper = new PdfStamper(tmpReader, tmpOutFileStream); 
      AcroFields fields = tmpOutStamper.AcroFields; 
      fields.SetField("Cognome", "pippo" + i.ToString()); 
      fields.SetField("Nome", "pluto" + i.ToString()); 
      fields.SetField("DatiNascita", "paperino" + i.ToString()); 
      fields.SetField("Residenza", "topolino" + i.ToString()); 

      tmpOutStamper.Writer.CloseStream = false; 
      tmpOutStamper.FormFlattening = true; 
      tmpOutStamper.Close(); 
      tmpOutFileStream.Close(); 

      PdfReader nwPgReader = new PdfReader(tmpfilepath); 

      copy.AddDocument(nwPgReader); 
     } 

     copy.Close(); 
    } 
} 

错误是“没有找到PDF头标识。” 这里是代码

protected void Button1_Click(object sender, EventArgs e) 
    { 
     string uniqueidstr = Guid.NewGuid().ToString(); 

     string file = Server.MapPath("~/Reports/PrimaVisita.pdf"); 

     MemoryStream masterStream = new MemoryStream(); 
     //string MasterPdfFile = Server.MapPath("./MstrCopyFile" + uniqueidstr + ".pdf").ToString(); 

     PdfCopyFields copy = new PdfCopyFields(masterStream); 

     for (int i = 0; i < 10; i++) 
     { 
      PdfReader tmpReader = new PdfReader(file); 
      string tmpfilepath = Server.MapPath("./tmpFile" + uniqueidstr + i.ToString() + ".pdf").ToString(); 
      MemoryStream tmpStream = new MemoryStream(); 

      //FileStream tmpOutFileStream = new FileStream(tmpfilepath, FileMode.CreateNew); 
      PdfStamper tmpOutStamper = new PdfStamper(tmpReader, tmpStream); 
      AcroFields fields = tmpOutStamper.AcroFields; 
      fields.SetField("Cognome", "pippo" + i.ToString()); 
      fields.SetField("Nome", "pluto" + i.ToString()); 
      fields.SetField("DatiNascita", "paperino" + i.ToString()); 
      fields.SetField("Residenza", "topolino" + i.ToString()); 

      tmpOutStamper.Writer.CloseStream = false; 
      tmpOutStamper.FormFlattening = true; 
      tmpOutStamper.Close(); 
      //tmpOutFileStream.Close(); 

      PdfReader nwPgReader = new PdfReader(tmpStream); 

      copy.AddDocument(nwPgReader); 
     } 

     copy.Close(); 
    } 
+0

你说*我试图用MemoryStream的,但我不能与PdfReader * ---当你尝试过什么事阅读本? – mkl 2013-04-22 10:20:58

+0

坦克的答复有一个关于pdf标题的错误 – Bruno 2013-04-22 10:40:51

+0

这听起来像'MemoryStream'有一个不正确的位置阅读。请将您使用的代码添加到您的问题中。 – mkl 2013-04-22 11:49:16

回答

1

我在字节数组转换MemoryStream的解决,现在它的工作原理。

坦克的支持

布鲁诺

protected void Button1_Click(object sender, EventArgs e) 
    { 
     string uniqueidstr = Guid.NewGuid().ToString(); 

     string file = Server.MapPath("~/Reports/PrimaVisita.pdf"); 

     MemoryStream masterStream = new MemoryStream(); 

     PdfCopyFields copy = new PdfCopyFields(masterStream); 

     for (int i = 0; i < 10; i++) 
     { 
      PdfReader tmpReader = new PdfReader(file); 
      MemoryStream tmpStream = new MemoryStream(); 
      tmpStream.Position = 0; 

      PdfStamper tmpOutStamper = new PdfStamper(tmpReader, tmpStream); 
      AcroFields fields = tmpOutStamper.AcroFields; 
      fields.SetField("Cognome", "pippo" + i.ToString()); 
      fields.SetField("Nome", "pluto" + i.ToString()); 
      fields.SetField("DatiNascita", "paperino" + i.ToString()); 
      fields.SetField("Residenza", "topolino" + i.ToString()); 

      tmpOutStamper.Writer.CloseStream = false; 
      tmpOutStamper.FormFlattening = true; 
      tmpOutStamper.Close(); 
      byte[] buf = tmpStream.ToArray(); 

      PdfReader nwPgReader = new PdfReader(buf); 

      copy.AddDocument(nwPgReader); 
     } 

     copy.Close(); 


}