本文主要记录几种
1、借助PyMuPDF
库
可以将页面呈现为光栅或矢量(SVG)图像,可以选择缩放、旋转、移动或剪切页面。
1)安装
pip install PyMuPDF
2)查看版本
import fitz
print(fitz.__doc__)
3)常用接口
-
打开
pdf
文件,或者创建pdf
文件doc=fitz.open(文件名)#或fitz.Document(文件名)
Document
的一些属性:属性 描述 Document.page_count
int
类型,页数Document.get_toc()
list
类型,内容目录Document.load_page()
读取页面 -
加载页面
page = doc.load_page(pno) page = doc[pno] page = doc[-1] # 最后一页 # 也可以作为迭代器 for page in doc: .... # 从后往前读取 for page in reversed(doc): .... # 切片 for page in doc.pages(start, stop, step): ....
-
呈现页面
# 函数定义 def get_pixmap( self, matrix: AnyType = None, colorspace: "Colorspace" = None, alpha: int = 0, ) -> "Pixmap": pix = page.get_pixmap()
pix
是一个Pixmap
对象,它(在本例中)包含页面的RGB图像,可用于多种用途。方法Page.get_pixmap()
提供了许多用于控制图像的变体:分辨率、颜色空间(例如,生成灰度图像或具有减色方案的图像)、透明度、旋转、镜像、移位、剪切等。
例如:创建RGBA
图像(即,包含alpha通道),指定pix=page.get_pixmap(alpha=True)
。
Pixmap
包含以下引用的许多方法和属性。其中包括整数宽度、高度(每个像素)和跨距(一个水平图像行的字节数)。属性示例表示表示图像数据的矩形字节区域(Python字节对象)。 -
将页面图像保存到文件中
pix.save('page.png') # 将页面图像保存到文件page.png中
4)将pdf
转为图片实例
def pdf2img(pdf_path, zoom_x, zoom_y, rotate_angle=0, clip_roi=None):
'''
zoom_x x方向的缩放系数
zoom_y y方向的缩放系数
rotation_angle 旋转角度
clip_roi 裁切区域坐标
'''
# open pdf file
pdf = fitz.open(pdf_path)
# logger.debug('Total: %d pages.'%pdf.pageCount)
page = pdf[0] # 处理第一页
# 设置缩放和旋转系数
trans = fitz.Matrix(zoom, zoom).preRotate(rotate_angle)
if clip_roi is not None:
rect = page.rect # 页面大小
mp = rect.tl + (rect.br - rect.tl) * 0.5 # 矩形的中心
# clip = fitz.Rect(mp, rect.br) # 想要截取的区域
clip = fitz.Rect(clip_roi[0], clip_roi[1]) # 想要截取的区域
pix = page.get_pixmap(matrix=trans, alpha=False, clip=clip) # 将页面转换为图像
else:
pix = page.get_pixmap(matrix=trans, alpha=False)
save_roi_name = pdf_path[:-4] + '_clip.png'
pix .save(save_roi_name)
pdf.close()
2、基于pdfplumber
库
1)安装
pip install pdfplumber
2)常用接口
- 读取
pdf
文件
这两种方法都返回# 打开pdf文件 pdfplumber.open("test.pdf") # 从内存加载 pdfplumber.load(file_like_object)
pdfplumber.PDF
类的实例。
若pdf
带有密码,则需要传入password
参数pdfplumber.open('test.pdf', password='test')`
pfplumber.Page
类
pdfplumber.Page
类是pdfplumber
整个的核心,有以下几个属性和方法:
属性 | 描述 |
---|---|
.page_number | 页码顺序,从1 开始 |
.width | 页面宽度 |
.height | 页面高度 |
.objects /.chars / .lines / .rects / .curves / .images / .figures | 这些属性都是列表形式 |
方法 | 描述 |
---|---|
.crop(bounding_box) | 返回裁剪后的页面,bounding_box 的值表示为(x0, top, x1, bottom) 的四元组。 |
.extract_text(x_tolerance=0, y_tolerance=0) | 将页面中所有的字符对象提取到一个字符串中 |
.extract_words(x_tolerance=0, y_tolerance=0, horizontal_ltr=True, vertical_ttb=True) | 返回所有单词外观及其边界框的列表 |
.to_image(**conversion_kwargs) | 返回PageImage 类的实例。 |
- 保存图像
im.save(path_or_object, format="PNG")
3)实例
import pdfplumber
path = './express_datas/YTO.pdf'
pdf = pdfplumber.open(path)
first_page = pdf.pages[0] # 第一页
print(first_page.page_number)
print('Page_W: ', first_page.width)
print('Page_H: ',first_page.height)
text = first_page.extract_text() # 提取页面中的文本内容
print(text)
im = first_page.to_image(resolution=96)
im.save('output.jpg')
pdf.close()