我还没能找到问题的答案。我想知道是否可以更新TOC每个项目的页面链接。
请注意,问题是更新TOC上的链接,而不是书签。
从我到目前为止阅读的内容来看,这是一个艰难的过程,需要至少一周的编程工作。由于这不容易通过iTextSharp实现。
我的第一个pdf有5页。第一页是TOC。
我有6页的第二个pdf。第一页是TOC。
我想合并这两个文件。
TOC页面位于合并文档的顶部。
使用对新页面的链接引用更新TOC中的每个项目。因此,当您单击它时,它会将您带到合并文档中的位置。
答案 0 :(得分:1)
“iText in Action - Second Edition”一书对此进行了解释。如果您没有该书的副本,则应该查看这些示例,更具体地说,请参阅ConcatenateBookmarks示例。
我看到您使用C#标记标记了问题,因此我将复制C#示例,而不是复制/粘贴Java示例。 src
是带有PDF文档的List
字节数组。
public byte[] ManipulatePdf(List<byte[]> src) {
using (MemoryStream ms = new MemoryStream()) {
// step 1
using (Document document = new Document()) {
// step 2
using (PdfCopy copy = new PdfCopy(document, ms)) {
// step 3
document.Open();
// step 4
int page_offset = 0;
// Create a list for the bookmarks
List<Dictionary<String, Object>> bookmarks =
new List<Dictionary<String, Object>>();
for (int i = 0; i < src.Count; i++) {
PdfReader reader = new PdfReader(src[i]);
// merge the bookmarks
IList<Dictionary<String, Object>> tmp =
SimpleBookmark.GetBookmark(reader);
SimpleBookmark.ShiftPageNumbers(tmp, page_offset, null);
foreach (var d in tmp) bookmarks.Add(d);
// add the pages
int n = reader.NumberOfPages;
page_offset += n;
for (int page = 0; page < n; ) {
copy.AddPage(copy.GetImportedPage(reader, ++page));
}
}
// Add the merged bookmarks
copy.Outlines = bookmarks;
}
}
return ms.ToArray();
}
}
<强>更新强>
如果问题是关于不同类型的TOC,那么您需要查看ConcatenateNamedDestinations示例。
在这种情况下,我们使用命名目的地从一个文档到另一个文档的链接。在这种情况下,我们需要ConsolidateNamedDestinations()
和MakeRemoteNamedDestinationsLocal()
。可以在此处找到此示例的C#版本:ConcatenateNamedDestinations.cs
我不知道这是否能解决你的问题。您谈到“链接参考更新”,但这可能意味着不同的事情(命名目的地,显式目的地,行动)。