C# 如何将书签添加到PDF文件?

C# 如何将书签添加到PDF文件?,c#,pdf,itextsharp,C#,Pdf,Itextsharp,我使用itextsharp创建了4个pdf模板文件,我添加了值,并将4个pdf文件合并/添加到一个文档中,因此所有4个页面都在一个pdf文件名下。现在我想将书签添加到我的pdf文件中。有什么方法可以在C#中实现吗?为了更好地理解,请参考下面的图片 您好,这就是我正在尝试做的,我没有得到任何错误,但我的pdf中仍然没有书签,我想添加带有4个部分的书签,如图所示。合并后,我想将书签添加到最终的pdf中 enter code herepublic string MergePDFs() {

我使用itextsharp创建了4个pdf模板文件,我添加了值,并将4个pdf文件合并/添加到一个文档中,因此所有4个页面都在一个pdf文件名下。现在我想将书签添加到我的pdf文件中。有什么方法可以在C#中实现吗?为了更好地理解,请参考下面的图片

您好,这就是我正在尝试做的,我没有得到任何错误,但我的pdf中仍然没有书签,我想添加带有4个部分的书签,如图所示。合并后,我想将书签添加到最终的pdf中

enter code herepublic string MergePDFs()
    {
        string outPutFilePath = @"D:\jeldsbre.pdf";
        string genereatedpdfs = @"D:\genereatedpdfs";

        using (FileStream stream = new FileStream(outPutFilePath, FileMode.Create))
        {
            Document pdfDoc = new Document(PageSize.A4);
            PdfCopy pdf = new PdfCopy(pdfDoc, stream);
            pdf.SetMergeFields();
            pdfDoc.Open();
            var files = Directory.GetFiles(genereatedpdfs);
            Console.WriteLine("Merging files count: " + files.Length);
            int i = 1;
            foreach (string file in files)
            {
                Console.WriteLine(i + ". Adding: " + file);
                pdf.AddDocument(new PdfReader(file));

                i++;
            }
          List<Dictionary<string, object>> bookmarks = new List<Dictionary<string, object>>();
            IList<Dictionary<string, object>> tempBookmarks =  new List<Dictionary<string, object>>();
            SimpleBookmark.ShiftPageNumbers(tempBookmarks, 1, null);
            bookmarks.AddRange(tempBookmarks);
            SimpleBookmark.ShiftPageNumbers(tempBookmarks, 3, null);
           bookmarks.AddRange(tempBookmarks);
           pdf.Outlines = bookmarks;
           if (pdfDoc != null)
                pdfDoc.Close();
            string base64 = GetBase64(outPutFilePath);
            return base64;
        }               

    }
在此输入代码公共字符串MergePDFs()
{
字符串outPutFilePath=@“D:\jeldsbre.pdf”;
字符串GeneratedPDFS=@“D:\GeneratedPDFS”;
使用(FileStream-stream=newfilestream(outPutFilePath,FileMode.Create))
{
文档pdfDoc=新文档(页面大小为A4);
PdfCopy pdf=新的PdfCopy(pdfDoc,流);
pdf.SetMergeFields();
pdfDoc.Open();
var files=Directory.GetFiles(generateadpdfs);
Console.WriteLine(“合并文件计数:“+files.Length”);
int i=1;
foreach(文件中的字符串文件)
{
Console.WriteLine(i+”。添加:“+文件);
pdf.AddDocument(新pdf阅读器(文件));
i++;
}
列表书签=新列表();
IList tempBookmarks=新列表();
SimpleBookmark.ShiftPageNumbers(tempBookmarks,1,null);
bookmarks.AddRange(临时书签);
SimpleBookmark.ShiftPageNumbers(tempBookmarks,3,null);
bookmarks.AddRange(临时书签);
pdf.Outlines=书签;
如果(pdfDoc!=null)
pdfDoc.Close();
字符串base64=GetBase64(outPutFilePath);
返回base64;
}               
}

假设您的原始PDF已经有书签,那么您不仅应该连接文档(使用
PdfCopy
类),还应该连接不同文件的不同书签结构(使用
SimpleBookMark
类),不要忘记要考虑到你需要正确地移动页码

这是在我的书的第7章中的示例中完成的:

// Create a list for the bookmarks
ArrayList<HashMap<String, Object>> bookmarks = new ArrayList<HashMap<String, Object>>();
List<HashMap<String, Object>> tmp;
for (int i  = 0; i < src.length; i++) {
    reader = new PdfReader(src[i]);
    // merge the bookmarks
    tmp = SimpleBookmark.getBookmark(reader);
    SimpleBookmark.shiftPageNumbers(tmp, page_offset, null);
    bookmarks.addAll(tmp);
    // add the pages
    n = reader.getNumberOfPages();
    page_offset += n;
    for (int page = 0; page < n; ) {
        copy.addPage(copy.getImportedPage(reader, ++page));
    }
    copy.freeReader(reader);
    reader.close();
}
// Add the merged bookmarks
copy.setOutlines(bookmarks);
//创建书签列表
ArrayList bookmarks=新建ArrayList();
列出tmp;
对于(int i=0;i
对于此示例的C#版本,请查看相应的iTextSharp示例:

// 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;
//创建书签列表
列表书签=
新列表();
对于(int i=0;i

如果现有文档没有任何书签(或者如果您不想复制任何现有文档),那么您的问题与我半年前回答的问题是重复的:

这个问题听起来可能是重复的,唯一的区别是这个问题与iTextSharp/C有关(但答案几乎相同,因为iText和iTextSharp之间几乎没有什么区别)谢谢……我将遵循这一点,并向您提供最新信息。我还提供了“完整”的答案(Java和C),但该答案假设现有文档已经有书签。(您的问题不清楚是否是这样。)您好@BrunoLowagie请查看我的代码并给出您的评论如果您希望我现在对您的代码发表评论,您将不会喜欢我所说的。为了避免这种情况,请扔掉您的代码。出去散散步。一旦您头脑清醒,请阅读并重新开始。