所以我所处的状态是以PDF格式发布了一堆数据,但更糟糕的是,大多数(全部?)的PDF似乎是在Office中输入的字母,打印/传真,然后扫描(我们的政府处于最佳状态?)。起初我以为我疯了,但后来我开始看到许多“倾斜”的pdf,就像有人没有正确地将它们放在扫描仪上一样。所以,我认为从中获取实际文本的下一个最好的方法是将每个页面变成图像。
显然这需要自动化,如果可能的话,我更愿意坚持使用Python。如果Ruby或Perl有某种形式的实现,它太棒了,我可以走那条路。我已经尝试了pyPDF进行文本提取,这显然对我没什么好处。我已经尝试过swftools,但是我从中得到的图像只是完全无法使用。看起来字体在转换中被破坏了。我也不太关心图像格式,只要它们相对轻巧,可读。
答案 0 :(得分:11)
如果PDF是真正扫描的图像,则不应将PDF转换为图像,应从PDF中提取图像。最有可能的是,PDF中的所有数据基本上都是一个巨大的图像,包含在PDF格式中,使其在Acrobat中可读。
您应该尝试简单地在PDF中查找图像,并将字节复制出来Extracting JPGs from PDFs。那里的代码很简单,可能有很多原因导致你的PDF文件不起作用。但如果确实如此,您将有一种快速而轻松的方式从PDF文件中获取图像数据。
答案 1 :(得分:8)
你可以打电话给来自命令行的pdftoppm
(或使用Python的subprocess
模块),然后使用例如将生成的PPM文件转换为所需的格式。 ImageMagick(再次使用subprocess
或一些绑定(如果存在)。
答案 2 :(得分:5)
Ghostscript非常适合将PDF文件转换为图像。它可靠且具有许多可配置选项。它也可以通过GPL许可或商业许可获得。您可以从命令行调用它或使用其本机API。有关更多信息:
答案 3 :(得分:1)
这是将.pdf文件转换为图像的另一种方法:使用图像打印机。我已成功使用以下功能来打印"打印" pdf使用ImagePrinter Pro jpeg图像。但是,那里有很多图像打印机。选择你喜欢的那个。根据您选择的图像打印机和图像打印机使用的标准文件保存格式,可能需要稍微更改某些代码。
import win32api
import os
def pdf_to_jpg(pdfPath, pages):
# print pdf using jpg printer
# 'pages' is the number of pages in the pdf
filepath = pdfPath.rsplit('/', 1)[0]
filename = pdfPath.rsplit('/', 1)[1]
#print pdf to jpg using jpg printer
tempprinter = "ImagePrinter Pro"
printer = '"%s"' % tempprinter
win32api.ShellExecute(0, "printto", filename, printer, ".", 0)
# Add time delay to ensure pdf finishes printing to file first
fileFound = False
if pages > 1:
jpgName = filename.split('.')[0] + '_' + str(pages - 1) + '.jpg'
else:
jpgName = filename.split('.')[0] + '.jpg'
jpgPath = filepath + '/' + jpgName
waitTime = 30
for i in range(waitTime):
if os.path.isfile(jpgPath):
fileFound = True
break
else:
time.sleep(1)
# print Error if the file was never found
if not fileFound:
print "ERROR: " + jpgName + " wasn't found after " + str(waitTime)\
+ " seconds"
return jpgPath
生成的jpgPath
变量告诉您打印的pdf的最后一个jpeg页面的路径位置。如果您需要获取另一个页面,可以轻松添加一些逻辑来修改获取先前页面的路径
答案 4 :(得分:0)
有了Wand,现在有了适用于Python的出色imagemagick绑定,这使这项工作非常容易。
以下是将单个PDF文件转换为一系列PNG图像所需的代码:
from wand.image import Image
input_path = "name_of_file.pdf"
output_name = "name_of_outfile_{index}.png"
source = Image(filename=upload.original.path, resolution=300, width=2200)
images = source.sequence
for i in range(len(images)):
Image(images[0]).save(filename=output_name.format(i))
答案 5 :(得分:-1)
pdf_to_jpg
IndexError:列表索引超出范围