PDF 生成在左侧目录栏目录信息的目录 点击跳转

pdf 导出的内容 是itextpdf 写的

目录信息 得用 pdfbox 里的 PDDocumentOutline

XML 复制代码
		<dependency>
			<groupId>com.itextpdf</groupId>
			<artifactId>itextpdf</artifactId>
			<version>5.4.3</version>
		</dependency>

		<dependency>
			<groupId>org.apache.pdfbox</groupId>
			<artifactId>pdfbox</artifactId>
			<version>3.0.1</version>
		</dependency>

思路:

1.itextpdf 输出文件过程中 在 pdfbox 的 PDDocumentOutline 添加目录信息

2.pdfbox 复制文件 配置 PDDocumentOutline 目录信息

  1. 删除 没有目录信息的文件
java 复制代码
// 目录
PDDocumentOutline documentOutline = new PDDocumentOutline();
documentOutline.addFirst(pdOutlineItem);
documentOutline.addLast(pdOutlineItem);
Iterable<PDOutlineItem> children = documentOutline.children();
documentOutline.openNode();
documentOutline.closeNode();
java 复制代码
        OutputStream os = FileUtil.getOutputStream(finalTempFilePath);
        Document document = new Document(PageSize.A4, 36, 36, 36, 36);
		PdfWriter writer = PdfWriter.getInstance(document, os);

		// 目录
		PDDocumentOutline documentOutline = new PDDocumentOutline();

        // 存目录条目 和对应的页号 在代码最后 配置目录要跳转的page
		List<Pair<PDOutlineItem, Integer>> itemList = Lists.newArrayList();

        document.open();
		writer.setPageEmpty(false);

		// 目录信息
		addOutline(documentOutline, "封面", writer.getPageNumber(), itemList);

        for (一级目录){
    
            
            PDOutlineNode pdOutlineItem = addOutline(documentOutline, "一级目录名",                   
                                    writer.getPageNumber(), itemList);
		
            for (二级目录){
                // 目录信息
		        addOutline(pdOutlineItem , "二级目录名", writer.getPageNumber(), 
                            itemList);
            }
		    
        }

        // 4. 复制文件
		try(
			PDDocument pdfDoc = Loader.loadPDF(new File(finalTempFilePath));
			PDDocument pdfPage = new PDDocument();
		){

			for (int i = 0; i < footerEndNum-1; i++) {

                // 这个if 是把 在文章最后的 目录 挪到前面
				if(i==footerBeginNum-1){
					for (int j = footerEndNum-1; j < menuPageEndNum; j++) {
						PDPage page = pdfDoc.getPage(j);
						pdfPage.addPage(page);
					}
				}

				PDPage page = pdfDoc.getPage(i);
				pdfPage.addPage(page);

			}

            // 给目录 配置跳转的page 
			for (Pair<PDOutlineItem, Integer> pdOutlineItemIntegerPair : itemList) {

				Integer second = pdOutlineItemIntegerPair.getSecond();
				PDPage page = pdfDoc.getPage(second);

				PDPageFitDestination dest = new PDPageFitDestination();
				dest.setPage(page);

				PDOutlineItem first = pdOutlineItemIntegerPair.getFirst();
				first.setDestination(dest);
			}

            // 给文件 加目录信息
			pdfPage.getDocumentCatalog().setDocumentOutline(documentOutline);

			// 存
			pdfPage.save(finalMenuFilePath);
		}
java 复制代码
	public PDOutlineItem addOutline (PDOutlineNode pDOutlineNode, String title, int pageNumber,
									 List<Pair<PDOutlineItem, Integer>> itemList) {
		PDOutlineItem pdOutlineItem = new PDOutlineItem();
		pdOutlineItem.setTitle(title);
//		PDPageXYZDestination pdPageXYZDestination = new PDPageXYZDestination();
//		pdPageXYZDestination.setPageNumber(pageNumber);
//		pdOutlineItem.setDestination(pdPageXYZDestination);
		pDOutlineNode.addLast(pdOutlineItem);

		itemList.add(new Pair<PDOutlineItem, Integer>(pdOutlineItem, pageNumber));
		return pdOutlineItem;
	}
相关推荐
为什么要做囚徒19 小时前
多线程基础系列-线程死锁
java·多线程
bluetata19 小时前
在 Spring Boot 中使用 Amazon Textract 从图像中提取文本
java·spring boot·后端
黎雁·泠崖19 小时前
Java底层探秘入门:从源码到字节码!方法调用的中间形态全解析
java·开发语言
we1less19 小时前
[audio] AudioTrack (六) 共享内存使用分析
java·开发语言
CYTElena19 小时前
关于JAVA异常的笔记
java·开发语言·笔记·语言基础
YIN_尹19 小时前
【C++11】lambda表达式(匿名函数)
java·c++·windows
猴子年华、19 小时前
【每日一技】:SQL 常用函数实战速查表(函数 + 场景版)
java·数据库·sql·mysql
码农水水19 小时前
京东Java面试被问:系统限流的实现方式
java·开发语言·面试
宁晓20 小时前
单表配置多级类型,按名称模糊筛选
java·后端
Yu_iChan20 小时前
Day03 公共字段填充与菜品管理
java·开发语言