使用iTextSharp生成的PDF在关闭时总是提示保存更改.并且在使用非acrobat PDF阅读器查看时出现缺页

本文关键字:PDF acrobat 缺页 保存更改 iTextSharp 使用 提示 | 更新日期: 2023-09-27 18:12:30

我最近使用iTextSharp从现有的PDF中导入20页,然后在最后一页的底部添加一个动态生成的链接,从而创建了一个PDF。它工作得很好……种。在windows PC上的Acrobat Reader中查看生成的PDF,显示的一切都与预期一样,尽管在关闭文档时它总是问"是否要保存更改?"在带有PDF阅读器的Surface Pro上查看生成的PDF,显示的是没有第一页和最后一页的文档。显然,在使用Polaris Office的移动设备上,第一页和最后一页也不见了。

我想知道当新的PDF生成时,它是否没有完全关闭,这就是为什么它在关闭它时询问"您想要保存更改吗?"也许这也是为什么它在一些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生成的pdf在关闭时导致保存对话框
使用iTextSharp将数据写入PDF工作得很好,但是Acrobat Reader会问'关闭文件时(或者它们指的是内存流,而不是写入磁盘等)

我的问题是,我如何修改上述内容,以便在acrobatreader中关闭生成的PDF时没有"是否要保存更改?"提示。这个问题的答案可能会解决Surface Pro上缺页等问题,但如果你知道其他可能导致的问题,我想听听。

欢迎提出任何建议!谢谢!

使用iTextSharp生成的PDF在关闭时总是提示保存更改.并且在使用非acrobat PDF阅读器查看时出现缺页

乍一看(没有太多的咖啡),似乎你在三个不同的上下文中使用PdfReader,作为PdfStamper的源,作为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)){
        }
    }
}

因为它为你做了所有的克隆,所以你不需要导入页面或任何东西。

然后,如果你想做的唯一一件事就是在最后一页添加一些文本,你可以使用上面的方法,并使用GetOverContent()PdfStamper询问PdfContentByte,并告诉它你感兴趣的页码。然后,您可以使用ColumnText逻辑的其余部分。

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)) {
            //Get a PdfContentByte object
            var cb = stamper.GetOverContent(reader.NumberOfPages);
            //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();
        }
    }
}