简介:这是一套专为ARM64/aarch64架构准备的OpenOffice替代方案,即LibreOffice Docker镜像制作文件包。OpenOffice官方并未提供适配国产化ARM环境的版本,作者改用启动方式与OpenOffice一致的LibreOffice,并整理成可直接构建、解压可用的文件集,适合在国产化服务器或树莓派等ARM平台部署办公转换服务的运维与开发人员。压缩包共15个文件,约644MB,主要包含7个TTF字体与4个TTC字体,覆盖常用中文字体,用于解决容器内文档转换时的中文显示和乱码问题;还提供Dockerfile-arm、批量构建脚本、启动脚本和离线镜像tar,结构清晰,便于按步骤复现。目前已有1177人学习下载,说明该方案在同类场景中具有较高参考价值。使用者可结合外部文档调整字体与构建参数,得到一套可复现的ARM64容器化办公部署基线,避免国产化适配过程中的重复踩坑。
1. openoffice 的 arm64 docker 镜像包:为什么不能直接 docker pull
在树莓派 4B、鲲鹏 920 或 Apple Silicon 的 Mac 上部署文档转换服务,你大概率搜过 openoffice docker 镜像,docker pull 下来,run 一声exec format error就退出。这个报错说明镜像架构是 x86_64,而宿主机是 arm64,Docker 不会帮你做指令集翻译。真正的问题是:OpenOffice 官方从未发布 ARM64 Linux 包,网上现成镜像也几乎全是 x86_64,想在这个平台跑起来,只能自己做一个镜像包。这篇文章给出完整制作方案——Dockerfile、下载脚本、entrypoint、构建与验证命令,让 doc/docx/ppt 转 PDF 的服务在 ARM 服务器上稳定落地。适合文档中台、报告自动生成这类必须用 OpenOffice,又跑在鲲鹏、树莓派或 ARM Mac 上的团队。
2. 方案选型:让 x86_64 的 openoffice 在 arm64 docker 里跑起来的三种做法
2.1 指令集不互通是第一个门槛
“arm64 和 x64 有什么区别”这个问题,落到 OpenOffice 上就是一个很具体的结论:编译出来的二进制指令完全不同,彼此不能直接执行。arm64 的 Debian/Ubuntu 源里没有 openoffice 这个包,新版发行版的源只保留 libreoffice,openoffice.org这个旧包早被 Debian 移除;Apache OpenOffice 官网的 Linux 下载页提供的也只有 x86-64 的 tar.gz、deb、rpm。所以在 arm64 环境里,你面对的压根不是“装哪个版本”,而是“没有官方构建物”。
这不是 Docker 的问题,是上游发布策略的问题。OpenOffice 进入维护模式以后,只维护 x86-64 构建流水线,AArch64 的构建脚本虽然能从源码仓库里翻到,但依赖的老工具链在今天的系统上很难一次编过。我自己试过一次,光配置 Perl 模块和一堆过时的构建依赖就耗了一下午。想拿到能在 arm64 上跑的 OpenOffice,绕不开“模拟执行”这条路。
Docker 的架构隔离机制再补一刀:镜像带 architecture 标签,arm64 的 Docker 引擎看到 amd64 镜像默认拒绝执行,除非你显式声明--platform=linux/amd64,并且系统里注册了 QEMU 的 binfmt 翻译层。Docker Desktop 在 Apple Silicon 和 Windows ARM 上内置了这个翻译层,所以很多人在 Mac 上没感觉;但 Linux arm64 服务器(鲲鹏、树莓派)不会自动给你配,这一段反而成了实际项目里第一个坑。不少团队的镜像仓库里躺着 x86 的 OpenOffice 镜像,拉到 arm64 机器上直接报exec format error,就是这个原因。
2.2 三条路线的取舍:模拟、混合、换引擎
我把从业者里常见的三种做法整理成一张对比表,你可以直接抄:
| 路线 | 镜像架构 | 构建难度 | 运行损耗 | 踩坑密度 |
|---|---|---|---|---|
| A:纯 amd64 镜像 + QEMU 模拟整容器 | linux/amd64 | 低,和 x86 机器上构建一致 | 约 20% 到 40%,文档转档这类 IO 混合任务可接受 | 低,官方包与脚本匹配 |
| B:arm64 基础镜像 + multiarch 装 x86 deb | linux/arm64 | 高,要配 dpkg multiarch、qemu-user 前缀、动态库路径 | 仅 OpenOffice 本体模拟,略低于 A | 高,库路径和环境变量极易炸 |
| C:直接用 LibreOffice arm64 官方包 | linux/arm64 | 极低,apt 一行 | 无 | 低,但本质换了引擎 |
路线 A 是目前最贴合“制作文件”这个需求的:Dockerfile 里写FROM --platform=linux/amd64,构建过程和你在一台 x86_64 服务器上构建完全一样,OpenOffice 官方 DEBS 包直接dpkg -i,不用处理 GCC 差异、多架构源和动态库搜索路径,出问题的地方基本集中在可控的脚本层,而不是系统层。
路线 B 看起来很优雅,镜像架构是 arm64,跑在 ARM 服务器上不用整容器模拟。但你要在 arm64 容器里把 OpenOffice 的 x86 二进制挂到 qemu-x86_64 解释器下跑,还要解决 amd64 动态库的搜索路径,这是我见过最容易翻车的写法。网上那些标着“ARM 版 OpenOffice 镜像”的产物,十有八九是拿路线 A 顶着的。路线 C 是保底选项,等第 6 章用基准数据说话。
我的建议很直接:个人开发机、小团队内部服务选 A,先把文档转换跑通;如果客户明确要求 OpenOffice 的宏或扩展,路线 A 的模拟层不会影响 UNO 接口和 Basic 宏,兼容性最好。方案选型这一步,血泪经验是“先看镜像 run 不 run 得起来,再谈性能优化”,A 方案能让你把 90% 的精力花在排业务坑上,而不是排环境坑。还有一种更激进的尝试是在 arm64 基础镜像里直接apt-get install openoffice,装出来的是 Ubuntu 对 LibreOffice 的过渡包,名字叫 openoffice 实际引擎早换了,别被它骗了。
3. 制作镜像包:Dockerfile、下载脚本和 entrypoint 的完整写法
3.1 文件清单和构建目录
一个可复现的镜像包,我习惯固定这套目录结构:
openoffice-arm64/ ├── Dockerfile ├── docker-compose.yml ├── scripts/ │ ├── download-openoffice.sh │ ├── build.sh │ └── entrypoint.sh └── dist/ └── Apache_OpenOffice_4.1.x_Linux_x86-64_install-deb_en-US.tar.gzdist 目录放从官网下载页拿到的 tar.gz,文件名取决于你下载时的发行版本。我的做法是不在 Dockerfile 里 RUN wget,而是让执行构建的人先把离线包放进 dist。原因是 OpenOffice 官方 tar.gz 挂在 Apache 下载节点,国内网络直连速度不稳定,叠加拉基础镜像本身就慢的问题,会让构建过程变成一个看网速脸色的黑匣子。离线包先下载好放本地,构建时 COPY 进去,整个镜像包才真正可复现、可离线交付,也顺手避开了“docker 镜像下载慢”这个常见抱怨。
3.2 Dockerfile:基础镜像与依赖安装
# 强制使用 amd64 基础镜像,保证 OpenOffice 官方 deb 能直接安装 FROM --platform=linux/amd64 debian:bullseye-slim ENV DEBIAN_FRONTEND=noninteractive \ HOME=/tmp \ LANG=en_US.UTF-8 # 运行时库与字体:fonts-noto-cjk 是中文转换的命根子 RUN apt-get update && apt-get install -y --no-install-recommends \ wget \ fontconfig \ fonts-dejavu-core \ fonts-noto-cjk \ libxinerama1 \ libcups2 \ libdbus-1-3 \ libglib2.0-0 \ libfreetype6 \ libfontconfig1 \ libx11-6 \ libxext6 \ libxrender1 \ libxt6 \ libsm6 \ libice6 \ default-jre-headless \ && rm -rf /var/lib/apt/lists/* # 把离线 tar.gz 拷进镜像,解压后只抽取 DEBS 主包 COPY dist/*.tar.gz /tmp/ RUN tar -xzf /tmp/*.tar.gz -C /tmp \ && mkdir -p /opt/debs \ && find /tmp -path '*/DEBS/*.deb' ! -path '*desktop-integration*' \ -exec cp {} /opt/debs/ \; \ && rm -rf /tmp/*.tar.gz /tmp/*Linux* \ && (dpkg -i /opt/debs/*.deb || apt-get -f install -y) \ && rm -rf /opt/debs COPY scripts/entrypoint.sh /usr/local/bin/entrypoint.sh RUN chmod +x /usr/local/bin/entrypoint.sh ENTRYPOINT ["/usr/local/bin/entrypoint.sh"] CMD ["--headless", "--accept=socket,host=0.0.0.0,port=8100;urp;", "--nofirststartwizard", "--norestore"]这段 Dockerfile 有四个地方值得单独说。第一,FROM 上的--platform=linux/amd64告诉 buildx 构建的是 amd64 镜像,即使构建机是 arm64,也会拉取对应的 amd64 基础镜像,这是整条路线 A 的根基。第二,依赖列表里的fonts-noto-cjk提供中日韩字体,缺了它,中文 docx 转出来的 PDF 全是方块,这个坑后面还会专门讲。第三,find只拷贝 DEBS 根目录下的 deb,排除 desktop-integration 子目录,那部分是给桌面菜单集成用的,容器里装它只会引入更多不存在于容器环境的依赖。第四,dpkg -i后面挂了|| apt-get -f install -y,这是老软件 deb 依赖问题的标准兜底:先解包,再让 apt 修依赖并完成配置。
基础镜像我特意选了 bullseye-slim,而不是更新的 bookworm 或 Ubuntu 24.04。OpenOffice 4.1 是 2013 年之后的维护版,和新系统里 t64 库重命名、dbus 版本升级都有潜在兼容风险,bullseye(Debian 11)的库更接近它的编译年代,且仍在社区维护期。如果你非要换 bookworm,遇到 OpenOffice 启动时报libdbus-glib-1.so.2缺失,别意外,处理方式就是把缺失的库加进依赖列表。
3.3 离线下载脚本和构建脚本:把 qemu 注册串进去
#!/bin/bash # scripts/download-openoffice.sh set -euo pipefail ARCHIVE="dist/Apache_OpenOffice_4.1.x_Linux_x86-64_install-deb_en-US.tar.gz" if [ -f "$ARCHIVE" ]; then echo "tar.gz already exists, skip download." exit 0 fi mkdir -p dist # 从 openoffice 官网下载页复制直链,填到环境变量里 OPENOFFICE_URL="${OPENOFFICE_URL:-}" if [ -z "$OPENOFFICE_URL" ]; then echo "Set OPENOFFICE_URL env to the official download link." exit 1 fi wget -O "$ARCHIVE" "$OPENOFFICE_URL" # 替换成官网下载页公布的 sha256,防止下到损坏或被人改过的文件 echo "${OPENOFFICE_SHA256:-} $ARCHIVE" | sha256sum -c下载脚本的逻辑很简单:本地已有离线包就跳过,没有就按官网直链下载并做校验。校验值那行虽然麻烦,但 OpenOffice 老项目的官网会公布 sha256,值得贴进去。否则构建出一个坏镜像,排查起来远不止 30 秒。
#!/bin/bash # scripts/build.sh set -euo pipefail # 在 arm64 主机上构建 amd64 镜像,先注册 qemu 用户态模拟 if [ "$(uname -m)" = "aarch64" ]; then docker run --rm --privileged \ multiarch/qemu-user-static --reset -p yes fi docker buildx build \ --platform linux/amd64 \ -t openoffice-arm64:4.1 \ . echo "build done: openoffice-arm64:4.1"构建脚本里的核心是那行 qemu 注册命令。multiarch/qemu-user-static --reset -p yes会往宿主机的 binfmt_misc 写入 amd64 解释器映射,相当于一次性把 QEMU 用户态模拟注册好。不加这行,buildx 拉取 amd64 基础镜像后,一执行 RUN 指令就报exec format error,你辛苦写好的 Dockerfile 全白搭。如果构建机本身是 x86_64,这段会自动跳过,脚本在两种架构的主机上都能跑。
3.4 entrypoint:同一份镜像承担服务和一次性转换
#!/bin/bash # scripts/entrypoint.sh set -euo pipefail export HOME="${HOME:-/tmp}" export LANG="${LANG:-en_US.UTF-8}" # 调用方传什么参数就透传给 soffice,不做多余判断 exec /opt/openoffice4/program/soffice "$@"entrypoint 只有透传,这是故意为之。镜像的 ENTRYPOINT 是脚本,CMD 默认是 UNO 常驻监听服务,所以docker run openoffice-arm64:4.1会直接启动 8100 端口的 headless 服务;而docker run openoffice-arm64:4.1 --headless --convert-to pdf --outdir /data /data/a.docx会覆盖 CMD,进入一次性转换模式。两种模式共用同一份镜像,这是镜像包设计里最划算的决策:不用维护服务版和批处理版两个镜像。
这里把最常用的 soffice 参数列一下,后面避坑章节还会用到:
| 参数 | 作用 | 注意事项 |
|---|---|---|
--headless | 无界面模式 | 容器里必须加,不加会尝试连 display 直接报错 |
--accept="socket,host=0.0.0.0,port=8100;urp;" | 启动 UNO 网络监听 | 分号必须完整,改端口时别动结构 |
--nofirststartwizard | 跳过首次启动向导 | 不加会在部分系统上卡住 |
--norestore | 禁止恢复上次会话 | 防止意外恢复导致挂起 |
-env:UserInstallation=file:///tmp/ooo_profile | 指定用户配置目录 | 多进程并发转换时用它隔离 profile 锁 |
--convert-to pdf | 一次性转 PDF | 后面可跟:writer_pdf_Export显式指定过滤器 |
参数里最容易写错的是--accept那一长串,socket和urp之间、分号前后都不能落。这个参数我只要隔两个月不写,就得回头翻文档,所以把它钉死在 CMD 里,而不是让使用镜像的人每次手敲。
4. 在 arm64 主机上构建并验证:buildx、qemu 注册与首次文档转换
4.1 构建前先注册 qemu:这是后悔药
先分清楚你的环境:Apple Silicon Mac 和 Windows ARM 上的 Docker Desktop 内置了 qemu 翻译层,直接docker buildx build --platform linux/amd64就行;但 Linux arm64 服务器,包括鲲鹏、飞腾、树莓派上的 Ubuntu,默认没有 binfmt 注册。如果你在 Windows ARM 上用 Docker Desktop,先确认 Hyper-V 和 WSL2 的虚拟化已经打开,否则 Docker Desktop 本身都启动不了,更谈不上模拟。
Linux arm64 主机的注册命令有两种:
# 方式一:用社区注册镜像,跨发行版一致,推荐 docker run --rm --privileged multiarch/qemu-user-static --reset -p yes # 方式二:发行版自带的包,适合离线内网环境 sudo apt-get install -y qemu-user-static binfmt-support sudo systemctl restart docker方式一会先清掉已有 binfmt 配置再注册(--reset的作用),-p yes表示注册的 qemu 解释器对容器内也生效。方式二适合没有外网的客户现场,装完包后重启 Docker 让 daemon 重新加载 binfmt 路径。注册完成后可以检查一下:ls /proc/sys/fs/binfmt_misc/里能看到qemu-x86_64,没有就说明注册没生效。
这一步做在前面等于吃了后悔药。我见过太多人在构建失败报exec format error之后才开始搜 qemu 注册,构建缓存还残留了半截 amd64 层,还得先docker builder prune再重来。
4.2 构建、运行、验证一条龙
目录、离线包都准备好的前提下,完整流程是这样:
cd openoffice-arm64 ./scripts/download-openoffice.sh # 把 tar.gz 放进 dist/ ./scripts/build.sh # 自动注册 qemu + buildx 构建 mkdir -p ./data cp test.docx ./data/ # 一次性转换模式:文件挂进 /data,转换结果写回 /data docker run --rm --platform linux/amd64 \ -v "$PWD/data:/data" \ openoffice-arm64:4.1 \ --headless --convert-to pdf --outdir /data /data/test.docx ls -lh ./data/test.pdf--platform linux/amd64在镜像已经带 amd64 标签时可以省略,但显式写出来能避免在混用多架构镜像的机器上被 Docker 的自动平台选择坑到。转换命令的第二个参数是源文件绝对路径,第三个--outdir指定输出目录,源目录和输出目录可以同一个,OpenOffice 不会覆盖源文件。
PDF 出来以后,还要验证一件事:中文是不是正常。用宿主机上的 poppler 工具看文本内容:
sudo apt-get install -y poppler-utils pdftotext ./data/test.pdf - | head -n 20如果输出里中文正常,字体链路就是通的;如果全是空格、方块、乱码,直接跳到第 5 章的字体坑。这一步不要跳过,很多文档转换服务上线后才发现中文字体问题,返工成本比现在多一百倍。
4.3 docker-compose 管理常驻转换服务
一次性转换适合测试,生产部署一般要常驻一个转换服务。给一份可直接用的 compose 文件:
services: openoffice: build: context: . platform: linux/amd64 container_name: openoffice-arm64 ports: - "8100:8100" volumes: - ./data:/data environment: HOME: /tmp command: ["--headless", "--accept=socket,host=0.0.0.0,port=8100;urp;", "--nofirststartwizard", "--norestore"]启动命令就两行:docker compose up -d拉起服务,docker compose logs -f看启动日志。服务起来以后,外部程序把待转换文件丢进挂载目录,再通过一次性转换的 docker run 命令出 PDF,这是小团队最稳的接法;也可以直接用 SDK 写 UNO 客户端连 8100 端口,但 UNO 客户端的跨语言环境配置很容易变成新的黑匣子,项目不大时我不建议上。常驻服务的配置目录没有指定-env:UserInstallation,单进程没问题,一旦你要并行调多个转换进程,就必须把 profile 隔离出来,这就是下一章要讲的坑。
5. 避坑:arm64 上跑 openoffice 镜像最容易翻车的 5 个地方
5.1 exec format error:镜像拉下来却起不来
现象:在 arm64 主机上执行docker run,容器秒退,日志只有一行 standard_init_linux.go 风格的 exec format error,或者直接提示 unknown architecture。原因分两种:一是镜像本身就linux/amd64,但主机没有 qemu 注册;二是 compose 或 kubectl 里没写platform: linux/amd64,Docker 按宿主架构去匹配,自然匹配不上。
处理:把 4.1 节的 qemu 注册命令跑一遍,确认/proc/sys/fs/binfmt_misc/qemu-x86_64存在;然后确保运行命令里带--platform linux/amd64,compose 文件里写死platform: linux/amd64。这两个都做了还不行的,检查主机内核是否开了binfmt_misc模块,modprobe binfmt_misc之后再注册。这个报错占了我见过的 arm64 容器问题一半以上,大部分情况就是注册没做。
5.2 中文全部变成方块:字体缺失
现象:docx 转出来的 PDF 能打开,英文、数字正常,所有汉字显示成空心方块或者干脆消失。原因非常直接:镜像里没有中文字体,OpenOffice 找不到 CJK 字形,只能画框占位。这个坑在 x86 镜像上就有,arm64 镜像因为大家经常随手基于精简基础镜像构建,更容易缺。
处理:在 Dockerfile 里安装fonts-noto-cjk和fonts-dejavu-core,装完跑一次fc-cache -f刷新字体缓存。验证方式用 4.2 节的 pdftotext,但要注意:pdftotext 提取的是文本层,如果字形缺失但文本映射还在,PDF 里也可能是正常文字、显示却有问题。最可靠的验证是转 PDF 后用pdftoppm渲染成图片,肉眼看像素。别问我为什么知道,这是我第一次给银行客户做转换服务时连夜排查出来的。
5.3 dpkg 半途而废:依赖错误堆积
现象:构建镜像时dpkg -i /opt/debs/*.deb报出一串依赖缺失,包括 libXinerama、libcups、libdbus 之类;有人看到错误就直接改 Dockerfile 加包,但每次加完总还有下一个。原因:OpenOffice 官方 DEBS 包的依赖声明对应的是它发布年代的桌面发行版,容器里是精简系统,依赖缺口不是一个包而是一组;逐个补永远差一个。
处理:先把第 3 章 Dockerfile 里那组依赖整体装齐,再执行dpkg -i;如果还报缺,让 apt 兜底:apt-get -f install -y,它会读取已解包 deb 的依赖信息自动补齐。这行命令要放在dpkg -i失败的路径上,不要分两步手动执行。补完后which soffice确认安装到了/opt/openoffice4/program/soffice。依赖这块没有捷径,老软件就是这样,把错误当成清单,一次补完。
5.4 并发转换互相死锁:profile 目录冲突
现象:同时启动多个转换进程,一开始正常,跑几分钟后部分进程卡死,日志里出现 profile 锁相关提示,或者ps能看到 soffice 进程但就是不产 PDF。原因:OpenOffice 默认把用户配置写到同一目录,多个进程同时读写 profile 会互斥,第二个进程拿不到锁就挂起等待。
处理:给每个转换进程指定独立的配置目录,参数是-env:UserInstallation=file:///tmp/ooo_profile_$RANDOM,或者用进程号保证唯一。比如在封装脚本里这样拼:
UNO_PROFILE="file:///tmp/ooo_profile_$$" /opt/openoffice4/program/soffice --headless \ -env:UserInstallation="$UNO_PROFILE" \ --convert-to pdf --outdir /data /data/test.docx$$是 shell 的 PID,保证每次启动的 profile 目录不重复,转换完不用清理,/tmp 会自己回收。如果你的调度框架不支持每条命令拼不同环境变量,至少在镜像的 CMD 里把-env:UserInstallation设成一个固定但可覆盖的值,别用默认路径。
5.5 进程启动后立刻退出:前台进程的坑
现象:容器起来了,docker logs里看到 OpenOffice 打印几行版本信息就退出,容器状态变成 Exited;换成docker run -it又能跑,一挂后台就死。原因:OpenOffice 启动时如果检测不到需要保持的监听任务,会在完成初始化后直接退出;另一个常见原因是容器里 HOME 目录不可写,初始化 profile 失败导致进程放弃。
处理:确认 CMD 里带着--accept="socket,host=0.0.0.0,port=8100;urp;",UNO 监听会让进程保持前台运行;同时把环境变量HOME=/tmp设上,并在 entrypoint 里先export HOME。如果日志里出现cannot open display之类的字眼,说明 headless 模式没强制生效,检查第一个参数是不是--headless。还有少数场景需要 Xvfb 兜底,apt-get install xvfb后用xvfb-run -a包一层,但正常 headless 模式用不到,别一上来就上 Xvfb,多一层依赖多一个坑。
6. 进阶:用同一份文档做基准测试,决定坚守 openoffice 还是换 libreoffice
6.1 先跑一个真实基准
模拟层跑了这么久,必须用数据说话。我常用的基准方式:同一份 20 页带中文和表格的 docx,转 PDF 各跑 10 次,取中位数对比。OpenOffice 用上面的镜像,LibreOffice 用 arm64 原生镜像(基础镜像拉debian:bullseye-slim,apt-get install libreoffice即可)。
#!/bin/bash # bench.sh —— 同一份 docx,OpenOffice 模拟 vs LibreOffice 原生 for i in $(seq 1 10); do start=$(date +%s%N) docker run --rm --platform linux/amd64 \ -v "$PWD/data:/data" openoffice-arm64:4.1 \ --headless --convert-to pdf --outdir /data /data/bench.docx end=$(date +%s%N) echo "openoffice_sim $(( (end-start)/1000000 )) ms" done docker build -t libreoffice-arm64:local -f Dockerfile.libreoffice . for i in $(seq 1 10); do start=$(date +%s%N) docker run --rm --platform linux/arm64 \ -v "$PWD/data:/data" libreoffice-arm64:local \ --headless --convert-to pdf --outdir /data /data/bench.docx end=$(date +%s%N) echo "libreoffice_native $(( (end-start)/1000000 )) ms" done跑完看两个数:中位数耗时和波动范围。我的经验是,OpenOffice 走的模拟方案因为 qemu 翻译 x86 指令,单次转换耗时通常比 LibreOffice 原生慢 30% 到 60%,但波动更大时就要注意了——如果 OpenOffice 的耗时方差很大,说明它在模拟层上处理某些字体和图形时触发了更差的路径,这种场景下换引擎收益明显。
6.2 换与不换的决策点
基准数据出来后,决策不只看速度。如果项目里有大量 OpenOffice Basic 宏,或者依赖只在 AOO 上发布的 OXT 扩展,那 LibreOffice 的兼容性并不完美,某些老宏和扩展在 LibreOffice 里会报错,这种绑定关系比性能更重要,坚守 OpenOffice 模拟方案是合理选择。反之,如果只是标准 docx/xlsx/pptx 转 PDF,没有历史宏包袱,LibreOffice 原生包是更省心的方案。
我现在接到 arm64 上跑 office 转换的需求,第一反应是先问一句:有没有非用 OpenOffice 不可的理由。没有,就上 LibreOffice;有,就用这套模拟镜像。两种选择都要先把同样的文档跑一遍基准,别凭感觉拍板。希望帮到你。
本文还有配套的精品资源,点击获取