AlbertzZZ 发表于 2025-9-24 14:11:24

关于word转PDF后带书签的问题

大佬们,刚接触c#开发,问题可能有点low...
现在有个需求是word转pdf后要求生成与目录一致的导航栏(书签),于是就费劲巴拉的加,最后是word中有导航栏了,但是pdf中却没有
dev版本是V21.2,也在线上找了一些文章,最后加了个方法,但是还是PDF书签,被恶心一天了,现在看看各位有没有对应的解决方法;
附上我加的代码

      private void ConfigurePdfBookmarks(WordHelper helper)
      {
            if (helper == null)
                return;

            var documentServer = helper.GetRichEditDocumentServer();
            if (documentServer == null)
                return;

            var bookmarkOptions = documentServer.Options.Bookmarks;
            bookmarkOptions.Visibility = RichEditBookmarkVisibility.Visible;
            bookmarkOptions.DisplayBookmarksInPdfNavigationPane = PdfBookmarkDisplayMode.All;
            bookmarkOptions.DisplayUnreferencedPdfBookmarks = true;
      }

AlbertzZZ 发表于 2025-9-24 16:25:34

现在采取了一个最粗暴的方法,在生成pdf后在强行打上书签的做法,有没有别的写法啊,实在是不美观
代码贴出来
    private void ExportPdfWithBookmarks(DevExpress.XtraRichEdit.RichEditDocumentServer server, string targetPdfPath, PdfExportOptions options)
    {
      if (server == null || string.IsNullOrWhiteSpace(targetPdfPath))
            return;

      var document = server.Document;
      if (document == null)
      {
            server.ExportToPdf(targetPdfPath, options);
            return;
      }

      var layout = server.DocumentLayout;
      layout?.GetFormattedPageCount();

      var bookmarkInfos = new List<(string Title, int PageIndex, float Top)>();
      if (layout != null)
      {
            foreach (Bookmark bookmark in document.Bookmarks)
            {
                if (!bookmark.Name.StartsWith(PdfBookmarkPrefix, StringComparison.OrdinalIgnoreCase))
                  continue;

                var textValue = document.GetText(bookmark.Range).Trim();
                if (string.IsNullOrEmpty(textValue))
                  continue;

                var layoutElement = layout.GetElement(bookmark.Range.Start, LayoutType.ParagraphMarkBox);
                if (layoutElement == null)
                  continue;

                var pageIndex = layout.GetPageIndex(layoutElement);
                if (pageIndex < 0)
                  continue;

                var bounds = layoutElement.Bounds;
                var topPoint = (float)bounds.Top;
                bookmarkInfos.Add((textValue, pageIndex, topPoint));
            }
      }

      var tempFilePath = Path.Combine(Path.GetTempPath(), Guid.NewGuid().ToString("N") + ".pdf");

      try
      {
            server.ExportToPdf(tempFilePath, options);

            if (bookmarkInfos.Count == 0)
            {
                File.Copy(tempFilePath, targetPdfPath, true);
                return;
            }

            using (var processor = new PdfDocumentProcessor())
            {
                processor.LoadDocument(tempFilePath);
                var pdfDocument = processor.Document;
                var pdfBookmarks = pdfDocument.Bookmarks;
                pdfBookmarks.Clear();

                foreach (var info in bookmarkInfos)
                {
                  if (pdfDocument.Pages.Count == 0)
                        break;

                  var pageIndex = Math.Min(Math.Max(info.PageIndex, 0), pdfDocument.Pages.Count - 1);
                  var page = pdfDocument.Pages;
                  var pageTop = page.CropBox.Top;
                  var pageBottom = page.CropBox.Bottom;
                  var topOffset = Math.Max(pageBottom, Math.Min(info.Top, pageTop));
                  var destination = processor.CreateDestination(pageIndex + 1, (float)topOffset);
                  var pdfBookmark = new PdfBookmark
                  {
                        Title = info.Title,
                        Destination = destination
                  };

                  pdfBookmarks.Add(pdfBookmark);
                }

                processor.SaveDocument(targetPdfPath);
            }
      }
      finally
      {
            if (File.Exists(tempFilePath))
                File.Delete(tempFilePath);
      }
    }

}
页: [1]
查看完整版本: 关于word转PDF后带书签的问题