pptx表格内容,显示不完整,导出pdf也不完整

test.pptx (111.0 KB)

impress打开此pptx,表格中,最后一行不显示,鼠标点击后可显示。PowerPoint打开正常。

作为一个统一的答案,以后看到谁再用LO打开MSO的文件(特别是用命令行的),我就把这个答案转发给他

定义

  • MSO: Microsoft Office
  • LO: LibreOffice
  • ODF: OpenDocument Format,包含odt, odp, ods等。
  • 转档: 文档格式转换,这里特指由MSO的Office Open XML转换为 LO 的 ODF。
  • CODE: Collabora Online Development Edition,是 LibreOffice Online的现存“官方”版本

写在“广告”之前

论点:字体会显著影响排版

在验证中发现,Win LO中的默认字体 (Noto Sans SC) 和Linux LO中的依赖字体 (Noto Sans CJK SC) 不一致;而在 Linux 中安装了 Noto Sans SC 并采用该字体后,显示出的效果正常了 (和 Win LO 一致)。而且,由于这个稿件没有指定字体(体现在:用 MSO 开为等线,用 Win LO 开为 Noto Sans SC,用树莓派 LO 开,因为装过思源,就成 Source Han Sans CN,而用我的笔电上的 Ubuntu 开,就是 Noto Sans CJK SC。而上述选项只有 MSO 和 Win LO 排版无遮挡),因此字体会显著影响排版

在此,我从Win11中拷贝了常用字体,放到个人网盘上给大家:Huang1111网盘。该网盘右上角弹出的均为广告,请小心翼翼×掉,然后下载按钮就会显现。
当然,也有其他网友的版本,比我的更全,比如Gitee上的 onlyoffice-chinese-fonts

然而… LO的命令行又不能指定用什么字体当默认字体开,因此换字体这一招仅适用于个人用户

论点:LO真的不适合开 MSO 文档

详见:推广 LibreOffice 常见问题:文件的兼容性推广 LibreOffice 常见问题:文件的兼容性(二)排版跑掉
从附件看,文章可能是台湾人写的。台湾省那边很早就在推广 ODF 文件格式,因此他们更知道转档的各种障碍。
考虑到大家可能不想注册中文论坛的账号,我就断章取义地搞点文字过来:

文档格式的兼容问题是所有推广 LibreOffice 一定会碰到的。要「破解」这个说法或现实,首先我们要来看看文档格式这件事。
「对微软 Office 文档格式的兼容问题。」这句话是完全以微软为中心的说法。但是各位知道吗?微软的每一个版本之间也有兼容性问题。
例如,使用 2013/2016 做的 docx 档,在 2007 是打不开的。使用 2007 做的 docx 档,在 2010/2013/2016 必须是在「兼容模式」下(我不清楚简体中文版是用什么名词)才能开得起来。而且一经储存,再回去 2007 又不能开了。

微软 Office 在 2003 以前预设格式为 doc/ppt/xls,那是封闭的专有格式,依照专利与授权条款是不得逆向工程(reverse engineering),换言之是不能「破解」的。
在 2007 以后预设格式改为 docx/pptx/xlsx 也就是称为 Office Open XML (OOXML)。它的格式是开放的,有拿到国际 ISO29500 标准。
照理说,如果格式开放,有国际标准,其他软件要支援、兼容这种格式应该要更容易才对。为什么实际情况不是这样?
原因在于:微软自己都没有依照这个格式在做。
虽然 OOXML 是一个标准,但是它在 2007/2010/2013/2016 对 OOXML 的实作都不一样。连自己的版本间都不能兼容了,更何况其他软件?
从文档格式角度来看,LibreOffice 还有其前身 OpenOffice 所产生的格式称为开放文档格式(Open Document Format, ODF),存成的档案为 odt/ods/odp/odf…
它是 Sun Microsystem 把 StarOffice 变成 OpenOffice.org 后,将其格式在 2001 年送去申请为国际标准,花了五年的时间通过成为 ISO26300 (ODF 1.1),后来在 2015 年更新一次 (ISO26300:2015)。
这个格式的其中一个最大的好处,就是稳定。稳定到什么程度?我使用 LibreOffice 5.x 版产生的 odt / odp 档,在 LibreOffice 3.5/4.0 开起来是没有问题的。我在很多场演讲中都有实际展示过。
至于微软的 Office 能不能兼容 ODF?理论上可以,读取 ODF 文档实际上也没有太多问题。问题在另存新档成 ODF 时,微软同样没有依照其规格在做。所以由微软 Office 另存成的 odt 档、ods 档、odp 档,在其他支持 ODF 格式的软件开起来一样是有问题的。这一点我在去年罗马的 ODF Plugfest 2017 有证明过,也有写出报告。

