JAVA PDF 截取N页,生成新文件,转图片,多个PDF 合并
<dependency> <groupId>com.itextpdf</groupId> <artifactId>itextpdf</artifactId> <version>5.5.13</version> </dependency>
import com.itextpdf.text.Document; import com.itextpdf.text.pdf.PdfCopy; import com.itextpdf.text.pdf.PdfImportedPage; import com.itextpdf.text.pdf.PdfReader; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPageTree; import org.apache.pdfbox.rendering.PDFRenderer; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.*; public class PdfUtil { /** * 截取pdfFile的第from页至第end页,组成一个新的文件名 * * @param pdfFile 要切割的pdf文件 * @param newFile 切割后形成的新的pdf文件 * @param from 从第N页开始 * @param end 到第N页结束 */ public static void partitionPdf(String pdfFile, String newFile, int from, int end) { Document document = null; PdfCopy copy = null; PdfReader reader = null; try { reader = new PdfReader(pdfFile); int pageCount = reader.getNumberOfPages(); if (from < 1) { from = 1; } if (from > pageCount) { from = pageCount; } if (end == 0 || end > pageCount) { end = pageCount; } document = new Document(reader.getPageSize(1)); copy = new PdfCopy(document, new FileOutputStream(newFile)); document.open(); for (int j = from; j <= end; j++) { document.newPage(); PdfImportedPage page = copy.getImportedPage(reader, j); copy.addPage(page); } } catch (Exception e) { e.printStackTrace(); } finally { if (document != null) { document.close(); } if (copy != null) { copy.close(); } if (reader != null) { reader.close(); } } } /** * pdf转图片 * * @param pdfFile PDF 文件 * @param imageFile 输出的图片文件 * @param from 开始页 从1开始 * @param end 结束页 最大为PDF总页数 * @throws Exception */ public static void pdfToImage(String pdfFile, String imageFile, int from, int end) throws Exception { PDDocument doc = null; ByteArrayOutputStream os = null; InputStream stream = null; OutputStream out = null; try { //pdf路径 stream = new FileInputStream(pdfFile); // 加载解析PDF文件 doc = PDDocument.load(stream); PDFRenderer pdfRenderer = new PDFRenderer(doc); PDPageTree pages = doc.getPages(); int pageCount = pages.getCount(); if (from < 1) { from = 1; } if (from > pageCount) { from = pageCount; } if (end == 0 || end > pageCount) { end = pageCount; } for (int i = from; i <= end; i++) { BufferedImage bim = pdfRenderer.renderImageWithDPI(i - 1, 200); //PDFBOX 是从0开始的,from初始值为1,所以这边要减 i-1 os = new ByteArrayOutputStream(); ImageIO.write(bim, "jpg", os); byte[] dataList = os.toByteArray(); //只取一页,等于传进来的名称,多页时,加上 页号 String imageFilePath = from == end ? saveImgFile : saveImgFile.replace(".jpg", "_" + i + ".jpg"); File file = new File(imageFilePath); if (!file.getParentFile().exists()) { // 不存在则创建父目录及子文件 file.getParentFile().mkdirs(); file.createNewFile(); } out = new FileOutputStream(file); out.write(dataList); } } catch (Exception e) { e.printStackTrace(); } finally { if (doc != null) { doc.close(); } if (os != null) { os.close(); } if (stream != null) { stream.close(); } if (out != null) { out.close(); } } } //多个PDF合并成一个 public static void mergePDFFiles(List<String> pdfFiles, String outputPdf) throws IOException { // 创建一个新的 PDF 阅读器对象和一个新的 PDF 写入对象 PdfReader reader = null; PdfCopy copy = null; Document document = new Document(); try { // 创建 PDF 阅读器对象和写入对象 reader = new PdfReader(pdfFiles.get(0)); copy = new PdfCopy(document, new FileOutputStream(outputPdf)); // 打开文档准备写入内容 document.open(); // 将第一个 PDF 的所有页面复制到输出 PDF 中 for (int i = 1; i <= reader.getNumberOfPages(); i++) { PdfImportedPage page = copy.getImportedPage(reader, i); copy.addPage(page); } // 将其它PDF的所有页,输出到 PDF 中 for (int i = 1; i < pdfFiles.size(); i++) { reader = new PdfReader(pdfFiles.get(i)); for (int j = 1; j <= reader.getNumberOfPages(); j++) { PdfImportedPage page = copy.getImportedPage(reader, j); copy.addPage(page); } } } catch (Exception e) { e.printStackTrace(); } finally { if (document != null) { document.close(); } if (copy != null) { copy.close(); } if (reader != null) { reader.close(); } } } }
@Test void pdf() throws Exception { String pdfFile = "D:\\Desktop\\20220117.pdf"; String jpgFile = "D:\\Desktop\\20220117.jpg"; PdfUtil.pdfToImage(pdfFile, jpgFile, 1, 1); } @Test void testMerge() throws IOException { List<String> pdfFiles = new ArrayList<>(); pdfFiles.add("D:\\Projects\\20231225180735.pdf"); pdfFiles.add("D:\\Projects\\20231225182535.pdf"); pdfFiles.add("D:\\Projects\\20231225184135.pdf"); PdfUtil.mergePDFFiles(pdfFiles, "D:\\Projects\\New.pdf"); }