java使用aspose-words生成pdf、word文件

 此文档主要为解决java项目中生成pdf、word文件。作者在以往项目中接触使用过多种生成pdf的方法,以前常用的生成pdf的方式大多使用itex进行打印,提前绘制好pdf模板。有的采用坐标位进行打印,打印前需要在模板上量坐标确定打印的位置;有的采用pdf域打印,打印前需要使用Adobe在pdf模板上对每一块打印的区域进行域的绘制;以上打印方法中存在以下几个问题:1)  打印表格时很难进行调整:使用Itex进行打印时,如果某一区域需要进行表格打印,代码中很难进行操作;调式时间长,打印效果不理想。2)    分页问题:使用itex进行打印时,分页问题最难处理;作者在之前项目中遇到过很多这种问题,很多区域在进行打印时需要计算字符长度,从而计算出当前页是否可以容纳当前打印的信息,否则就要进行字符截取处理分页问题。3)  超出打印区域问题使用坐标位进行打印时普遍存在此问题,因为模板文件为固定的pdf。打印的文字过多时,还需计算当前区域能否容纳。或进行字符截取、或进行分页操作。以上只为说明以前使用的打印方法中存在的问题及弊端,可能描述的不够全面和完整,由于能力有限尽请见谅。自从接触到Aspose-words这种打印方式后,感觉在项目中使用这种方式进行pdf、word的生成简直太方便了。项目中只需要引入一个jar和一个license文件即可使用,使用时提前写好公用的方法在具体代码中使用时进行简单调用即可。Aspose-words基本上可解决项目中90%以上的pdf、word生成,除非存在特别复杂的表单无法生成。以下简单总结下Aspose-words的使用:

模板定义

 **域的定义都一样唯一需要注意的是表格的域定义。动态的表格域定义:«TableStart:TableInfoList»«lable»«value»«TableEnd:TableInfoList»TableInfoList为表格名,两列label、value列**

定义好的模板

在这里插入图片描述

测试代码

