整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:

后端动态生成word或pdf的几种常见方法

需求要生成动态生成电子文件以及后面签字,但是又要在小程序里预览效果。


生成word的难点

  1. 文档模式和web模式的差异
    生成word,一开始是通过word模板通过修改变量的方式生成新docx文档后,二次打开导出到pdf。结果导出pdf 看了phpword的源码,就是通过word web版式生成html 后 导出pdf。导致docx 一个效果 pdf一个效果。解决方法,放弃word 转pdf 直接 html 转pdf。
  2. 复选框的实现。
    一般有以下几种方式:
    docx 里 插入图片
    docx 里 插入 emoji表情 ✅
    docx 里 插入 字符 □ 前面字符需要字体对应
    html 里写入input checkbox 但是要完整的form,id name 要不重复,一样可能导致pdf 里的复选款 一点全选
    html 里 样式 显示checkbox
  3. 签字的实现
    docx 替换字符站位图片
    html里替换图片标签,
  4. 中文乱码
    word乱码 和pdf 乱码 分别处理方法不一样,word乱码 是系统缺中文字体;pdf乱码还需要看库去处理 word转pdf 用的dom2pdf html转pdf 用snappy。dom2pdf 有个上古类去处理,snappy copy store/simsun.ttc 到 /usr/share/fonts/truetype/ chmod 0755 simsun.ttc
  5. 生成html 快速方法
    http://hiprint.io/
    或者 纯前端手写。

spose.Words for Java是一个强大的文档处理库,可以帮助你使用HTML生成Word文档。以下是一个简单的示例代码,演示了如何使用Aspose.Words实现这一功能:

import com.aspose.words.*;

public class HtmlToWord {

public static void main(String[] args) {

// 创建一个空的Word文档

Document doc = new Document();

// HTML内容

String htmlContent = "<html><body><h1>Hello, World!</h1><p>This is an example of generating a Word document from HTML using Aspose.Words.</p></body></html>";

// 使用DocumentBuilder将HTML插入到Word文档中

DocumentBuilder builder = new DocumentBuilder(doc);

builder.insertHtml(htmlContent);

// 保存为Word文档

try {

doc.save("HtmlToWord.docx", SaveFormat.DOCX);

System.out.println("Word文档已生成。");

} catch (Exception e) {

System.out.println("生成Word文档时出现错误:" + e.getMessage());

}

}

}

在上面的代码中,我们首先创建一个空的Word文档对象。然后,我们定义了HTML内容并使用 DocumentBuilder 将HTML插入到Word文档中。最后,我们保存生成的Word文档为docx格式。

详细]php调用python脚本,将word转为html代码及调用失败处理

起因:因为公司遇到发稿问题,很多人喜欢用word编码,然后再发布到网站上。PHP的包中虽然有部分可以使用的类库,但是对于图片始终处理不好,我就想到了python。研究了下,python将word转为html还真是方便。但是,怎么结合到服务器上呢?我们的服务器是用PHP开发的。

1:python脚本

#!/usr/bin/python# -*- coding: UTF-8 -*-import sysfrom pydocx import PyDocXreload(sys)sys.setdefaultencoding('utf8')FileName = sys.argv[1] #获取文件名参数ShortName = sys.argv[2] #获取文件名参数html = PyDocX.to_html(FileName) # f = open("/www/wwwroot/micuer.com/pythoncode/runtime/99.txt", 'w') #服务器的全路径# f.write(html)# f.close()print(html)

2:php处理脚本

public function uploadword(){        try {            $file = request()->file("file");            // 上传到本地服务器            $savename = \think\facade\Filesystem::disk('upload')->putFile( 'word', $file);            $shotrname = time().".txt"; // 短名称            $savename = "/www/wwwroot/micuer.com/data/upload/".$savename; //Request::domain().            $python_file_name = "/www/wwwroot/micuer.com/pythoncode/WordToHtml.py";            //组装命令            $cmd = "python {$python_file_name} ".$savename." {$shotrname}  2>error.txt 2>&1";            $res = exec($cmd,$array, $ret);            return json(["code"=>200,"msg"=>"成功","data"=>$savename,"cmd"=>$cmd,"array"=>$array]);        } catch (think\exception\ValidateException $e) {            return json(["code"=>40000,"msg"=>$e->getMessage()]);        }    }

上传界面如下:

实现的功能就是利用PHP的exec函数,调用py脚本,将html代码返回给前台服务器。

返回数据如下

其实,再处理这个方案中,也遇到了很多问题,比如在命令行下只能成功,但是exec函数执行不成功等等。
参考了资料:https://my.oschina.net/u/4427610/blog/3155816
也就是

exec("python python_test.py 2>error.txt 2>&1", $array, $ret);

在bash中0,1,2三个数字分代表STDIN_FILENO、STDOUT_FILENO、STDERR_FILENO,即标准输入(一般是键盘),标准输出(一般是显示屏,准确的说是用户终端控制台),标准错误(出错信息输出)。
也可以通过以下方式将标准错误重定向到标准输出保存到$array中:
打印之后,发现是没有权限调用。于是就直接改为输出了,也就是 py的print(html)函数。

注意几点:
1:执行权限问题
2:exec(“python python_test.py 2>error.txt 2>&1”, $array, $ret); 中 $array就接受到了 print(html)的值
3:各个脚本尽量使用全路径