fpdf简介

fpdf

fpdf 的 github地址
fpdf 是从 PHP 的 FPDF 移植而来的,与其他 PDF 库相比,fpdf 简单、小巧、用途广泛,功能先进,易于学习、扩展和维护。

特征

  • Python 2.5 到 3.4 支持
  • Unicode (UTF-8) TrueType 字体子集嵌入
  • 条码 I2of5 和 code39,二维码即将推出…
  • PNG、GIF 和 JPG 支持(包括透明度和 Alpha 通道)
  • 带有视觉设计师和基本 html2pdf 的模板
  • 异常支持、其他小修复、改进和 PEP8 代码清

Tips: 暂时未整理 fpdf 写入中文操作

安装

pip install fpdf

pypdf2

pypdf2 的 github地址 , 能够拆分、合并、裁剪和转换 PDF 文件的页面。它还可以为 PDF 文件添加自定义数据、查看选项和密码。PyPDF2 也可以从 PDF 中检索文本和元数据。

安装

pip install PyPDF2

使用

fpdf

纯文字

# 最简单引用
from fpdf import FPDFdef hello_world():pdf = FPDF(orientation="P", unit="mm", format="A4")  # 竖版,A4,mm单位pdf.add_page()pdf.set_font(family="Arial", style="B", size=16)pdf.cell(w=40, h=10, txt="hello world pdf")pdf.text(x=60, y=140, txt="Some text.")pdf.output(name="hello_world_pdf.pdf", dest="F")

图片,页眉页脚

# 添加图片,页眉,页脚等# 继承FPDF 重写 header 页眉,footer页脚方法
class PDF(FPDF):def header(self):# Logoself.image(name='img.png', x=10, y=10, w=5)self.set_draw_color(0, 80, 180)self.set_fill_color(230, 230, 0)self.set_text_color(220, 50, 50)# 设置页眉字体self.set_font('Arial', '', 12)# 设置页眉前空字符# self.cell(100)# 页眉标题文字self.cell(0, 10, 'Title', 0, 0, 'C')  # 居中# self.cell(30, 10, 'Title', 1, 0, 'L')  # 左对齐# self.cell(30, 10, 'Title', 1, 0, 'R')  # 右对齐# 换行self.ln(10)def footer(self):# 距离底部1.5cmself.set_y(-15)# 页脚字体self.set_font('Arial', 'I', 8)# 页数  当前页/总页数self.cell(0, 10, str(self.page_no()) + " / {nb}", 0, 0, 'C')# 添加副标题def chapter_title(self, num, label):# Arial 12self.set_font('Arial', '', 12)# Background colorself.set_fill_color(200, 220, 255)# Titleself.cell(0, 6, 'Chapter %d : %s' % (num, label), 0, 1, 'L', 1)# Line breakself.ln(4)# 添加文件内容def chapter_body(self, name):# Read text filewith open(name, 'rb') as fh:txt = fh.read().decode('latin-1')# Times 12self.set_font('Times', '', 12)# Output justified textself.multi_cell(0, 5, txt)# Line breakself.ln()# 设置链接self.set_link(link=name, y=-1, page=-1)# 斜体I,标记结束self.set_font('', 'I')self.cell(0, 5, '(end of excerpt)')# 组合副标题和文件内容def print_chapter(self, num, title, name):self.add_page()self.chapter_title(num, title)self.chapter_body(name)if __name__ == '__main__':pdf = PDF()pdf.alias_nb_pages()  # 定义总页数可以使用{nb}来获取pdf.set_font('Times', '', 12)pdf.set_title("page title")pdf.set_author('yiwanliejiu')pdf.print_chapter(1, 'first chapter', 'a.txt')pdf.print_chapter(2, 'second chapter', 'b.txt')pdf.output('hello_world.pdf', 'F')

添加表格,二维码,注释

