`
sswh
  • 浏览: 163685 次
  • 性别: Icon_minigender_1
社区版块
存档分类
最新评论
阅读更多
最近项目中有用到Word文档转PDF的功能,做了一些尝试,也遇到了一些困难。
下面把尝试的情况记录下来,也希望做过类似工作的童鞋能一起探讨一下。

我尝试过的Word文档转PDF,用过两种方法:
1、使用OpenOffice转PDF;
2、使用MS Office的OLE自动化功能;
OpenOffice的情况稍后补充,下面先说MS Office的转换情况。

Office版本使用2007,因为2007提供了一个加载项:Microsoft Save as PDF 或 XPS,可将文档另存为PDF格式。下载地址:http://www.microsoft.com/downloads/zh-cn/details.aspx?FamilyID=4D951911-3E7E-4AE6-B059-A2E79ED87041,安装即可使用。

Office COM 组件调用使用jacob(Java COM Bridge)
http://sourceforge.net/projects/jacob-project/
Jacob初次使用的人可能会感到比较困惑。题外话,jacob的API设计是有够别扭的,这儿就不多说了。下面说明一下:

我们接触的jacob类主要就3个:ActiveXComponent、Variant、Dispatch;
ActiveXComponent代表COM应用程序:

初始化方法为:
ActiveXComponent app = new ActiveXComponent("Word.Application");

Variant 是与COM通讯的参数或者返回值;
Dispatch代表一个可操作的自动化对象;如果确定返回值是自动化对象的话,可以调用Variant.toDispatch()转换成Dispatch。
获取了Dispatch之后,即可调用该自动化对象的属性或方法,具体的属性和方法要看参考文档,比如:Word开发可在WORD帮助中查看“脱机开发人员帮助WORD对象模型”。
Dispatch.get(dispatch, String name);获取对象属性;
Dispatch.put(dispatch, String name, Object value);设置对象属性;
Dispatch.call(dispatch, String name, Object… args);调用对象方法;
以上都是Dispatch上的静态方法,所以需要传递dispatch本身。

关于jacob-1.15-M4-x86.dll放置的位置,其实很简单,dll的放置位置就是系统参数
System.getProperty("java.library.path");
所指定的,放在路径里的任意一个目录即可,不想污染JDK目录或者windows/system32目录的话,放置项目启动目录下就可以了,Eclipse下我是放在项目目录下。

下面看具体代码:

public class Word2PDF {

static final int wdDoNotSaveChanges = 0;// 不保存待定的更改。
static final int wdFormatPDF = 17;// PDF 格式

public static void main(String[] args) {

	String filename = "f:/temp/测试文档.docx";
	String toFilename = filename + ".pdf";
	System.out.println("启动Word...");
	long start = System.currentTimeMillis();
	ActiveXComponent app = null;
	try {
		app = new ActiveXComponent("Word.Application");
		app.setProperty("Visible", false);

		Dispatch docs = app.getProperty("Documents").toDispatch();
		System.out.println("打开文档..." + filename);
		Dispatch doc = Dispatch.call(docs,//
				"Open", //
				filename,// FileName
				false,// ConfirmConversions
				true // ReadOnly
				).toDispatch();

		System.out.println("转换文档到PDF..." + toFilename);
		File tofile = new File(toFilename);
		if (tofile.exists()) {
			tofile.delete();
		}
		Dispatch.call(doc,//
				"SaveAs", //
				toFilename, // FileName
				wdFormatPDF);

		Dispatch.call(doc, "Close", false);
		long end = System.currentTimeMillis();
		System.out.println("转换完成..用时:" + (end - start) + "ms.");
	} catch (Exception e) {
		System.out.println("========Error:文档转换失败:" + e.getMessage());
	} finally {
		if (app != null)
			app.invoke("Quit", wdDoNotSaveChanges);
	}
}
}


已知的情况:
1、转换效果好。(相对于OpenOffice)
2、速度慢
3、CPU占用率高

待解决的问题:
1、安全性问题:是否可禁用WORD宏,以及WORD文档中的ActiveX控件?
这一点我不太清楚,但在WORD选项--安全性设置中看到的:

2、微软知识库中的“服务器端 Office 自动化注意事项”
http://support.microsoft.com/kb/257757/
文档似乎明确了
Microsoft 目前建议不要从任何无人参与的、非交互式客户端应用程序或组件(包括 ASP、DCOM 和 NT Service)中进行 Microsoft Office 应用程序的“自动化”,也不为此提供支持,因为 Office 在这种环境中运行时可能会出现不稳定的现象并且/或者会死锁。

因为我主要的用途就是用来服务器端自动转换。
待仔细研读。
  • 大小: 23.2 KB
  • 大小: 41.5 KB
分享到:
评论
14 楼 kkkwoai 2015-08-04  
你好,有问题请教一下

我用来做ppt解析为图片,放在web服务器上面,在并发访问较高的时候,出现大量的请求实际上并没有生成解析的文件,这个有解决方案吗


还有一个就是ppt为什么设置为不可见,代码就不往下面执行了,不会另存为图片了
13 楼 Charles+java 2012-06-26  
求解求解求解求解
12 楼 Charles+java 2012-06-26  
启动Word...
打开文档...D:/work/jilin-project/zjgc_jlyt/doc/3.开发文档.docx
转换文档到PDF...D:/work/jilin-project/zjgc_jlyt/doc/3.开发文档.docx.pdf
========Error:文档转换失败:Invoke of: SaveAs
Source: Microsoft Word
Description: 命令失败


楼主怎么回事啊。

Dispatch.call(doc,// 
                    "SaveAs", // 
                    toFilename);  这样可以转换。,但是转换后的的PDF 打不开
11 楼 antonia 2011-06-16  
我也是刚才才发现word没有控制直接存为图片的参数`~~~
10 楼 ray_linn 2011-06-10  
xiangziwade 写道
再次感谢您不吝赐教!!!

