Java-freemaker 生成word,不能用openoffice转成pdf。
我用office软件另存为xml,再把xml变为freemarker模板,然后通过freemarker替换里面的变量数据。生成的doc文档不是真正的word,而是xml文件(通过freemarker 生成的word文档,虽然可以保存为.doc 。但是用文本编辑器打开看文档结构,根本不是ms word的文档结构,还是xml的文档结构),请问怎样才能转换成pdf文件
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我做的是ASP.NET之前曾做过类似的功能实现的步骤如下:首先做一个Word模版里面有需要替换的字符,其次再写程序将Word模板中的替换字符替换掉,最后再将替换后的Word生成PDF文档,C#代码如下,希望能给你提示
Word替换代码
Microsoft.Office.Interop.Word.Application app = new Microsoft.Office.Interop.Word.Application();
object MissingValue = Type.Missing;
object file = Server.MapPath();
Microsoft.Office.Interop.Word.Document doc = app.Documents.Open(
ref file, ref MissingValue, ref MissingValue,
ref MissingValue, ref MissingValue, ref MissingValue,
ref MissingValue, ref MissingValue, ref MissingValue,
ref MissingValue, ref MissingValue, ref MissingValue,
ref MissingValue, ref MissingValue, ref MissingValue, ref MissingValue);
//doc.Content.Find.Text = strOldText ;
StringBuilder sbStrOld = new StringBuilder();
StringBuilder sbStrNew = new StringBuilder();
//此处将需要替换的字符串与替换后的字符明确,多个替换符之前用“;”分隔
object FindText, ReplaceWith, Replace;//
string strold = sbStrOld.ToString().TrimEnd(';');
string[] str_old = strold.Split(';');
string strnew = sbStrNew.ToString();
string[] str_new = strnew.Split(';');
for (int i = 0; i < str_old.Length; i++)
{
doc.Content.Find.Text = str_old[i];// strOldText ;
FindText = str_old[i];// strOldText ;//要查找的文本
ReplaceWith = str_new[i];// strNewText ;//替换文本
Replace = Microsoft.Office.Interop.Word.WdReplace.wdReplaceAll;/**//*wdReplaceAll - 替换找到的所有项。
* wdReplaceNone - 不替换找到的任何项。
* wdReplaceOne - 替换找到的第一项。
* */
doc.Content.Find.ClearFormatting();//移除Find的搜索文本和段落格式设置
if (doc.Content.Find.Execute(
ref FindText, ref MissingValue,
ref MissingValue, ref MissingValue,
ref MissingValue, ref MissingValue,
ref MissingValue, ref MissingValue, ref MissingValue,
ref ReplaceWith, ref Replace,
ref MissingValue, ref MissingValue,
ref MissingValue, ref MissingValue))
{
}
}
doc.Save();
doc.Close(ref MissingValue, ref MissingValue, ref MissingValue);
//关闭应用
app.Quit(ref MissingValue, ref MissingValue, ref MissingValue);
app = null;
Word生成PDF代码
1、首先安装 Microsoft Office 2007加载项:Microsoft Save as PDF-简体中文版:下载地址:
http://download.microsoft.com/download/3/8/8/388812b2-0d3f-474e-a7ef-b095d3d0d3cd/SaveAsPDF.exe
2、新建网站项目,添加Microsoft.Office.Interop.Word的引用
3、代码:
Microsoft.Office.Interop.Word.Application wordApp = new Microsoft.Office.Interop.Word.ApplicationClass();
Type wordType = wordApp.GetType();
Microsoft.Office.Interop.Word.Documents docs = wordApp.Documents;
Type docsType = docs.GetType();
Microsoft.Office.Interop.Word.Document doc = (Microsoft.Office.Interop.Word.Document)docsType.InvokeMember("Open", System.Reflection.BindingFlags.InvokeMethod, null, (object)docs, new Object[] { filename, true, true });
Type docType = doc.GetType();
docType.InvokeMember("SaveAs", System.Reflection.BindingFlags.InvokeMethod, null, doc, new object[] { savefilename, Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatPDF });
//Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatHTML //保存为HTML
//Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatRTF //保存为RTF
//Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatText //保存为文本
//Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatXML //保存为XML
//Microsoft.Office.Interop.Word.WdSaveFormat.wdFormatXPS //保存为XPS
docType.InvokeMember("Close", System.Reflection.BindingFlags.InvokeMethod, null, doc, null);
wordType.InvokeMember("Quit", System.Reflection.BindingFlags.InvokeMethod, null, wordApp, null);
4、设置Word DCOM访问权限
Dcomcnfg.exe
组件服务――计算机――我的电脑――DCOM配置――找到microsoft word 文档
点击属性
选择“安全性”
选定“使用自定义访问权限”和“使用自定义启动权限”
分别编辑权限,添加Everyone,IIS用户
选择“身份标识”,在选定“交互式用户” 即可
在Web.config里加 <identity impersonate="true"/>
使用freemaker就是因为部署的环境不是window。如果是window环境在java下面已经使用jacob组件就可以实现没什么问题的。
现在的问题关键点在于 freemaker生成的word实际是xml格式的,这个生成word已经没有什么问题。在进行openoffice转换成pdf的时候就出问题,原因就是生成的word不是标准的word格式。现在需要解决的时这个xml格式的word怎么变成标准的word,或者有其他方式可以将这种格式的word直接转换成pdf。
sailroWang谢谢您的回答,您说的这些都找到过描述,可是还不能解决现在碰到的这个问题。
按照你的思路:
Java实现XML文档到word文档转换http://wenku.baidu.com/view/8d9dae360b4c2e3f57276387
然后通过openoffice将word转换成pdf
java生成pdf方案总结
1. Jasper Report生成pdf:设计思路是先生成模板,然后得到数据,最后将两者整合得到结果。但是Jasper Report的问题在于,其生成模板的方式过于复杂,即使有IDE的帮助,我们还是需要对其中的众多规则有所了解才行,否则就会给调试带来极大的麻烦。
2. openoffice生成pdf:openoffice是开源软件且能在windows和linux平台下运行。
3. itext + flying saucer生成pdf:itext和flying saucer都是免费开源的,且与平台无关,结合css和velocity技术,可以很好的实现。
一般使用第三种方案比较多,它实现的步骤是非常简单的