package ext.demo;import com.aspose.words.*;
import com.aspose.words.net.System.Data.DataRow;
import com.aspose.words.net.System.Data.DataTable;import java.io.*;
import java.util.List;
import java.util.*;/*** Pdf文件生成*/
public final class PdfTempHelper {private Document doc;private PdfTempHelper() {}public static PdfTempHelper create(String filePath) {File file = new File(filePath);return create(file);}/*** 装载模板文件** @param file* @return*/public static PdfTempHelper create(File file) {PdfTempHelper helper = new PdfTempHelper();try {String license = "E:\\项目文件\\jar文件\\Aspose\\aspose.words.lic_2999.xml";if (helper.getLicense(license) != true) {return null;}helper.doc = new Document(file.getAbsolutePath());} catch (Exception e) {e.printStackTrace();}return helper;}public PdfTempHelper render(Map<String, Object> data) {return render(data, "font-size:13px");}/*** 信息打印** @param data* @param style* @return*/public PdfTempHelper render(Map<String, Object> data, String style) {List<String> names = new ArrayList<>();List<Object> values = new ArrayList<>();List<DataTable> tables = new ArrayList<>();Map<String, String> htmls = new HashMap<>();data.forEach((name, value) -> {if (name == null) {return;}if (value == null) {value = "";}if (value instanceof DataTable) {tables.add((DataTable) value);} else if (value instanceof StringBuffer) {htmls.put(name, ((StringBuffer) value).toString());} else {names.add(name);values.add(value);}});try {doc.getMailMerge().execute(names.toArray(new String[0]), values.toArray(new Object[0]));String[] fieldNames = doc.getMailMerge().getFieldNames();System.out.println(">>>>>>>>>>fieldNames=" + Arrays.asList(fieldNames));for (DataTable table : tables) {doc.getMailMerge().executeWithRegions(table);}if (htmls.keySet() != null && htmls.keySet().size() > 0) {for (String name : htmls.keySet()) {DocumentBuilder builder = new DocumentBuilder(doc);//处理html标签字体大小String html = setFontStyle(htmls.get(name), style);htmls.put(name, html);builder.moveToMergeField(name);builder.insertHtml(htmls.get(name));}}} catch (Exception e) {e.printStackTrace();}return this;}/*** 处理富文本标签** @param html* @param style* @return*/public static String setFontStyle(String html, String style) {html = html.replaceAll("<p>", "<p style='" + style + "'>");html = html.replaceAll("<td>", "<td style='" + style + "'>");return html;}public void saveAsPdf(OutputStream output) {saveAs(output, SaveFormat.PDF);}public void saveAsPdf(String filepath) {BufferedOutputStream output = null;try {output = new BufferedOutputStream(new FileOutputStream(filepath));saveAs(output, SaveFormat.PDF);} catch (FileNotFoundException e) {e.printStackTrace();} finally {try {if (output != null) {output.close();}} catch (IOException e) {e.printStackTrace();}}}public void saveAsDoc(OutputStream output) {saveAs(output, SaveFormat.DOC);}public void saveAsDocx(OutputStream output) {saveAs(output, SaveFormat.DOCX);}/*** 文件保存** @param output* @param format*/private void saveAs(OutputStream output, int format) {try {//加载字体文件String base = "E:\\项目文件\\jar文件\\Aspose\\font";FontSettings font = new FontSettings();List<FontSourceBase> sources = new ArrayList<>();sources.add(new FolderFontSource(base, true));font.setDefaultFontName("SIMSUN");font.setFontsSources(sources.toArray(new FontSourceBase[sources.size()]));doc.setFontSettings(font);//设置字体doc.save(output, format);//保存对应文件output.flush();} catch (Exception e) {e.printStackTrace();} finally {try {if (output != null) {output.close();}} catch (IOException e) {e.printStackTrace();}}}/*** 获取licence** @param filepath* @return*/private boolean getLicense(String filepath) {try {InputStream is = new FileInputStream(filepath);License license = new License();license.setLicense(is);return true;} catch (Exception e) {e.printStackTrace();return false;}}/*** 获取doc上所有域名称** @return* @throws Exception*/public String[] getAllMailMergeNames() {try {return doc.getMailMerge().getFieldNames();} catch (Exception e) {e.printStackTrace();return null;}}public static void main(String[] args) throws Exception {PdfTempHelper pdfTempHelper = create("E:\\项目文件\\jar文件\\Aspose\\AsposeWord资料总结.docx");//装载模板信息Map printInfo = new HashMap();//定义打印信息集合String[] allMailMergeNames = pdfTempHelper.getAllMailMergeNames();//获取模板上所有添加的域for (String mailMergeName : allMailMergeNames) {printInfo.put(mailMergeName, "");//默认域中打印空白信息}//测试文本信息装载printInfo.put("text", "测试文本信息");//测试表格信息装载DataTable dataTable = new DataTable("TableInfoList");dataTable.getColumns().add("label");  //定义列信息dataTable.getColumns().add("value");DataRow dataRow = dataTable.newRow();//表格创建行dataRow.set("lable", "第一行label");dataRow.set("value", "第一行value");dataTable.getRows().add(dataRow);dataRow = dataTable.newRow();//表格创建行dataRow.set("lable", "第二行label");dataRow.set("value", "第二行value");dataTable.getRows().add(dataRow);printInfo.put("TableInfoList", dataTable);//图片打印测试printInfo.put("picture", new StringBuffer("<img src='E:\\项目文件\\jar文件\\Aspose\\picture.jpg'></img>"));//html打印测试printInfo.put("html", new StringBuffer("<p>测试html文本</p>\n" +"<h1>html文本h1</h1>\n" +"<h2>html文本h1</h2>\n" +"<h3>html文本h1</h3>"));pdfTempHelper.render(printInfo);//信息打印String outPath = "E:\\项目文件\\jar文件\\Aspose\\export\\" + System.nanoTime() + ".pdf";//定义输出文件位置pdfTempHelper.saveAsPdf(outPath);//生成pdf文件}
}

测试结果

总结

接下来简单说一些自己的体会吧:以上测试基本上满足项目中大部分打印需求,作者自从使用Aspose-words打印pdf、word文件后,感觉比itex打印功能强大太多,再也不用担心打印的问题了。
目前遇到过几个问题不好解决的:1)    打印信息的格式问题:很多时候我们会在项目中使用富文本,而富文本最终是以html的形式进行打印的,往往我们提前在word中某一个域中定义好了段落、缩进、字体等信息。但是打印的html中有自己的格式、字体,导致我们在word中定义的格式不生效尤其是缩进问题。2)  复杂的表格打印Aspose-words打印表格时只能打印一些常用的表格,过于复杂的动态表打印还是有些问题的。这个问题虽然存在,但是并不影响他的强大。至于其余问题,我认为都可以解决。例如一下这种信息的打印:**1、第一段**第一段文本**2、第二段**第二段文本。。。像这种不确定的多个段落打印时,我们无法提前定义标题和内容的域,但是可以在后台使用html进行拼接,打印在一个域中。也可以和itext结合进行使用。类似这种变通的使用,具体的使用方法还需要在具体项目中进行操作总结。

资料不易,还请勿喷。相关文件奉上,若链接过期留言获取连接
链接:https://pan.baidu.com/s/1YQU54n_EZ8sxvZmtYgdLQQ
提取码:3838

java使用aspose打印pdf、word文件相关推荐

