Python处理PDF文档

最近碰到需要分割PDF文档的需求,本着Python万能的原则,找到了一个pypdf的库,可以实现PDF的分割、合并等操作,现在就对这些操作做一个简单的介绍。

库的安装

pypdf是一个支持python操作PDF的库,不过现在已经不再更新的,可以用一个类似的库pypdf2的库代替,可以直接使用下面的命令。

pip3 install pypdf2

pypdf的基本使用

pypdf主要有PdfFileWriterPdfFileReader两个类,可以通过PyPDF2.pdf导入。

PDF文件读取通过PdfFileReader实现,直接传入一个打开的文件句柄就可以了,对页面的读取可以直接通过getPage方法实现,示例如下:

from PyPDF2.pdf import PdfFileWriter, PdfFileReader

with open("source.pdf", 'rb') as souce_pdf:
    pdf_in = PdfFileReader(source_pdf)
    page = pdf_in.getPage(10)

如果需要写入pdf,则需要PdfFileWriter,一般直接向里面添加页面就可以了。比如:

from PyPDF2.pdf import PdfFileWriter, PdfFileReader

with open("source.pdf", 'rb') as souce_pdf:
    pdf_in = PdfFileReader(source_pdf)
    page = pdf_in.getPage(10)
    pdf_out = PdfFileWriter()
    with open("target.pdf", 'wb') as target_pdf:
        pdf_out.addPage(page)
        pdf_out.write(target_pdf)

上述示例经过简单的封装就可以实现我们需要的功能了。

文件分割脚本

#! /usr/bin/env python3

"""
Extract specified pages from source PDF
"""

from PyPDF2.pdf import PdfFileWriter, PdfFileReader
import sys
import argparse
import os

__prog__ = os.path.basename(__file__)
__version__ = "1.0.0"
__description__ = __doc__
__author__ = "Major Lin"
__copyright__ = "Copyright (C) 2017 Major Lin"


def cutter():
    parser = argparse.ArgumentParser(description=__description__)
    parser.add_argument("-v", "--version", action="version", version="%(prog)s" + __version__)
    parser.add_argument(
        "src_pdf",
        metavar="SOURCE-PDF",
        type=argparse.FileType('rb'),
        help="path to source pdf file"
    )
    parser.add_argument(
        "first_page",
        metavar="FIRST-PAGE",
        type=int,
        help="number of first page (1-based index)"
    )
    parser.add_argument(
        "last_page",
        metavar="LAST-PAGE",
        type=str,
        help="number of last page (1-based index)"
    )
    parser.add_argument(
        "-o", "--output",
        type=str,
        default="output.pdf",
        help="path to output file"
    )
    args = parser.parse_args()
    first_page = args.first_page -1
    if args.last_page.startswith("+"):
        last_page = args.last_page[1:].replace(" ", "")
        if not last_page:
            sys.exit("Need to specify number of pages")
        last_page = first_page + int(last_page)
    else:
        last_page = int(args.last_page) - 1
    pdf_in = PdfFileReader(args.src_pdf)
    pdf_out = PdfFileWriter()
    for pg_num in range(first_page, last_page):
        pdf_out.addPage(pdf_in.getPage(pg_num))

    out_stream = open(os.path.expandvars(os.path.expanduser(args.output)), 'wb')
    pdf_out.write(out_stream)
    out_stream.close()

if __name__ == "__main__":
    cutter()

[下载链接]()


本作品采用知识共享署名-非商业性使用-禁止演绎 4.0 国际许可协议进行许可。

发表新评论