import csvfrom fpdf import FPDF"""
生成表格的三种样式
"""class PDF(FPDF):def basic_table(self, headings, rows):# 表头for heading in headings:self.cell(30, 7, heading, 1, align="C")self.ln()  # 换行# 数据for row in rows:for col in row:self.cell(40, 6, col, 1, align="L")self.ln()def improved_table(self, headings, rows, col_widths=(42, 39, 35, 40)):for col_width, heading in zip(col_widths, headings):self.cell(col_width, 7, heading, border=1, align="C")self.ln()for row in rows:self.cell(col_widths[0], 6, row[0], border="LR")  # border="LR" 边框线设置为左右,那么上下为空,做到合并单元格效果self.cell(col_widths[1], 6, row[1], border="LR")self.cell(col_widths[2], 6, row[2], border="LR", align="R")self.cell(col_widths[3], 6, row[3], border="LR", align="R")self.ln()# 底部闭合线:self.cell(sum(col_widths), 0, "", border="T")def colored_table(self, headings, rows, col_widths=(42, 39, 35, 42)):# Colors, line width and bold font:self.set_fill_color(255, 100, 0)  # 背景色self.set_text_color(255)  # 文字颜色self.set_draw_color(255, 0, 0)  # 边框线颜色self.set_line_width(0.3)  # 边框线宽度self.set_font(style="B")for col_width, heading in zip(col_widths, headings):self.cell(col_width, 7, heading, border=1, align="C", fill=True)self.ln()# Color and font restoration:self.set_fill_color(224, 235, 255)self.set_text_color(0)self.set_font()fill = False  # 最初不绘制单元格背景for row in rows:self.cell(col_widths[0], 6, row[0], border="LR", align="L", fill=fill)self.cell(col_widths[1], 6, row[1], border="LR", align="L", fill=fill)self.cell(col_widths[2], 6, row[2], border="LR", align="R", fill=fill)self.cell(col_widths[3], 6, row[3], border="LR", align="R", fill=fill)self.ln()fill = not fill  # 将配置取反。这样可以实现隔行绘制背景的效果# 底部闭合线self.cell(sum(col_widths), 0, "", "T")# 处理文件数据
def load_data_from_csv(csv_filepath):headings, rows = [], []with open(csv_filepath, encoding="utf8") as csv_file:for row in csv.reader(csv_file, delimiter=","):if not headings:  # extracting column names from first row:headings = rowelse:rows.append(row)return headings, rowscol_names, data = load_data_from_csv("a.txt")
pdf = PDF()
pdf.set_font("helvetica", size=14)
pdf.add_page()
pdf.basic_table(col_names, data)
pdf.add_page()
pdf.improved_table(col_names, data)
pdf.add_page()
pdf.colored_table(col_names, data)
# 条形码
pdf.add_page()
pdf.code39("*fpdf2*", x=30, y=50, w=4, h=20)
# 二维码
import qrcode
pdf.add_page()
img = qrcode.make("fpdf2")
pdf.image(img.get_image(), x=50, y=50)
# 文本注释
pdf.add_page()
pdf.set_font("Helvetica", size=24)
pdf.text(x=60, y=140, txt="Some text.")
pdf.text_annotation(x=100,y=130,text="This is a text annotation.",
)
# 强调背景色,hover注释
pdf.add_page()
# pdf.add_font(family="youyuan", style="", fname="./SIMYOU.TTF", uni=False)  # 添加一个本地字体
pdf.set_font("Helvetica", size=24)
with pdf.add_highlight("lingt ", title="title", color=(120, 230, 0)):pdf.text(50, 50, "first")pdf.set_y(50)pdf.multi_cell(w=30, txt="second")
pdf.cell(w=60, txt="Not highlighted", border=1)pdf.output("tuto5.pdf")

添加链接

from fpdf import FPDF, HTMLMixinclass MyFPDF(FPDF, HTMLMixin):passpdf = MyFPDF()# First page:
pdf.add_page()
pdf.set_font("helvetica", size=20)
pdf.write(5, "To find out what's new in self tutorial, click ")
pdf.set_font(style="U")
# 添加本文件内部链接
link = pdf.add_link()
# 添加链接引用位置
pdf.write(5, "click here jump", link)
pdf.set_font()# Second page:
pdf.add_page()
# 设置链接目标地址
pdf.set_link(link)
# 给图片添加 url链接
pdf.image("img.png", 10, 10, 50, 0, "", "https://pyfpdf.github.io/fpdf2/"
)pdf.set_left_margin(60)
pdf.set_font_size(18)
# 在html格式数据内指定URL链接地址
pdf.write_html("""You can print text mixing different styles using HTML tags: <b>bold</b>, <i>italic</i>,
<u>underlined</u>, or <b><i><u>all at once</u></i></b>!
<br><br>You can also insert links on text, such as <a href="https://pyfpdf.github.io/fpdf2/" target="blank">https://pyfpdf.github.io/fpdf2/</a>,
or on an image: the logo is clickable!"""
)
pdf.output("tuto6.pdf")

目录大纲

from fpdf import FPDF, HTMLMixin, HTML2FPDFclass CustomHTML2FPDF(HTML2FPDF):def render_toc(self, pdf, outline):pdf.cell(txt='Table of contents:', new_x="LMARGIN", new_y="NEXT")for section in outline:pdf.cell(txt=f'* {section.name} (page {section.page_number})', new_x="LMARGIN", new_y="NEXT")class PDF(FPDF, HTMLMixin):HTML2FPDF_CLASS = CustomHTML2FPDFpdf = PDF()
pdf.add_page()
pdf.write_html("""<toc></toc><h1>Level 1</h1><h2>Level 2</h2><h3>Level 3</h3><h4>Level 4</h4><h5>Level 5</h5><h6>Level 6</h6><p>paragraph<p>""")
pdf.output("html_toc.pdf")

