word向html迁移方法研究
因为最近有需求,有可能通过word转移到html,所以前期调查后整理如下。
问题的说明
不明确问题就谈论解决方案是不明智的,所以首先要明确问题:
目前线上有一组word文件,并在背景提供上传入口网站。 上载后,必须分析内容并支持在富格文本编辑器中进行编辑。 word文档中有一个空白,可以在编辑器中填写内容以生成新数据。 原始word和新生成的word最终将以pdf格式保留。
我这样分析:
第一种方案
word必须在上载后可以在编辑器中进行编辑,因此word必须迁移到html。
最终的word必须生成为pdf,第一步生成的html必须生成pdf以保证格式。
第二个方案
因为我以前就知道word会生成pdf,所以我很自然地想,能不能不通过html直接word成pdf。 这样可以减少代码的复杂性和误差。 本来,机器的转换次数越多,误差就越大。
但是,根据问题的描述,导入的word其实就像一个模板,我们需要可以编辑,但这个方法可能不太会调整内容,所以这个方法被保留了。
word to html
所有方法只阐述具体实现,详情可浏览官网。
unoconv工具依赖于LibreOffice或OpenOffice,这两种Office都基于开源软件,通常是LibreOffice (可能是为了协议,Debian等分发视图)
我的是Centos环境,解压后使用以下命令安装下载的rpm软件包:
cd dir
yum -y install ./*.rpm
这里没有使用rpm -ivh ./*.rpm是因为rpm命令无法解决依赖问题。 yum会解决的。
unoconv的安装
最下面有链接,直接下载解压缩。 目录中有unoconv命令,请直接执行。
处理问题:
运行unoconv命令后:
/opt/libre office 6.2/program/python .冷静的边缘:/lib 64/libc.so.6: version ` glibc _ 2.14 ' not found (required )
看来LibreOffice依赖于更高版本的glibc。 注: glibc是整个系统的基础,所以请不要轻易动。 这里是docker环境,有备份,所以我简单地试了一下:
查看当前的glibc版本:
strings/lib 64/libc.so.6|grep glibc _
请看yum源代码的版本:
rpm -qa | grep glibc
没有GLIBC_2.14的版本。 从这个链接下载,下载并按照这些步骤安装。 (没有备份。 请小心操作。 ) :
cd dir
生成构建
./configure-- prefix=/usr/local/glibc-2.14
生成- j4
sudo make install
export LD _ library _ path=/usr/local/glibc-2.14/lib 3360 $ LD _ library _ path
注:由于此安装非常慢,因此这些步骤没有完全执行。
glibc很难升级,所以要降级LibreOffice。 我的系统glibc的最高版本是2.12,所以重新下载了5.4.7。 这是找不到官方提供的说明,完全是感觉上的。
安装完成后,启动office服务。 不用启动。 基于c/s架构的性能更好。
cd dir
./soffice---no logo---headless---accept=' socket,host=127.0.0.1,port=8100; urp; StarOffice.ServiceManager '
启动后,可能会发生以下问题。
/opt/libre office 5.4/program/soffice .冷静的边缘: errorwhileloadingsharedlibraries 3360 lib cairo.so.23360 cannotopensharararararies
解决方案:
yum install ibus
此时,我的想法有点无知,看yum源代码中是否有这个软件(4.3.7版),就安装了。 之后,索性卸载了以前安装的版本。
之后,在启动命令中,遇到了一些问题,对应的解决方案:
问题
Java ldx : couldnotfindajavaruntimeenvironment!
warning :故障
to read path from javaldx解决方案:
yum -y install libreoffice-base问题
/usr/lib64/libreoffice/program/soffice.冷静的缘分 X11 error: Can't open display
解决方案:
yum install libreoffice-headlesspdf乱码,后来想直接转换为pdf用来着,此时我已经焦虑了,看下面的命令就知道,哈哈。
yum -y install libreoffice*
yum groupinstall chinese-support
到目前为止,可能碰到的问题都解决了,还是进行转换:
cd dir
./unoconv --connection "socket,host=127.0.0.1,port=8100;urp;StarOffice.ComponentContext" -f html -o a.html a.docx
生成了html,迫不及待看一眼什么样,样式基本都在,但是源文件是在太乱了,放在富文本编辑器内表现还可以,但是通过tcpdf生成的pdf基本就没法看了。至于为什么用tcpdf来生成pdf,首先是因为项目当前用的就是tcpdf,切换有一定的成本,二来就是我们不能为了解决这个问题容忍凌乱的html代码,无论从数据存储还是后期维护,都不能这样做。
自动生成的代码不行,就按文本进行干净化处理,但是考虑到源word文档的多样性,可能会出现各种小问题,所以这样方案也pass掉了。
安装:
yum -y install pandoc
执行命令转换:
pandoc zz.docx -o a.html
报错:
pandoc: zz.docx: hGetContents: invalid argument (invalid UTF-8 byte sequence)
这个问题没有解决,可能是版本的问题,又尝试下载了最新版本,在这,解压后的冷静的缘分目录下的命令可以直接执行,结果正常。
在mac下也安装试了下:
安装:
brew install pandoc
brew install pandoc-citeproc
同样执行上面的转换命令,结果一致。
也可以执行这个命令,可以添加自定义的头:
pandoc -s zz.docx -o a.html
出现如下错误:
[WARNING] This document format requires a nonempty
element.Please specify either 'title' or 'pagetitle' in the metadata,
e.g. by using --metadata pagetitle="..." on the command line.
Falling back to 'zz'
根据提示应该是需要补充个标题,用下面这个命令解决:
pandoc -s zz.docx --metadata title:"title" -o a.html
成功了,同样还是迫不及待,输出结果代码相比unoconv,代码少了很多,代价就是丢失了些样式,比如字体大小,左右对其这种基本的页没有了,总体来说仍然不能使用。
3. phpword
试了以上两种命令式的方法,均不能解决问题,所以尝试下直接用php扩展来处理。
phpword默认使用composer来安装,但是我们项目没有使用composer环境,可以到这个链接下载完整的require文件包,直接在项目引用即可。
如下php代码:
require_once APP_PATH . '/classes/PHPWord/vendor/autoload.php';
$phpWord = PhpOfficePhpWordIOFactory::load('a.docx');
$xmlWriter = PhpOfficePhpWordIOFactory:: createWriter($phpWord, "HTML");
$xmlWriter->save('a.html');
执行上面的代码就能生成html了,依然是迫不及待,生成的html跟unoconv类似,代码很多,转换为pdf格式不完美,所以lmdjzg不是很好的解决方案。
总结
所以在尝试了unoconv、pandoc以及phpword之后,都不能得到相对简洁的对tcpdf友好的html,目前还没有尝试过付费方案,如果有必要,可以考虑再调研一下。
其他想法
又想到了word直接转pdf,首先对于word模板文档,我们可以把留白用phpword读取出来(留白有特殊标识),单独配置一个表单填写留白,用户添加完成后,再由phpword写入进去,最终由unoconv生成pdf。
这样富文本编辑器可以去掉了,填写好的内容删改的时候,直接改表单内容就行。
貌似也是一种方案。
人是活的,需求可以沟通,在保证投入与产出成正比的情况下,各种方案都值得沟通与尝试。
(完)