从Windows到Docker:一次跨平台部署LibreOffice与PyMuPDF的深度排错之旅

springboot整合libreoffice(两种方式,使用本地和远程的libreoffice);docker中同时部署应用和libreoffice 文章总结了在SpringBoot项目中整合LibreOffice实现Word转PDF功能的两种方案:本地服务和远程服务。本地方式通过JodConverter直接调用LibreOffice转换,远程方式则通过Docker部署JodConverter REST服务实现远程调用。文中详细记录了配置过程、遇到的坑点(如远程连接超时、格式错乱等)及解决方案,特别强调了字体文件挂载的重要性。最终推荐使用Docker部署远程服务方案,虽然镜像体积较大(约1GB),但能保证稳定性和兼容性。文章还提供了Word模板格式调整、 阅读详情

本文档堪称一部史诗,详细记录了我们如何将一个在Windows上岁月静好的Python项目,扔进一个“毛坯房”风格的青龙Docker容器里,并最终让它活下来的全过程。我们一路上降妖除魔,克服了环境不匹配、工具玩失踪、网络闹脾气以及依赖包“水土不服”等一系列经典且令人头秃的难题。

第一阶段:西天取经的目标与出发点

  • 核心目标: 部署位于Ubuntu服务器上的青龙容器里的Python脚本,这些脚本使用了具备跨平台使用的三方工具LibreOffice,让它能在不同操作系统下自动修正多种格式(.doc, .docx, .xls, .xlsx, .pdf)文件里的错别字。

  • 出发地 (本地环境): Windows系统,一个安逸舒适的“花果山”,所有依赖都已配齐,脚本运行丝滑。

  • 目的地 (服务器环境): 一台Ubuntu服务器,其上住着一个标准的青龙面板Docker容器——我们的“西天”。

第二阶段:初入宝地,各路神仙先给个下马威

第一难:驯服上古神兽.doc

我们的脚本需要一位法力高强的神仙LibreOffice,来将老旧的.doc格式“点化”成现代的.docx。因此,首要任务是在青龙容器里把这位神仙请出来。

  • 遇到的难题 1.1:错误的“咒语”:念了apt-get,神仙没反应

    • 现象: 进入容器后,我们想当然地念出咒语apt-get install libreoffice,结果系统返回apt-get: command not found。

    • 原因分析: 我们以为住进了精装修的Ubuntu大平层,结果一开门,发现是个极简风的Alpine毛坯房。

    • 解决方案: 换个法术!放弃apt-get,改用Alpine的本地咒语apk。一句apk add libreoffice,神仙乖乖现身。

  • 遇到的难题 1.2:神仙开口,满嘴“豆腐块”

    • 现象: LibreOffice请来后,一处理包含中文的文档,就满屏方框乱码,仿佛在说天书。

    • 原因分析: 这间毛坯房里连个中文字帖都没有,神仙不识字,可不就满嘴豆腐块嘛。

    • 解决方案: 赶紧贴几张字画!我们最终选择了更潮、更全面的font-noto-cjk。一句apk add font-noto-cjk,神仙终于能说人话了。

  • 遇到的难题 1.3:神仙吐出的“龙珠”去哪了?

    • 现象: 测试脚本成功运行,日志显示已生成.docx文件,但青龙面板的管家却说没看见。

    • 原因分析: 青龙面板的管家只关心剧本(脚本文件),对演员们下的蛋(生成的文件)不感兴趣。而且我们也不知道这颗蛋下在了哪个角落。

    • 解决方案:

      1. 地毯式搜查:在容器内使用find / -name "文件名",像开了天眼,瞬间定位了龙珠的藏匿地点。

      2. 隔空取物: 使用docker cp <容器名>:<绝对路径> <宿主机路径>这招,成功将龙珠从容器里掏出来,下载到本地检查,确认法力无边!

第三阶段:行至中途,真正的挑战开始

第二难:给项目“搬家”的风水问题

