指定页数到处pdf

指定页数到处pdf

指定页数显示pdf文档。

有些业务中,如果保存的是一个word文档模板,这个模板可能有几百页,非常多。展示文档的时候,需要将模板中的某些地方填充数据。

  • 方案一:不推荐

word转为PDF后替换里面的数据,其实PDF是最终文本格式,这样替换是特别麻烦,还有会出现格式上的问题。例如:将文档中的某个字符替换成一段文字,这段文字的位置肯定是不够的,所以就会重叠在其他文档上面。

  • 方案二:

批量获取word文档,然后把数据替换后再转为PDF文档渲染。(后期给出demo

开源参考:

https://github.com/aspose-pdf/Aspose.PDF-for-Java

https://github.com/aspose-words/Aspose.Words-for-Java

一、导入依赖

<dependency>
    <groupId>org.apache.pdfbox</groupId>
    <artifactId>pdfbox</artifactId>
    <version>1.8.10</version>
</dependency>
package com.open.capacity.datasource.controller;

import org.apache.pdfbox.exceptions.COSVisitorException;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.util.Splitter;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.util.List;

@RestController
@RequestMapping("/user")
public class UserController {

	@GetMapping("/pdf/{startPage}/{endPage}")
	public void findPdf(HttpServletResponse response, @PathVariable Integer startPage,@PathVariable Integer endPage) {
		splitPdf(response,startPage,endPage,"C:\\Users\\stars\\Desktop\\Linux安装各种各种程序.pdf");
	}

	@GetMapping("/pdf")
	public void find(HttpServletResponse response) {
		splitCompletely(response,"C:\\Users\\stars\\Desktop\\Linux安装各种各种程序.pdf");
	}

	/**
	 * 分页读取pdf文档
	 * <b>这里只能显示一页,具体不填清楚</b>
	 *
	 * <p>如果只显示一页,开始时间和结束时间设置为一样的。</p>
	 * @param response
	 * @param startPage 开始也
	 * @param endPage 结束页
	 * @param filePath pdf 文档所在路径
	 */
	public void splitPdf(HttpServletResponse response, Integer startPage, Integer endPage, String filePath) {
		// 这是对应文件名
		File indexFile = new File(filePath);
		try {
			PDDocument document  = PDDocument.load(indexFile);
			// 获取总页数
//			int numberOfPages = document.getNumberOfPages();
//			System.out.println("总页数告诉你哦:" + numberOfPages);

			Splitter splitter = new Splitter();
			// 开始页
			splitter.setStartPage(startPage);
			// 结束页
			splitter.setEndPage(endPage);
			List<PDDocument> pages = splitter.split(document);
			pages.forEach(pdDocument -> {
				try {
					pdDocument.save(response.getOutputStream());
					pdDocument.close();
				} catch (IOException e) {
					e.printStackTrace();
				} catch (COSVisitorException e) {
					e.printStackTrace();
				}
			});
		}catch (IOException ex){
			ex.printStackTrace();
		}
	}

	/**
	 * 查询全部PDF文档
	 * <p>
	 *      获取总页数
	 * 		int numberOfPages = document.getNumberOfPages();
	 * 		System.out.println("总页数告诉你哦:"+numberOfPages);
	 * </p>
	 * @param response
	 * @param filePath PDF 所在的目录
	 */
	public void splitCompletely (HttpServletResponse response, String filePath) {
		// 这是对应文件名
		File indexFile = new File(filePath);
		try {
			PDDocument document = PDDocument.load(indexFile);
			document.save(response.getOutputStream());
			document.close();
		} catch (IOException e) {
			e.printStackTrace();
		} catch (COSVisitorException e) {
			e.printStackTrace();
		}
	}
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值