查看了一下,word貌似还真没有控制直接存为图片的参数。。。

另外,有没有什么 不依赖于office2007 来转换word2003到pdf(或者图片)的方法?



有,API是在Exlorper里。
9 楼 xiangziwade 2011-06-10  
再次感谢您不吝赐教!!!

查看了一下,word貌似还真没有控制直接存为图片的参数。。。

另外,有没有什么 不依赖于office2007 来转换word2003到pdf(或者图片)的方法?
8 楼 sswh 2011-06-10  
xiangziwade 写道
原来如此啊,非常感谢!
Dispatch.call()的情况好复杂。。。

另外,这些常数是如何定义的呢?
static final int wdFormatPDF = 17;// PDF 格式
static final int ppSaveAsPDF = 32;// PDF 格式

对于ppt貌似设置成16到19之间,可以直接转换成图片。
不知对于word有没有类似的情况?


sswh 写道
获取了Dispatch之后,即可调用该自动化对象的属性或方法,具体的属性和方法要看参考文档,比如:Word开发可在WORD帮助中查看“脱机开发人员帮助WORD对象模型”。






7 楼 xiangziwade 2011-06-09  
原来如此啊,非常感谢!
Dispatch.call()的情况好复杂。。。

另外,这些常数是如何定义的呢?
static final int wdFormatPDF = 17;// PDF 格式
static final int ppSaveAsPDF = 32;// PDF 格式

对于ppt貌似设置成16到19之间,可以直接转换成图片。
不知对于word有没有类似的情况?
6 楼 ray_linn 2011-06-09  
装个PDF打印机就可以了,win7默认有XPS打印机,win8应该同时支持xps和PDF
5 楼 sswh 2011-06-09  
xiangziwade 写道
在ppt转换为pdf时,visible可否有什么方法设置为false?
用setProperty尝试了下,提示不允许:Hiding the application window is not allowed。


app = new ActiveXComponent("Powerpoint.Application");
// app.setProperty("Visible", true);
System.out.println(app.getProperty("Visible"));


new一个Powerpoint.Application时,Visible已经是false了。
MsoTriState 枚举.msoFalse的值是0,和打印出来的相同。
反而是如果调用setProperty("Visible", true);Powerpoint的窗口才会显示出来。

