说明:PageOffice是客户端插件,做不到纯后台调用把word转为pdf。但是pageoffice的FileMaker对象可以实现不在客户端打开文件直接转换文件为pdf并保存到服务器端,看起来跟服务器端转换的效果一样。

1、环境

前端:vue

后端:springboot、pageoffice5.4.0.3版本

2、前端

在index.vue页面定义一个打开文件的按钮,通过点击事件调用POBrowser打开文件,这里因为使用FileMaker对象,不在页面打开文件,所以我们把POBrowser的宽高设置为1px,并设置无边框,隐藏pageoffice浏览器模拟服务器端转换的效果。我这里放了一个加载图片,转换完成后隐藏,方便知道当前转换的进度,

<template>
<div class="Word">
<body style="text-align: center;">
<a href="javascript:;" @click="convert()">Word转PDF并打开PDF文件</a>
<div id="pgImg" style="with:100px;height:100px;margin-top:20px;display: none;" >
正在生成文件,请稍等:<img src="../../../public/images/pg.gif">
</div>
</body> </div>
</template> <script>
const axios=require('axios');
export default{
name: 'Word',
data(){
return {
poHtmlCode: '',
state: '' }
},
methods:{
//控件中的一些常用方法都在这里调用,比如保存,打印等等
myFunc(){
alert("文件生成成功!");
document.getElementById("pgImg").style.display="none";
//打开pdf文件
POBrowser.openWindowModeless('OpenPDF' , 'width=1200px;height=800px;');
},
convert() {
document.getElementById("pgImg").style.display="block";
POBrowser.openWindowModeless('PDF', 'width=1px;height=1px;frame=no;');
} },
mounted: function(){
// 将vue中的方法赋值给window
window.myFunc = this.myFunc;
}
}
</script>

word转换PDF的页面PDF.vue

<template>
<div class="PDF">
<div style="height: 800px; width: auto" v-html="poHtmlCode" />
</div>
</template> <script>
const axios=require('axios');
export default{
name: 'PDF',
data(){
return {
poHtmlCode: '',
}
},
created: function(){
//由于vue中的axios拦截器给请求加token都得是ajax请求,所以这里必须是axios方式去请求后台打开文件的controller
axios.post("/api/FileMakerPDF/PDF").then((response) => {
this.poHtmlCode = response.data;
}).catch(function (err) {
console.log(err)
})
},
methods:{
//控件中的一些常用方法都在这里调用,比如保存,打印等等
OnProgressComplete() {
window.external.CallParentFunc("myFunc();"); //调用父页面的js函数
window.external.close();//关闭POBrwoser窗口
} },
mounted: function(){
// 将vue中的方法赋值给window
window.OnProgressComplete = this.OnProgressComplete;
}
}
</script>

打开PDF文件的页面OpenPDF.vue

<template>
<div class="PDF">
<div style="height: 800px; width: auto" v-html="poHtmlCode" />
</div>
</template> <script>
const axios=require('axios');
export default{
name: 'PDF',
data(){
return {
poHtmlCode: '', }
},
created: function(){
//由于vue中的axios拦截器给请求加token都得是ajax请求,所以这里必须是axios方式去请求后台打开文件的controller
axios.post("/api/FileMakerPDF/OpenPDF").then((response) => {
this.poHtmlCode = response.data; }).catch(function (err) {
console.log(err)
})
},
methods:{
//控件中的一些常用方法都在这里调用,比如保存,打印等等
SetBookmarks() {
document.getElementById("PDFCtrl1").BookmarksVisible = !document.getElementById("PDFCtrl1").BookmarksVisible;
},
PrintFile() {
document.getElementById("PDFCtrl1").ShowDialog(4);
},
SwitchFullScreen() {
document.getElementById("PDFCtrl1").FullScreen = !document.getElementById("PDFCtrl1").FullScreen;
},
SetPageReal() {
document.getElementById("PDFCtrl1").SetPageFit(1);
},
SetPageFit() {
document.getElementById("PDFCtrl1").SetPageFit(2);
},
SetPageWidth() {
document.getElementById("PDFCtrl1").SetPageFit(3);
},
ZoomIn() {
document.getElementById("PDFCtrl1").ZoomIn();
},
ZoomOut() {
document.getElementById("PDFCtrl1").ZoomOut();
},
FirstPage() {
document.getElementById("PDFCtrl1").GoToFirstPage();
},
PreviousPage() {
document.getElementById("PDFCtrl1").GoToPreviousPage();
},
NextPage() {
document.getElementById("PDFCtrl1").GoToNextPage();
},
LastPage() {
document.getElementById("PDFCtrl1").GoToLastPage();
},
SetRotateRight() {
document.getElementById("PDFCtrl1").RotateRight();
},
SetRotateLeft() {
document.getElementById("PDFCtrl1").RotateLeft();
} },
mounted: function(){
// 将vue中的方法赋值给window
window.SetBookmarks = this.SetBookmarks;
window.PrintFile = this.PrintFile;
window.SwitchFullScreen = this.SwitchFullScreen;
window.SetPageReal = this.SetPageReal;
window.SetPageFit = this.SetPageFit;
window.SetPageWidth = this.SetPageWidth;
window.ZoomIn = this.ZoomIn;
window.ZoomOut = this.ZoomOut;
window.FirstPage = this.FirstPage;
window.PreviousPage = this.PreviousPage;
window.NextPage = this.NextPage;
window.LastPage = this.LastPage;
window.SetRotateRight = this.SetRotateRight;
window.SetRotateLeft = this.SetRotateLeft;
}
}
</script>

