需求

有一个项目需求是需要把多张图片存储到pdf上,图片下面还要有信息描述,然后可以下载到手机查看。

问题

之前我查了网上很多方法,图片是存储到那个pdf变得相当大,才十张图片不到就已经70M。我尝试过图片压缩再存储到pdf上,并没卵用。
说到这就得提一下,python把图片存储到pdf上,与其说是存储不如说是描绘,所以说和图片大小并没有太大关系。
就当我以为没办法的时候,我仔细看了一下drawImage这个方法的注释。(在下面的代码中有:# 添加图片 下面)。这个方法最后一段是重点。

原注释:

“”"
Unlike drawInlineImage, this creates ‘external images’ which
are only stored once in the PDF file but can be drawn many times.
If you give it the same filename twice, even at different locations
and sizes, it will reuse the first occurrence, resulting in a saving
in file size and generation time. If you use ImageReader objects,
it tests whether the image content has changed before deciding
whether to reuse it.
In general you should use drawImage in preference to drawInlineImage
unless you have read the PDF Spec and understand the tradeoffs.

“”"

翻译:

与drawInlineImage不同,它创建的“外部图像”
在PDF文件中仅存储一次,但可以多次绘制。
如果给它两次相同的文件名,即使是在不同的位置
和大小,它将重用第一个引用,从而实现保存
在文件大小和生成时间方面。如果使用ImageReader对象,
它测试图像内容是否已更改,然后再决定
是否重复使用它。

通常,您应该优先使用drawImage而不是drawInlineImage
除非您已经阅读了PDF规范并理解了权衡。

个人理解

调用drawImage方法,会在pdf上创建“外部图像”。ImageReader(image_file)里面的image_file是图片路径,要是图片路径不一样,drawImage方法就会创建新的“外部图像”。
所以我循环文件夹,会把新的图片重命名为1.jpg(什么名字都行),覆盖前一张图片。要是你想保留图片就用
shutil.copy(image_file, new_path),意思就是拷贝不是移动。

代码

from reportlab.pdfgen import canvas
from PIL import Image
from reportlab.lib.pagesizes import A4
import PIL.Image, PIL.ExifTags
from reportlab.lib.utils import ImageReader
from reportlab.pdfbase import pdfmetrics
from reportlab.pdfbase.ttfonts import TTFont# 生成pdf
class PicturePDF(Resource):   # 注册中文字体包def registerFont(self):fullPath = os.path.join(ROOT_PATH, "etc", "文泉驿正黑.ttf")pdfmetrics.registerFont(TTFont('song', fullPath))# 保存的图片转换为pdfdef imgtopdf(self, pdf_path):self.registerFont()# 保存为pdf的路径imgDoc = canvas.Canvas(pdf_path)# A4是格式imgDoc.setPageSize(A4)document_width, document_height = A4i = 0for image_name in os.listdir(self.pci_path):image_file = os.path.join(self.pci_path, image_name)new_path = os.path.join(self.pci_path, "1.jpg")print(i)shutil.move(image_file, new_path)# 尝试识别图片,失败则跳过继续try:image_file = PIL.Image.open(new_path)except Exception as e:print(f'{image_file = }')logger.ERROR(f'PicturePDF, image_name, {e}')continue# 图片的尺寸大小image_width, image_height = image_file.size# 处理图片在pdf保存的比例image_aspect = image_height / float(image_width)print_width = document_widthprint_height = document_width * image_aspectif i % 2 == 0:d_h = document_height - print_heightif i % 2 == 1:d_h = d_h - print_height - 30# 添加图片imgDoc.drawImage(ImageReader(new_path), document_width - print_width,d_h, width=print_width,height=print_height, preserveAspectRatio=True)# 注册中文字体imgDoc.setFont('song', 16)# 添加信息imgDoc.drawString(document_width - print_width, d_h - 15, text=image_name.encode('utf-8'))# 一页保存两张图片,两页之后另起新的一页if i % 2 == 1:imgDoc.showPage()i += 1image_file.close()imgDoc.save()

重点

这个博客的重点就是告诉大家,图片描绘到pdf中,pdf依旧可以很小,关键是图片名字一样,内容可以不一样。
还有就是添加中文信息需要注册中文字体,下载一个ttf包到本地,根据对应路径注册。

python-将图片存储到pdf中相关推荐

  1. Python从Word/PPT/PDF中抽取图片

    Python从Word/PPT/PDF中抽取图片 PS 1:也是从网上各个帖子中学习的代码,因此代码的格式以及内容有粘贴网上其他大神的代码,如有侵权请告知删除 2:本次设计意在用pyinstaller ...

  2. 用Python去除扫描型PDF中的水印

    内容概述 含水印扫描型PDF文件,其中某页如下图所示,用Python去除其页顶及页底的水印. 处理思路:PDF中的每一页的水印的相对位置基本相同,将PDF每一页输出成图片,然后进行图片编辑,用白色填充 ...

  3. python 两种提取pdf中图片的包

    项目需求,提取pdf中图片,找半天的结果 1.fitz (我没找到元素定位的方法) pip install pymupdf import fitzdef extract_pic_from_pdf(pd ...

  4. python 删除pdf页面_使用Python批量删除扫描PDF中的空白页

    对于经常看扫描PDF资料的人来说,经常会碰到如下问题: PDF缩略图 因为一些格式转换的原因,一些空白页时不时的出现,而且规律不定,一会是偶数页码一会是奇数页码,逐个选中删除的话,对于几百页的文档,非 ...

  5. 三种方法,用Python轻松提取PDF中的全部图片

    作者 | 陈熹.刘早起 来源 | 早起Python 头图 | 下载于视觉中国 有时我们需要将一份或者多份PDF文件中的图片提取出来,如果采取在线的网站实现的话又担心图片泄漏,手动操作又觉得麻烦,其实用 ...

  6. python中读取文件内容-深入学习python解析并读取PDF文件内容的方法

    这篇文章主要学习了python解析并读取PDF文件内容的方法,包括对学习库的应用,python2.7和python3.6中python解析PDF文件内容库的更新,包括对pdfminer库的详细解释和应 ...

  7. python处理pdf提取指定数据_python从PDF中提取数据的示例

    01 前言 数据是数据科学中任何分析的关键,大多数分析中最常用的数据集类型是存储在逗号分隔值(csv)表中的干净数据.然而,由于可移植文档格式(pdf)文件是最常用的文件格式之一,因此每个数据科学家都 ...

  8. PDFPlumber使用入门+python实现PDF中表格转化为Excel的方法

    PDFPlumber使用入门:https://blog.csdn.net/weixin_48629601/article/details/107224376 python实现PDF中表格转化为Exce ...

  9. python从字符串中提取数字并转换为相应数据类型_python从PDF中提取数据的示例

    01 前言 数据是数据科学中任何分析的关键,大多数分析中最常用的数据集类型是存储在逗号分隔值(csv)表中的干净数据.然而,由于可移植文档格式(pdf)文件是最常用的文件格式之一,因此每个数据科学家都 ...

  10. python中提取几列_Python一键提取PDF中的表格到Excel(实例50)

    从PDF文件获取表格中的数据,也是日常办公容易涉及到的一项工作.一个一个复制吧,效率确实太低了.用Python从PDF文档中提取表格数据,并写入Excel文件,灰常灰常高效. 上市公司的年报往往包含几 ...

最新文章

  1. 求职屡次被虐?务必拿走这300道面试宝藏题!
  2. oracle常见单词_Oracle的词汇表
  3. XCTF-Reverse:re1
  4. 【Tools】TortoiseGit安装图解
  5. 使用SpringTask定时获取传感器设备信息并缓存到Redis
  6. apt-get 更新指定软件_GrandPerspective for mac(磁盘管理软件)
  7. Java自动拆箱陷阱。 谨防!
  8. php 换行 PHP_EOL变量
  9. 电脑显示器闪屏_Win7系统电脑显示器屏幕闪屏的解决办法
  10. 关于电脑程序员职务 用英语怎么表达
  11. 【机器学习】选择模型
  12. C#实现WebService服务 项目完整总结
  13. linux文件系统简析
  14. 三向合并和 Git 的合并策略,手把手教你Git 合并
  15. CAD一键统计所有线段长度
  16. [渝粤教育] 北京师范大学 中国哲学 参考 资料
  17. 中国莽草酸行业市场深度调查报告(2022版)
  18. 有限元:什么是有限元分析法
  19. 计算机应用后期影音制作,影音制作工具(ImTOO Movie Maker)
  20. cubic算法优化_安卓cpu优化 tcp拥塞算法cubic和reno怎么选择

热门文章

  1. 【制作脑图】万彩脑图大师教程 | 关于设置
  2. js 判断2月份多少天
  3. oeasy教您玩转vim - 3 - # 打开文件
  4. PBS+maui安装文档
  5. 企业商誉管理系统(业务开展)
  6. 网站实现GNSS数据批量下载
  7. 用original绘制重叠柱状图
  8. atom n270 cpu linux,英特尔Atom Z530和Intel Pentium-M 733 那个处理能力强_intel atom z530
  9. git add 之后没有push 怎么找回代码?
  10. 刽子手c语言,竞赛题目选讲——刽子手的游戏(C语言)