客户有一个新的需求。控制用户下载文档的页数。比如。我设置只开放10页。那就要我们去做截取文档。pdf自带有实现的方式。docx暂时没找到开源的。我这边处理的docx。是通过转换成pdf。通过截取pdf后再转成docx去实现的
工具类如下:
import java.io.FileOutputStream; import java.io.IOException; import java.util.List; import java.util.Objects; import com.itextpdf.text.Document; import com.itextpdf.text.DocumentException; import com.itextpdf.text.pdf.PdfCopy; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfSmartCopy;/*** PDF工具类*/ public class PdfUtils {/*** 抽取PDF文件** @param sourceFile 源PDF文件路径* @param targetFile 目标PDF文件路径* @param extractedPageNums 需要抽取的页码)*/public static void extract(String sourceFile, String targetFile, List<Integer> extractedPageNums) {Objects.requireNonNull(sourceFile);Objects.requireNonNull(targetFile);PdfReader reader = null;Document document = null;FileOutputStream outputStream = null;PdfCopy pdfCopy = null;try {// 读取源文件reader = new PdfReader(sourceFile);// 创建新的文档document = new Document();// 创建目标PDF文件outputStream = new FileOutputStream(targetFile);pdfCopy = new PdfSmartCopy(document, outputStream);// 获取源文件的页数int pages = reader.getNumberOfPages();document.open();// 注意此处的页码是从1开始for (int page = 1; page <= pages; page++) {// 如果是指定的页码,则进行复制if (extractedPageNums.contains(page)) {pdfCopy.addPage(pdfCopy.getImportedPage(reader, page));}}} catch (IOException | DocumentException e) {e.printStackTrace();} finally {if (reader != null) {reader.close();}if (document != null) {document.close();}if (outputStream != null) {try {outputStream.flush();outputStream.close();} catch (IOException e) {e.printStackTrace();}}if(pdfCopy != null){pdfCopy.flush();pdfCopy.close();}}} }
如果想实现docx和pdf互转格式不变。请参考另一篇文章
java 实现docx和pdf互转并保留格式_王威振的csdn的博客-CSDN博客