我们制定了标准的搬家流程:本地打包 -> 上传服务器 -> 扔进容器 -> 开箱入住。

  • 遇到的难题 2.1:水土不服:行李上的中文标签全变火星文

    • 现象: 从Windows打包的.zip行李箱,在容器里一打开,所有中文标签都变成了看不懂的符号。

    • 原因分析: Windows管家打包用的是“方言”(GBK),而Linux管家开箱用的是“普通话”(UTF-8),语言不通,自然鸡同鸭讲。

    • 解决方案探索:

      • 方案A (失败): 尝试请系统翻译官unzip -O GBK来帮忙,结果翻译官太老,不认识-O这个新词。

      • 方案B (失败): 花钱请了个高级翻译官apk add unzip,结果还是个老古董,依然不认识-O。

      • 方案C (王炸): 自己动手,丰衣足食。既然系统自带的翻译官又老又笨,我们干脆自己写一个Python翻译官(unzip_gbk.py)。利用zipfile库并手动进行方言转换(filename.encode('cp437').decode('gbk')),天下太平。

        unzip_gbk.py 脚本内容:

        import zipfile
        import sys
        import os
        
        def unzip_with_gbk(zip_file_path):
            """
            使用GBK编码解压zip文件,解决中文文件名乱码问题。
            """
            if not os.path.exists(zip_file_path):
                print(f"错误:文件 '{zip_file_path}' 不存在。")
                return
        
            print(f"正在解压文件: {zip_file_path}")
            with zipfile.ZipFile(zip_file_path, 'r') as zf:
                for member in zf.infolist():
                    try:
                        # 关键:先用默认的cp437编码得到原始字节,再用GBK解码成正确的字符串
                        correct_filename = member.filename.encode('cp437').decode('gbk')
                    except:
                        # 如果GBK解码失败,则使用原始文件名(可能是英文或UTF-8)
                        correct_filename = member.filename
        
                    # 如果是目录,则创建目录
                    if member.is_dir():
                        os.makedirs(correct_filename, exist_ok=True)
                        continue
        
                    # 提取文件内容
                    file_content = zf.read(member)
        
                    # 确保文件的父目录存在
                    if os.path.dirname(correct_filename):
                        os.makedirs(os.path.dirname(correct_filename), exist_ok=True)
        
                    # 写入文件
                    with open(correct_filename, 'wb') as f:
                        f.write(file_content)
                    print(f"  -> 已解压: {correct_filename}")
        
            print("解压完成!")
        
        if __name__ == "__main__":
            if len(sys.argv) < 2:
                print("用法: python3 unzip_gbk.py <你的zip文件名>")
            else:
                file_to_unzip = sys.argv[1]
                unzip_with_gbk(file_to_unzip)
        
        
第三难:请神容易送神难之PyMuPDF

这是我们遇到的最困难、最核心的挑战。脚本需要另一位大神fitz,但请神的过程堪比西天取经。

  • 遇到的难题 3.1:神仙的“马甲”问题

    • 现象: ModuleNotFoundError: No module named 'fitz',但本地pip list里也找不到fitz。

    • 原因分析: fitz是神仙下凡行走江湖用的“花名”,而PyMuPDF才是他在天庭注册的“真名”。你要请神,得喊对真名才行。

  • 遇到的难题 3.2:“欧标插头”插不进“国标插座”

    • 现象: pip install PyMuPDF后,运行时报错ImportError: Error relocating ... symbol not found。

    • 原因分析: 官方给的PyMuPDF是个进口电器,带的是欧标插头(glibc库)。可我们的Alpine毛坯房里,预留的是国标插座(musl libc库)。插不进去,急死人。

    • 解决方案: 现场施工,改造插头。我们干脆不要那个进口电器了,直接在房间里(容器内)用本地材料(apk add build-base...)现场组装一个。一句pip install --no-binary...,开始现场施工。

  • 遇到的难题 3.3:施工队被“海关”拦下了 (最顽固的敌人)

    • 现象: 现场施工需要从国外(mupdf.com)进口一批核心原料(C++源码包),但我们的施工队每次去拉货,都被“海关”(网络防火墙)以各种理由(ConnectionResetError)劝返。

    • 原因分析: 容器的网络环境访问该国外服务器存在持续性的连接问题,这在中国大陆的网络环境下很常见。

    • 解决方案探索:

      • 方案A (失败): 手动走私原料,结果原料在路上颠簸坏了(哈希校验失败),被施工队当场扔掉,然后他们又头铁地去闯关。

      • 方案B (失败): 换个版本的原料,结果还是被同一个海关拦下。

      • 方案C (终极大法):开辟“走私”通道。既然正门走不通,我们就从隔壁能通关的邻居家(Windows电脑192.168.1.67)挖条地道。我们在邻居家开了个“允许邻居借道”的后门,然后在施工队出发时给他们一张小纸条(http_proxy=...),告诉他们从地道走。最终,原料顺利运达,施工成功!

