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