为什么有些 MSO 文档就可以正常打开呢?作者说:

过去我们在做文档时,其实并不是拿文档直接来传递的。而是把文档做好之后,透过印表机打印出来,用纸本来传递的。所以很多制作文档的习惯,都是从过去打字机时代,到后来的 pe2 等等累积起来的。
在那个时代的习惯有一个特色:我们只要「设法」把字放到该有的位置就好了。因为如此,所以我们会用空白键移到要打字的位置(打字机就是这种模式啊!)然后再开始加入文字。我们也会用 Enter 移到下一页再开始打字。因为最终是要打印成纸本的,所以怎么做都没差别。
问题在哪里呢?问题在「软件所看到的文档,跟我们用人眼所看到的文档,认知是完全不同的」。
好,我们回到重点来。在 Office (一样,不管是 MSO, OOo 或 LibO 甚至 Abiword 等)中,正确的标题做法是:把标题打上去之后,去找样式(Style,抱歉我不清楚简体中文版的翻译为何),里面找到题名(Title),把那一段文字设定成题名样式。如果题名样式的大小、字型等不符所需,那么就去调整样式设定(不是调整文字喔!),把它调整成你要的样子。

中文论坛有网友说:对 MSO 文档兼容性最好的,微软 MSO 排第一,金山 WPS 排第二。因此,大家非要追求格式全部在,那就去做 MSO 的开发。方法很简单:在 Win 主机上部署一个 MSO,选装 Word, PowerPoint, Excel(没图形界面的可以试一下 Office 部署工具,Office 无人值守安装,但我还没试过)。部署完以后就用调用 Office COM的方法,比如Python库 docx2pdf,pptxtopdf。

金山也可以有命令行呀。已经有人写了利用 WPS 转换的工具。至于 WPS for Linux,我只找到 CSDN 的文章,而且是收费文章,没看,仅放个链接吧。wps office 2019 for linux 通过命令行进行文档格式转换。这种文档,大概率 AI 水文,图个乐就好。

广告:开源办公套件 OnlyOffice

先上效果图,最好右键查看:
test2
test-2.pdf (395.9 KB)

说的是 OnlyOffice Docs, 不是说 OnlyOffice 桌面办公套件

为什么推荐这个套件呢?是因为它能在 Linux 上正常打开题主的文件。虽然字体有点不一致,但显示是完整的。关键是大家都在想命令行的事情,而 OnlyOffice Docs 就是干这一行的。 同行 CODE,还有台湾的 OxOffice Online 虽然功能差不多,但都是基于 LibreOffice Online 开发的,实际上也不能做到像题主要求的这样完整的排版。

事实上,OnlyOffice自己打的广告都是开docx的。参见OnlyOffice 主页

免费,开源——说的是社区版

想必大家非用 LO 不可,鼓着不用 MSO,不是因为对LO的钟情:可能是系统非 Win,还可能是没有购买软件的预算。

如果从 OnlyOffice 的首页进去,可能会被高昂的授权费吓到:但事实上,那些都是商业版。社区版的链接似乎只能在搜索引擎上搜“onlyoffice community”找到。我已经找好了:下载 ONLYOFFICE 产品的社区版本

安装 OnlyOffice 可以用 Windows,这相对简单些;用 Linux 的话,得调数据库,这可能会和您的现有库冲突。如果追求一键安装,可以用 Snap,要慢一些。不过,有一个全平台兼容(手机除外,因为SELinux)的选项:Docker。可以注意到,OnlyOffice也为arm64做了适配。

开发思路

OnlyOffice Docs是一个服务器端,本来是用于做在线文档编辑器的后端的,因此也是基于HTTP的。这里,我们采用它的一个Api:Conversion API (”转换 API“ 的开发文档,右上角可调中文),要做的工作就是从HTTP调用这个接口。呵,有点大才小用的意思。

各位不是要做在线文档转PDF的服务吗?来,OnlyOffice官方已经为大家写好了一份教程:使用 ONLYOFFICE 转换 API 构建在线文档转换器。只不过,这篇文章写的是网页端,用的是NodeJS。而各位的需求嘛,千差万别。