第四阶段:取得真经与感悟

  • 成果盘点:毛坯房变豪华别墅(和它的物业费): 经过上述所有操作,我们发现最终的Docker镜像从500MB暴增到2.22GB。这完全正常!你把一个空房间,硬是塞进了一整套宜家(LibreOffice)和一座小型机械加工厂(C++编译工具链),不变胖才怪!我们还学会了如何通过apk del build-base来给别墅“减肥”。

  • 最后的大彻大悟:青龙面板的“大锅饭”哲学: 我们终于搞明白,青龙面板不搞“单间”(venv虚拟环境)那套,所有脚本都在一个大食堂里吃“大锅饭”(全局Python环境)。所以,请客吃饭(装依赖)必须直接往大锅里加菜,别在自己单间里捣鼓。

这次取经之路虽然磨难重重,但我们最终修成正果,收获的不仅是能运行的脚本,更是一身降妖除魔的本领。

构建LibreOffice Android 构建LibreOffice Android预览有两种方式,第一种方式就是在master分支上进行构建,但是这种方式构建出来的Android应用程序,界面并没有那么友好,对于只是研究源码的小伙伴来说是一种不错的选择。 如果想要界面友好,体验比较顺畅的话,可以选择Collabora公司的online部分源码结合LibreOffice core源码进行构建,在编译过程中,本人也遇到很多坑,不过在趟坑的过程中,两种方式的源码,都编译成功了,写这篇文章,一是为了记录,二是希望能帮助到更多和我一样的小伙伴,可以一起探讨 阅读详情

相关推荐

跨平台文件在线预览解决方案(三)- LibreOffice vs OpenOffice

前言 突然有一天在业务系统中发现OpenOffice转换word为pdf时,出现个别中文字丢失以及格式发生变化。这在业务系统中预览合同等重要附件是致命的。Google了半天也没找到问题所在。于是采用LibreOffice进行转换,看看转换效果。office文件在线预览原理一样,先转换成pdf,然后采用pdf. js预览。 问题复现 原word文件 OpenOffice转换后pdf文件 链接 关于OpenOffice的使用方法,参考《跨平台(uni-app)文件在线预览解决方案》第四章节 关于

liupan6889的博客 6797

dockerfile自定义编译安装mupdf镜像

安装mupdf版本为1.18.0可以先到mupdf官网下载 Dockerfile中放入源码文件,使用tar解压 目录结构如下 ├── Dockerfile ├── install_mupdf.sh ├── mupdf-1.18.0-source.tar └── requirements.txt Dockerfile文件内容如下 FROM python:3.5 MAINTAINER rendy "example@qq.com" ENV PYTHONUNBUFFERD 1 RUN mkdir /workspa

cherry的博客 444

用Python实现一个猜密码的程序

我们用Python实现猜密码

sk6584631_sz的博客 1261

Python3 - Docker部署Libre Office Online在线文件转换

将配置文件重新复制到容器中,并重新启动Office 容器。由于Libre Office Online 默认配置为。禁用SSL 加密传输:(其默认是True,开启)如上所示的Web管理控制平台。

韩俊强的博客 3641

保姆级教程:用OSSH免费版+FreeRADIUS+FreeAC NAC,从零搭建一套企业级无线Portal认证系统

本文提供了一套基于OSSH免费版、FreeRADIUS和FreeAC NAC的企业级无线Portal认证系统搭建教程。从环境规划、核心组件安装到认证策略与用户管理,详细介绍了如何利用开源工具构建高效、安全的认证体系,特别适用于预算有限但需求严格的企业场景。

weixin_27032989的博客 392

【外挂编程】外挂编程技术揭秘(二)

