从pdf 文件中抽取特定的页面

前段时间买了一个kindle 电子书阅读器、我想用它来读的pdf文档、当然最主要是用来读python标准库&mysql的官方文档。

问题就来了、这两个都是大头书、之前用mac看还好、用kindle就真的不方便了;主要是kindle对pdf的支持不太好、不能

目录导航;于是我就想把大的pdf文件按章节分解成小的pdf文件

 

一、安装PyPDF2这个python包

pip3 install PyPDF2

 

二、从源pdf文件中抽取页面

#/usr/local/python/bin/python3

from PyPDF2 import PdfFileReader,PdfFileWriter
"""
抽取pdf页面
"""

if __name__=="__main__":
    reader=PdfFileReader('/Users/jianglexing/Documents/linux/python/python-3.6/library.pdf')
    writer=PdfFileWriter()
    #开始的页面号
    start=108 
    #结束的页面号
    stop=126
    with open('/Users/jianglexing/Documents/python-std-re.pdf','wb') as wstream:
        for page in range(start,stop):
            temp=reader.getPage(page)
            writer.addPage(temp)
        writer.write(wstream)
    print("对抽取完成了")

 

三、功能我们已经实现了、但是还太友好、下面对代码进行改进

#/usr/local/python/bin/python3

from PyPDF2 import PdfFileReader,PdfFileWriter
import argparse

"""
抽取pdf页面
"""

if __name__=="__main__":
    parser=argparse.ArgumentParser()
    parser.add_argument('--source-file',default=r'/Users/jianglexing/Documents/linux/python/python-3.6/library.pdf',help='源文件全路径')
    parser.add_argument('--target-file',default=r'/tmp/target.pdf',help='目标路径的全路径')
    parser.add_argument('--start-page',default=0,type=int,help='开始的页号')
    parser.add_argument('--stop-page',default=0,type=int,help='结束的页号')
    args=parser.parse_args()
    reader=PdfFileReader(args.source_file)
    writer=PdfFileWriter()
    with open(args.target_file,'wb') as wstream:
        for page in range(args.start_page,args.stop_page):
            temp=reader.getPage(page)
            writer.addPage(temp)
        writer.write(wstream)
    print("对抽取完成了")

 

四、还有一些没有解决的问题、如果源文件太大的话会报错、由于还没有看PyPDF2的源码、所以目前还不知道怎么解决

JianglexingdeMacBook-Pro:Desktop jianglexing$ python3 splitpdf.py --source-file='/Users/jianglexing/Desktop/refman-5.7.18-en.a4.pdf' --target-file=/Users/jianglexing/Desktop/temp.pdf --start-page=1 --stop-page=6
Traceback (most recent call last):
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PyPDF2/generic.py", line 229, in __new__
    return decimal.Decimal.__new__(cls, utils.str_(value), context)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PyPDF2/utils.py", line 252, in str_
    if sys.version_info[0] < 3:
RecursionError: maximum recursion depth exceeded in comparison

During handling of the above exception, another exception occurred:

Traceback (most recent call last):
  File "splitpdf.py", line 23, in <module>
    writer.write(wstream)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PyPDF2/pdf.py", line 482, in write
    self._sweepIndirectReferences(externalReferenceMap, self._root)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PyPDF2/pdf.py", line 571, in _sweepIndirectReferences
    self._sweepIndirectReferences(externMap, realdata)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PyPDF2/pdf.py", line 547, in _sweepIndirectReferences
    value = self._sweepIndirectReferences(externMap, value)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PyPDF2/pdf.py", line 571, in _sweepIndirectReferences
    self._sweepIndirectReferences(externMap, realdata)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PyPDF2/pdf.py", line 547, in _sweepIndirectReferences
    value = self._sweepIndirectReferences(externMap, value)
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PyPDF2/pdf.py", line 556, in _sweepIndirectReferences
    value = self._sweepIndirectReferences(externMap, data[i])
  File "/Library/Frameworks/Python.framework/Versions/3.5/lib/python3.5/site-packages/PyPDF2/pdf.py", line 571, in _sweepIndirectReferences
    self._sweepIndirectReferences(externMap, realdata)

 

 

----

学习交流

posted on 2017-05-31 20:19  蒋乐兴的技术随笔  阅读(1134)  评论(0编辑  收藏  举报

导航