不过一个问题是 另存的时候,还是会有一个发布的进度框显示出来,还不知道该怎样把它隐藏掉。
public class Test {
static final int ppSaveAsPDF = 32;// PDF 格式

public static void main(String[] args) {

	String filename = "f:/aaaaa.ppt";
	String toFilename = filename + ".pdf";
	System.out.println("启动...");
	long start = System.currentTimeMillis();
	ActiveXComponent app = null;
	try {
		app = new ActiveXComponent("Powerpoint.Application");
		// app.setProperty("Visible", true);
		System.out.println(app.getProperty("Visible"));

		Dispatch presentations = app.getProperty("Presentations").toDispatch();
		System.out.println("打开文档..." + filename);
		Dispatch presentation = Dispatch.call(presentations,//
				"Open", //
				filename,// FileName
				true,// ReadOnly
				true,// Untitled 指定文件是否有标题。
				false // WithWindow 指定文件是否可见。
				).toDispatch();

		System.out.println("转换文档到PDF..." + toFilename);
		File tofile = new File(toFilename);
		if (tofile.exists()) {
			tofile.delete();
		}
		Dispatch.call(presentation,//
				"SaveAs", //
				toFilename, // FileName
				ppSaveAsPDF);

		Dispatch.call(presentation, "Close");
		long end = System.currentTimeMillis();
		System.out.println("转换完成..用时:" + (end - start) + "ms.");
	} catch (Exception e) {
		System.out.println("========Error:文档转换失败:" + e.getMessage());
	} finally {
		if (app != null) app.invoke("Quit");
	}
}

4 楼 xiangziwade 2011-06-09  
在ppt转换为pdf时,visible可否有什么方法设置为false?
用setProperty尝试了下,提示不允许:Hiding the application window is not allowed。
3 楼 sswh 2011-04-18  
TO kimmking:
非常感谢。
OLE是我前面写错了,目前暂不需要嵌入编辑界面,只需要后台运行Office就可以了。

如果用Office做后台转换的话,转换速度慢、CPU占用100%的问题还有什么好的办法来应对吗?

宏的问题,我主要担心恶意的宏对系统安全造成危害。
有什么办法来解决吗?Office我的使用还比较初级,呵呵

使用office的print功能,比使用saveas有哪些优势吗?
使用saveas只需要依赖office,使用print,依赖的环境不是更多了吗?

另外,关于你说的:
kimmking 写道

2、office在com方式下使用,容易出现无法release的问题。特别是excel,
因为excel的进程模型跟其他的不太一样。
这个有办法处理强制解决。


非常有兴趣知道,期待你的分享。
2 楼 kimmking 2011-04-18  
1\2\3 跟转换的有关系。

4、可以对宏进行签名,解决安全问题。
-----------------------------------
你可以咨询我任何office dev相关的问题。

另外,对你的几个建议
1、office不支持ole,可以通过dsoframer来做
2、office在com方式下使用,容易出现无法release的问题。特别是excel,
因为excel的进程模型跟其他的不太一样。
这个有办法处理强制解决。

还有一个转换办法:
使用office的print功能,而不是saveaspdf插件。
然后指定pdf reader自带的pdf打印机来生成文档。


当然,这些方式,都依赖了office。
1 楼 sswh 2011-04-17  
因为使用WORD转PDF的效果是OpenOffice无法比拟的,虽然有诸多问题,还是想要采用。

因为已知的问题:
1、转换速度慢;
2、CPU占用率高(单CPU占用100%)
3、并发情况下WORD可能会死锁(微软知识库)
4、Word宏安全问题;
5、还有一些未知的细节。

目前的打算是采用一个独立服务器,定时扫描需要转换文档的数据库表,
一旦有任务就执行转换,转换完再取下一条数据。
这样的话1/2/3条都不成问题了。

相关推荐

    doc文件转pdf

    通过XDocReport,你可以轻松地将 Velocity 模板集成到Java应用中,实现动态数据的插入,生成新的doc文档。例如,你可能有一个包含个人信息的docx模板,如姓名、地址等,这些信息可以通过Velocity语法定义,然后在...

    doc文档转PDF文档所需的jar包

    "doc文档转PDF文档所需的jar包"是解决这个问题的关键,它提供了一套库文件,使得开发者能够轻松地在应用程序中实现这个功能。 首先,我们要了解的是,转换过程通常依赖于第三方库,这些库已经实现了对Office文档...

    doc文档转PDF文件工具

    标题提到的"doc文档转PDF文件工具"正是为了解决这个问题,将Microsoft Word(.doc或.docx)文档转换成PDF格式。描述中提到的“完美解决doc转图片格式的问题”,可能是指该工具不仅支持文字转换,还能处理包含图像的...

    python写的doc转换成pdf文件代码

    python写的doc转换成pdf文件代码,很实用的。

    doc文档转pdf软件

    "doc文档转pdf软件"是一个专题,它涉及到Microsoft Word(doc)文档与Adobe Portable Document Format (PDF)之间的转换。这两种格式各有特点:Word文档便于编辑,而PDF文件则侧重于保持格式的一致性和阅读体验。 在...

    doc转pdf免费软件

    标题中的“doc转pdf免费软件”指的是能够将Microsoft Word(doc)或Microsoft Excel(xls)文档转换成PDF(Portable Document Format)格式的免费工具。在IT领域,这种类型的软件广泛应用于文档格式转换,以确保文件...