引言: 经过上一篇文章大家可能对外挂有了一个初步的认识,之前的内容比较简单,应该大家很容易掌握。我写作过程中我发现三个篇幅可能写不完,后续还可能要多加几个篇幅,这篇我们就先以内存挂为主吧。话不多说了,让我们开始吧。 文章中代码github地址: https://github.com/Diamonds-ZhaoYu/hz_example 环境要求: 系统:Windows 语言...

c-rain 4033

Bootstrap Hover Dropdown:让导航菜单实现悬停激活的终极解决方案

Bootstrap Hover Dropdown 是一款强大的非官方 Bootstrap 插件,它能够让 Bootstrap 下拉菜单在鼠标悬停时激活,为用户带来更加流畅和直观的操作体验。无论是网站导航栏、按钮组还是选项卡,这款插件都能轻松实现悬停显示下拉内容的功能,极大地提升了网站的交互性和用户友好度。 ## 🌟 为什么选择 Bootstrap Hover Dropdown? 在传统的 B

gitblog_00183的博客 697

TVS 管击穿电压与钳位电压的工程解析

TVS二极管的核心参数击穿电压(VBR)和钳位电压(VC)常被混淆,但二者具有本质区别。VBR是

硬核科技 480

LibreOffice Online 搭建教程:从零开始部署开源在线办公平台

还在为团队协作效率低下而烦恼吗?想要搭建一个既安全又免费的在线办公系统?LibreOffice Online 作为一款功能强大的开源在线办公套件,能够完美解决这些问题。今天,我将带你从零开始,一步步完成这个开源协作平台的部署。 ## 实战演练:5分钟快速部署指南 ### 环境准备与检查清单 在开始之前,请确保你的系统满足以下要求: - Linux 发行版(Ubuntu 或 CentOS 推荐

gitblog_00482的博客 871

YOLOv11改进 - 卷积Conv | SPD-Conv空间深度转换卷积优化空间信息编码,攻克小目标检测难题

本文介绍了一种名为SPD-Conv的新型CNN构建块及其在YOLOv11中的结合。传统CNN在处理低分辨率图像或小物体时,因使用步长卷积和池化层导致细粒度信息丢失、性能下降。SPD-Conv由空间到深度(SPD)层和非步长卷积(Conv)层组成,完全消除卷积步长和池化层,避免信息损失。SPD层重排特征图元素将空间信息转换到深度维度,非步长卷积层进一步处理特征图。我们将SPD-Conv集成进YOLOv11,实验证明其在低分辨率图像和小物体检测任务上显著优于现有模型。

魔改工程师的博客 1141

JavaScript实现边缘检测Canny(附完整源码)

JavaScript实现边缘检测Canny(附完整源码)

希望我的博客,能帮上你解决学习中工作中所遇到的问题 707

Linux 离线/在线安装 libreoffice + python 使用示例

(1)执行语句,如果看到类似 libreoffice7.6 或 libreoffice7.6-writer 等包,说明安装成功。(2)安装后的软件会在 /opt/libreoffice7.6 目录下,program下有可执行文件 soffice。如果 ubuntu 版本不高的尽量选择低版本的 libreoffice,如 7.x。(3)手动运行 soffice 文件,如果能输出版本信息,说明正确安装。当然,这个时候可能会遇到下载失败的问题,换个其它版本。缺啥下啥,因此顺便安装其它可能的图形库。

weixin_43303444的博客 4325

利用GAT(图论分析工具箱)构建并分析大脑结构协变网络学习笔记

前言 前面我学习了利用DTI构建白质纤维脑网络,并采用GRETNA计算了小世界网络属性。阅读文献发现可以利用灰质体积或皮层指标(皮层厚度、折叠指数、沟深)等构建结构协变网络再进行网络拓扑属性的计算。因此,我采用前面提取的灰质体积和皮质数据进行了结构协变网络分析,特此写下笔记以便后面的学习。 一、数据准备 二、构建结构协变网络 三、全局属性的统计分析 四、局部属性的统计分析 五、网络攻击分析 六、度的分布 ..................

weixin_52073820的博客 7496

libreoffice Error: source file could not be loaded

