使用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没有试过。自己测试。
如下截图:
相关推荐
4. **执行转换**:然后,使用`Docx4J`提供的方法将Word文档转换为PDF。 ```java OutputStream os = new FileOutputStream("path_to_output_pdf.pdf"); PdfWriterHelper.write(wordMLPackage, os); os.close(); ``` ...
本文将深入探讨如何使用Java库docx4j来实现多个Word文档的合并,并将结果转换为PDF格式。 docx4j是一款强大的开源Java库,专门用于处理Microsoft Office Open XML(OOXML)格式的文件,如.docx和.xlsx。它提供了一...
docx4j 用的jar包,docx4j学习网址:http://www.docx4java.org/trac/docx4j
- `docx4j`是一个用于处理OpenXML格式(如.docx)的Java库,可能会被用来与Freemarker协同工作,生成Word文档。 - `itextpdf`是iText库的文件名,表示该项目直接使用了iText的PDF处理功能。 这些技术在企业级应用...
"docx4j操作word" ...使用docx4j,也可以将Word文档转换成pdf文件。 docx4j是一个功能强大的Java类库,提供了创建、读取和操作Word文档的功能。通过使用docx4j,可以轻松地操作Word文档,满足各种需求。
docx4j提供了将Word文档(.docx)转换为PDF的能力。这一过程通常涉及解析OOXML文档结构,然后根据这些结构生成PDF文档。docx4j通过内部集成的PDF渲染引擎来完成这个任务,确保转换后的PDF尽可能地保留原始Word文档的...
下面我们将详细讲解如何进行“word转pdf并加水印”的过程。 1. **Word转PDF**: - **Microsoft Word内转换**:新版的Microsoft Office(如Office 2013及以后版本)提供了直接保存为PDF的功能。只需打开Word文档,...
这些依赖包可能包括处理XML、PDF生成、图片处理等不同功能的库,确保docx4j能顺利完成Word到PDF的转换以及其他操作。 描述中提到的"word转换pdf"是docx4j的一项重要功能。docx4j可以将.docx文档转换为.pdf格式,这...
2. **创建新文档**:使用`org.docx4j.jaxb.Context`类初始化上下文,然后通过`org.docx4j.Docx4J.createDocument()`方法创建一个新的Word文档。 3. **操作文档内容**:可以使用`org.docx4j.model.content.Body`和`...
html模板填充生成pdf和word
1. **文档生成**:docx4j允许开发者动态生成Word文档,包括文本、段落、表格、图像和图表。这在需要自动生成报告或合同的业务场景中非常有用。 2. **读取与解析**:通过docx4j,可以读取现有的.docx文件,并对其...
**四、docx4j的依赖** 为了使用docx4j,需要在项目中引入对应的依赖包。在Java项目中,可以通过Maven或Gradle等构建工具添加docx4j的依赖。 **五、示例代码** ```java import org.docx4j.*; public class Docx4...
总之,"docx转pdf并实现字段填充"涉及的关键技术是docx4j库的使用,它可以实现文档格式转换和内容填充,适用于需要确保文档一致性、安全性和不可编辑性的场景。对于Java开发者来说,掌握docx4j的使用技巧将极大地...
Apache POI是docx4j的一个重要依赖,因为它提供了对低级别Office文档结构的理解,使得docx4j能够解析和构建Word文档的内部XML结构。 除了这两个主要的jar包,其他58个jar包可能包含了docx4j的额外依赖和扩展功能。...
docx4j是一款强大的Java库,专为处理Microsoft Office 2007及更高版本的文件格式而设计,包括Word(.docx)、Excel(.xlsx)和PowerPoint(.pptx)文档。它允许开发者在Java应用程序中创建、修改和转换这些文件,...
在实际项目中,为了方便重复使用,可以封装这些操作到两个工具类中:一个用于读取Word并转换为Docx4j可以理解的格式,另一个用于将Docx4j的输出转换为最终的PDF。此外,工具类中还可以包含字节流处理,以便于在网络...
其次,docx4j还支持Word文档转换为PDF格式。在现代办公环境中,PDF因其良好的跨平台性和阅读体验,成为了普遍的文档交换格式。通过docx4j,开发者可以将Word文档转换为PDF,这在需要打印或共享无编辑版本的文档时...
《docx4j-3.3.3:Java处理Word文档的强大工具》 在Java开发中,处理Microsoft Office格式的文档是一项常见的需求,尤其是docx格式。为了方便开发者,一个名为docx4j的开源库应运而生,它允许程序员以编程方式创建、...
Docx4J是一个强大的开源Java库,它主要用于处理Word2007(.docx)、PowerPoint2007(.pptx)和Excel2007(.xlsx)文件,特别在处理Word文档方面,与Apache POI相比具有更强大的功能。Docx4J的官方入门指南是英文版本...