fpdf2

# fpdf 生成水印
import fpdf
pdf = fpdf.FPDF()
# pdf.set_text_color(245, 245, 245)
pdf.set_text_color(250, 250, 250)  # 设置文字颜色
pdf.set_font("Arial", size=20)
pdf.add_page()
pdf.text(80, 130, "yiwanliejiu")  # 水印文案
pdf.output("waterMark.pdf")
# PyPDF2
from PyPDF2 import PdfFileReader, PdfFileWriter, PdfFileMergerpassword = "123456"reader = PdfFileReader("pypdf2_meta.pdf")
writer = PdfFileWriter()
merger = PdfFileMerger()# 解密
if reader.isEncrypted:reader.decrypt(password)def reader_demo():# 读print(reader.numPages)  # 获取总页数print(reader.getNumPages())  # 获取总页数info = reader.getDocumentInfo()  # 获取文档信息元数据print("author ", info.author)print("creator ", info.creator)print("producer ", info.producer)print("title ", info.title)print("subject ", info.subject)page0 = reader.getPage(0)print(page0.extractText())  # 读取文本内容def wtiter_demo():# 写for pageNum in range(reader.numPages):page = reader.getPage(pageNum)writer.addPage(page)# 写入元数据writer.addMetadata({"/Author": "yiwanliejiu","/Producer": "PyPDF2 writer","/Title": "ahaha"})# 添加密码# writer.encrypt(password)with open("pypdf2_meta.pdf", "wb") as f:writer.write(f)def merger_demo():# 逐个添加合并pdf文件# for pdf in ["tuto2.pdf", "tuto4.pdf"]:#     merger.append(pdf)# merger.write("merger_demo.pdf")# 指定合并的pdf具体页数,位置input1 = open("tuto2.pdf", "rb")input2 = open("tuto4.pdf", "rb")input3 = open("tuto5.pdf", "rb")merger.append(fileobj=input1, pages=(0, 2))  # 指定合并的页码 pages=[)merger.merge(position=1, fileobj=input2, pages=(0, 1))  # 指定新页面插入的位置和页码merger.append(input3)  # 在最后位置插入全部页码output = open("merger_more.pdf", "wb")merger.write(output)merger.close()output.close()# 水印旋转
def water():watermark = PdfFileReader("water.pdf")reader = PdfFileReader("none.pdf")writer = PdfFileWriter()page = reader.getPage(0)page.mergeRotatedPage(watermark.getPage(0), 20)  # 添加水印图片,旋转一定角度writer.addPage(page)with open("water2.pdf", "wb") as fp:writer.write(fp)def waterMark():watermark = PdfFileReader("water.pdf")reader = PdfFileReader("tuto2.pdf")writer = PdfFileWriter()page = reader.getPage(0)# page.mergePage(watermark.getPage(0))  # 添加水印图片# page.mergeRotatedPage(waterpage, 20)  # 添加水印图片,旋转一定角度# writer.addPage(page)for page in reader.pages:page.mergePage(watermark.getPage(0))  # 不知道为什么只能是水印在上面writer.addPage(page)with open("watermark.pdf", "wb") as fp:writer.write(fp)def add_attachment_note():writer = PdfFileWriter()writer.addBlankPage(width=2000, height=2000)writer.addAttachment(fname="桌面壁纸马.jpg", fdata="这里是注释".encode("utf-8"))with open("attach.pdf", "wb") as f:writer.write(f)def compress():# 压缩文件reader = PdfFileReader("waterMark.pdf")writer = PdfFileWriter()for page in reader.pages:page.compressContentStreams()  # 压缩writer.addPage(page)with open("waterMarkCompress.pdf", "wb") as f:writer.write(f)

