关于c#:使用MemoryStream保存PdfCopy

Save PdfCopy with MemoryStream

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

我遇到的主要问题是我无法保存或显示结果。在我以前的所有项目中,我都使用了memoryStream,但现在当使用pdfcopy而不是pdfwritter时,这个方法似乎不起作用。

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
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; }
}

打印按钮上的事件:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
 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();
        }
    }


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

你们也说得对,我把它改成了一个作家,现在一切都正常了。


您需要将内存流写到一个文件中。您可以改为开始使用文件流。

ps:copy.close()还将关闭用它创建的流。

PPS:我不太确定您是否可以将表/段落等添加到pdfcopy实例中。我怀疑你必须用pdwriter正常地构建一个pdf文件,保存它(保存到一个memorystream是好的),然后用另一个阅读器再次打开它备份,把它添加到pdfcopy中。

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