Linux环境下实现excel文件转pdf并且实现优化

最近公司有一个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)

最终转换速率得到了很大的提升,其中转换速率可能还和电脑的硬件配置有关系,我用自己电脑跑起来很快,公司电脑运用就慢了很多!
如有不对的地方希望大家指出来,一起交流学习!

你可能感兴趣的:(excel转pdf,python,linux,excel,xpdf,ubuntu)