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)

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

Python中操作LibreOffice换DOC格式为DOCX格式,可以借助`unoconv`这个命令行工具或者通过PyUNO库直接与 LibreOffice 应用程序进行交互。以下是两种常见的方法: 1. 使用`unoconv`工具: - 首先需要安装`unoconv`,它是一个基于UNO(OpenOffice的API)的命令行工具,可以在大多数Linux发行版中找到,如Ubuntu、Debian等。使用前确保安装了相应的依赖包。 ```sh # 安装 unoconv sudo apt-get install libreoffice-calc libreoffice-writer libreoffice-impress # 换命令示例(替换源文件和目标文件名) unoconv -f odf --stdout input.doc > output.docx ``` 2. 使用PyUNO库(仅限Python环境支持LibreOffice运行): - 如果你想编写Python脚本进行换,可以使用PyUNO库,首先需要安装`python-uno`模块: ```sh pip install python-uno ``` - 下面是一个简单的例子,它会打开文档并保存为DOCX: ```python from com.sun.star.util import XCloseable from unotools import UnoUrlResolver import uno ctx = uno.getComponentContext() resolver = UnoUrlResolver(ctx) url = 'file:///path/to/input.doc' document = resolver.resolve('com.sun.star.text.Document').createInstanceWithContext(uno.Type('com.sun.star.text.TextDocument'), ctx) # 打开文档 document.loadComponentFromURL(url, '_blank', 0, ()) # 保存为DOCX url_out = 'file:///path/to/output.docx' document.storeToURL(url_out, False, XCloseable()) ``` 记得替换上述代码中的`input.doc`和`output.docx`为实际的文件路径。
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值