在python代码中,如何有效地将pdf中的某个页面保存为jpeg文件?(使用案例:我有一个python flask web服务器,上传pdf-s,每个页面对应的jpeg-s是商店.)
这个解决方案很接近,但问题是它没有将整个页面转换为jpeg.
是否有一个简单的解决方案来修剪PIL中的图像空白?
ImageMagick通过以下方式轻松支持它:
convert test.jpeg -fuzz 7% -trim test_trimmed.jpeg
Run Code Online (Sandbox Code Playgroud)
我找到了PIL的解决方案:
from PIL import Image, ImageChops
def trim(im, border):
bg = Image.new(im.mode, im.size, border)
diff = ImageChops.difference(im, bg)
bbox = diff.getbbox()
if bbox:
return im.crop(bbox)
Run Code Online (Sandbox Code Playgroud)
但是这个解决方案有缺点:
border颜色,这对我来说不是什么大问题,我的图像有白色背景-fuzz密钥.添加一些模糊裁剪.因为我可以有一些jpeg压缩工件和不需要的巨大阴影.可能PIL有一些内置的功能吗?还是有一些快速解决方案?
因此,我所处的状态是以PDF格式发布的一堆数据,但更糟糕的是,大多数(全部?)的PDF似乎是在办公室打印的字母,打印/传真,然后扫描(我们的政府在其最好的呃?)起初我以为我疯了,但后来我开始看到许多"倾斜"的pdf,就像有人没有正确地将它们放在扫描仪上一样.因此,我认为从中获取实际文本的下一个最好的方法是将每个页面转换为图像.
显然这需要自动化,如果可能的话我宁愿坚持使用Python.如果Ruby或Perl有某种形式的实现,它太棒了,我可以走那条路.我已经尝试了pyPDF进行文本提取,这显然对我没什么好处.我已经尝试过swftools,但是我从中得到的图像只是完全无法使用.看起来字体在转换中被破坏了.我也没有真正关心图像格式,只要它们相对轻巧,可读.
我想要一个python函数,它接受pdf并返回文档中注释注释的文本列表.我看过python-poppler(https://code.launchpad.net/~poppler-python/poppler-python/trunk),但我无法弄清楚如何让它给我任何有用的东西.
我找到了get_annot_mapping方法并修改了提供的演示程序来调用它self.current_page.get_annot_mapping(),但我不知道如何处理AnnotMapping对象.它似乎没有完全实现,只提供复制方法.
如果有任何其他库提供此功能,那也没关系.
我已经安装了 PymuPDF/fitz,因为我试图从 PDF 文件中提取图像。但是,在运行下面的代码时,我看到No module named 'frontend'.
doc = fitz.open(pdf_path)
for i in range(len(doc)):
for img in doc.getPageImageList(i):
xref = img[0]
pix = fitz.Pixmap(doc, xref)
if pix.n < 5: # this is GRAY or RGB
pix.writePNG("p%s-%s.png" % (i, xref))
else: # CMYK: convert to RGB first
pix1 = fitz.Pixmap(fitz.csRGB, pix)
pix1.writePNG("p%s-%s.png" % (i, xref))
pix1 = None
pix = None
Run Code Online (Sandbox Code Playgroud)
我已经搜索过,但没有这种错误的单一报告。我已经安装了 PyMuPDF、muPDF 和 fitz 模块
这是完整的错误:
Traceback (most recent call last):
File "/home/waqar/PycharmProjects/predator/ExtractFileImage.py", line 1, in <module>
import …Run Code Online (Sandbox Code Playgroud) 我有一个从扫描软件生成的pdf.pdf每页有1个TIFF图像.我想从每个页面中提取TIFF图像.
我正在使用iTextSharp并且我已经成功找到了图像,并且可以从该PdfReader.GetStreamBytesRaw方法中获取原始字节.问题是,正如我之前发现的那样,iTextSharp不包含PdfReader.CCITTFaxDecode方法.
还有什么我知道的?即使没有iTextSharp,我也可以在记事本中打开pdf并找到流,/Filter /CCITTFaxDecode我知道/DecodeParams它正在使用CCITTFaxDecode组4.
有没有人知道如何从我的pdf中获取CCITTFaxDecode过滤图像?
干杯,卡胡
有没有办法从pdf文档中提取图像(使用PyPDF2库)?也可以将一些图像替换为另一个图像(例如用PIL生成或从文件加载)?
我能够从pdf对象树中获取EncodedStreamObject并获得编码流(通过调用getData()方法),但看起来它只是原始内容,没有任何图像标题和其他元信息.
>>> import PyPDF2
>>> # sample.pdf contains png images
>>> reader = PyPDF2.PdfFileReader(open('sample.pdf', 'rb'))
>>> reader.resolvedObjects[0][9]
{'/BitsPerComponent': 8,
'/ColorSpace': ['/ICCBased', IndirectObject(20, 0)],
'/Filter': '/FlateDecode',
'/Height': 30,
'/Subtype': '/Image',
'/Type': '/XObject',
'/Width': 100}
>>>
>>> reader.resolvedObjects[0][9].__class__
PyPDF2.generic.EncodedStreamObject
>>>
>>> s = reader.resolvedObjects[0][9].getData()
>>> len(s), s[:10]
(9000, '\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc\xcc')
Run Code Online (Sandbox Code Playgroud)
我已经仔细研究过PyPDF2,ReportLab和PDFMiner解决方案,但没有找到类似我正在寻找的东西.
任何代码示例和链接都将非常有用.
我已成功使用以下代码从多个 PDF 页面中提取图像,但分辨率相当低。有办法调整吗?
import fitz
pdffile = "C:\\Users\\me\\Desktop\\myfile.pdf"
doc = fitz.open(pdffile)
for page_index in range(doc.pageCount):
page = doc.loadPage(page_index)
pix = page.getPixmap()
output = "image_page_" + str(page_index) + ".jpg"
pix.writePNG(output)
Run Code Online (Sandbox Code Playgroud)
我还尝试使用此处的代码并将 if pix.n < 5" 更新为 "if pix.n - pix.alpha < 4 但这在我的情况下没有输出任何图像。
搜索了很多,但由于我找不到此类问题的解决方案,因此在同一个问题上发布了一个明确的问题。大多数答案涵盖了相对容易的图像/文本提取。
我需要分别从 PDF 中提取表格和图形作为文本 (csv) 和图像。
任何人都可以用有效的python 3.6代码来帮助我解决这个问题吗?
到目前为止,我可以使用 startmark = b"\xff\xd8" 和 endmark = b"\xff\xd9" 实现提取 jpg,但并非 PDF 中的所有表格和图形都是普通的 jpg,因此我的代码无法实现这一目标。
例如,我想从第 11 页中提取表格,从第 12 页中提取图形作为图像或从下面给出的链接中可行的内容。怎么办?
https://hartmannazurecdn.azureedge.net/media/2369/annual-report-2017.pdf
我有一个函数可以从 PDF 文件中获取页面,并使用(PIL Fork)PyPDF2将第一页转换为 png(或 jpg)Pillow
from PyPDF2 import PdfFileWriter, PdfFileReader
import os
from PIL import Image
import io
# Open PDF Source #
app_path = os.path.dirname(__file__)
src_pdf= PdfFileReader(open(os.path.join(app_path, "../../../uploads/%s" % filename), "rb"))
# Get the first page of the PDF #
dst_pdf = PdfFileWriter()
dst_pdf.addPage(src_pdf.getPage(0))
# Create BytesIO #
pdf_bytes = io.BytesIO()
dst_pdf.write(pdf_bytes)
pdf_bytes.seek(0)
file_name = "../../../uploads/%s_p%s.png" % (name, pagenum)
img = Image.open(pdf_bytes)
img.save(file_name, 'PNG')
pdf_bytes.flush()
Run Code Online (Sandbox Code Playgroud)
这会导致错误:
OSError:无法识别图像文件<_io.BytesIO对象位于0x0000023440F3A8E0>
我发现一些线程有类似的问题(PIL open() 方法不适用于 BytesIO),但我看不出我在这里错在哪里,因为我已经pdf_bytes.seek(0)添加了。 …
我有一堆 PDF 文件,其中一些是纯文本,但有些完全或部分保存为“每页一个图像”,因为它们是从扫描仪生成的。
我需要提取PDF 中包含的所有图像,然后分别检查每个图像。
我能够使用此处找到的 python 脚本提取大部分图像,请参见问题:
一些包含的图像是使用 JBIG2 编码的,我找不到任何 python 或其他工具来将 jbig2 转换为可以使用通用图形工具轻松打开的东西。
python ×10
pdf ×9
image ×3
extract ×2
pymupdf ×2
pypdf ×2
bytesio ×1
imagemagick ×1
itextsharp ×1
jbig2 ×1
mupdf ×1
ocr ×1
python-3.6 ×1
python-3.x ×1
reportlab ×1