    doc文档转换pdf,亲测非常精准

    1.将需转换的doc文档存放至,某目录。 2.运行jar包:java -jar Doc.jar /需要转换文件的目录

    dopdf doc文件转pdf工具

    Dopdf软件提供了一个便捷的解决方案,帮助用户在不丢失原有布局和格式的情况下,将doc文档转换为PDF格式。 描述中提到的“快速解决如何把word文件转换为pdf文件”意味着dopdf能够高效地完成这一任务。通常,Word...

    PDF文件转换成DOC文档.rar

    PDF文件转换成DOC文档是一个常见的需求,特别是在办公环境中,用户可能需要编辑PDF中的文本或将其内容整合到Word文档中。这个压缩包文件“PDF文件转换成DOC文档.rar”显然是一个工具,专门用于解决这个问题。下面将...

    doc转pdf小工具

    标题中的“doc转pdf小工具”指的是一个软件或应用程序,其主要功能是将Microsoft Word(doc格式)文档转换成PDF(Portable Document Format)文件。在日常工作中,这种工具非常实用,因为不同的用户可能使用不同的...

    DOC转PDF工具

    "PDF转DOC工具"通常具备以下特性: 1. **格式保留**:工具在转换过程中会尽可能地保留原DOC文件的字体、颜色、图像、表格和段落样式,确保PDF文件生成后与DOC文件无明显差异。 2. **易用性**:用户界面友好,操作...

    批量Doc转PDF工具

    "批量Doc转PDF工具"是解决这个问题的专业软件,它能够帮助用户高效地将多个docx和doc格式的文档转换为PDF格式。这种转换工具通常具有批量处理的功能,可以一次性处理大量文件,大大节省了手动操作的时间。 Docx和...

    winform c# pdf文件转换doc文件和 png 图片格式 PDF转word 和图片

    采用C#开发语言,借助第三方Aspose.Pdf.dll及Spire.Pdf.dll 对pdf文件进行处理,可以把pdf文件转换成doc 或者docx png等格式,通过代码大家可以进行自己重新开发,核心代码已经编写完成,下载后可以直接运行进行pdf...

    doc 替换生成doc doc转pdf实践

    综上所述,"doc 替换生成doc"和"doc转pdf实践"是利用编程技术处理文档转换的过程,主要涉及了Apache POI库以及PDF生成库的应用。在实际工作中,这样的技能可以帮助我们高效地处理大量文档的转换和内容更新需求。

    c# office(doc xls ppt等)转pdf代码类

    在C#编程环境中,将Office文档(如DOC、XLS、PPT等)转换为PDF是一种常见的需求。这种转换有助于保持格式一致性,并方便在不同设备和操作系统之间共享。本篇文章将详细探讨如何使用C#代码实现这个功能。 首先,我们...

    doc2pdf2 doc/word转pdf

    "doc2pdf2 doc/word转pdf" 提供了一种解决方案,帮助用户将Microsoft Word(.doc或.docx)格式的文件转换为PDF(Portable Document Format)格式。PDF文件因其跨平台的兼容性和防止编辑的特点,被广泛应用于报告、...

    doc转pdf终极解决方案demo,基于aspose-words实现,兼容windows和linux系统

    DOC是Microsoft Word的默认格式,而PDF(Portable Document Format)则是一种通用的文件格式,能够保留原始文档的格式和布局,并且可以在各种设备和操作系统上查看。在跨平台共享文档或确保文档一致呈现时,PDF通常...

    PDF转换成DOC\XLS

    该软件能够尽可能地保留原文档的格式和图像质量,使得转换后的DOC文件与原始PDF尽可能一致。 转换过程通常包括以下步骤: 1. 安装Solid Converter PDF 7.1:首先需要在计算机上安装这个软件,确保满足系统需求。 2....

    OpenOffice 实现JPG.DOC转PDF转SWF在线预览(Java版)

    总结,通过OpenOffice和相关的Java库,我们可以实现Java环境下的文件格式转换,包括JPG图片和DOC文档转PDF,以及PDF转SWF。这些操作对于构建在线文档预览系统至关重要。同时,确保正确配置和安装相关软件、字体以及...

    【doc格式转pdf】word转换pdf专用工具

    在“word文档格式转换 doc转pdf格式 word格式转pdf”的标签中,我们了解到这个工具专注于Word到PDF的转换,支持.doc和.docx两种常见的Word文件格式。 从压缩包内的文件名称“Word~doc转pdf.exe”我们可以推断,这是...

Global site tag (gtag.js) - Google Analytics