落地时需要注意的问题:

  • 是否使用 JWT 令牌。从版本 7.2 开始,JWT 认证默认处于启用状态,这不利于开发调试。可以用环境变量 JWT_ENABLED=false 停用 JWT。但我没有开发经验,请大家自行考虑安全性。
  • 是否用 80 端口。改端口的教程已为大家找好:OnlyOffice论坛上的文章:Change listen port。考虑到内核是nginx,大家也可以用奇技淫巧。我的思路是:改成其他端口,然后防火墙阻止外部流量,只允许内部访问。
  • 有没有条件:CPU: 多核 2 GHz CPU,4 GB 内存,40 GB 空闲空间(仅OnlyOffice Docker镜像就占 3.79 GB),4 GB swap,linux内核高于 3.10 (信息来源:Ubuntu版安装指南)。当然,如果只用转换 API 的话,要求肯定会小很多,因为这个配置是为20个在线编辑器同时连接考虑的。补充一个OnlyOffice在Docker里空转时,各软件的对比。(按内存排列,注意看 WSL ,两个 Docker Desktop似乎没啥关联) 屏幕截图 2025-08-01 221850
    好吧,那个内存实在是偶然事件,其实刚启动3分钟时,WSL占的内存最高能飙到4800MB (主机几乎空载,如果主机有很高的内存负载的话,最高几乎不到2500MB),而Docker Desktop统计的容器内存也有1.45GB了。烤机1h后,容器内存为1.05GB,但WSL内存为546MB,而且swap是空的。如图所示。截图的WSL内存比546M小一点,是因为间隔了几分钟。似乎WSL一直在压缩。
  • 准备字体:去上面的链接处下载字体,然后参考官方文档Adding fonts to ONLYOFFICE Docs。也可以尝试网络上的办法,直接把字体拷到OnlyOffice工作目录
  • 用 Docker 的话,请配置好 Docker Hub 的国内镜像,因为被封了~

另外,把图中的两个命令贴给大家(为了能跑 curl,用了 Git Bash):

docker run -i -t -d -p 80:80 -e JWT_ENABLED=false onlyoffice/documentserver
curl --location --request POST 'http://localhost/converter' \
--header 'Accept: application/json' \
--header 'Content-Type: application/json' \
--data '{
    "async": false,
    "filetype": "pptx",
    "key": "Khirz6zTPdfd7",
    "outputtype": "pdf",
    "title": "test.pptx",
    "url": "http://192.185.254.132:8080/test.pptx"
}'

curl 这条命令里的每一个参数都是必须的。其中,key不是密钥,而是自己拟的所传文档的“键”。其他的自己参阅上面提到的 API 文档。使用 curl 发请求不是我的原创

局限性:

凡非 MSO 的套件必然有兼容性问题,比如控件。请看下面文章的文件。

这文件就神了:做表格的选项,不是用 数据验证(LO称为数据有效性) 的方法做下拉框,而是用控件的方法做,然后一个个把控件拉到和单元格差不多的位置。。。
LO 倒是可以加载出控件,但是文字全部丢失,原因已经写在那个主题的回答里了。OnlyOffice加载时,控件会全部丢失,连个影子都没有。
那么什么东西能正常加载出控件呢?答案是:金山文档\WPS 云文档。要做 WPS 的工作的话,可以掉头去看广告前部分了。
还有,文档字体的问题,各种格式的问题……想用开源的方法处理闭源的东西,这些问题你就接受它吧。

广告后

再看 LO 的特点

总之,这些开源的方案,如LO,CODE,OxOffice,OnlyOffice,OpenOffice…最适合用它们的人不是商业伙伴,而是热爱 Linux 的人。 因为,Linux 用户最爱的就是折腾嘛,不爱折腾的 Linux 用户早晚要停止使用 Linux。

想要开源方案完全兼容 Office Open XML?呵,LO 的兼容性本来就是按照 ISO标准设计的。(参见论点2)而且,LO 就是 LO,LO 主打的就是 ODF。它不可能把开发主力放在对 MSO 格式的适应上。相反,连 LO 都会出些连 MSO 里都找不到的功能。比如中文论坛的一篇文章:请教有关移动平均趋势线的相关中文术语

林肯 发表于 2021-7-5 21:59:19
震惊,是mso和wps没有的功能,这个可能需要统计学方面的人来帮忙才行了

如何提问

