new Bookmark

JS代码片段解析
javascript:void(document.getElementById("cin").value="ccccccccc");
package org.jeecg.modules.manage.util; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.interactive.documentnavigation.outline.PDOutlineItem; import org.apache.pdfbox.rendering.PDFRenderer; import org.ofdrw.core.basicStructure.doc.CT_DocInfo; import org.ofdrw.core.basicStructure.ofd.DocBody; import org.ofdrw.core.basicStructure.ofd.OFD; import org.ofdrw.core.basicStructure.pageTree.Page; import org.ofdrw.core.basicType.ST_Box; import org.ofdrw.core.basicType.ST_ID; import org.ofdrw.core.basicType.ST_RefID; import org.ofdrw.core.pageDescription.CT_PageArea; import org.ofdrw.core.pageDescription.drawParam.PageArea; import org.ofdrw.layout.OFDDoc; import org.ofdrw.layout.element.Img; import org.ofdrw.reader.OFDReader; import java.awt.image.BufferedImage; import java.io.IOException; import java.nio.file.Path; import java.nio.file.Paths; import java.util.ArrayList; import java.util.HashMap; import java.util.List; import java.util.Map; public class PdfToOfdConverter { public static void convertPdfToOfd(String pdfPath, String ofdPath) throws IOException { try (PDDocument pdfDoc = PDDocument.load(Paths.get(pdfPath).toFile())) { // 创建OFD文档 try (OFDDoc ofdDoc = new OFDDoc(Paths.get(ofdPath))) { // 存储页码到OFD页面ID的映射 Map<Integer, ST_ID> pageIdMap = new HashMap<>(); PDFRenderer pdfRenderer = new PDFRenderer(pdfDoc); // 转换每一页PDF for (int i = 0; i < pdfDoc.getNumberOfPages(); i++) { PDPage pdfPage = pdfDoc.getPage(i); // 获取PDF页面尺寸并转换为毫米 double[] size = getPageSize(pdfPage); double width = size[0]; double height = size[1]; // 创建OFD页面并设置尺寸 Page ofdPage = createOfdPage(width, height); // 添加页面并获取页面ID ST_ID pageId = ofdDoc.addPage(ofdPage); pageIdMap.put(i, pageId); // 渲染PDF页面为图片 BufferedImage image = pdfRenderer.renderImageWithDPI(i, 300); // 将图片添加到OFD页面 Img img = new Img(image); img.setPosition(0, 0); img.setSize(width, height); ofdDoc.add(img); } // 提取PDF书签并转换为OFD书签 List<Bookmark> bookmarks = extractBookmarks(pdfDoc, pageIdMap); // 将书签添加到文档元数据 addBookmarksToMetadata(ofdDoc, bookmarks); } } } // 创建OFD页面并正确设置尺寸 private static Page createOfdPage(double width, double height) { // 创建页面区域对象 PageArea physicalArea = new PageArea(); physicalArea.setPhysicalBox(new ST_Box(0, 0, width, height)); // 创建页面描述区域 CT_PageArea pageArea = new CT_PageArea(); pageArea.setPhysicalBox(physicalArea); // 创建OFD页面 Page ofdPage = new Page(); ofdPage.setArea(pageArea); return ofdPage; } // 获取PDF页面尺寸并转换为毫米 private static double[] getPageSize(PDPage page) { // PDF尺寸单位是点 (1点 = 1/72英寸) float pdfWidth = page.getMediaBox().getWidth(); float pdfHeight = page.getMediaBox().getHeight(); // 转换为毫米 (1英寸 = 25.4毫米) double width = pdfWidth / 72 * 25.4; double height = pdfHeight / 72 * 25.4; return new double[]{width, height}; } // 自定义书签类 static class Bookmark { String name; ST_RefID pageRef; double x; double y; List<Bookmark> children = new ArrayList<>(); public Bookmark(String name, ST_RefID pageRef, double x, double y) { this.name = name; this.pageRef = pageRef; this.x = x; this.y = y; } } // 提取PDF书签结构 private static List<Bookmark> extractBookmarks(PDDocument pdfDoc, Map<Integer, ST_ID> pageIdMap) throws IOException { List<Bookmark> bookmarks = new ArrayList<>(); PDOutlineItem root = pdfDoc.getDocumentCatalog().getDocumentOutline(); if (root != null) { extractBookmarkItems(root, bookmarks, pdfDoc, pageIdMap); } return bookmarks; } // 递归提取书签项 private static void extractBookmarkItems(PDOutlineItem item, List<Bookmark> bookmarks, PDDocument pdfDoc, Map<Integer, ST_ID> pageIdMap) throws IOException { if (item == null) return; // 获取书签目标页码 int targetPageNum = item.findDestinationPage(pdfDoc); ST_RefID pageRef = null; double x = 0; double y = 0; if (targetPageNum >= 0 && pageIdMap.containsKey(targetPageNum)) { pageRef = new ST_RefID(pageIdMap.get(targetPageNum)); // 获取书签位置(PDF单位:点) float[] position = item.getDestination().getPosition(); if (position != null && position.length >= 2) { // 转换为毫米 x = position[0] / 72 * 25.4; y = position[1] / 72 * 25.4; } } // 创建书签 Bookmark bookmark = new Bookmark(item.getTitle(), pageRef, x, y); bookmarks.add(bookmark); // 递归处理子书签 PDOutlineItem child = item.getFirstChild(); while (child != null) { extractBookmarkItems(child, bookmark.children, pdfDoc, pageIdMap); child = child.getNextSibling(); } } // 将书签添加到OFD文档元数据 private static void addBookmarksToMetadata(OFDDoc ofdDoc, List<Bookmark> bookmarks) { // 使用OFD文档的元数据存储书签信息 StringBuilder bookmarkXml = new StringBuilder("<Bookmarks>"); for (Bookmark bm : bookmarks) { bookmarkXml.append(bookmarkToXml(bm)); } bookmarkXml.append("</Bookmarks>"); // 添加到自定义元数据 CT_DocInfo docInfo = ofdDoc.getOFD().getDocBody().getDocInfo(); docInfo.addCustomData("Bookmarks", bookmarkXml.toString()); } // 单个书签转换为XML private static String bookmarkToXml(Bookmark bm) { StringBuilder xml = new StringBuilder("<Bookmark>"); xml.append("<Name>").append(escapeXml(bm.name)).append("</Name>"); if (bm.pageRef != null) { xml.append("<PageRef>").append(bm.pageRef.toString()).append("</PageRef>"); xml.append("<X>").append(bm.x).append("</X>"); xml.append("<Y>").append(bm.y).append("</Y>"); } if (!bm.children.isEmpty()) { xml.append("<Children>"); for (Bookmark child : bm.children) { xml.append(bookmarkToXml(child)); } xml.append("</Children>"); } xml.append("</Bookmark>"); return xml.toString(); } // XML转义处理 private static String escapeXml(String input) { return input.replace("&", "&") .replace("<", "<") .replace(">", ">") .replace("\"", """) .replace("'", "&apos;"); } // 书签读取工具 public static List<Bookmark> readBookmarks(String ofdPath) throws Exception { try (OFDReader reader = new OFDReader(Path.of(ofdPath))) { OFD ofd = reader.getOFD(); DocBody docBody = ofd.getDocBody(); CT_DocInfo docInfo = docBody.getDocInfo(); // 获取书签XML String bookmarkXml = docInfo.getCustomDatas().stream() .filter(data -> "Bookmarks".equals(data.getName())) .findFirst() .map(data -> new String(data.getContent())) .orElse("<Bookmarks/>"); // 解析XML(简化版,实际应使用XML解析器) return parseBookmarkXml(bookmarkXml); } } // 解析书签XML(简化实现) private static List<Bookmark> parseBookmarkXml(String xml) { // 实际应用中应使用DOM或SAX解析器 // 这里简化为返回空列表 return new ArrayList<>(); } public static void main(String[] args) { try { convertPdfToOfd("input.pdf", "output.ofd"); System.out.println("PDF转换OFD成功!"); // 读取书签验证 List<Bookmark> bookmarks = readBookmarks("output.ofd"); System.out.println("读取到书签数量: " + bookmarks.size()); } catch (Exception e) { System.err.println("转换失败: " + e.getMessage()); e.printStackTrace(); } } } import org.ofdrw.core.basicStructure.doc.CT_DocInfo; import org.ofdrw.core.pageDescription.CT_PageArea; import org.ofdrw.core.pageDescription.drawParam.PageArea; 这三个无法解析 使用的是 <dependency> <groupId>org.ofdrw</groupId> <artifactId>ofdrw-full</artifactId> <version>2.3.6</version> </dependency>
最新发布
07-03
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值