背景
我有一个java程序,它使用itext 5分析数据并创建一个pdf报告。
我最近不得不在文档开头添加主要问题的摘要,这样用户就不必阅读超过一百页来查找问题。只有在连续查看数据时才会发现问题。
我通过创建3个pdf文档然后合并它们,开始/标题pdf,问题摘要pdf以及正文或分析pdf来解决问题。 (基本上在我想插入摘要的位置拆分原始文档)
我使用PdfReader和PdfCopy来组合文档。我能够保持章节书签的确定。
问题
当我遇到重大问题时,我将其添加到“摘要”文档中。我想在摘要中添加一个链接以指出正文中的问题。
我尝试使用Chunk.setLocalDestination和setLocalGoto但是意识到为什么不起作用,所以我尝试使用setLocalDestination和setRemoteGoto(有和没有'file://'),但这也不起作用。 (另外,我在RemoteGoto中使用了最终的pdf文档名称,而不是临时的pdf文档名称。)
我不想使用书签,因为这看起来不对,看起来不对。
我希望有人可以提出替代方法或提出建议。
回顾一下,在我当前的代码中,创建一个带有setLocalDestination的块,该块进入'body'文档。同时我创建了一个setRemoteGoto,它被放入摘要文档中。我希望当它们合并时链接可以工作,但是当点击链接时,你会转到合并文档的第一页。
感谢.....
PS我在动作书中都有iText
澄清3/5/2014
我所谓的'书签'实际上是章节类实体,它们在创建时插入到3个文档的各个部分中。
保存3个文档后,PdfReader用于打开每个文档,PdfCopy用于将它们放入新的最终文档中。
我从章节中获取数据,该数据在用户使用的Pdf阅读器的左侧创建“书签”,例如: Acrobat Reader。
int thisPdfPages = reader.getNumberOfPages();
reader.consolidateNamedDestinations();
java.util.List<HashMap<String, Object>> bookmarks = SimpleBookmark.getBookmark(reader);
if (bookmarks != null) {
if (pageOffset != 0) {
if (debug3) auditLogger.log("Shifting pages by " + pageOffset );
SimpleBookmark.shiftPageNumbers(bookmarks, pageOffset, null);
}
masterBookmarks.addAll(bookmarks);
}
for (int i = 0; i < thisPdfPages;) {
page = copy.getImportedPage(reader, ++i);
stamp = copy.createPageStamp(page);
// add page numbers
ColumnText.showTextAligned(stamp.getUnderContent(), Element.ALIGN_CENTER, new Phrase(String.format("page %d of %d", start + i, totalPages)), 297.5f, 28, 0);
stamp.alterContents();
copy.addPage(page);
}
PRAcroForm form = reader.getAcroForm();
if (form != null) {
copy.copyAcroForm(reader);
}
在分析数据时,我打开了2个文档,一个包含所有详细信息的基本文档和一个包含超过某些阈值的重要事件的摘要文档。
//NOTE section is part of the 'body' document
//NOTE summaryPhrase is a part of the 'summary' document
String linkName = "summaryPf_" + networkid ;
//create Link target
section.add(new Chunk("CHANGE TO EMPTY STRING WHEN WORKING").setLocalDestination( linkName ));
//create Link
Chunk linkChunk = new Chunk( "[Link] " );
Font linkFont = new Font( regularFont );
linkFont.setColor(BaseColor.BLUE);
linkFont.setStyle( Font.UNDERLINE );
linkChunk.setFont( linkFont );
boolean useLocal = true;
// both local and remote goto's fail
if (useLocal) {
linkChunk.setLocalGoto( linkName);
} else {
// all permutations of setting filename fail,
// but it does bring up a permissions dialog when the link is clicked.
//String remotePdfName = "file://./" + pdfReportName ;
//String remotePdfName = "file://" + pdfReportName ;
//String remotePdfName = "file:" + pdfReportName ;
String remotePdfName = pdfReportName ;
linkChunk.setRemoteGoto( remotePdfName, linkName);
}
// add link to summary document
summaryPhrase.add( linkChunk );
summaryPhrase.add( String.format("There were %d devices with ping failures", summaryCount));
summaryPhrase.add( Chunk.NEWLINE );
}
如果我使用setLocalGoto,当您点击最终文档中的链接时,您将转到第一页。
如果我使用setRemoteGoto,则会出现一个对话框,要求获取文档的权限,但文档无法打开,尝试对文件名进行多次排列。