鉴于不同平台上的 LO(本例),甚至不同版本的 LO 的情况都不同(案例:使用libreoffice7.6将docx转pdf,批注消失 ),因此大家在说“XXX不见了”时,一定要明确的在自己的主题中点出以下要点:

  • 是不是用 LO 硬开 MSO 创造的文件了(案例数不胜数),或者用 LO 却保存成了 Office Open XML 的格式(案例:Failed to uncheck the option of 'change slides by clicking on background'
  • 什么系统(所用系统不能公开的,像题主,直接说是不是 Win 即可,或者说不便透露。因为不同系统会有字体的不同)
  • 什么版本 LO(像7.4的先升级25.2验证下再说)
  • 示例文件,截图文件,报错日志(案例 docx 转pdf 着重号丢失 都尚且可以实验,案例 在Windows上一打开就崩溃 这种就毫无解决的可能了!)
  • 最好直接挑明是不是要用命令行,是不是要生成PDF。司空见惯了,用图形界面的方法回答,结果人家要用命令行。。

如果这篇文章对您有帮助,请点个赞,因为我正在冲刺“ 成员”用户组。

您好。您的问题在Ubuntu 25.04上可复现,在Windows 11上无法复现。软件采用Office19和LibreOffice 25.2。

如果您需要使用Impress编辑,只需调整一下第一行的行高即可。您也可以调整行距(1.5x → 1.15x),调整后的效果更美观些。

一般的,LibreOffice和MS Office均会在您编辑表格内文本时,自动调整行高。然而,在用LibreOffice打开MS Office文档时,软件不会在文件一打开时就调整好所有格式,因此出现排版错误很正常。

建议您始终使用专门的软件来编辑对应的文档。MS Office适于编辑doc(x)、xls(x)、ppt(x),而LibreOffice适于编辑odt、ods、odp。

同时,字体问题值得关注。即使在同一操作系统中打开您的文件,两软件的主要字体也不同:MS Office会选择等线字体,而LibreOffice会选择Noto Sans CJK SC,这也可能造成差异。

     感谢,我需要java程序在命令行下,使用 soffice --headless --convert-to pdf 进行pdf转换,在此种pptx下,会导致转出的pdf显示不完整,请问有没有办法处理。
    尝试libreoffice升到25.2,加参数:EmbedStandardFonts和SelectPdfVersion,没有作用。

(动图,2.5秒1帧,共4帧,可右键查看图像)
untitled

  • LibreOffice 版本
    Version: 25.2.5.2 (X86_64) / LibreOffice Community
    Build ID: 03d19516eb2e1dd5d4ccd751a0d6f35f35e08022
    CPU threads: 8; OS: Windows 11 X86_64 (10.0 build 26100); UI render: Skia/Raster; VCL: win
    Locale: zh-CN (zh_CN); UI: zh-CN
    Calc: CL threaded
  • Windows 规格
版本 Windows 11 家庭中文版
版本号 24H2
安装日期 ‎2025/‎2/‎14
操作系统版本 26100.4652
序列号 PF2FATTQ
体验 Windows 功能体验包 1000.26100.128.0

若您方便,请您提供一下您的系统信息和LibreOffice版本信息(在菜单栏的帮助->关于LibreOffice->版本信息),以及是否方便在系统上安装MS Office。

看来,问题的不是出在字体或Pdf版本,而是LibreOffice打开文件时,将表格的行高变得小于正常行高,导致文字被遮挡了。而且,MS Office, LibreOffice(win), LibreOffice(linux)产生的结果互不相同。

由于Python现存库都必须依赖于某一个办公套件才能运作,我的思路有:
(仅当完全不能利用图形化界面调整时)

  • 安装Jython;或安装Python,实现Java对本地Python的调用
  • 若能安装MS Office:
  • 若能够在Windows10以上运行LibreOffice 25.2:那应该没有本帖的问题了。参考动图。
  • 若能够在任意环境运行LibreOffice 25.2:
    • 安装python-pptx,参考python-pptx英文文档。然后想办法枚举表格(Table),表格里枚举单元格(Cell),对单元格查询行距,凡行距大于等于1.5的改成1或1.25。
      • 或者,也可以考虑更改行高。但不推荐更改行高,因为我在Ubuntu上测试时,效果并不理想。
    • 然后用soffice命令行,或者用PyUNO+unoconv导出pdf。

我不是专业人员,也不熟悉Java中操作pptx的原生方法,甚至没有Java开发的经验,不了解最佳实践。依我看,Java里调用Jython已经是相当臃肿的事情了,所以上面的方法您可完全不听取。如要考虑编程细节,请您查阅相关文档,谢谢。

还有,我好好奇为什么中文贴里10个贴有9个是用LibreOffice硬开MS Office文件的,而且清一色的都是玩命令行((

因为很多情况下,是利用libreoffice的命令行转换功能,开发一套程序来做文档转换服务,提供给客户端使用。而用户很多情况下是上传的MS Office文件来转成pdf

因为是做一个文档转换的服务,用户上传的文件,里面的内容和格式无法控制,所以不可能通过编辑文档,修改它内容和格式的方式,进行导出。

请您提供一下您的系统信息和LibreOffice版本信息,以及是否方便在系统上安装MS Office。我始终不清楚您的情况,自然无法针对您设计。即使是服务器,也分Linux和Windows Server Core吧。

不然,要给您推荐湾湾的ODF转档工具了馁。