使用iTextSharp生成的PDF始终会提示在关闭时保存更改。使用非Acrobat PDF阅读器查看时缺少页面

时间:2015-09-13 21:54:19

标签: c# pdf pdf-generation itextsharp

我最近使用iTextSharp通过从现有PDF导入20个页面然后将动态生成的链接添加到最后一页的底部来创建PDF。它很好......有点儿。在Windows PC上在Acrobat Reader中查看生成的PDF会按预期显示所有内容,但在关闭文档时它始终会询问"是否要保存更改?"。使用PDF Reader在Surface Pro上查看生成的PDF将显示没有第一页和最后一页的文档。显然,在使用Polaris Office的移动设备上,第一页和最后一页也不见了。

我想知道是否在生成新PDF时,它没有完全正常关闭,这就是为什么它要求"你想保存更改吗?&#34 ;关闭时。也许这也是为什么它在某些PDF阅读器应用程序中无法正确显示的原因。

以下是代码:

    using (var reader = new PdfReader(HostingEnvironment.MapPath("~/app/pdf/OriginalDoc.pdf")))
    {


        using (
            var fileStream =
                new FileStream(
                    HostingEnvironment.MapPath("~/documents/attachments/DocWithLink_" + id + ".pdf"),
                    FileMode.Create, FileAccess.Write))
        {
            var document = new Document(reader.GetPageSizeWithRotation(1));
            var writer = PdfWriter.GetInstance(document, fileStream);

            using (PdfStamper stamper = new PdfStamper(reader, fileStream))
            {
                var baseFont = BaseFont.CreateFont(BaseFont.HELVETICA_BOLD, BaseFont.CP1252,
                    BaseFont.NOT_EMBEDDED);
                Font linkFont = FontFactory.GetFont("Arial", 12, Font.UNDERLINE, BaseColor.BLUE);
                document.Open();

                for (var i = 1; i <= reader.NumberOfPages; i++)
                {
                    document.NewPage();

                    var importedPage = writer.GetImportedPage(reader, i);
                    // Copy page of original document to new document.

                    var contentByte = writer.DirectContent;
                    contentByte.AddTemplate(importedPage, 0, 0);

                    if (i == reader.NumberOfPages) // It's the last page so add link.
                    {
                        PdfContentByte cb = stamper.GetOverContent(i);

                        //Create a ColumnText object
                        var ct = new ColumnText(cb);
                        //Set the rectangle to write to
                        ct.SetSimpleColumn(100, 30, 500, 90, 0, PdfContentByte.ALIGN_LEFT);

                        //Add some text and make it blue so that it looks like a hyperlink
                        var c = new Chunk("Click here!", linkFont);

                        var congrats = new Paragraph("Congratulations on reading the eBook!    ");
                        congrats.Alignment = PdfContentByte.ALIGN_LEFT;

                        c.SetAnchor("http://www.domain.com/pdf/response/" + encryptedId);
                        //Add the chunk to the ColumnText
                        congrats.Add(c);
                        ct.AddElement(congrats);

                        //Tell the system to process the above commands
                        ct.Go();
                    }
                }
            }
        }
    }

我已经查看了类似问题的这些帖子,但似乎没有提供我需要的答案: iTextSharp-generated PDFs cause save dialog when closing
Using iTextSharp to write data to PDF works great, but Acrobat Reader asks 'Do you want to save changes' when closing file (或者他们引用内存流而不是写入磁盘等)

我的问题是,如何修改上述内容,以便在Acrobat Reader中关闭生成的PDF时,没有&#34;您要保存更改吗?&#34;提示。对此的答案可以解决Surface Pro等上缺少页面的问题,但如果您对可能导致的内容有任何其他了解,我也希望了解它。

非常欢迎任何建议!谢谢!

1 个答案:

答案 0 :(得分:3)

乍一看(还没有太多咖啡),您可能会在三个不同的背景中使用PdfReader作为PdfStamper的来源,作为{{1}的来源和导入源。因此,您实际上是将文档导入到您自己也要写入的文档中。

为了快速概述,以下代码将基本上将Document的内容克隆到source.pdf中:

dest.pdf

既然这样就完成了所有克隆工作,您不需要导入页面或任何内容。

然后,如果您要做的唯一事情是在最后一页添加一些文字,您可以使用上述内容并使用using (var reader = new PdfReader("source.pdf")){ using (var fileStream = new FileStream("dest.pdf", FileMode.Create, FileAccess.Write)){ using (PdfStamper stamper = new PdfStamper(reader, fileStream)){ } } } PdfStamper询问PdfContentByte并告诉它你感兴趣的页码。然后,您可以使用其余的GetOverContent()逻辑。

ColumnText