原因是少装了LibreOffice的writer,直接执行: yum install libreoffice-writer

Gblfy_Blog 3482

YOLOv8改进策略【Neck】| CGA Fusion:内容引导的注意力融合模块,空间权重引导的多模态特征自适应融合

本文记录的是利用CGA Fusion 模块改进 YOLOv8 的多模态融合部分。(Content-Guided Attention Fusion)通过内容引导注意力生成空间权重,引导高低层特征的自适应融合。本文利用模块,通过内容引导注意力生成空间权重,自适应地融合两个模态的特征,在特征融合阶段实现跨模态语义对齐与噪声抑制,增强对不同模态互补特征的利用能力,从而提升模型在多模态场景下的检测鲁棒性与准确性。DEA-Net: Single image dehazing based on detail-enhanc

Limiiiing的博客 282

蓝牙模块HM-10手册

蓝牙模块HM-10手册,该手册对蓝牙模块HM-10进行了详细的介绍和使用方法以及一些AT指令。

终极指南:如何快速部署LibreOffice Online在线办公套件

LibreOffice Online是一款功能强大的开源在线办公套件,让你通过浏览器就能轻松编辑文档、电子表格和演示文稿。这个免费协作平台基于成熟的LibreOffice技术,为团队协作和远程办公提供了完美的解决方案。无论你是个人用户还是企业团队,都能享受到这款专业级在线文档编辑工具带来的便利。 ## 🚀 5分钟快速启动指南 想要立即体验LibreOffice Online的强大功能?只需简

gitblog_00737的博客 885

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Alpine包管理工具apk使用介绍

Alpine包管理工具apk使用介绍

weixin_44401399的博客 1990

霍尼韦尔SoftMaster使用说明

霍尼韦尔SoftMaster使用说明

win10 跳过U8环境检测的IE WebControls.rar

win10 安装u8的时候 提示IE WebControls 不通过,这个工具可以欺骗u8的检查。 跳过U8环境检测的IE WebControls。提示导入失败后,重新检测通过。

LibreOffice 自由免费、全能、跨平台的办公套件

LibreOffice 是一款开放源代码的自由免费全能办公软件,可运行于 Microsoft Windows, GNU Linux 以及 Mac OS  X 等操作系统上。它包含了 Writer, Calc, Impress, Draw, Math 以及 Base 等组件,可分别用于文本文档、电子表格、幻灯片演示文稿、绘图文档、数学公式编辑、数据库管理等工作。LibreOffice 采用对企业和个...

karali的专栏 1364

【数据结构-5】单链表的实现

单链表,具体来说是单向的、不带头的、不循环的链表。链表由一个一个节点组成,每个节点分为数据域和指针域,数据域存放数据,指针域存放下一节点的地址。这样,就可以根据指针域中的地址找到下一个节点,节点就串起来了构成了单链表。

weixin_44218929的博客 192

工厂设备接MES为什么慢:协议识别与点表配置自动化的技术拆解

工业现场设备接 MES 的周期主要消耗在协议识别与点表配置。本文拆解这条链路的四层结构,给出点表映射的数据模型、两种部署架构的对比,以及可直接落地的三项验收口径与校验代码。适合工控集成、MES 实施、设备联网方向的工程师。

emfuture的博客 394

C# 数据结构和特殊类型

.NET Core(现称.NET)提供丰富数据结构,优化性能与开发效率。日常开发首选List<T>和Dictionary<TKey,TValue>;高性能场景推荐Span<T>与Memory<T>减少内存分配;并发环境使用ConcurrentDictionary等线程安全集合;避免非泛型集合如ArrayList。

cccloveforever的博客 682

list

的底层是双向链表结构,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可。是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。迭代到该位置,在这段位置上迭代需要线性的时间开销;最大的缺陷是不支持任意位置的随机访问,比如:要访问。还需要一些额外的空间,以保存每个节点的相关联信息。个元素,必须从已知的位置。

xie0510_的博客 274
上一篇: 全新 Ubuntu 服务器标准配置指南(docker)
下一篇: 告别拼凑感:UI设计整体感与层次感提升指南
vasing_
博客等级 码龄5年 44粉丝 9原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值