【问题标题】:Save PdfCopy with MemoryStream使用 MemoryStream 保存 PdfCopy
【发布时间】:2011-09-07 18:17:41
【问题描述】:

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

我遇到的主要问题是我无法保存或显示结果。在我之前的所有项目中,我都使用了 memorystream,但现在使用 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();
        }
    }

【问题讨论】:

  • PdfCopy 仅支持使用AddPage 添加内容,您需要使用PdfWriter 并使用PdfReader 导入页面。
  • 我按照你告诉我的 Lazarus 做了什么,但这对我也没有帮助。那时我发现页面上有 2 个更新面板,一个来自母版页,一个来自页面本身。这些面板具有相同的名称。一旦我删除了页面上的那个,一切都被修复了。

标签: c# asp.net itextsharp


【解决方案1】:

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

你们对 pdfcopy 的看法也是对的,我将其更改为作家,现在一切正常。

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-11-07
      • 1970-01-01
      • 2012-01-29
      • 2014-06-09
      • 1970-01-01
      • 2011-05-15
      • 1970-01-01
      相关资源
      最近更新 更多