说明: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. Docker 学习之道: 容器注册表及其最佳实践

    容器注册表是Docker容器镜像的集中存储和分发系统.它允许开发人员以这些镜像的形式轻松共享和部署应用程序.容器注册表在容器化应用程序的部署中发挥着关键作用,因为它们提供了一种快速.可靠和安全的方式, ...

  2. 【FAQ】HarmonyOS SDK 闭源开放能力 —Push Kit

    1.问题描述 升级到4.0.0.59版本后,通过pushService.getToken获取华为的token时报如下错误:Illegal application identity. 解决方案 Mate ...

  3. openGauss每日一练(全文检索)

    openGauss 每日一练(全文检索) 本文出处:https://www.modb.pro/db/224179 学习目标 学习 openGauss 全文检索 openGauss 提供了两种数据类型用 ...

  4. 域名之A记录,CNAME,NS联系和区别

    域名解析中常常涉及:A记录,CNAME,NS 1. A记录 又称IP指向,用户可以在此设置子域名并指向到自己的目标主机地址上,从而实现通过域名找到服务器.说明:指向的目标主机地址类型只能使用IP地址; ...

  5. linux 性能自我学习 ———— 关于内存 [七]

    前言 内存的基本知识,将在操作系统篇中详细介绍,这里只说明如何排查问题. 正文 内存的分配和回收: 在malloc 是c 标准库中的内存分配函数,对应到系统调用上,有两种实现方式,一种是brk()和 ...

  6. 在windows电脑中安装redis

    1,github下载地址:https://github.com/MSOpenTech/redis/tags 2,下载完成后,解压到对应文件夹 3,打开redis.windows.conf,在#requ ...

  7. WPF随笔收录-RestSharp下载文件406问题

    一.前言 在项目开发过程中,涉及到通过http下载文件的需求,最近遇到一个406问题,由于第一次接触这个问题,也被问题卡了好久,在网上风暴了很久才找到解决办法: 二.解决方法 解决的办法就是在requ ...

  8. Redis 性能优化实战

    Redis 作为内存数据库,其性能表现非常出色,单机 OPS 很容易达到 10万以上,这主要得益于其高效的内存数据结构.单线程无锁设计.IO 多路复用等技术实现.但是在线上生产环境的使用中,我们仍然会 ...

  9. ddddocr基本使用和介绍

    ddddocr基本使用和介绍 摘要:在使用爬虫登录网站的时候,经常输入用户名和密码后会遇到验证码,这时候就需要用到今天给大家介绍的python第三方库ddddocr,ddddocr是一款强大的通用开源 ...

  10. 用百度和神策做埋点为何pv差异很大?

    近期ClkLog收到一个客户反馈说我们与百度统计的PV数据差异很大.为了验证问题,开发进行了一次对页面浏览量统计的测试.针对同一个IP同一个时间的页面浏览量统计发现,百度的统计数据只有一条,而ClkL ...