最近公司有一个excel转pdf的需求需要实现,话不多说直接上代码!
我所用的环境是ubuntu18版本
excel转pdf在Linux环境中可以使用libreoffice插件进行转换!
1.首先查看是否安装libreoffice,如果没有安装则使用pip命令进行安装
pip install libreoffice
2.安装完以后可以直接用命令行进行转换测试:
soffice --headless --convert-to 目标格式(如pdf) 转格式文件 --outdir 目标文件夹
3.此时也可以写一个脚本文件去测试例如:
subprocess模块介绍:https://www.cnblogs.com/zhou2019/p/10582716.html
import subprocess
import os
import time
def doc2pdf_linux(docPath, pdfPath):
"""
需要在linux中下载好libreoffice
"""
# 注意cmd中的libreoffice要和linux中安装的一致
cmd = 'soffice --headless --convert-to pdf'.split()+[docPath] + ['--outdir'] + [pdfPath]
p = subprocess.Popen(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE,bufsize=1)
# p.wait(timeout=30) # 停顿30秒等待转化
# stdout, stderr = p.communicate()
p.communicate()
# if stderr:
# raise subprocess.SubprocessError(stderr)
def doc2pdf(docPath, pdfPath):
"""
注意使用绝对路径
pdf的生成只写路径,不写名字
"""
docPathTrue = os.path.abspath(docPath)
return doc2pdf_linux(docPathTrue, pdfPath)
if __name__ == '__main__':
wordpath='/home/jxrzw/Desktop/test.xlsx'
pdfpath='/home/jxrzw/Desktop/attached1'
start_time = time.time()
doc2pdf(wordpath,pdfpath)
end_time = time.time()
print(end_time - start_time)
通过测试后的小伙伴会发现如果一旦excel文件过大转换速率就会很慢,并且转换时会出现折行的问题,那么问题来了,该这么解决勒?
优化方法:
1.首先把excel文件转成html格式的文件,此时你会发现转换速度出奇的快,而且格式也ok没有一点问题。
2.然后利用python中的pdfkit库或者wkhtmltopdf把html转换成pdf(如果没有的小伙伴请自行去安装)
3.实现代码:
**有关wkhtmltopdf的资料:**https://blog.csdn.net/qq_34496005/article/details/89398987
# -*- coding: utf-8 -*-
"""
linux platform excel to pdf
"""
import subprocess
import multiprocessing
import time
import pdfkit
def excel_to_html(excelPath, htmlPath):
"""
需要在linux中下载好libreoffice
"""
# 注意cmd中的libreoffice要和linux中安装的一致
cmd = 'libreoffice --headless --convert-to html'.split() + [excelPath] + ['--outdir'] + [htmlPath]
p = subprocess.Popen(cmd, stderr=subprocess.PIPE, stdout=subprocess.PIPE,bufsize=1)
# p.wait(timeout=30) # 停顿30秒等待转化
# stdout, stderr = p.communicate()
p.communicate()
# if stderr:
# raise subprocess.SubprocessError(stderr)
options = {
'page-size': 'A0',
'margin-top': '0in',
'margin-right': '0in',
'margin-bottom': '0in',
'margin-left': '0in',
'encoding': "UTF-8",
'lowquality':'',
'grayscale':'',
'custom-header' : [
('Accept-Encoding', 'gzip')
],
'cookie': [
('cookie-name1', 'cookie-value1'),
('cookie-name2', 'cookie-value2'),
],
'no-outline': None
}
# def html_to_pdf(htmlPath,pdfPath):
# # mutex.acquire()
# # mutex.release()
# return pdfkit.from_file(htmlPath,pdfPath,options=options)
def html_to_pdf(htmlPath,pdfPath):
cmd1 = 'wkhtmltopdf -l -s A0'.split() + [htmlPath] + [pdfPath]
q = subprocess.Popen(cmd1, stderr=subprocess.PIPE, stdout=subprocess.PIPE, bufsize=1)
# stdout,stderr =q.communicate()
q.communicate()
# if not stderr:
# raise subprocess.SubprocessError(stderr)
# pdfkit.from_file(htmlPath, pdfPath, options=options)
if __name__ == '__main__':
excelpath='/home/jxrzw/Desktop/test.xlsx'
htmlpath='/home/jxrzw/Desktop/attached'
htmlpath1 = '/home/jxrzw/Desktop/attached/test.html'
pdfpath = '/home/jxrzw/Desktop/attached/test.pdf'
start_time = time.time()
g1 = multiprocessing.Process(target=excel_to_html,args=(excelpath,htmlpath))
g1.start()
g1.join()
g2 = multiprocessing.Process(target=html_to_pdf, args=(htmlpath1, pdfpath))
g2.start()
g2.join()
end_time = time.time()
print(end_time - start_time)
最终转换速率得到了很大的提升,其中转换速率可能还和电脑的硬件配置有关系,我用自己电脑跑起来很快,公司电脑运用就慢了很多!
如有不对的地方希望大家指出来,一起交流学习!