使用python将windows下多种文件格式转换成PDF格式

前言

最近在用python处理将各种格式的文件转换成pdf文件,然后合并,最后统一打印。过程中遇到了一些列问题,现将相关经验汇总如下,共有需要的朋友使用。

image2pdf

# import之前需要pip install 相关的包
import img2pdf
from PIL import Image
import pythoncom
img_path = 'G:\project_2020\text.jpg'  # 需要转换的图片地址
pdf_path = 'G:\project_2020\tex.pdf'  # 转换成pdf的存储地址,需要提前生成一个空的pdf文件
with Image.open(img_path) as image:
    # 将图片转成二进制内容
    pdf_bytes = img2pdf.convert(image.filename)
    with open(p_path, "wb") as file:
        # 将二进制的图片内容写入pdf文件
        file.write(pdf_bytes)

docx2pdf(直接使用docx2pdf包)

# pip install docx2pdf
from docx2pdf import convert
docx_path = 'G:\project_2020\text.docx'  # 需要转换的文档地址
pdf_path = 'G:\project_2020\tex.pdf'  # 转换成pdf的存储地址,需要提前生成一个空的pdf文件
# 因为docx2pdf调用的是pywin32提供的接口,所以需要pythoncom.CoInitialize()初始化资源,否则无法运行
pythoncom.CoInitialize()
convert(docx_path, p_path)
# 抓换完成之后还需释放资源
pythoncom.CoUninitialize()

注意:

该包源码也是使用pywin32封装好的包,使用方便,但是仅可转换docx格式文档,无法处理doc文档

使用pywin32转换office文档格式

doc2pdf-docx2pdf(使用pywin32)

# import之前需要pip install 相关的包
from win32com import client
import pythoncom
word_path = 'G:\project_2020\text.doc'  # 需要转换的文档地址
pdf_path = 'G:\project_2020\tex.pdf'  # 转换成pdf的存储地址,需要提前生成一个空的pdf文件
# 初始化office环境
pythoncom.CoInitialize()
word = client.Dispatch("Word.Application")
doc = word.Documents.Open(word_path)
# pdf
doc.SaveAs(p_path, 17)
doc.Close()
word.Quit()
# 释放资源
pythoncom.CoUninitialize()

excel2pdf(xls、xlsx)

# import之前需要pip install 相关的包
from win32com import client
import pythoncom
excel_path = 'G:\project_2020\text.xls'  # 需要转换的文档地址
pdf_path = 'G:\project_2020\tex.pdf'  # 转换成pdf的存储地址,需要提前生成一个空的pdf文件
pythoncom.CoInitialize()
excel = client.Dispatch("Excel.Application")
excel.Visible = False
xls = excel.Workbooks.Open(excel_path)
# 获取工作sheet
n = xls.Worksheets.Count + 1
sheet_list = range(1, n)
# 选中全部active的sheet
xls.WorkSheets(sheet_list).Select()
# 导出pdf格式
xls.ActiveSheet.ExportAsFixedFormat(0, p_path)
xls.Close()
excel.Quit()
pythoncom.CoUninitialize()

txt2pdf

from fpdf import FPDF

txt_path = 'G:\project_2020\text.txt'  # 需要转换的文档地址
pdf_path = 'G:\project_2020\tex.pdf'  # 转换成pdf的存储地址,需要提前生成一个空的pdf文件
pdf = FPDF()
# 添加一页pdf "L"横向pdf
pdf.add_page("L")
# 使用fpdf需要自己添加中文字体否则会出现乱码现象 中文字字体百度自行下载解压后将xxx.ttf文件复制到项目指定静态文件夹
pdf.add_font('chinese', '', 'static/font/HuaWenXiHei-1.ttf', True)
pdf.set_font('chinese', size=12)
# create a cell
t = open(txt_path, 'r', encoding="utf-8")
for x in t:
    # 逐行写入数据
    pdf.cell(200, 10, txt=x, ln=1, align='L')
    pdf.output(p_path)

合并pdf

from PyPDF2 import PdfFileReader, PdfFileWriter


pdf_path = 'G:\project_2020\tex.pdf'  # 合并的pdf的存储地址,需要提前生成一个空的pdf文件
p_path = 'G:\project_2020\pdf.pdf'  # 被copy的pdf的存储地址,需要提前生成一个空的pdf文件
# 清空pdf_path中内容
f = open(pdf_path, "wb+")
f.close()
# 获取一个 PdfFileWriter 对象
pdf_output = PdfFileWriter()
# 获取一个 PdfFileReader 对象
pdf_input = PdfFileReader(p_path)
# 获取 PDF 的页数
page_count = pdf_input.getNumPages()
# 返回一个 PageObject
for p in range(page_count):
    page = pdf_input.getPage(p)
    # 将一个 PageObject 加入到 PdfFileWriter 中
    pdf_output.addPage(page)
    # p_f.close()
    # 输出到文件中
    with open(pdf_path, 'ab') as p_d_f:
        pdf_output.write(p_d_f)

注意

本文总结的方法只适用windows系统并且已安装office办公软件,无法在linux系统中使用,因为pywin32会调用windows系统里的office软件,而linux系统不含有office软件,如果想要在linux系统实现该需求可以在linux中安装libreOffice,但是该方法比较麻烦,有兴趣的朋友可以自行研究。

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值