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

pdf 导出的内容 是itextpdf 写的 

目录信息 得用 pdfbox 里的 PDDocumentOutline  

		<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  目录信息

3. 删除 没有目录信息的文件

// 目录
PDDocumentOutline documentOutline = new PDDocumentOutline();
documentOutline.addFirst(pdOutlineItem);
documentOutline.addLast(pdOutlineItem);
Iterable<PDOutlineItem> children = documentOutline.children();
documentOutline.openNode();
documentOutline.closeNode();

        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);
		}
	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;
	}

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值