2、后端

word转换pdf的controller。FileMaker对象转换完成后会自动调用保存方法。在执行fmCtrl.fillDocumentAsPDF()之前,可以动态填充word文件

 @RequestMapping(value = "PDF")
public String showWord(HttpServletRequest request) {
FileMakerCtrl fmCtrl = new FileMakerCtrl(request);
fmCtrl.setServerPage("/api/poserver.zz");
WordDocument doc = new WordDocument();
//禁用右击事件
doc.setDisableWindowRightClick(true);
//给数据区域赋值,即把数据填充到模板中相应的位置
doc.openDataRegion("PO_company").setValue("北京卓正志远软件有限公司 ");
fmCtrl.setSaveFilePage("/api/FileMakerPDF/save?pdfName=template.pdf");
fmCtrl.setWriter(doc);
fmCtrl.setJsFunction_OnProgressComplete("OnProgressComplete()");
//fmCtrl.setFileTitle("newfilename.doc");//设置另存为文件的文件名称
fmCtrl.fillDocumentAsPDF("D:\\FileMakerPDF\\template.doc", DocumentOpenType.Word, "template.pdf");
return fmCtrl.getHtmlCode("FileMakerCtrl1");
}

保存方法

@RequestMapping("save")
public void save(HttpServletRequest request, HttpServletResponse response) {
FileSaver fs = new FileSaver(request, response);
String pdfName=request.getParameter("pdfName");
fs.saveToFile( "D:\\FileMakerPDF\\" + pdfName);
fs.close();
}

打开pdf文件的方法

@RequestMapping(value = "OpenPDF")
public String showindex(HttpServletRequest request) {
PDFCtrl pdfCtrl1 = new PDFCtrl(request);
pdfCtrl1.setServerPage("/api/poserver.zz"); //此行必须
// Create custom toolbar
pdfCtrl1.addCustomToolButton("打印", "PrintFile()", 6);
pdfCtrl1.addCustomToolButton("隐藏/显示书签", "SetBookmarks()", 0);
pdfCtrl1.addCustomToolButton("-", "", 0);
pdfCtrl1.addCustomToolButton("实际大小", "SetPageReal()", 16);
pdfCtrl1.addCustomToolButton("适合页面", "SetPageFit()", 17);
pdfCtrl1.addCustomToolButton("适合宽度", "SetPageWidth()", 18);
pdfCtrl1.addCustomToolButton("-", "", 0);
pdfCtrl1.addCustomToolButton("首页", "FirstPage()", 8);
pdfCtrl1.addCustomToolButton("上一页", "PreviousPage()", 9);
pdfCtrl1.addCustomToolButton("下一页", "NextPage()", 10);
pdfCtrl1.addCustomToolButton("尾页", "LastPage()", 11);
pdfCtrl1.addCustomToolButton("-", "", 0);
pdfCtrl1.addCustomToolButton("向左旋转90度", "SetRotateLeft()", 12);
pdfCtrl1.addCustomToolButton("向右旋转90度", "SetRotateRight()", 13);
pdfCtrl1.webOpen("D:\\FileMakerPDF\\template.pdf");
return pdfCtrl1.getHtmlCode("PDFCtrl1");
}

3、最后效果

模板文件template.doc



最后生成的pdf文件在线使用pageoffice打开

转载:https://blog.csdn.net/qq_44306545/article/details/128302680

