python拆分PDF文件
一、python讲PDF分割并重组合并
先占个空,后面在慢慢更新
下面这个代码实现讲一个PDF文件拆分成多个文件
import PyPDF2 def split_pdf(input_pdf_path, output_prefix, start_page, end_page): """ 分割PDF文件为多个小的PDF文件,每个文件包含原始文档的一部分页面。 :param input_pdf_path: 输入PDF文件的路径。 :param output_prefix: 输出PDF文件的前缀。 :param start_page: 开始分割的页面号(从1开始)。 :param end_page: 结束分割的页面号(从1开始)。 """ with open(input_pdf_path, 'rb') as file: reader = PyPDF2.PdfReader(file) # 确保页数有效 if start_page > end_page or end_page > len(reader.pages): print(f"页数无效,分割失败。总页数为:{reader.numPages}") return for page_number in range(start_page, end_page + 1): writer = PyPDF2.PdfWriter() writer.add_page(reader.pages[page_number-1]) # 创建输出文件名 output_filename = f"{output_prefix}-page_{page_number}.pdf" with open(output_filename, 'wb') as output_file: writer.write(output_file) print(f"已分割页面 {page_number} 到文件 {output_filename}") # 使用示例 split_pdf('/Users/gaochengcheng/Desktop/test/phythic-u3.pdf', '/Users/gaochengcheng/Desktop/test/u3', 1, 37) # 分割前三页
图片库文件下载失败了,曲线一下直接用PDF文件进行合并
import PyPDF2 import os def merge_pdfs(folder, output): pdf_writer = PyPDF2.PdfWriter() for path in os.listdir(folder): if os.path.splitext(path)[1]=='.pdf': file=os.path.join(folder,path) print(file) pdf_reader = PyPDF2.PdfReader(file) for page in range(len(pdf_reader.pages)): pdf_writer.add_page(pdf_reader.pages[page]) with open(output, 'wb') as out: pdf_writer.write(out) input_folder='/Users/gaochengcheng/Desktop/test/' output = '/Users/gaochengcheng/Desktop/test/output-u3.pdf' # 合并后的PDF文件名 merge_pdfs(input_folder,output )
二、Java将PDF分割成图片
如果没有python,也没有关系,可以尝试使用Java.
依赖文件
<dependencies> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>fontbox</artifactId> <version>2.0.9</version> </dependency> <!-- https://mvnrepository.com/artifact/org.apache.pdfbox/pdfbox --> <dependency> <groupId>org.apache.pdfbox</groupId> <artifactId>pdfbox</artifactId> <version>2.0.9</version> </dependency> <!-- https://mvnrepository.com/artifact/commons-logging/commons-logging --> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> </dependencies>
源代码
package com.test; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; import javax.imageio.ImageIO; import java.awt.image.BufferedImage; import java.io.File; import java.io.IOException; public class App1 { /** * 使用pdfbox将整个pdf转换成图片 * * @param fileAddress 文件地址 如:C:\\Users\\user\\Desktop\\test * @param filename PDF文件名不带后缀名 * @param type 图片类型 png 和jpg */ public static void pdf2png(String fileAddress, String filename, String type) { long startTime = System.currentTimeMillis(); // 将文件地址和文件名拼接成路径 注意:线上环境不能使用\\拼接 File file = new File(fileAddress + "/" + filename + ".pdf"); try { // 写入文件 PDDocument doc = PDDocument.load(file); PDFRenderer renderer = new PDFRenderer(doc); int pageCount = doc.getNumberOfPages(); for (int i = 0; i < pageCount; i++) { // dpi为144,越高越清晰,转换越慢 BufferedImage image = renderer.renderImageWithDPI(i, 144); // Windows native DPI // 将图片写出到该路径下 ImageIO.write(image, type, new File(fileAddress + "/" + filename + "_" + (i + 1) + "." + type)); } long endTime = System.currentTimeMillis(); System.out.println("共耗时:" + ((endTime - startTime) / 1000.0) + "秒"); //转化用时 } catch (IOException e) { e.printStackTrace(); } } public static void main(String[] args) { pdf2png("/Users/gaochengcheng/Desktop/test", "output-u3", "jpg"); } }
这样分割完直接就是图片了,如果是Mac电脑,可以直接使用预览进行多图片合并成PDF
Java代码转自:https://www.jb51.net/program/301597i1b.htm
三、Java分割和合并PDF
前面把PDF分割成了jpg图片,方便是很方便,缺点是新生成的PDF就是图片格式了,里面的文字无法选中
为了方便期间,还是新写了把PDF拆分成PDF,然后在合并的程序
这样合并后的PDF文件跟原文件一模一样
/** * 合并指定目录下所有PDF文件 * @param folderName * @param destName * @throws IOException */ public static void merge_pdf(String folderName, String destName) throws IOException { TreeSet<File> fileList = new TreeSet<>((o1, o2) -> { String name1 = o1.getName(); String name2 = o2.getName(); return name1.compareTo(name2); }); getAllFiles(new File(folderName), fileList); // 创建 PDFMergerUtility 实例 PDFMergerUtility pdfMerger = new PDFMergerUtility(); // 设置合并后的PDF文件的输出路径 pdfMerger.setDestinationFileName(folderName + "/" + destName); for (File file : fileList) { pdfMerger.addSource(file); } // 合并文件 try { pdfMerger.mergeDocuments(null); } catch (IOException e) { e.printStackTrace(); } } /** * 获取目录下所有PDF文件 * * @param folder * @param fileList */ public static void getAllFiles(File folder, TreeSet<File> fileList) { File[] files = folder.listFiles(); if (files == null) { // 如果文件夹为空 return; } for (File file : files) { if (file.isDirectory()) { // 如果是子文件夹,则递归调用 getAllFiles(file, fileList); } else { String name = file.getName(); if (name.endsWith(".pdf")) { fileList.add(file); } } } } /** * 拆分一个PDF为多个单页PDF * * @param filePath * @param fileName * @throws IOException */ public static void split_pdf(String filePath, String fileName) throws IOException { File file = new File(filePath + "/" + fileName); try (PDDocument doc = PDDocument.load(file)) { int number = doc.getNumberOfPages(); for (int i = 0; i < number; i++) { PDPage page = doc.getPage(i); try (PDDocument doc1 = new PDDocument()) { doc1.addPage(page); doc1.save(filePath + "/M1-" + String.format("%03d", i) + ".pdf"); } } } } public static void main(String[] args) throws IOException { String filePath = "/Users/gaochengcheng/Desktop/test"; String fileName = "M1-2014-01.pdf"; // split_pdf(filePath, fileName); merge_pdf(filePath,fileName); }