iTextSharp目录(TOC)更新
本文关键字:更新 TOC 目录 iTextSharp | 更新日期: 2023-09-27 17:52:37
我一直没能找到问题的答案。我想知道是否有可能更新目录中每个项目的页面链接。
请注意,问题是更新TOC上的链接,而不是书签。
从我目前所读到的内容来看,这是一个困难的过程,需要至少一周的编程工作。由于这不是通过iTextSharp轻易实现的。
-
我有第一个5页的pdf。第一页是目录。
-
我有第二个pdf,共6页。第一页是目录。
-
我想合并这两份文件。
-
TOC页面位于合并文档的顶部。
-
使用新页面的链接引用更新目录中的每个项目。因此,当你点击它时,它会把你带到它应该在合并文档中的位置。
这在《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
我不知道这是否能解决你的问题。您谈论的是"链接引用更新",但这可能意味着不同的东西(命名目的地、明确目的地、操作(。