使用MemoryStream保存PdfCopy

本文关键字:PdfCopy 保存 MemoryStream 使用 | 更新日期: 2023-09-27 17:58:16

所以我在保存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();
        }
    }

使用MemoryStream保存PdfCopy

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

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

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

您希望原始页面和表在同一页面上,还是不同的页面上?

现在问题解决了。我的主要问题是我的Updatepanel,因为打印按钮没有引起真正的回发,所以无法完成文件的保存。这就是为什么我按下按钮时没有得到任何结果。现在我在更新面板中将它用作回发触发器,所有问题都解决了。

你们对pdfcopy的看法也是正确的,我把它改成了一个作家,现在一切都正常了。