PageOffice动态生成Word文件并转换为PDF的更多相关文章

  1. 如何将动态生成Word文件

    大致的思路是先用office2003或者2007编辑好Word的样式,然后另存为XML,将XML翻译为FreeMarker模板,最后用Java来解析FreeMarker模板并输出Doc.经测试这样方式 ...

  2. [转载]Java动态生成word文档(图文并茂)

    很多情况下,软件开发者需要从数据库读取数据,然后将数据动态填充到手工预先准备好的Word模板文档里,这对于大批量生成拥有相同格式排版的正式文件非常有用,这个功能应用PageOffice的基本动态填充功 ...

  3. [原创]Java动态生成word文档(图文并茂)

    很多情况下,软件开发者需要从数据库读取数据,然后将数据动态填充到手工预先准备好的Word模板文档里,这对于大批量生成拥有相同格式排版的正式文件非常有用,这个功能应用PageOffice的基本动态填充功 ...

  4. freemarker动态生成word并将生成的word转为PDF,openoffice转换word乱码

    之前项目有个需求,需要先动态生成word内容,然后再预览生成word的内容(不能修改).整理一下,方便以后使用. 网上参考了好多大神的博客.具体也忘了参考谁的了,如有侵权,请告知修改. 思路一: 将目 ...

  5. Java使用FreeMarker模版技术动态生成word实践

    一.序言 在日常开发中,常常有动态word文件生成的需求,通过编制模版,然后动态修改word内容以组合成新的文件.报告单.请假单.发票页等都可以使用动态生成word来解决. 笔者总结归纳出通用技术要点 ...

  6. JSP生成word文件

    1.jsp生成word文件,直接改动jsp格式: <%@ page contentType="application/vnd.ms-word;charset=GB2312"% ...

  7. C# 动态生成word文档 [C#学习笔记3]关于Main(string[ ] args)中args命令行参数 实现DataTables搜索框查询结果高亮显示 二维码神器QRCoder Asp.net MVC 中 CodeFirst 开发模式实例

    C# 动态生成word文档 本文以一个简单的小例子,简述利用C#语言开发word表格相关的知识,仅供学习分享使用,如有不足之处,还请指正. 在工程中引用word的动态库 在项目中,点击项目名称右键-- ...

  8. Java使用iText生成word文件的完美解决方案(亲测可行)

    JAVA生成WORD文件的方法目前有以下种: 一种是jacob 但是局限于windows平台 往往许多JAVA程序运行于其他操作系统 在此不讨论该方案 一种是pio但是他的excel处理很程序 wor ...

  9. C#动态生成Word文档并填充数据

    C#也能动态生成Word文档并填充数据 http://www.cnblogs.com/qyfan82/archive/2007/09/14/893293.html 引用http://blog.csdn ...

  10. 我是如何使用freemarker生成Word文件的?

    推荐:亲身体验,数次踩坑,遂撰写此文,以备各位不时之需. 背景 一天,产品经理递给我了一份word报告,我定睛一看 这个文档有大大小小的标题层级,还有排版好的段落.各种一目了然的饼图.走势图,当然还少 ...

随机推荐

  1. 快捷转换/互转 Markdown 文档和 TypeScript/TypeDoc 注释

    背景 作为文档工具人,经常需要把代码里面的注释转换成语义化的 Markdown 文档,有时也需要进行反向操作.以前是写正则表达式全局匹配,时间长了这种方式也变得繁琐乏味.所以写了脚本来互转,增加一些便 ...

  2. 【直播回顾】参与ArkUI,共建OpenHarmony繁荣生态

    5月31日晚上19点,战"码"先锋第三期直播 <参与ArkUI,共建OpenHarmony繁荣生态> ,在OpenHarmony社群内成功举行.   本期课程,由华为终 ...

  3. SpringBoot使用@Value注入静态属性

    说明:SpringBoot中使用yml文件配置自定义属性,读取配置文件属性注入到实体类中,属性值都为静态属性 配置文件:yml #用户信息 userMag: userName: "王小波&q ...

  4. RabbitMQ 09 主题模式

    主题模式 主题模式结构图: 主题模式实际上就是一种模糊匹配的模式,可以将routingKey以模糊匹配的方式去进行转发. 可以使用*或#来表示: *:任意的一个单词. #:0个或多个单词. 定义配置类 ...

  5. Docker 13 网络

    Linux 网络 查看本地网络信息: [root@sail ~]# ip addr 1: lo: <LOOPBACK,UP,LOWER_UP> mtu 65536 qdisc noqueu ...

  6. win10系统,软件不可用,无法调用摄像头

    现象描述: 客户电脑是win10,定制带版权的电脑,安装的有卡巴斯基安全软件(最开始并不知道有这么个玩意),使用客户端软件,软件可以正常打开,但是软件无法打开摄像头画面(*:软件在其他电脑都是正常使用 ...

  7. c# Barrier 线程回调

    前言 假如现在有一个这样的需求,我一堆小黄人生产小黄丹,而大黄人要一直吃小黄丹. 如果是这样的话,想到就是一堆小黄人作为一个多线程,然后一直制造,然后另外一个大黄人一直检索是否有小黄丹,有就吃掉. 但 ...

  8. 使用Elasticsearch做手机号和身份证号的模糊检索

    使用Elasticsearch做手机号和身份证号的模糊检索 背景 客户想通过人名 四位数值 来检索人的信息 例如 张三 3421,例如需要检索包含张三和且手机号或者身份证里包含3421的数据 过程 e ...

  9. Pytorch Dataset入门

    ​ Dataset入门 Pytorch Dataset code:torch/utils/data/dataset.py#L17 Pytorch Dataset tutorial: tutorials ...

  10. 初探Mysql架构和InnoDB存储引擎

    前言 mysql相信大家都不陌生了,分享之前我们先思考几个面试题: 1.undo log和redo log了解过吗?它们的作⽤分别是什么? 2.redo log是如何保证事务不丢失的? 3.mysql ...