python pdf文件处理相关推荐

  1. Python PDF文件转Word格式

    1.免费在线转换网站 PDF转换器,限制50页: http://pdfdo.com/pdf-to-word.aspx 迅捷PDF转换器,限制2M: http://app.xunjiepdf.com/p ...

  2. Python PDF文件合并,提取

    文章目录 1. 功能介绍 2.项目难点 1. tkinter设置图标显示 3. 源代码 3. 代码打包 1. 打包过后程序运行出错 2. 打包命令 3.打包技巧 1. 功能介绍 选择两个pdf指定的页 ...

  3. [Python]PDF文件与图片转换(PyMuPDF)及转PPT

    文章目录 安装与简介 MuPDF PyMuPDF PyMuPDF使用 元数据 页面Page 代码示例 PDF转图片 图片转PDF PDF转PPT PyMuPDF提供了PDF及流行图片处理接口. 安装与 ...

  4. Python PDF文件转Word格式,只需要3秒(附打包)

    PDF文档遵循一定的规范,例如精确定位了每个字符出现在页面上的坐标.根据坐标绘制的各种形状(线.矩形.曲线等).所以,用PDF格式传输和打印文档可以保证格式的一致性,不会像Word那样因为渲染引擎的不 ...

  5. python批量pdf转word,python批量实现Word文件转换为PDF文件

    本文为大家分享了python批量转换Word文件为PDF文件的具体方法,供大家参考,具体内容如下 1.目的 通过万能的Python把一个目录下的所有Word文件转换为PDF文件. 2.遍历目录 作者总 ...

  6. Python 办公自动化,一键给PDF文件加密,超方便

    作者 | 欣一 来源 | Python爱好者集中营 今天给大家做一个给PDF文件加密的GUI界面(图形用户界面),方便现在的一些上班族白领们使用,尤其是需要给一些比较重要的PDF文件加密的时候,下面我 ...

  7. python pdf处理 图片_python PDF文件合并、图片处理

    一.合并多个PDF文件 实例: #导入模块import codecs import os import PyPDF2 as PyPDF2 #建立一个装pdf文件的数组 files = list()#遍 ...

  8. Python实现按序合并多个pdf文件

    技术交流QQ群:1027579432,欢迎你的加入! 欢迎关注我的微信公众号:CurryCoder的程序人生 1.整体实现步骤 在日常办公中,我们可能会有一个需求,需要将多个pdf文件合并成一个文件. ...

  9. python使用fpdf创建pdf文件包含:页眉、页脚并嵌入logo图片、设置使用中文字体

    python使用fpdf创建pdf文件包含:页眉.页脚并嵌入logo图片.设置使用中文字体 #python使用fpdf创建页眉.页脚并嵌入logo图片.设置使用中文字体 from fpdf impor ...

  10. python使用fpdf生成发票格式的pdf文件包含:文字、图片logo、表格、条形码等;

    python使用fpdf生成发票格式的pdf文件包含:文字.图片logo.表格.条形码等: pip install fpdf #python使用fpdf生成发票格式的pdf文件包含:文字.图片logo ...

最新文章

  1. NVIDIA深度架构
  2. Nat. Mach. Intell. | 少量数据的生成式分子设计
  3. [黑客技术]提权总结21种办法篇
  4. Go实现查找目录下(包括子目录)替换文件内容
  5. mysql noinstall 5.5_安装配置MYSQL5.5
  6. 中国版MSN慈善缘何遇冷:白领网民参与只为时尚(转自--竞报)
  7. HDU 2176:取(m堆)石子游戏(Nim博弈)
  8. 手机显示天气服务器不可用,手机天气云服务器
  9. vs2015 使用Qt语言家及其使用过程中遇到的问题
  10. java反射机制之Method invoke执行调用方法例子
  11. 不能装载文档控件。请在检查浏览器的选项中检查浏览器的安全设置_Windows 7 怎么修复 Windows 中的 Wi-Fi 连接问题,我教你(六)...
  12. 模拟时针--微信小程序制作
  13. 【每天更新】2022年最新WordPress主题下载,外贸独立站商城/企业网站/个人博客模板 2022-5-18
  14. App推送推了10万打开100?3招提高消息推送(Push)到达率
  15. JQuery中append(function(index,html)),appendTo(),after(function(index,html)),clone()方法
  16. Android Studio模拟器的创建和SDK的安装
  17. CMake I add_custom_command命令详解(构建)
  18. 关于大疆无人机Phantom的一些问题
  19. python下载油管、B站视频的方法
  20. 成信大807程序综合设计2015-2022历年真题及答案【持续更新中】

热门文章

  1. 嬴彻科技日: 发布《自动驾驶卡车量产白皮书》分享从量产走向无人技术路线
  2. MySQL查询不同年份母亲节_日期习俗大不同,走近七个国家的母亲节!
  3. IPD数字诀(一二三四五六七八九十)
  4. 章文嵩-构建云计算平台的实践
  5. C++ 04 翁恺>声明(Declarations) VS. 定义(Definitions)
  6. 奇点云宣布完成1.2亿元B1轮融资,首次公开数据星图
  7. Golang与Java各方面使用对比(下)
  8. Period 、Duration常用方法使用与介绍
  9. CTF easycap Banmabanma
  10. 机器学习中的主动学习实现_我如何使用机器学习来帮助实现正念