客户有一个新的需求。控制用户下载文档的页数。比如。我设置只开放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互转格式不变。请参考另一篇文章