python拆分PDF文件

Mars.wang / 2024-08-08 / 原文

一、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