使用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上缺页等问题,但如果你知道其他可能导致的问题,我想听听。
欢迎提出任何建议!谢谢!
乍一看(没有太多的咖啡),似乎你在三个不同的上下文中使用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();
}
}
}