使用MemoryStream保存PdfCopy

时间:2011-06-03 11:23:23

标签: c# asp.net itextsharp

所以我在保存pdf时遇到了问题。 我想基于模板创建库存,模板没有acrofields。 该模板包含公司徽标和一些数据,如地址。 我要做的是从模板中复制页面,将其粘贴到新文档中,然后向其中添加一个表格(带有库存的表格)。

我遇到的主要问题是我无法保存或显示结果。在我的所有上一个项目中,我使用了内存流,但现在使用pdfCopy而不是pdfWriter时,这种方法似乎不起作用。

有人能帮帮我吗?这是我的代码。

public void PrintInventory(string path, MemoryStream ms) 
{ 
        VoorraadService vService = new VoorraadService(); 

        PdfReader reader; 
        Document document; 
        PdfCopy copy; 

        try 
        { 
            var stock = vService.GetInventaris(); 
            reader = new PdfReader(path + "Images/Inventaris_Template.pdf"); 
            document = new Document(reader.GetPageSizeWithRotation(1)); 
            copy = new PdfCopy(document, ms); 

            document.Open(); 

            while(stock.Count >0) 
            { 
                copy.AddPage(copy.GetImportedPage(reader, 1)); 

                PdfPTable table = new PdfPTable(6); 
                table.WidthPercentage = 100; 
                for (int i = 0; i < 15 && stock.Count > 0; i++) 
                { 
                    table.AddCell(new Phrase(stock[0].ArtikelID)); 
                    table.AddCell(new Phrase(stock[0].ExternArtikelID)); 
                    table.AddCell(new Phrase(stock[0].Naam)); 
                    table.AddCell(new Phrase(stock[0].Aankoopprijs.ToString())); 
                    table.AddCell(new Phrase(stock[0].Aantal.ToString())); 
                    table.AddCell(new Phrase(stock[0].Totaal.ToString())); 
                    stock.Remove(stock[0]); 
                } 
                table.CompleteRow(); 
                copy.Add(table);         
            } 
            document.Close(); 
            reader.Close(); 
        } 
        catch (Exception e) 
        { return; }
}             

打印按钮上的事件:

 protected void btnPrinten_Click(object sender, EventArgs e)
    {
        using (MemoryStream ms = new MemoryStream())
        {
            ms.Position = 0;
            PdfGenerator pdf = new PdfGenerator();
            pdf.PrintInventory(Request.Url.OriginalString.Replace("Applicatie/Voorraad/Inventory.aspx", ""), ms);

            Response.ContentType = "application/pdf";
            Response.OutputStream.Write(ms.GetBuffer(), 0, ms.GetBuffer().Length);
            Response.OutputStream.Flush();
            Response.OutputStream.Close();
        }
    }

2 个答案:

答案 0 :(得分:0)

您需要将MemoryStream写入文件。您可以开始使用文件流。

PS:copy.close()也将关闭它创建的流。

PPS:我不太确定你可以将表/段落等添加到PdfCopy实例中。我怀疑你必须使用PdfWriter正常构建PDF,保存它(保存到内存流),然后再用另一个读取器将其重新打开以将其添加到PdfCopy中。

您希望原始页面和表格位于同一页面上还是不同页面上?

答案 1 :(得分:0)

问题现在解决了。 我的主要问题是我的Updatepanel,因为printbutton没有导致真正的回发,所以无法完成文件的保存。 这就是我按下按钮时没有得到任何结果的原因。 现在我在updatepanel中将它用作回发触发器,所有问题都解决了。

你们对pdfcopy的看法也是正确的我把它改成了作家,现在一切都按照应有的方式进行。