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);


    }

 

posted @ 2024-08-08 10:27  Mars.wang  阅读(464)  评论(0编辑  收藏  举报