关于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;
}
现在采取了一个最粗暴的方法,在生成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]