`
01jiangwei01
  • 浏览: 540791 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

docx4j word转pdf

 
阅读更多

使用docx4j转pdf,代码及模板在下面。模板在附件中,字体使用的是宋体。

 

import java.io.OutputStream;
import java.util.HashMap;
import java.util.List;

import org.docx4j.Docx4J;
import org.docx4j.TraversalUtil;
import org.docx4j.XmlUtils;
import org.docx4j.convert.out.FOSettings;
import org.docx4j.finders.ClassFinder;
import org.docx4j.fonts.IdentityPlusMapper;
import org.docx4j.fonts.Mapper;
import org.docx4j.fonts.PhysicalFont;
import org.docx4j.fonts.PhysicalFonts;
import org.docx4j.model.datastorage.migration.VariablePrepare;
import org.docx4j.openpackaging.packages.WordprocessingMLPackage;
import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;
import org.docx4j.wml.Tbl;
import org.docx4j.wml.Tr;

/**
 * 
 * 将模板内容替换后转化成PDF输出
 *
 */
public class MyexapmleConvertToPDF {

private static final  String templetate_docx  = "\\myexamples\\replace_text_PDF_templetate.docx";
	
	private static final  String output_pdf  = "\\myexamples\\replace_text_PDF.pdf";
	
	public static void main(String[] args) throws Exception {
		//加载模板
				WordprocessingMLPackage wordMLPackage = WordprocessingMLPackage
						.load(new java.io.File(System.getProperty("user.dir")+templetate_docx));

				//准备数据
				HashMap<String, String> mappings = new HashMap<String, String>();
				mappings.put("username", "张三");
				mappings.put("party_date", "2014年10月25日");
				mappings.put("numberCount", "150");
				mappings.put("pay_acount", "99.50");
				mappings.put("now_date", "2014年09月25日");
				
				//进行数据合并
				MainDocumentPart documentPart = wordMLPackage.getMainDocumentPart();
		 
				ClassFinder finder = new ClassFinder(Tbl.class); // <----- change this to suit
				new TraversalUtil(documentPart.getContent(), finder);
				//查找模板表格(第i个表格 )
				int seleTableIndex = 0;
				Tbl table_selected =  (Tbl) finder.results.get(seleTableIndex);
				List trs = table_selected.getContent(); 
				//模板行,第2行为模板行
				int table_templetate_row_index = 2;
				org.docx4j.wml.Tr templetate_row = (Tr)trs.get(table_templetate_row_index);
				String templetate_row_string = XmlUtils.marshaltoString(templetate_row,true,true);
				//System.out.println(templetate_row_string);
				//替换第二行的数据
				List<Object>tds = templetate_row.getContent();
				HashMap datamap = new HashMap();
				datamap.put("table_index", "1");
				datamap.put("product_name", "唐代陶瓷");
			 
				
				HashMap datamap2 = new HashMap();
				datamap2.put("table_index", "2");
				datamap2.put("product_name", "明代王冠"); 
				
				//合并表格数据1
				Object newTr = XmlUtils.unmarshallFromTemplate(templetate_row_string,datamap);
				table_selected.getContent().add(newTr);
				//合并表格数据2
				newTr = XmlUtils.unmarshallFromTemplate(templetate_row_string,datamap2);
				table_selected.getContent().add(newTr);
				//移除第2行
				table_selected.getContent().remove(table_templetate_row_index);
					
				//数据替换预处理,调用API包
				//在表格替换后调用这个方法
				VariablePrepare.prepare(wordMLPackage);
				documentPart.variableReplace(mappings);
	 
		//pdf准备工作
		// Font regex (optional)
		// Set regex if you want to restrict to some defined subset of fonts
		// Here we have to do this before calling createContent,
		// since that discovers fonts
		String regex = null;
		// Windows:
		// String  字体类型
		// regex=".*(calibri|camb|cour|arial|symb|times|Times|zapf).*";
		regex=".*(simsunb|simsun|calibri|camb|cour|arial|times|comic|georgia|impact|LSANS|pala|tahoma|trebuc|verdana|symbol|webdings|wingding).*";
		// Mac
		// String
		// regex=".*(Courier New|Arial|Times New Roman|Comic Sans|Georgia|Impact|Lucida Console|Lucida Sans Unicode|Palatino Linotype|Tahoma|Trebuchet|Verdana|Symbol|Webdings|Wingdings|MS Sans Serif|MS Serif).*";
		PhysicalFonts.setRegex(regex);
		
		// Set up font mapper (optional)
		Mapper fontMapper = new IdentityPlusMapper();
		
		// .. example of mapping font Times New Roman which doesn't have certain Arabic glyphs
		// eg Glyph "ي" (0x64a, afii57450) not available in font "TimesNewRomanPS-ItalicMT".
		// eg Glyph "ج" (0x62c, afii57420) not available in font "TimesNewRomanPS-ItalicMT".
		// to a font which does
		PhysicalFont font = PhysicalFonts.getPhysicalFonts().get("calibri"); 
			// make sure this is in your regex (if any)!!!
		if (font!=null) {
			fontMapper.getFontMappings().put("Times New Roman", font);
		}
		fontMapper.getFontMappings().put("Libian SC Regular", PhysicalFonts.getPhysicalFonts().get("SimSun"));
		wordMLPackage.setFontMapper(fontMapper);
		// FO exporter setup (required)
		// .. the FOSettings object
    	FOSettings foSettings = Docx4J.createFOSettings();
    	 
    	foSettings.setFoDumpFile(new java.io.File(System.getProperty("user.dir")+templetate_docx + ".fo"));
    	
		foSettings.setWmlPackage(wordMLPackage);
		
		// Document format: 
		// The default implementation of the FORenderer that uses Apache Fop will output
		// a PDF document if nothing is passed via 
		// foSettings.setApacheFopMime(apacheFopMime)
		// apacheFopMime can be any of the output formats defined in org.apache.fop.apps.MimeConstants eg org.apache.fop.apps.MimeConstants.MIME_FOP_IF or
		// FOSettings.INTERNAL_FO_MIME if you want the fo document as the result.
		//foSettings.setApacheFopMime(FOSettings.INTERNAL_FO_MIME);
		
		// exporter writes to an OutputStream.		
		OutputStream os = new java.io.FileOutputStream(System.getProperty("user.dir")+output_pdf);
    	
		// Specify whether PDF export uses XSLT or not to create the FO
		// (XSLT takes longer, but is more complete).
		
		// Don't care what type of exporter you use
		//Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL);
		
		// Prefer the exporter, that uses a xsl transformation
		Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_XSL);
		
		// Prefer the exporter, that doesn't use a xsl transformation (= uses a visitor)
		// .. faster, but not yet at feature parity
		// Docx4J.toFO(foSettings, os, Docx4J.FLAG_EXPORT_PREFER_NONXSL);
		System.out.println("创建完成 " );

	}

}

 

其中代码字体需要注意了。

regex=".*(simsunb|simsun|calibri|camb|cour|arial|times|comic|georgia|impact|LSANS|pala|tahoma|trebuc|verdana|symbol|webdings|wingding).*";

 其中的名称获取方式是在c://windows/fonts目录下找到需要的文字。右键-属性 查看其名称。Linux没有试过。自己测试。

如下截图:

 

 

 

  • 大小: 636.8 KB
分享到:
评论

相关推荐

    利用docx4j实现docx转pdf

    4. **执行转换**:然后,使用`Docx4J`提供的方法将Word文档转换为PDF。 ```java OutputStream os = new FileOutputStream("path_to_output_pdf.pdf"); PdfWriterHelper.write(wordMLPackage, os); os.close(); ``` ...

    docx4j word合并转pdf.zip

    本文将深入探讨如何使用Java库docx4j来实现多个Word文档的合并,并将结果转换为PDF格式。 docx4j是一款强大的开源Java库,专门用于处理Microsoft Office Open XML(OOXML)格式的文件,如.docx和.xlsx。它提供了一...

    word转pdf所用docx4j

    docx4j 用的jar包,docx4j学习网址:http://www.docx4java.org/trac/docx4j

    word转pdf、word导出、pdf加水印

    - `docx4j`是一个用于处理OpenXML格式(如.docx)的Java库,可能会被用来与Freemarker协同工作,生成Word文档。 - `itextpdf`是iText库的文件名,表示该项目直接使用了iText的PDF处理功能。 这些技术在企业级应用...

    docx4j操作word

    "docx4j操作word" ...使用docx4j,也可以将Word文档转换成pdf文件。 docx4j是一个功能强大的Java类库,提供了创建、读取和操作Word文档的功能。通过使用docx4j,可以轻松地操作Word文档,满足各种需求。

    docx4j所需jar包全

    docx4j提供了将Word文档(.docx)转换为PDF的能力。这一过程通常涉及解析OOXML文档结构,然后根据这些结构生成PDF文档。docx4j通过内部集成的PDF渲染引擎来完成这个任务,确保转换后的PDF尽可能地保留原始Word文档的...

    word转pdf并加水印

    下面我们将详细讲解如何进行“word转pdf并加水印”的过程。 1. **Word转PDF**: - **Microsoft Word内转换**:新版的Microsoft Office(如Office 2013及以后版本)提供了直接保存为PDF的功能。只需打开Word文档,...

    Docx4j office word java

    2. **创建新文档**:使用`org.docx4j.jaxb.Context`类初始化上下文,然后通过`org.docx4j.Docx4J.createDocument()`方法创建一个新的Word文档。 3. **操作文档内容**:可以使用`org.docx4j.model.content.Body`和`...

    docx4j所有jar包

    这些依赖包可能包括处理XML、PDF生成、图片处理等不同功能的库,确保docx4j能顺利完成Word到PDF的转换以及其他操作。 描述中提到的"word转换pdf"是docx4j的一项重要功能。docx4j可以将.docx文档转换为.pdf格式,这...

    docx4j(jar,src,依赖JAR)

    1. **文档生成**:docx4j允许开发者动态生成Word文档,包括文本、段落、表格、图像和图表。这在需要自动生成报告或合同的业务场景中非常有用。 2. **读取与解析**:通过docx4j,可以读取现有的.docx文件,并对其...

    docx转pdf并实现字段填充.rar

    总之,"docx转pdf并实现字段填充"涉及的关键技术是docx4j库的使用,它可以实现文档格式转换和内容填充,适用于需要确保文档一致性、安全性和不可编辑性的场景。对于Java开发者来说,掌握docx4j的使用技巧将极大地...

    docx4j及其依赖包

    **四、docx4j的依赖** 为了使用docx4j,需要在项目中引入对应的依赖包。在Java项目中,可以通过Maven或Gradle等构建工具添加docx4j的依赖。 **五、示例代码** ```java import org.docx4j.*; public class Docx4...

    docx4j全部jar包,包含docx4j-3.2.1.jar、poi-3.14.jar等60个jar包。.zip

    Apache POI是docx4j的一个重要依赖,因为它提供了对低级别Office文档结构的理解,使得docx4j能够解析和构建Word文档的内部XML结构。 除了这两个主要的jar包,其他58个jar包可能包含了docx4j的额外依赖和扩展功能。...

    docx4j项目(javadoc文档、源码及示例)

    docx4j是一款强大的Java库,专为处理Microsoft Office 2007及更高版本的文件格式而设计,包括Word(.docx)、Excel(.xlsx)和PowerPoint(.pptx)文档。它允许开发者在Java应用程序中创建、修改和转换这些文件,...

    JAVA利用poi完成word转pdf,内容包括两个现成工具类和使用到的所有jar包

    在实际项目中,为了方便重复使用,可以封装这些操作到两个工具类中:一个用于读取Word并转换为Docx4j可以理解的格式,另一个用于将Docx4j的输出转换为最终的PDF。此外,工具类中还可以包含字节流处理,以便于在网络...

    docx4j-3.3.3.zip

    《docx4j-3.3.3:Java处理Word文档的强大工具》 在Java开发中,处理Microsoft Office格式的文档是一项常见的需求,尤其是docx格式。为了方便开发者,一个名为docx4j的开源库应运而生,它允许程序员以编程方式创建、...

    docx4j以及依赖的全套jar包

    其次,docx4j还支持Word文档转换为PDF格式。在现代办公环境中,PDF因其良好的跨平台性和阅读体验,成为了普遍的文档交换格式。通过docx4j,开发者可以将Word文档转换为PDF,这在需要打印或共享无编辑版本的文档时...

    Docx4J入门指南(英文)

    Docx4J是一个强大的开源Java库,它主要用于处理Word2007(.docx)、PowerPoint2007(.pptx)和Excel2007(.xlsx)文件,特别在处理Word文档方面,与Apache POI相比具有更强大的功能。Docx4J的官方入门指南是英文版本...

    docx4j操作word2007

    **docx4j操作word2007** 在IT领域,docx4j是一个非常实用的Java库,专为处理Microsoft Office Open XML (OOXML) 文件格式,如.docx、.xlsx和.pptx而设计。它允许开发人员在Java应用程序中创建、修改和转换这些文档...

Global site tag (gtag.js) - Google Analytics