IE下用JavaScript将HTML导出为Word、Pdf

       最近升级公司内部系统发文章的功能,涉及到将文章内容导出为html、word、pdf,系统多用于IE环境下,并且公司电脑都预装了office,所以导出暂时采用客户端的方式。

       页面基本结构:       

<html>
	<head>
		<title>客户端导出测试</title>
		<script type="text/javascript">
			function exportHtml {
			
			}
			
			function exportWord() {
			
			}
			
			function exportPdf() {
			
			}
		</script>
	</head>
	<body>
		<!-- toolbar -->
		<div>
			<button>导出HTML</button>
			<button>导出WORD</button>
			<button>导出PDF</button>
		</div>
		<!-- content -->
		<div id="content" style="border: 1px #000 solid">
			<h1>标题</h1>
			<font color="gray">正文内容</font>
		</div>
	</body>
</html>

       可以复制下来在浏览器内看下效果,我们的目标是将content内的内容分别导出到html、word、pdf文件中,content内的内容可能非常复杂,样式非常多,还有可能标签不标准,不对称,并且有中文,如果拿到服务端去处理,比较复杂,下面分别完善三个导出方法。

       导出文件时需要选择导出目录,那么如何弹出窗口选择目录呢?

function getExportPath() {
	var shell = new ActiveXObject("Shell.Application");
	var folder = shell.BrowseForFolder(0, '请选择存储目录', 0x0040, 0x11); 
	var filePath;
	if(folder != null) {
		 filePath = folder.Items().Item().Path;
	}
	return filePath;
}

       要使上段代码生效,需要对IE浏览器设置一下,如下图:

       设置完之后,直接在浏览器运行还可能出现没有权限的问题,那就需要将html部署在服务器上,让后将当前服务器的访问地址设置为可信站点。

       导出HTML:

function exportHtml {
	var filePath = getExportPath();
	if(filePath != null) {
		var file;
		try {
			var fso = new ActiveXObject("Scripting.FileSystemObject");  
			file = fso.createtextfile(filePath + "/测试导出.html",true);// 创建文件
			file.WriteLine(content.innerHTML);// 写入数据
			alert("导出成功");
		} catch (e) {
			alert("导出失败");
		} finally {
			if(file != null) 
				file.close();// 关闭连接
		}
	}
}

       导出WORD:

function exportWord() {
	var filePath = getExportPath();
	if(filePath != null) {
		try {
			var word = new ActiveXObject("Word.Application");
			var doc = word.Documents.Add("", 0, 1);
			var range = doc.Range(0, 1);
			var sel = document.body.createTextRange();
			try {
				sel.moveToElementText(content);
			} catch (notE) {
				alert("导出数据失败,没有数据可以导出。");
				window.close();
				return;
			}
			sel.select();
			sel.execCommand("Copy");
			range.Paste();
			//word.Application.Visible = true;// 控制word窗口是否显示
			doc.saveAs(filePath + "/导出测试.doc");// 保存
			alert("导出成功");
		} catch (e) {
			alert("导出数据失败,需要在客户机器安装Microsoft Office Word(不限版本),将当前站点加入信任站点,允许在IE中运行ActiveX控件。");
		} finally {
			try {word.quit();// 关闭word窗口} catch (ex) {}
		}
	}
}

       导出PDF:

var filePath = getExportPath();
	if(filePath != null) {
		try {
			var word = new ActiveXObject("Word.Application");
			var doc = word.Documents.Add("", 0, 1);
			var range = doc.Range(0, 1);
			var sel = document.body.createTextRange();
			try {
				sel.moveToElementText(content);
			} catch (notE) {
				alert("导出数据失败,没有数据可以导出。");
				window.close();
				return;
			}
			sel.select();
			sel.execCommand("Copy");
			range.Paste();
			//word.Application.Visible = true;// 控制word窗口是否显示
			doc.saveAs(filePath + "/导出测试.pdf", 17);// 保存为pdf格式
			alert("导出成功");
		} catch (e) {
			alert("导出数据失败,需要在客户机器安装Microsoft Office Word 2007以上版本,将当前站点加入信任站点,允许在IE中运行ActiveX控件。");
		} finally {
			try {word.quit();// 关闭word窗口} catch (ex) {}
		}
	}

       导出PDF废了一番周折,saveAs方法有一串参数,这里我只用到了前两个,第一个参数是保存文件名称,第二个参数是保存文件格式,office 2007或2010支持将当前word另存为PDF格式,第二个参数是VB或C#环境下枚举类WdSaveFormat的一个值,经过多次弯曲的查询,终于查到其各个变量对应值。

Name

Value

Description

wdFormatDocument

0

Microsoft Office Word 97 - 2003 binary file format.

wdFormatDOSText

4

Microsoft DOS text format.

wdFormatDOSTextLineBreaks

5

Microsoft DOS text with line breaks preserved.

wdFormatEncodedText

7

Encoded text format.

wdFormatFilteredHTML

10

Filtered HTML format.

wdFormatFlatXML

19

Open XML file format saved as a single XML file.

wdFormatFlatXML

20

Open XML file format with macros enabled saved as a single XML file.

wdFormatFlatXMLTemplate

21

Open XML template format saved as a XML single file.

wdFormatFlatXMLTemplateMacroEnabled

22

Open XML template format with macros enabled saved as a single XML file.

wdFormatOpenDocumentText

23

OpenDocument Text format.

wdFormatHTML

8

Standard HTML format.

wdFormatRTF

6

Rich text format (RTF).

wdFormatStrictOpenXMLDocument

24

Strict Open XML document format.

wdFormatTemplate

1

Word template format.

wdFormatText

2

Microsoft Windows text format.

wdFormatTextLineBreaks

3

Windows text format with line breaks preserved.

wdFormatUnicodeText

7

Unicode text format.

wdFormatWebArchive

9

Web archive format.

wdFormatXML

11

Extensible Markup Language (XML) format.

wdFormatDocument97

0

Microsoft Word 97 document format.

wdFormatDocumentDefault

16

Word default document file format. For Word 2010, this is the DOCX format.

wdFormatPDF

17

PDF format.

wdFormatTemplate97

1

Word 97 template format.

wdFormatXMLDocument

12

XML document format.

wdFormatXMLDocumentMacroEnabled

13

XML document format with macros enabled.

wdFormatXMLTemplate

14

XML template format.

wdFormatXMLTemplateMacroEnabled

15

XML template format with macros enabled.

wdFormatXPS

18

XPS format.

       使用客户端的导出方式优缺点都是显而易见的。

       优点:原样导出,代码简单,不用为样式复杂的HTML导出发愁;

       缺点:依赖客户端,只能在IE下使用,浏览器安全降低。

       好了,先写这么多,大家晚安。

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

发表于

我来说两句

0 条评论
登录 后参与评论

相关文章

来自专栏运维前线

使用Gitlab创建git项目

使用Gitlab创建git项目 登录gitlab系统,访问自己的gitlab.example.com,然后使用gitlab用户,登录 ? 第一次登录需要重新修改...

3978

一位非提交者的Apache CloudStack贡献

本文的内容最初由Joe Brockmeier编写,发表在Cloudstack博客上。

1805
来自专栏IT可乐

CentOS 6.8 虚拟机安装详解

第一步:安装 VMware   官方网站:www.vmware.com   下载百度云链接:http://pan.baidu.com/s/1bphDOWv 密码...

2117
来自专栏IMWeb前端团队

如何编写fis3插件

目前业务正在逐步迁移到fis3和lego,有许多和业务相关的fis插件需要处理。 fis 编译流程 ? 官方的这张图,对fis的构建流程讲述的很清楚了,主要包...

2210
来自专栏CodingBlock

Postman用法简介-Http请求模拟工具

  在我们平时开发中,特别是需要与接口打交道时,无论是写接口还是用接口,拿到接口后肯定都得提前测试一下,这样的话就非常需要有一个比较给力的Http请求模拟工具,...

2387
来自专栏企鹅号快讯

React 学习笔记

React 学习笔记 Wednesday, 03. January 2018 04:45PM react 基于nodejs环境。 ? 一、环境安装 nodejs...

1647
来自专栏腾讯IVWEB团队的专栏

Node.js 编写 CLI 的实践

通常而言,Node.js 的应用场景有前后端分离、海量web页面渲染服务、命令行工具和桌面端应用等等。本篇文章选取 CLI(Command Line Tools...

2340
来自专栏高爽的专栏

如何实现"设为首页","加入收藏"的功能

如何实现"设为首页","加入收藏"的功能   解决思路:          将指定URL设为首页的功能主要是依靠IE默认行为homePage的setHomePa...

2090
来自专栏IT可乐

本机向windows服务器传输文件的三种方法

  闲来无事,在腾讯云上申请了一个免费的服务器,想将自己写的网页发布到服务器上,服务器的申请很简单,百度搜索 腾讯云 ,然后新人第一次注册能申请到免费一个月的云...

2249
来自专栏郑家乐的专栏

多版本 Node.js 使用 Workflow

NodeJS 成为新一届的版本帝后,需要预编译的模块常常更新不够及时,就会出现我这样上班时间搞环境 ,那么如何保持一机多版本继续使用低版本的 NodeJS 运行...

1810

扫码关注云+社区