  1. 在linux环境下com.aspose.words将word文件转为pdf后乱码,window环境下不会

    在linux环境下com.aspose.words将word文件转为pdf后乱码,window环境下不会 乱码原因是因为在linux系统下没有中文字体,所以转换的时候乱码,需要我们手动把window系 ...

  2. 【Apache POI】Java Web根据模板导出word文件

    最近工作中遇到一个需求:根据word模板文档导出word文件. 查阅了一些资料,发现Apache POI可以实现文档读写的功能,于是就研究了一下,总结如下: Apache-POI在线Javadoc:h ...

  3. 基于Aspose.Words 生成Word文件

    原文地址为: 基于Aspose.Words 生成Word文件 using Aspose.Words; string tmppath = Server.MapPath("~/TestWord. ...

  4. html表格打印成pdf格式文件,使用html2pdf打印PDF格式文件中的数据作为PDF文件

    我想从表单文章中获取一些数据并将其输出到PDF2文件中,并在同一页面上使用html2pdf.但是,当试图将表单数据发布到同一页面时,它不会打开PDF文件,这可能是因为PHP文件的其余部分将出现在if( ...

  5. java使用Aspose.words实现word文档转pdf文件

    引入原因: 感觉openOffice问题还是比较多的. 1. 比如经常出现8100端口问题,虽然kill了就行,但是还是多了一份操作. 2. 出现少数docx无法预览的问题.(已经修改过源码兼容doc ...

  6. Java使用aspose把PDF文件转换成PNG文件,以及把PDF文件水印转换成PNG格式

    Java代码把PDF文件转换成PNG文件 需要引用aspose包,引入操作我写了一个博客,地址如下 https://blog.csdn.net/weixin_46713508/article/deta ...

  7. Java调用打印机打印PDF文档的两种方法

    最近,由于项目需求,需要增加系统调用打印机打印PDF文档功能.以前在Asp.Net项目中做过套打,但是现在的需求直接文档打印,下面是实现代码调用打印机的两种方法. 1.Java Print Servi ...

  8. Java调用打印机打印pdf

    要在Java中调用打印机打印PDF,可以使用Java打印API和第三方库,如Apache PDFBox或iText PDF. 以下是使用Java打印API打印PDF的基本步骤: 安装打印机:确保您已经 ...

  9. java 文档比较功能_[原创]java在线比较两个word文件

    一.项目背景 开发文档管理系统或OA办公系统的时候,实现在线处理word文档的功能比较容易,但是也经常会有客户提出文档版本管理的需求,这就需要同时在线打开两个word文件,对比两个不同版本的word文 ...

  10. java连接打印机打印PDF

    核心代码: public class PrintService {private static final Logger logger = LoggerFactory.getLogger(PrintS ...

最新文章

  1. 【java】兴唐第十五节课
  2. Myeclipse开发环境下文件中出现的提示错误与解决方法:The import javax.servlet cannot be resolved?
  3. 【cocos2d-x 手游研发----地图活起来了】
  4. KnockoutJS + My97DatePicker
  5. 5款神器级别Github 的Chrome插件
  6. android 界面长按,Android 主界面长按创建快捷方式
  7. 【Ubuntu引导】EFI系统分区.删除不掉,也不能格式化,如何粘力删除 efi 隐藏分区
  8. 试图将驱动程序添加到存储区_云存储——终于等到你,还好没放弃
  9. 你会处理圆周率吗?----- Python操作文件应用举例
  10. STM32 ADC没有输入电压时,采集结果不为0
  11. java提高篇(二)-----理解java的三大特性之继承
  12. 智慧校园安防平台应用解决方案
  13. html5通讯录模板,[应用模板]HTML5+Phonegap通讯录
  14. 产品设计:axure的基本使用
  15. Ubuntu16.04解决arpspoof时出现arpspoof: libnet_check_iface() ioctl: No such device问题
  16. MSOCache文件夹能否删除?
  17. 均值不等式中考_中考数学解题技巧方法
  18. 电脑无法识别U盘的解决方式集锦_艾孜尔江撰稿
  19. poj 1177 线段树+离散化+扫描线 求矩形并的轮廓长
  20. 【Cicadaplayer】播放器的时间戳

热门文章

  1. 天下武功唯快不破--速度要快
  2. bmp图片批量转为jpg格式文件?
  3. RCNN 的 Hard Negative Mining的原理
  4. 利用TLF给文本加样式
  5. 【Week 1】Preferences and Ratings
  6. 如何屏蔽电脑微信自动更新
  7. 介绍一下Emily----大一
  8. 我在南方的艳阳里大雪纷飞
  9. yuyu终于考完了!我提前过生日了!(两者好像没有关联嘛^_^)
  10. 医学图像笔记(八)窗宽窗位