如何在iText 7中从PDF大纲/书签获取矩形、适配类型等属性
用iText 7提取PDF书签的视图属性(矩形、适配类型、缩放、页码)
我完全懂你的困扰——用iText 7创建书签时PdfExplicitDestination.CreateXYZ这类方法用得顺手,但反过来提取已有书签的视图属性,确实得绕个弯,因为PdfOutline本身不会直接把这些细节摆到台面上。下面给你一步步拆解解决方案:
核心思路:从PdfOutline挖到PdfExplicitDestination
每个书签的视图目标其实藏在PdfOutline关联的PdfDestination对象里,而我们需要的矩形、缩放等属性,只有**显式目标(PdfExplicitDestination)**才会包含。所以第一步就是先判断目标类型,再针对性提取参数。
具体实现代码示例(C#)
using iText.Kernel.Pdf; using iText.Kernel.Pdf.Action; using iText.Kernel.Pdf.Navigation; PdfDocument pdfDoc = new PdfDocument(new PdfReader("your-input.pdf")); PdfOutline rootOutline = pdfDoc.GetOutlines(true); // 递归遍历所有层级的书签 TraverseBookmarks(rootOutline); void TraverseBookmarks(PdfOutline outline) { if (outline.GetDestination() != null) { PdfDestination dest = outline.GetDestination(); // 只处理显式跳转目标(跳过外部链接等动作类书签) if (dest is PdfExplicitDestination explicitDest) { // 1. 获取页码 int pageNum = explicitDest.GetPage().GetPageNumber(); Console.WriteLine($"书签标题: {outline.GetTitle()} | 目标页码: {pageNum}"); // 2. 获取适配类型(比如XYZ、Fit、FitH等) PdfName destType = explicitDest.GetType(); Console.WriteLine($"适配类型: {destType.ToString()}"); // 3. 根据适配类型解析对应的参数(矩形、缩放等) PdfArray parameters = explicitDest.GetParameters(); switch (destType) { case PdfName.XYZ: float left = parameters.GetAsNumber(0).FloatValue(); float top = parameters.GetAsNumber(1).FloatValue(); float zoom = parameters.GetAsNumber(2).FloatValue(); Console.WriteLine($"XYZ参数: 左边界={left}, 上边界={top}, 缩放比例={zoom}\n"); break; case PdfName.FitR: // FitR对应一个矩形区域,参数顺序是左、下、右、上 float rectLeft = parameters.GetAsNumber(0).FloatValue(); float rectBottom = parameters.GetAsNumber(1).FloatValue(); float rectRight = parameters.GetAsNumber(2).FloatValue(); float rectTop = parameters.GetAsNumber(3).FloatValue(); Console.WriteLine($"FitR矩形区域: 左={rectLeft}, 下={rectBottom}, 右={rectRight}, 上={rectTop}\n"); break; case PdfName.FitH: float topY = parameters.GetAsNumber(0).FloatValue(); Console.WriteLine($"FitH参数: 页面顶部对齐坐标={topY}\n"); break; case PdfName.Fit: Console.WriteLine("Fit类型: 适配整个页面显示\n"); break; // 其他适配类型(FitV、FitB等)可以参照上面的逻辑扩展 } } } // 递归处理子书签 foreach (PdfOutline child in outline.GetAllChildren()) { TraverseBookmarks(child); } } pdfDoc.Close();
关键细节提醒
- 不是所有书签都是显式跳转:有些书签是动作(比如跳转到外部URL、执行JS),这类需要通过
outline.GetAction()判断,但如果你的需求只关注PDF内部的视图属性,只处理PdfExplicitDestination即可。 - 参数的含义要对应PDF规范:比如XYZ类型的第三个参数为0时,表示保持当前缩放比例;FitR的四个参数严格对应矩形的左、下、右、上坐标。
内容的提问来源于stack exchange,提问作者Speed
相关产品推荐
相关产品推荐

