说明: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. Python设计模式----3.单例模式

    单例模式:主要目的是确保某一个类只有一个实例存在 代码: class A(): def __new__(self, *args, **kwargs): if not hasattr(self, 'na ...

  2. JavaScript 迈入 AI 新纪元

    随着人工智能技术的不断进步,JavaScript 也迎来了自己的 AI 时代. JS-Torch 是一个全新的深度学习库,专为 JavaScript 设计,其语法习惯与广受欢迎的 PyTorch 框架 ...

  3. 【有奖互动】开发者版本新特性,你期待哪些更新?#HDC.Together2023#

    <hdc.together< span="">>华为开发者大会2023再次启航,将于8月4日~6日在中国松山湖举办,承载万千期待,开启崭新时代.聚焦新版本. ...

  4. Cache Aside Pattern缓存+数据库读写模式的分析

    1.Cache Aside Pattern(1)读的时候,先读缓存,缓存没有的话,那么就读数据库,然后取出数据后放入缓存,同时返回响应 (2)更新的时候,先删除缓存,然后再更新数据库 2.为什么是删除 ...

  5. Node中的EventEmitter? 如何实现一个EventEmitter?

    一.是什么 我们了解到,Node采用了事件驱动机制,而EventEmitter就是Node实现事件驱动的基础 在EventEmitter的基础上,Node几乎所有的模块都继承了这个类,这些模块拥有了自 ...

  6. 《Effective C#》系列之(零)——概要

    把全书的内容讲述完整可能需要很长时间,我可以先回答主要目录和核心的内容.如果您有任何特定问题或需要更详细的解释,请告诉我. <Effective C#>一书共包含50条C#编程建议,以下是 ...

  7. Oracle 将字符中含有的字母或特殊字符去除并将字符串置换成数字

    将字符中含有的字母或特殊字符去除并将字符串置换成数字 将字符中含有的字母或特殊字符去除并将字符串置换成数字 to_number(nvl(TRANSLATE(u.scsqrbzl, 'qwertyuio ...

  8. 【Oracle】year must be between -4713 and +9999,and not be 0

    [Oracle]year must be between -4713 and +9999,and not be 0 year must be between -4713 and +9999,and n ...

  9. 力扣977(Java)-有序数组的平方(简单)

    题目: 给你一个按 非递减顺序 排序的整数数组 nums,返回 每个数字的平方 组成的新数组,要求也按 非递减顺序 排序. 示例 1: 输入:nums = [-4,-1,0,3,10]输出:[0,1, ...

  10. 力扣597(MySQL)-好友申请Ⅰ:总体通过率(简单)

    题目: 此表没有主键,它可能包含重复项.该表包含发送请求的用户的 ID ,接受请求的用户的 ID 以及请求的日期. 此表没有主键,它可能包含重复项.该表包含发送请求的用户的 ID ,接受请求的用户的 ...