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

December 17, 2023
测试
测试
测试
测试
11 分钟阅读

       最近升级公司内部系统发文章的功能,涉及到将文章内容导出为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下使用,浏览器安全降低。

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

继续阅读

更多来自我们博客的帖子

如何安装 BuddyPress
由 测试 December 17, 2023
经过差不多一年的开发,BuddyPress 这个基于 WordPress Mu 的 SNS 插件正式版终于发布了。BuddyPress...
阅读更多
Filter如何工作
由 测试 December 17, 2023
在 web.xml...
阅读更多
如何理解CGAffineTransform
由 测试 December 17, 2023
CGAffineTransform A structure for holding an affine transformation matrix. ...
阅读更多