首页 > 编程知识 正文

使用python提取pdf文件,python修改pdf文字

时间:2023-05-04 15:59:56 阅读:169263 作者:1330

虽然您可能需要提取一个或多个PDF文件中的图像,但在线网站上实现可能会导致图像泄漏,手动操作很麻烦,但实际上在Python中也很容易做到。

今天我要和系统分享几个Python提取PDF图像的方法。 其实没有非常完美的方法,任何方法的提取效率都不是100%,所以可以考虑用各种方法来补充。 主要包括基于fitz库和基于正则搜索提取图像的pdf2image库两种方法提取图像

基于fitz库和正则搜索

fitz是pymupdf的子模块,必须首先从命令行安装pymupdf。

pip install pymupdf

但是,请注意,您将使用import fitz导入模块进行导入。

在下面的代码中,要使用fitz库提取图像,必须使图像元素正常匹配,将模板元素转换为像素,然后将其作为图像进行书写

import fitz

导入re

import os

file _ path=r ' c :XXXXXX.pdf ' # pdf文件路径

dir_path=r'C:xxx' #用于存储图像的文件夹

defPDF2image1(path,pic_path ) :

checkIM=r'/Subtype?=*/Image ('

pdf=fitz.open(path )

lenXREF=pdf._getXrefLength (

count=1

forIinrange(1,lenXREF ) :

text=pdf._getxrefstring(I ) )

isimage=re.search(checkim,text ) ) ) ) ) ) ) ) ) )。

if not isImage:

continue

pix=fitz.pixmap(pdf,I ) )。

new_name=f'img_{count}.png '

pix.writepng(OS.path.join ) pic_path,new_name ) )

count =1

pix=None

PDF2image1(file_path,dir_path ) ) ) ) ) ) ) ) )。

执行示例文件提取的结果如下:

你可以看到,一些小色块也被提取为图像,你怎么过滤它们?

有一种按大小过滤的简单方法。 pix像素在fitz库中有一个重要的方法。 pix.size反映像素的数量。 简单的色素块这个值很低,可以通过设定阈值进行过滤。 以阈值10000为例进行过滤:

import fitz

导入re

import os

file _ path=r ' c :XXXXXX.pdf ' # pdf文件路径

dir_path=r'C:xxx' #用于存储图像的文件夹

defPDF2image1(path,pic_path ) :

checkIM=r'/Subtype?=*/Image ('

pdf=fitz.open(path )

lenXREF=pdf._getXrefLength (

count=1

forIinrange(1,lenXREF ) :

text=pdf._getxrefstring(I ) )

isimage=re.search(checkim,text ) ) ) ) ) ) ) ) ) )。

if not isImage:

continue

pix=fitz.pixmap(pdf,I ) )。

if pix.size 10000: #在此添加一处判断一个循环

如果continue #不匹配阈值,请向下跳转

new_name=f'img_{count}.png '

pix.writepng(OS.path.join ) pic_path,new_name ) )

count =1

pix=None

PDF2image1(file_path,dir_path ) ) ) ) ) ) ) ) )。

你会发现所有的图像都被正常提取了!

两种基于pdf2image库的方法

看名字就知道这个库的有用性。 官方文档为https://www.cn python.com/pypi/pdf 2image

虽然可以很容易地在pip install pdf2image中安装,但实际上poppler是一个可以正常工作的转换器,因此需要额外的安装和配置。 windows用户必须安装poppler for Windows,并且必须安装poppler for Mac才能将jqdty/文件夹添加到PATH Mac用户

具体功能的代码的官方文档中也有详细的说明:

那么,让我们分别试试这两种方法。

from pdf2imageimportconvert _ from _ path,convert_from_bytes

导入模板

from pdf 2image.exceptionsimportpdfinfonotinstallederror、PDFPageCountError、PDFSyntaxError

import os

file _ path=r ' c :XXXXXX.pdf ' # pdf文件路径

dir_path=r'C:xxx' #用于存储图像的文件夹

efPDF2image2(file_path,dir_path ) :

images=convert _ from _ path (file _ path,dpi=200 ) )。

for image in images:

ifnotOS.path.exists(dir_path ) :

OS.makedirs(dir_path ) )。

image.save (file _ pathf 'img _ { images.index ) image ) }.PNG ',' png ' ) )

PDF2image2(file_path,dir_path ) ) ) ) ) ) ) ) )。

图像提取成功。 试试第二种方法:

from pdf2imageimportconvert _ from _ path,convert_from_bytes

导入模板

from pdf 2image.exceptionsimportpdfinfonotinstallederror、PDFPageCountError、PDFSyntaxError

import os

file _ path=r ' c :XXXXXX.pdf ' # pdf文件路径

dir_path=r'C:xxx' #用于存储图像的文件夹

efPDF2image3(file_path,dir_path ) :

images=convert _ from _ bytes (open (file _ path,' rb ' ).read ) )

for image in images:

ifnotOS.path.exists(dir_path ) :

OS.makedirs(dir_path ) )。

image.save (file _ pathf 'img _ { images.index ) image ) }.PNG ',' png ' ) )

PDF2image3(file_path,dir_path ) ) ) ) ) ) ) ) )。

发现结果与以前一致,PDF中的所有图像都将被提取!

我还要补充一下。 核心方法covert_from_bytes包含许多参数,可以自己修改。 几个一般参数总结如下。

参数

意义

pdf_path

PDF文档路径

dpi

图像质量(对于学术杂志中常见的300dpi ) ) ) ) ) ) ) )。

output_folder

将生成的图像写入文件夹,而不是直接写入内存

first_page

开始转换页数

last_page

要转换到哪个页面

fmt

图像格式。 可以指定为png,默认值为ppm

thread_count

可以参与转换的线程数

userpw

PDF密码

output_file

输出文件名

poppler_path

指定portlet的安装路径。 如果先进行配置,则无需指定

有趣的是,能够启动多线程的thread_count参数可以大大提高转换速度,尤其是在有很多PDF页面的情况下。 感兴趣的读者可以试试。

以上是用python的三种方法提取pdf中图像的详细内容。 有关python提取pdf中图像的信息,请参阅自由资源网上的其他相关文章。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。