Java 实现word 中写入文字图片的解决方案
JAVA不使用POI给Word文档添加水印[PageOffice]
JAVA不使用POI给Word文档添加水印[PageOffice]程序员在开发项目时,经常需要给一些图片、文件添加水印,但往往代码编写复杂,只能是先将文件上传再调用Graphics类才能实现这一功能。
但是最无奈的是这个类只能给图片添加水印,而无法通过程序给Word文件添加水印,那如何实现这一功能呢,下面我就来和大家分享一下一种简单的实现方法吧。
第一步:拷贝文件到WEB项目的“WEB-INF/lib”目录下。
拷贝PageOffice 示例中下的“WEB-INF/lib”路径中的pageoffice.cab和pageoffice.jar到新建项目的“WEB-INF/lib”目录下。
第二步:修改WEB项目的配置文件。
将如下代码添加到配置文件中:<!-- PageOffice Begin --><servlet><servlet-name>poserver</servlet-name><servlet-class>com.zhuozhengsoft .pageoffice.poserver.Server</servlet-class></servlet><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/poserver.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/pageoffice.cab</url-pattern></servlet-mapping><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/popdf.cab</url-pattern></servlet-mapping><servlet-mapping><servlet-name>poserver</servlet-name><url-pattern>/sealsetup.exe</url-pattern></servlet-mapping><servlet><servlet-name>adminseal</servlet-name><servlet-class>com.zhuozhengsoft.pageoffice.poserver.AdminSeal </servlet-class></servlet><servlet-mapping><servlet-name>adminseal</servlet-name><url-pattern>/adminseal.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>adminseal</servlet-name><url-pattern>/loginseal.do</url-pattern></servlet-mapping><servlet-mapping><servlet-name>adminseal</servlet-name><url-pattern>/sealimage.do</url-pattern></servlet-mapping><mime-mapping><extension>mht</extension><mime-type>message/rfc822</mime-type></mime-mapping><context-param><param-name>adminseal-password</param-name><param-value>123456</param-value></context-param><!-- PageOffice End -->第三步:添加引用。
java根据模板生成word文档,兼容富文本、图片
java根据模板⽣成word⽂档,兼容富⽂本、图⽚Java⾃动⽣成带图⽚、富⽂本、表格等的word⽂档使⽤技术 freemark+jsoup ⽣成mht格式的伪word⽂档,已经应⽤项⽬中,确实是可⾏的,⽆论是富⽂本中是图⽚还是表格,都能在word中展现出来使⽤jsoup解析富⽂本框,将其中的图⽚进⾏Base64位转码,使⽤freemark替换模板的占位符,将变量以及图⽚资源放⼊模板中在输出⽂件maven地址<!--freemarker--><!--<dependency> <groupId>org.freemarker</groupId> <artifactId>freemarker</artifactId> <version>2.3.23</version></dependency><!--JavaHTMLParser--><!--<dependency> <groupId>org.jsoup</groupId> <artifactId>jsoup</artifactId> <version>1.10.2</version></dependency>制作word的freemark模板1. 先将wrod的格式内容定义好,如果需要插⼊参数的地⽅以${xxx}为表⽰,例:${product}模板例⼦: 2. 将模板另存为mht格式的⽂件,打开该⽂件检查每个变量(${product})是否完整,有可能在${}中出现其他代码,需要删除。
3. 将mht⽂件变更⽂件类型,改成ftl为结尾的⽂件,引⼊到项⽬中 4. 修改ftl模板⽂件,在⽂件中加上图⽚资源占位符${imagesBase64String},${imagesXmlHrefString}具体位置如下图所⽰: 5. ftl⽂件中由⼏个关键配置需要引⼊到代码中:docSrcParent = word.filesdocSrcLocationPrex =nextPartId = 01D2C8DD.BC13AF60上⾯三个参数,在模板⽂件中可以找到,需要进⾏配置,如果配置错误,图⽚⽂件将不会显⽰下⾯这三个参数固定,切换模板也不会改变shapeidPrex = _x56fe__x7247__x0020typeid = #_x0000_t75spidPrex = _x0000_i 6. 模板引⼊之后进⾏代码编辑源码地址为:下载源码后需要进⾏调整下内容:1. 录⼊步骤5中的6个参数2. 修改freemark获取模板⽅式下⾯这种⽅式能获取模板,但是在项⽬打包之后⽆法获取jar包内的⽂件Configuration configuration=newConfiguration(Configuration.getVersion());configuration.setDefaultEncoding(StandardCharsets.UTF_8.toString());configuration.setDirectoryForTemplateLoading(newFile(templatePath));Template template=configuration.getTemplate("xxx.ftl");通过流的形式直接创建模板对象Configuration configuration=newConfiguration(Configuration.getVersion());configuration.setDefaultEncoding(StandardCharsets.UTF_8.toString());configuration.setDirectoryForTemplateLoading(newFile(templatePath));InputStream inputStream=newFileInputStream(newFile(templatePath+"/"+templateName)); InputStreamReader inputStreamReader=newInputStreamReader(inputStream,StandardCharsets.UTF_8); Template template=newTemplate(templateName,inputStreamReader,configuration);。
Java解析OFFICE(word,excel,powerpoint)以及PDF的实现方案。。。
Java解析OFFICE(word,excel,powerpoint)以及PDF的实现⽅案。
Java解析OFFICE(word,excel,powerpoint)以及PDF的实现⽅案及开发中的点滴分享 在此,先分享下写此⽂前的经历与感受,我所有的感觉浓缩到⼀个字,那就是:"坑",如果是两个字那就是"巨坑"=>因为这个需求⼀开始并不是这样⼦的,且听我漫漫道来: ⼀开始客户与我们商量的是将office和PDF上传,将此类⽂件解析成html格式,在APP端调⽤内置server直接以html"播放" 经历⼀个⽉~,两个⽉~,三个⽉~~~ 到需求开发阶段,发现这是个坑。
:按照需规的意思这个整体是当做⼀个功能来做的,技术难度也就算了,⽽且按照估算的⼯时也很难做成需规所需要的样⼦(缺陷太多!) 然后⼀周~,⼀周~,⼜⼀周~~~ 各种⽅案下来将需求做成能⽤的样⼦,然后需求确认时客户说:“我们没有要求你们能解析这些⽂档,我们只要求你们当做⼀个源⽂件上传,在APP端点击直接能选择调⽤第三⽅应⽤打开就⾏了,⽽且⼀开始我们的需求就是这样的。
” /**听完,顿时泪流满⾯( _ ),如果业务⼀开始就确认这样做,何⾄于浪费如此多的时间,花费如此多的精⼒绕⽼⼤⼀圈。
*/ 需求绕了⼀圈⼜绕回来了,作为经历过的⼈,现在总结下这需求⾥⾯⽆尽的坑: A>开源社区有很多Demo,这些Demo有很多缺陷,⽐如office⾥⾯的艺术字、图⽚、公式、颜⾊样式、视频和⾳频不能解析 B>能解析的对象,解析出来的效果不是很好,⽐如word和ppt⾃⾝的排版乱了,excel单元格⾥⾯的⾃定义格式全变成数字了~等等 C>开源社区的资料并不是很全,导致的结果是不同的⽂档类型需要⽤不同的解析⽅式去解析,⽐如word⽤docx4j解析、excel⽤poi解析带来的代码量巨⼤ D>由于代码⾃⾝的解析效果不是很好,更改后的⽅案需要在上传之前将源⽂件处理成其他的形式,如pdf需要切成图⽚,ppt需要转换成视频或是图⽚,这样⼀来需求实现的⽅式就变成半⾃动了╥﹏╥... E>word⽤docx4j解析⼀个很⼤的问题是解析的效率太低了,5MB以上的⽂件或者内容⽐较复杂的word⽂档解析⼗分耗时,解析效率太低,再⼀就是poi解析数据量⽐较⼤的Exel(⽐如>1000⾏)容易造成内存溢出,不好控制 F>⼯时太短,只有15天。
[原创]java向word模板中填充数据(总结)
[原创]java向word模板中填充数据(总结) 使⽤过PageOffice动态⽣成word⽂档的⼈都知道,PageOffice可以给word⽂档的指定位置进⾏填充,这⾥我们所说的指定位置在PageOffice的专业术语⾥⾯有两个概念,⼀个叫做数据区域(DataRegion),另⼀个叫做数据标签(DataTag)。
⼀、概念 数据区域:是Word⽂档中具有 "PO_" 前缀命名的书签所定位的⽂档区域。
简单来说,数据区域就是⼀种特殊的Word书签对象,便于定位Word⽂档中的内容。
数据标签:是任意的有效字符组成的特殊样式的字符串(如“【时间】”、“{姓名}”、“${name}”等等)作为标记,理论上这样的字符串(⽐如:“性别”、“地址”、“aa”、“bbcc”)也可以当做数据标签,但是不推荐使⽤,因为这样的标签不能从视觉上直观的看出word⽂档中包含了哪些数据标签。
⼆、使⽤ 数据区域⾥⾯可以填充些的内容:⽂本、图⽚、Word⽂件、Excel⽂件。
WordDocument doc = new WordDocument();//填充⽂本DataRegion dataRegion1 = doc.openDataRegion("PO_userName");dataRegion1.setValue("张三");//还可以给填充的⽂本设置字体,颜⾊,粗体等样式dataRegion1.getFont().setColor(Color.blue);dataRegion1.getFont().setSize(24);dataRegion1.getFont().setName("⾪书");dataRegion1.getFont().setBold(true);//填充图⽚doc.openDataRegion("PO_deptName").setValue("[image]img/123.jpg[/image]");//填充word⽂件doc.openDataRegion("PO_deptName").setValue("[word]doc/aabb.doc[/word]");//填充excel⽂件doc.openDataRegion("PO_deptName").setValue("[excel]doc/bbcc.xls[/excel]"); 数据标签中可以填充的内容:⽂本。
Java在Word中创建邮件合并模板并合并文本和图片的操作方法
Java在Word中创建邮件合并模板并合并⽂本和图⽚的操作⽅法Word⾥⾯的邮件合并功能是⼀种可以快速批量操作同类型数据的⽅式,常见的如数据填充、打印等。
其中必不可少的步骤包括⽤于填充的模板⽂档、填充的数据源以及实现邮件合并的功能。
下⾯,通过Java程序展⽰如何来实现创建模板,并通过邮件合并功能来合并⽂本数据和图⽚数据的⽅法,分别以2个⽰例来展⽰,即:1. 创建Word填充模板2. 邮件合并⽂本和图⽚本次程序运⾏环境如下:代码编译⼯具:IDEAJdk版本:1.8.0Word测试⽂档:.docx 2013Word jar包⼯具:Free Spire.Doc for Java关于jar导⼊:下载Free Spire.Doc for Java 到本地后,解压。
然后执⾏如下步骤⼿动导⼊jar到Java程序:Project Structure(Shift+Ctrl+Alt+S)打开的界⾯中选择【Modules】—【Dependencies】,点击“+”,【JARs or directories…】,选择本地路径中的jar⽂件,添加后,勾选,点击“OK”。
完成导⼊。
Java代码⽰例1. 创建Word邮件合并模板import com.spire.doc.*;import com.spire.doc.documents.Paragraph;public class CreateTemplate {public static void main(String[] args) {//创建Document实例Document document = new Document();document.loadFromFile("test.docx");//获取第⼀节Section section = document.getSections().get(0);//添加4个段落Paragraph para1 = section.addParagraph();Paragraph para2 = section.addParagraph();Paragraph para3 = section.addParagraph();Paragraph para4 = section.addParagraph();//添加合并域,包括⽂字域、图⽚域para1.setText("姓名 : ");para1.appendField("Name", FieldType.Field_Merge_Field);para2.setText("邮件地址: ");para2.appendField("Email Address", FieldType.Field_Merge_Field);para3.setText("⽇期 : ");para3.appendField("Date", FieldType.Field_Merge_Field);para4.setText("图⽚:");para4.appendField("Image:image",FieldType.Field_Merge_Field);//保存模板⽂档document.saveToFile("template.docx", FileFormat.Docx);document.dispose();}}模板效果:2. 邮件合并⽂本和图⽚数据以上⾯创建模板为例,填充⽂本数据及图⽚数据import com.spire.doc.*;import com.spire.doc.reporting.MergeImageFieldEventArgs;import com.spire.doc.reporting.MergeImageFieldEventHandler;import java.text.SimpleDateFormat;import java.util.Date;public class MailMerge {public static void main(String[] args) throws Exception{//创建Document实例,并加载邮件合并模板⽂档Document document = new Document();document.loadFromFile("template.docx");//按⽂本合并域名称,设置合并域的⽂本值Date currentTime = new Date();SimpleDateFormat formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");String dateString = formatter.format(currentTime);String[] textFieldNames = new String[]{"Name", "Email Address", "Date"};String[] textFieldValues = new String[]{"亚当斯密","**************",dateString};//合并⽂本到模板document.getMailMerge().execute(textFieldNames,textFieldValues );//按图⽚合并域名称,设置图⽚路径值String[] imageFieldNames = new String[]{"image"};String[] imageFieldValues = new String[]{"logo.jpg"};//调⽤邮件合并事件加载图⽚document.getMailMerge().MergeImageField = new MergeImageFieldEventHandler(){public void invoke(Object sender, MergeImageFieldEventArgs args){mailMerge_MergeImageField(sender, args);}};//执⾏邮件合并document.getMailMerge().execute(imageFieldNames, imageFieldValues);//保存⽂档document.saveToFile("result.docx", FileFormat.Docx);}//创建邮件合并事件⽤于加载图⽚private static void mailMerge_MergeImageField(Object sender, MergeImageFieldEventArgs field) { String filePath = (String) field.getFieldValue();if (!filePath.isEmpty()){field.setImage(filePath);}}}合并效果:到此这篇关于Java 在Word中创建邮件合并模板并合并⽂本和图⽚的⽂章就介绍到这了,更多相关java创建邮件合并模板内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
Java 添加、修改、回复、删除Word批注
Java 添加、回复、修改(替换)、删除、读取Word批注批注是一种常用于对特定文档内容进行注解的工具或方法,起到解释说明、标记指正的作用。
在本篇文章中,将介绍如何操作Word批注的方法,包括:1. 添加批注:添加文本到批注、插入图片到批注;1.1 给指定段落添加批注1.2 给指定字符串添加批注2. 回复批注;3. 修改或替换批注:用文本替换批注中的文本内容、用文本替换批注中的图片、用图片替换批注中的图片;4. 删除批注:删除指定批注中的所有内容、删除指定批注中的指定内容5. 读取批注5.1 读取批注中的文本5.2 读取批注中的图片使用工具:Free Spire.Doc for Java (免费版)Jar文件获取及导入:方法1:通过官网获取jar包,并解压。
解压后,将lib文件夹下的Spire.Doc.jar文件导入java程序。
方法2:通过添加maven依赖导入到maven项目,参考导入步骤。
Java示例代码【示例1】给段落添加批注(文本、图片)import com.spire.doc.*;import com.spire.doc.documents.Paragraph;import ment;public class AddComment {public static void main(String[] args) {//加载测试文档Document doc = new Document("test.docx");//获取指定段落Section sec = doc.getSections().get(0);Paragraph para= sec.getParagraphs().get(3);//插入文本到批注Comment comment = para.appendComment("请在试验中将包含以下特征的实验样本记录在册,并整理好周记录报表,供后续观察取样。
documentbuilder insertimage 用法
documentbuilder insertimage 用法在DocumentBuilder中,insertImage()方法用于在Word文档中插入图片。
它的用法如下:1. 创建一个DocumentBuilder对象,可以通过Document对象的createDocumentBuilder()方法获取。
```javaDocumentBuilder builder = document.createDocumentBuilder(); ```2. 使用insertImage()方法插入图片,该方法有两个重载形式: 1) insertImage(InputStream inputStream)该方法接受一个InputStream参数,用于读取图片数据。
以下是一个示例:```javaInputStream imageStream = newFileInputStream("path/to/image.jpg");builder.insertImage(imageStream);```2) insertImage(File imageFile)该方法接受一个File参数,用于指定图片文件。
以下是一个示例:```javaFile imageFile = new File("path/to/image.jpg");builder.insertImage(imageFile);```3. 可选:可以通过其他方法对插入的图片进行调整,例如设置图片大小、位置等。
以下是一些常用的调整方法:```javabuilder.setAutoFit(ImageAutoFit.CONTROL);builder.setWidth(400);builder.setHeight(300);builder.setWrapType(WrapType.INLINE);```4. 最后,通过Document对象的save()方法保存文档。
Java利用poi对word插入文字图片
Java利用poi对word插入文字图片文档末尾rar压缩包内,完整的Java project demo,包含所需的所有jar包,示例文件,使用说明等。
三步实现:一、package com.word.poi;import java.io.IOException;import java.io.InputStream;import org.apache.poi.openxml4j.opc.OPCPackage;import ermodel.XWPFDocument;import ermodel.XWPFParagraph;import org.apache.xmlbeans.XmlException;import org.apache.xmlbeans.XmlToken;importorg.openxmlformats.schemas.drawingml.x2006.main.CTNonVisualDrawingProps; import org.openxmlformats.schemas.drawingml.x2006.main.CTPositiveSize2D; importorg.openxmlformats.schemas.drawingml.x2006.wordprocessingDrawing.CTInline;/********************************************************* 类名:CustomXWPFDocument* 功能:XWPFDocument读写word.docx* 作者:qiucx 2017年4月12日* 修改记录:* 日期修改人修改说明********************************************************/public class CustomXWPFDocument extends XWPFDocument { public CustomXWPFDocument(InputStream in) throws IOException { super(in);}public CustomXWPFDocument() {super();}public CustomXWPFDocument(OPCPackage pkg) throws IOException { super(pkg);}/********************************************************* 函数名: createPicture* 功能 : 在word中标记的位置生成指定路径的图片* 作者 : qiucx 2017年4月12日* 参数表: @param id* 参数表: @param width 设置图片宽度* 参数表: @param height 设置图片高度* 参数表: @param paragraph 段落参数* 返回值: void* 修改记录:* 日期修改人修改说明********************************************************/public void createPicture(int id, int width, int height,XWPFParagraph paragraph) {final int EMU = 9525;width *= EMU;height *= EMU;System.out.println("getAllPictures---" + getAllPictures().size());String blipId = getAllPictures().get(id).getPackageRelationship().getId();CTInline inline = paragraph.createRun().getCTR().addNewDrawing().addNewInline();String picXml = ""+ "<a:graphicxmlns:a=\"/drawingml/2006/main\">"+ "<a:graphicData uri=\"/drawingml/2006/picture\">"+ "<pic:pic xmlns:pic=\"/drawingml/2006/picture\">"+ "<pic:nvPicPr>" + "<pic:cNvPr id=\""+ id+ "\" name=\"Generated\"/>"+ "<pic:cNvPicPr/>"+ "</pic:nvPicPr>"+ "<pic:blipFill>"+ "<a:blip r:embed=\""+ blipId+ "\" xmlns:r=\"/officeDocument/2006/relationships \"/>"+ "<a:stretch>"+ "<a:fillRect/>"+ "</a:stretch>"+ "</pic:blipFill>"+ "<pic:spPr>"+ "<a:xfrm>"+ "<a:off x=\"0\" y=\"0\"/>"+ "<a:ext cx=\""+ width+ "\" cy=\""+ height+ "\"/>"+ "</a:xfrm>"+ "<a:prstGeom prst=\"rect\">"+ "<a:avLst/>"+ "</a:prstGeom>"+ "</pic:spPr>"+ "</pic:pic>"+ "</a:graphicData>" + "</a:graphic>";inline.addNewGraphic().addNewGraphicData(); XmlToken xmlToken = null;try {xmlToken = XmlToken.Factory.parse(picXml); } catch (XmlException xe) {xe.printStackTrace();}inline.set(xmlToken);inline.setDistT(0);inline.setDistB(0);inline.setDistL(0);inline.setDistR(0);CTPositiveSize2D extent = inline.addNewExtent();extent.setCx(width);extent.setCy(height);CTNonVisualDrawingProps docPr = inline.addNewDocPr();docPr.setId(id);docPr.setName("图片" + id);docPr.setDescr("测试");}}二、package com.word.poi;import java.io.ByteArrayInputStream;import java.io.IOException;import java.io.InputStream;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Map.Entry;import org.apache.poi.POIXMLDocument;import org.apache.poi.openxml4j.opc.OPCPackage; import ermodel.XWPFParagraph; import ermodel.XWPFRun; import ermodel.XWPFT able; import ermodel.XWPFT ableCell; import ermodel.XWPFT ableRow;/******************************************************** * 类名:WordUtil* 功能:POI Word读取编辑工具类* 作者:qiucx 2017年4月12日* 修改记录:* 日期修改人修改说明********************************************************/public class WordUtil {/********************************************************* 函数名: generateWord* 功能 : 通用功能处理* 作者 : qiucx 2017年4月12日* 参数表: @param param* 参数表: @param template* 参数表: @return* 返回值: CustomXWPFDocument* 修改记录:* 日期修改人修改说明********************************************************/public static CustomXWPFDocument generateWord(Map<String, Object> param, String template) {CustomXWPFDocument doc = null;try {OPCPackage pack = POIXMLDocument.openPackage(template);doc = new CustomXWPFDocument(pack);if (param != null && param.size() > 0) {//处理段落List<XWPFParagraph> paragraphList = doc.getParagraphs();processParagraphs(paragraphList, param, doc);//处理表格Iterator<XWPFTable> it = doc.getTablesIterator();while (it.hasNext()) {XWPFT able table = it.next();List<XWPFTableRow> rows = table.getRows();for (XWPFTableRow row : rows) {List<XWPFTableCell> cells = row.getT ableCells();for (XWPFTableCell cell : cells) {List<XWPFParagraph> paragraphListT able = cell.getParagraphs();processParagraphs(paragraphListT able, param, doc);}}}}} catch (Exception e) {e.printStackTrace();}return doc;}/********************************************************* 函数名: processParagraphs* 功能 : 处理段落* 作者 : qiucx 2017年4月12日* 参数表: @param paragraphList* 参数表: @param param* 参数表: @param doc* 返回值: void* 修改记录:* 日期修改人修改说明********************************************************/public static void processParagraphs(List<XWPFParagraph> paragraphList,Map<String, Object> param,CustomXWPFDocument doc){ if(paragraphList != null && paragraphList.size() > 0){for(XWPFParagraph paragraph:paragraphList){List<XWPFRun> runs = paragraph.getRuns();for (XWPFRun run : runs) {String text = run.getText(0);if(text != null){boolean isSetText = false;for (Entry<String, Object> entry : param.entrySet()) {String key = entry.getKey();if(text.indexOf(key) != -1){isSetText = true;Object value = entry.getValue();if (value instanceof String) {//文本替换text = text.replace(key, value.toString());} else if (value instanceof Map) {//图片替换text = text.replace(key, "");Map pic = (Map)value;int width = Integer.parseInt(pic.get("width").toString());int height = Integer.parseInt(pic.get("height").toString());int picType = getPictureType(pic.get("type").toString());byte[] byteArray = (byte[]) pic.get("content");ByteArrayInputStream byteInputStream = new ByteArrayInputStream(byteArray);try {int ind = doc.addPicture(byteInputStream,picType);System.out.println(ind+"------------");doc.createPicture(ind, width , height,paragraph);} catch (Exception e) {e.printStackTrace();}}}}if(isSetText){run.setText(text,0);}}}}}}/********************************************************* 函数名: getPictureType* 功能 : 根据图片类型,取得对应的图片类型代码* 作者 : qiucx 2017年4月12日* 参数表: @param picType* 参数表: @return* 返回值: int* 修改记录:* 日期修改人修改说明********************************************************/ private static int getPictureType(String picType){int res = CustomXWPFDocument.PICTURE_TYPE_PICT;if(picType != null){if(picType.equalsIgnoreCase("png")){res = CustomXWPFDocument.PICTURE_TYPE_PNG;}else if(picType.equalsIgnoreCase("dib")){res = CustomXWPFDocument.PICTURE_TYPE_DIB;}else if(picType.equalsIgnoreCase("emf")){res = CustomXWPFDocument.PICTURE_TYPE_EMF;}else if(picType.equalsIgnoreCase("jpg") || picType.equalsIgnoreCase("jpeg")){res = CustomXWPFDocument.PICTURE_TYPE_JPEG;}else if(picType.equalsIgnoreCase("wmf")){res = CustomXWPFDocument.PICTURE_TYPE_WMF;}}return res;}/********************************************************* 函数名: inputStream2ByteArray* 功能 : 将输入流中的数据写入字节数组* 作者 : qiucx 2017年4月12日* 参数表: @param in* 参数表: @param isClose* 参数表: @return* 返回值: byte[]* 修改记录:* 日期修改人修改说明********************************************************/public static byte[] inputStream2ByteArray(InputStream in,boolean isClose){ byte[] byteArray = null;try {int total = in.available();byteArray = new byte[total];in.read(byteArray);} catch (IOException e) {e.printStackTrace();}finally{if(isClose){try {in.close();} catch (Exception e2) {System.out.println("关闭流失败");}}}return byteArray;}}三、package com.word.poi;import java.io.FileInputStream;import java.io.FileOutputStream;import java.util.Date;import java.util.HashMap;import java.util.Map;/********************************************************* 类名:Test* 功能:测试类指定一些标记的参数,图片路径,文件模板位置,文件输出位置* 作者:qiucx 2017年4月12日* 修改记录:* 日期修改人修改说明********************************************************/public class Test {//指定一些标记的参数,图片路径,文件模板位置,文件输出位置public static void main(String[] args) throws Exception {//文字标记Map<String, Object> param = new HashMap<String, Object>();param.put("${name}", "qiucx");param.put("${zhuanye}", "计算机科学与技术");param.put("${sex}", "男");param.put("${school_name}", "福建农林大学");param.put("${date}", new Date().toString());//图片标记,路径,宽高Map<String,Object> header = new HashMap<String, Object>();header.put("width", 150);header.put("height", 150);header.put("type", "jpg");header.put("content", WordUtil.inputStream2ByteArray(new FileInputStream("D:\\icon\\smile.jpg"), true));param.put("${header}",header);//原文件CustomXWPFDocument doc = WordUtil.generateWord(param, "D:\\icon\\tess.docx");//输出文件FileOutputStream fopts = new FileOutputStream("D:\\icon\\tess2.docx");doc.write(fopts);fopts.close();}}原文件模板样式:输出文件示例:附件:poi_word_demo.rar。
java读写word文档 完美解决方案
java读写word文档完美解决方案Java读写Word文档:完美解决方案Word文档是一种广泛使用的文件格式,用于创建和编辑文本文档。
在Java编程中,读写Word文档是一个常见的需求。
本文将介绍一种完美解决方案,帮助您在Java中实现对Word文档的读写操作。
一、引入依赖要在Java中读写Word文档,我们需要使用Apache POI库。
Apache POI是一个Java类库,可用于读取和编写Microsoft Office文件格式,包括Word文档。
在您的Java项目中,您需要将以下依赖项添加到您的构建文件中,以便使用Apache POI库:```java<dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>4.1.2</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>4.1.2</version></dependency>```二、读取Word文档要读取一个Word文档,您可以使用Apache POI提供的XWPFDocument类。
以下是一个简单的示例代码,演示如何使用XWPFDocument读取Word文档:```javaimport ermodel.XWPFDocument;import org.apache.poi.xwpf.extractor.XWPFWordExtractor;import java.io.FileInputStream;import java.io.IOException;public class ReadWordDocument {public static void main(String[] args) {try {FileInputStream fis = newFileInputStream("path/to/your/word/document.docx");XWPFDocument document = new XWPFDocument(fis);XWPFWordExtractor extractor = new XWPFWordExtractor(document);String content = extractor.getText();System.out.println(content);fis.close();} catch (IOException e) {e.printStackTrace();}}}```在上面的代码中,您需要将"path/to/your/word/document.docx"替换为您实际的Word文档路径。
Java 添加、删除Word水印
Java 添加、删除Word水印水印是一种常用于各种文档的声明、防伪手段,一般可设置文字水印或者加载图片作为水印。
以下内容将分享通过Java编程给Word文档添加水印效果的方法,以及如何将Word文档中已有的水印效果删除。
使用工具:Free Spire.Doc for Java 2.0.0(免费版)Jar导入:方法1:通过官网下载控件包。
在程序下新建一个directory目录,并命名(本示例中命名为lib);将控件包lib文件夹下的jar(如下图1)复制到程序中新建的目录下。
复制jar文件后,鼠标右键点击jar文件,选择”A dd as Library”。
完成导入(如下图2)。
图1:图2:方法2:通过maven导入。
参考导入方法。
Java代码示例(供参考)【示例1】添加文本水印import com.spire.doc.*;import com.spire.doc.documents.WatermarkLayout; import java.awt.*;public class Main {public static void main(String[] args) { //加载测试文档Document document = new Document();document.loadFromFile("sample.docx");//插入水印InsertTextWatermark(document.getSections().get(0));//保存文档document.saveToFile("textwatermark.docx",FileFormat.Docx ); }//自定义方法用于指定文本水印字样及格式化操作private static void InsertTextWatermark(Section section){TextWatermark txtWatermark = new TextWatermark();txtWatermark.setText("内部使用");txtWatermark.setFontSize(40);txtWatermark.setColor(Color.red);txtWatermark.setLayout(WatermarkLayout.Diagonal);section.getDocument().setWatermark(txtWatermark);}文本水印效果:【示例2】添加图片水印import com.spire.doc.*;public class Main {public static void main(String[] args) {//加载测试文档Document document = new Document();document.loadFromFile("sample.docx");//加载图片设置为水印PictureWatermark picture = new PictureWatermark();picture.setPicture("wx.png");picture.setScaling(5);picture.isWashout(false);document.setWatermark(picture);//保存文档document.saveToFile("imagewatermark.docx",FileFormat.Docx ); }}图片水印效果:【示例3】删除Word水印import com.spire.doc.*;public class DeleteWatermark {public static void main(String[] args){//加载含有水印的Word文档Document doc = new Document("test.docx");//调用方法setWatermark()设置为null,去掉水印效果doc.setWatermark(null);//保存文档doc.saveToFile("result.docx",FileFormat.Docx_2010); }}运行程序后,水印效果将被删除。
Java利用poi生成word(包含插入图片,动态表格,行合并)
//图片,如果是多个图片,就新建多个map Map<String,Object> picture1 = new HashMap<String, Object>(); picture1.put("width", 100); picture1.put("height", 150); picture1.put("type", "jpg"); picture1.put("content", WorderToNewWordUtils.inputStream2ByteArray(new FileInputStream("D:/docTest/p1.jpg"), true)); data.put("${picture1}",picture1);
data.put("${address}", "华东院"); /* data.put("${communityvalue}", ""); data.put("${safetycode}", "华东院"); data.put("${picture2}", ""); data.put("${picture3}", "");*/ data.put("${buildingvalue2}", "华东院"); /* data.put("${patrolPhoto1}", ""); data.put("${patrolPhoto2}", ""); data.put("${buildingvalue3}", "中国");*/
Java 添加、删除Word图片以及设置Word图片格式
Java 添加、删除、格式化Word中的图片本文介绍使用Spire.Cloud.SDK for Java提供的ImagesApi接口来操作Word中的图片。
具体可通过addImage()方法添加图片、deleteImage()方法删除图片、updateImageFormat()格式化Word中的图片以及getImageFormat()获取Word中的图片格式等。
操作方法和代码示例可参考下文中的步骤。
步骤1:导入jar文件创建Maven项目程序,通过maven仓库下载导入。
以IDEA为例,新建Maven项目,在pom.xml文件中配置maven仓库路径,并指定spire.cloud.sdk的依赖,如下:<repositories><repository><id>com.e-iceblue</id><name>cloud</name><url>/repository/maven-public/</url></repository></repositories><dependencies><dependency><groupId> cloud </groupId><artifactId>spire.cloud.sdk</artifactId><version>3.5.0</version></dependency><dependency><groupId> com.google.code.gson</groupId><artifactId>gson</artifactId><version>2.8.1</version></dependency><dependency><groupId> com.squareup.okhttp</groupId><artifactId>logging-interceptor</artifactId><version>2.7.5</version></dependency><dependency><groupId> com.squareup.okhttp </groupId><artifactId>okhttp</artifactId><version>2.7.5</version></dependency><dependency><groupId> com.squareup.okio </groupId><artifactId>okio</artifactId><version>1.6.0</version></dependency><dependency><groupId> io.gsonfire</groupId><artifactId>gson-fire</artifactId><version>1.8.0</version></dependency><dependency><groupId>io.swagger</groupId><artifactId>swagger-annotations</artifactId><version>1.5.18</version></dependency><dependency><groupId> org.threeten </groupId><artifactId>threetenbp</artifactId><version>1.3.5</version></dependency></dependencies>完成配置后,点击“Import Changes” 即可导入所有需要的jar文件。
Java将数据写入word文档(.doc)
Java将数据写⼊word⽂档(.doc)Java可⽤org.apache.poi包来操作word⽂档。
org.apache.poi包可于上下载,解压后各jar作⽤如下图所⽰:可根据需求导⼊对应的jar。
⼀、HWPFDocument类的使⽤⽤HWPFDocument类将数据写到指定的word⽂档中,基本思路是这样的:- ⾸先,建⽴⼀个HWPFDocument类的实例,关联到⼀个临时的word⽂档;- 然后,通过Range类实例,将数据写⼊这个word⽂档中;- 接着,将这个临时的word⽂档通过write函数写⼊指定的word⽂档中。
- 最后,关闭所有资源。
下⾯详细说明各个步骤。
1.构造函数这⾥要说明⼀下,经过试验,暂时还没找到直接在程序中新建⼀个word⽂档并读取的⽅法,只能先创建好temp.doc,然后在程序中读取。
(⽤File-createNewFile和POIFSFileSystem.create创建出来的.doc⽂件,都不能被正确读取)另外,其实选择哪种参数传⼊都是⼀样的,毕竟HWPFDocument关联的word⽂档是⽆法写⼊的,只是当作⼀个临时⽂件。
所以,选择最为熟悉的InputStream较为合适。
参数1:InputStream。
可将word⽂档⽤FileInputStream流读取,然后传⼊HWPFDocument类。
主要⽤于读取word⽂档中的数据。
参数2:POIFSFileSystem。
POIFSFileSystem的构造函数参数可以是(File,boolean)【这样的话file必须是已经存在的】,后者为false时可读写。
这⾥可以写为HWPFDocument doc = new HWPFDocument(new POIFSFileSystem(new File("temp.doc"),false));2.Range类(1)获取Range类实例。
HWPFDocument类中有⼀系列获取Range类实例以操作word⽂档的⽅法。
Java Word中的文本、图片替换功能
Java Word中的文本、图片替换功能Word中的替换功能以查找指定文本然后替换为新的文本,可单个替换或全部替换。
以下将要介绍的内容,除常见的以文本替换文本外,还将介绍不同对象间相互替换的方法,具体可包括:1. 指定字符串内容替换文本(通过方法replce(matchString, newValue, caseSensitive, wholeWord );直接指定替换的新字符串内容)2. 获取文档内容替换文本(通过方法replace(String matchString, TextSelection textSelection, boolean caseSensitive, boolean wholeWord);替换指定文本)3. 图片替换文本4. 图片替换图片需要使用Free Spire.Doc for Java的jar包,可手动下载并解压导入Spire.Doc.jar文件到Java 程序,也可以通过maven仓库下载导入。
【示例1】指定字符串内容替换文本import com.spire.doc.*;public class ReplaceTextWithText {public static void main(String[] args) {//加载文档Document doc = new Document();doc.loadFromFile("test.docx");//要替换第一个出现的指定文本,只需在替换前调用setReplaceFirst方法来指定只替换第一个出现的指定文本//doc.setReplaceFirst(true);//调用方法用新文本替换原文本内容doc.replace("系统测试", "System Testing", false, true);//保存文档doc.saveToFile("ReplaceAllText.docx",FileFormat.Docx_2013);doc.dispose();}}【示例2】获取文档内容替换文本import com.spire.doc.*;import com.spire.doc.documents.TextSelection;public class ReplaceTextWithDocument {public static void main(String[] args) {//加载文档1Document doc1 = new Document();doc1.loadFromFile("test.docx");//加载文档2Document doc2 = new Document();doc2.loadFromFile("TargetFile.docx");//查找文档2中的指定内容TextSelection textSelection = doc2.findString("Falling under the scope of black box testing, " +"system testing is a phase in the software " +"testing cycle where a total and integrated" +" application /system is tested.",false,false);//用文档2中查找到的内容替换文档1中的指定字符串doc1.replace("System Test, ST",textSelection,false,true);//保存文档1doc1.saveToFile("ReplaceTextWithDocument.docx",FileFormat.Docx_2013);doc1.dispose();}}两个用于测试的文档如下,将文档2中的文本内容替换文档1中的指定文本内容:替换结果:【示例3】图片替换文本import com.spire.doc.*;import com.spire.doc.documents.TextSelection;import com.spire.doc.fields.DocPicture;import com.spire.doc.fields.TextRange;public class ReplaceTextWithImg {public static void main(String[] args) {//加载文档Document doc = new Document("test.docx");//查找需要替换的字符串TextSelection[] textSelection = doc.findAllString("系统测试",true,false);int index ;//加载图片替换文本字符串for (Object obj : textSelection) {TextSelection Selection = (TextSelection)obj;DocPicture pic = new DocPicture(doc);pic.loadImage("tp.png");TextRange range = Selection.getAsOneRange();index = range.getOwnerParagraph().getChildObjects().indexOf(range); range.getOwnerParagraph().getChildObjects().insert(index,pic);range.getOwnerParagraph().getChildObjects().remove(range);}//保存文档doc.saveToFile("ReplaceTextWithImage.docx", FileFormat.Docx_2013);doc.dispose();}}【示例4】图片替换图片import com.spire.doc.*;import com.spire.doc.documents.Paragraph;import com.spire.doc.fields.DocPicture;public class ReplacePictureWithPicture {public static void main(String[] args) {//加载Word文档Document doc = new Document();doc.loadFromFile("sample.docx");//获取文档中的指定段落Section section = doc.getSections().get(0);Paragraph para = section.getParagraphs().get(0);//替换段落中的第一张图片Object obj = para.getChildObjects().get(0);if(obj instanceof DocPicture){DocPicture pic = (DocPicture)obj;pic.loadImage("tp.png");}/*//批量替换图片for(int i =0;i < section.getParagraphs().getCount();i++){Object obj = section.getParagraphs().get(i).getChildObjects(); if(obj instanceof DocPicture){DocPicture pic = (DocPicture)obj;pic.loadImage("tp.png");}}*///保存结果文档doc.saveToFile("ReplaceWithImage.docx", FileFormat.Docx_2013);doc.dispose();}}(完)。
java实现图片合成,并添加文字
java实现图⽚合成,并添加⽂字最近公司⼀个需要,需要把商品的优惠卷分享链接,⽣成⼀个⼆维码然后和商品主图合成⼀张,并且在新合成的主图增加商品信息的描述,好了直接看合成后图⽚的样式下⾯我就直接贴代码,⾸先是Contorller层/*** 淘宝⼆维码,商品主图,合成⼀张图** @param pictUrl* @param request* @param response* @throws IOException*/@RequestMapping("/getTaoBaoqQRCode")public void getTaoBaoqQRCode(TaoBaoQRCode taoBaoQRCode, HttpServletRequest request,HttpServletResponse response) throws IOException {ServletOutputStream os = null;InputStream buffin = null;try {// ⼆维码String couponUlr = "https:" + taoBaoQRCode.getCouponShareUrl();// ⾼额卷分享链接byte[] imgByte = QrCodeUtil.createQrCode2Bytes(250, 250, couponUlr);buffin = new ByteArrayInputStream(imgByte);BufferedImage couponImage = ImageIO.read(buffin);// 商品主图String imageUrl = "https:" + taoBaoQRCode.getPictUrl();URL url = new URL(imageUrl);BufferedImage picImage = ImageIO.read(url);BufferedImage modifyImage =imageHandleUtil.mergeImage(picImage, couponImage, taoBaoQRCode.getTitle(),taoBaoQRCode.getReservePrice(), taoBaoQRCode.getZkFinalPrice());response.setContentType("image/jpg");os = response.getOutputStream();ImageIO.write(modifyImage, "jpg", os);os.flush();} catch (Exception e) {LOGGER.error("getTaoBaoqQRCode error");e.printStackTrace();} finally {buffin.close();os.close();}}⼆维码QrCodeUtil ⽣成帮助类public class QrCodeUtil {private static final int DAFAULT_WIDTH = 360;private static final int DAFAULT_HEIGHT = 360;private static final Logger LOGGER = LoggerFactory.getLogger(QrCodeUtil.class);public static String createQrCode(String text) {return createQrCode(DAFAULT_WIDTH, DAFAULT_HEIGHT, text);}public static String createQrCode(int widht, int height, String text) {HashMap<EncodeHintType, String> hints = new HashMap<EncodeHintType, String>();hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");try {byte[] bytes = createQrCode2Bytes(widht, height, text);String fileName = UUID.randomUUID().toString().replaceAll("-", "") + ".png";return UpYunClient.upload(fileName, bytes);} catch (Exception e) {LOGGER.error("create qrcode error", e);}return null;}public static byte[] createQrCode2Bytes(String text) {return createQrCode2Bytes(DAFAULT_WIDTH, DAFAULT_HEIGHT, text);}public static byte[] createQrCode2Bytes(int widht, int height, String text) {HashMap<EncodeHintType, String> hints = new HashMap<EncodeHintType, String>(); hints.put(EncodeHintType.CHARACTER_SET, "UTF-8");try {BitMatrix bitMatrix =new MultiFormatWriter().encode(text, BarcodeFormat.QR_CODE, widht, height,hints);ByteArrayOutputStream out = new ByteArrayOutputStream();BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);ImageIO.write(image, "png", out);return out.toByteArray();} catch (Exception e) {LOGGER.error("create qrcode error", e);}return null;}/*** ⽣成条形码并已字节码形式返回,⽣成的图⽚格式为png** @param contents* @param width* @param height* @return*/public static byte[] createBarcode2Byte(String contents, int width, int height) {int codeWidth = 3 + // start guard(7 * 6) + // left bars5 + // middle guard(7 * 6) + // right bars3; // end guardcodeWidth = Math.max(codeWidth, width);try {BitMatrix bitMatrix =new MultiFormatWriter().encode(contents, BarcodeFormat.CODE_128, codeWidth, height, null);BufferedImage image = MatrixToImageWriter.toBufferedImage(bitMatrix);ByteArrayOutputStream out = new ByteArrayOutputStream();ImageIO.write(image, "png", out);return out.toByteArray();} catch (Exception e) {e.printStackTrace();}return null;}}⼆维码⽣成我这⾥⽤的是⾕歌的看下⾯maven pom.xml ⽂件<!-- 条形码、⼆维码⽣成 --><dependency><groupId>com.google.zxing</groupId><artifactId>core</artifactId><version>2.2</version></dependency><dependency><groupId>com.google.zxing</groupId><artifactId>javase</artifactId><version>2.2</version></dependency>合成图⽚⽅法如何package mon.util;import java.awt.Color;import java.awt.Font;import java.awt.Graphics2D;import java.awt.RenderingHints;import java.awt.image.BufferedImage;import java.io.File;import java.io.IOException;import .URL;import javax.imageio.ImageIO;import ponent;@Componentpublic class ImageHandleUtil {private Font font = null;private Graphics2D g = null;/*** 导⼊本地图⽚到缓冲区** @param imgName* @return*/public BufferedImage loadImageLocal(String imgName) {try {return ImageIO.read(new File(imgName));} catch (IOException e) {e.printStackTrace();}return null;}/*** 导⼊⽹络图⽚到缓冲区** @param imgName* @return*/public BufferedImage loadImageUrl(String imgName) {try {URL url = new URL(imgName);return ImageIO.read(url);} catch (IOException e) {e.printStackTrace();}return null;}/*** ⽣成新图⽚到本地** @param newImage* @param img*/public void writeImageLocal(String newImage, BufferedImage img) {if (newImage != null && img != null) {try {// ⽬录不存在则创建String dirUrl = newImage.substring(0, stIndexOf(File.separator)); File dir = new File(dirUrl);if (!dir.exists()) {dir.mkdirs();}File outputfile = new File(newImage);ImageIO.write(img, "png", outputfile);} catch (IOException e) {e.printStackTrace();}}}/*** 设定⽂字的字体等** @param fontStyle* @param fontSize*/public void setFont(String name, int style, int fontSize) {this.font = new Font(name, style, fontSize);}/*** 修改图⽚,返回修改后的图⽚缓冲区(只输出⼀⾏⽂本),图⽚居中显⽰** @param img* @param content* @param y* @param color* @return*/public BufferedImage modifyImage(BufferedImage img, Object content, int y, Color color) {try {g = img.createGraphics();g.setBackground(Color.WHITE);g.setColor(color);// 设置字体颜⾊g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 if (this.font != null)g.setFont(this.font);int width = img.getWidth();// 图⽚宽度if (content != null) {String str = content.toString();int strWidth = g.getFontMetrics().stringWidth(str);// 字体宽度g.drawString(str, (width - strWidth) / 2, y);}g.dispose();} catch (Exception e) {e.printStackTrace();}return img;}public BufferedImage modifyImage(BufferedImage img, Object content, int x, int y, Color color) {try {g = img.createGraphics();g.setBackground(Color.WHITE);g.setColor(color);// 设置字体颜⾊g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);// 抗锯齿 if (this.font != null)g.setFont(this.font);if (content != null) {String str = content.toString();g.drawString(str, x, y);}g.dispose();} catch (Exception e) {e.printStackTrace();}return img;}/*** 将⼀张图⽚画在另⼀张图⽚上** @param addImage 被添加的图⽚* @param sourceImg 源图* @param x* @param y* @param width* @param height* @return*/public BufferedImage modifyImagetogeter(BufferedImage addImage, BufferedImage sourceImg, int x,int y) {int width = addImage.getWidth();int height = addImage.getHeight();try {g = sourceImg.createGraphics();g.drawImage(addImage, x, y, width, height, null);g.dispose();} catch (Exception e) {e.printStackTrace();}return sourceImg;}/**** @param img1* @param img2* @param title 标题* @param reservePrice 现价* @param zkFinalPrice 折扣价* @return BufferedImage* @throws IOException*/public BufferedImage mergeImage(BufferedImage img1, BufferedImage img2,String title,String reservePrice,String zkFinalPrice)throws IOException {Font font = new Font("微软雅⿊", Font.BOLD, 20);int w1 = img1.getWidth();int h1 = img1.getHeight();int w2 = img2.getWidth();int h2 = img2.getHeight();BufferedImage newImage = new BufferedImage(w1, h2 + h1 + h2/2, BufferedImage.TYPE_INT_RGB);// 新的图Graphics2D graphics = (Graphics2D) newImage.getGraphics();graphics.setBackground(Color.WHITE);graphics.fillRect(0, 0, newImage.getWidth(), newImage.getHeight());graphics.drawImage(img1, 0, 0, null);graphics.drawImage(img2, (newImage.getWidth()) / 2 - (w2 / 2), newImage.getHeight() - h2,null);graphics.setFont(font);graphics.setColor(Color.BLACK);int width = graphics.getFontMetrics(font).stringWidth(title);int startY = h1 + 30;if (width > newImage.getWidth()) {char[] array = title.toCharArray();StringBuilder sb = new StringBuilder(array[0]);for (char c : array) {sb.append(c);int newWidth = graphics.getFontMetrics(font).stringWidth(sb.toString());if ((newWidth + 19) >= newImage.getWidth()) {// 准备换⾏graphics.drawString(sb.toString(), 0, startY);startY += 30;sb.delete(0, sb.length());}}graphics.drawString(sb.toString(), 0, startY);} else {graphics.drawString(title, 0, startY);}graphics.drawString("现价¥"+reservePrice, 0, startY + 30);startY += 30;graphics.drawString("卷后价¥"+zkFinalPrice, 0, startY + 30);return newImage;}}两个帮助类⾥⾯有很多⽅法没⽤到,⼤家只要看⼏个关键的⽅法就可以了,TaoBaoQRCode 对象⾥⾯的属性我就没列出来了,⼤家⾃⼰根据⾃⼰的需求⽽定以上就是java 实现图⽚合成,并添加⽂字的详细内容,更多关于Java 图⽚合成的资料请关注其它相关⽂章!。
Java替换word文档文字并指定位置插入图片
Java替换word⽂档⽂字并指定位置插⼊图⽚先说下需要的依赖包<dependency><groupId>org.apache.poi</groupId><artifactId>poi-excelant</artifactId><version>3.12</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-scratchpad</artifactId><version>3.12</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml</artifactId><version>3.8</version></dependency><dependency><groupId>org.apache.poi</groupId><artifactId>poi-ooxml-schemas</artifactId><version>3.8</version></dependency><!-- ⽣成图⽚--><dependency><groupId>org.jfree</groupId><artifactId>jfreechart</artifactId><version>1.0.19</version></dependency><dependency><!--⽀持插⼊图⽚--><groupId>org.docx4j</groupId><artifactId>docx4j</artifactId><version>3.3.1</version></dependency>⽰例,下图如上图,需要替换的字符串地⽅“$1”为“1231”,在指定位置插⼊书签,并命名“test” ,插⼊的图⽚如下本⼈也没太过多去研究,亲测通过有效,在这分享下1.demoimport java.awt.Font;import java.io.File;import java.io.FileInputStream;import java.io.FileOutputStream;import java.io.IOException;import java.io.InputStream;import java.math.BigInteger;import java.text.DecimalFormat;import java.text.NumberFormat;import java.util.Iterator;import java.util.List;import java.util.Map;import java.util.Set;import org.apache.poi.POIXMLDocument;import org.apache.poi.openxml4j.opc.OPCPackage;import org.apache.poi.util.IOUtils;import ermodel.XWPFDocument;import ermodel.XWPFParagraph;import ermodel.XWPFRun;import org.docx4j.TraversalUtil;import org.docx4j.dml.wordprocessingDrawing.Inline;import org.docx4j.finders.RangeFinder;import org.docx4j.openpackaging.packages.WordprocessingMLPackage;import org.docx4j.openpackaging.parts.WordprocessingML.BinaryPartAbstractImage;import org.docx4j.openpackaging.parts.WordprocessingML.MainDocumentPart;import org.docx4j.wml.Body;import org.docx4j.wml.BooleanDefaultTrue;import org.docx4j.wml.CTBookmark;import org.docx4j.wml.Color;import org.docx4j.wml.Document;import org.docx4j.wml.Drawing;import org.docx4j.wml.HpsMeasure;import org.docx4j.wml.ObjectFactory;import org.docx4j.wml.P;import org.docx4j.wml.R;import org.docx4j.wml.RPr;import org.jfree.chart.ChartFactory;import org.jfree.chart.ChartUtilities;import org.jfree.chart.JFreeChart;import bels.StandardPieSectionLabelGenerator;import org.jfree.chart.plot.PiePlot;import org.jfree.chart.title.TextTitle;import org.jfree.data.general.DefaultPieDataset;import mon.constant.ERRORConstants; import mon.exception.SysException;import com.aisino.qysds.service.IExportBgService;import mon.collect.Maps;public class ExportBgServiceImpl {public static void main(String[] args) throws Exception {Map<String, String> map = Maps.newHashMap();map.put("$1", "1231");XWPFDocument document = new XWPFDocument(POIXMLDocument.openPackage("D:\\tp\\test.docx")); Iterator<XWPFParagraph> itPara = document.getParagraphsIterator();while (itPara.hasNext()) {XWPFParagraph paragraph = (XWPFParagraph) itPara.next();List<XWPFRun> runs = paragraph.getRuns();for (int i = 0; i < runs.size(); i++) {String oneparaString = runs.get(i).getText(runs.get(i).getTextPosition());for (Map.Entry<String, String> entry : map.entrySet()) {if (oneparaString.equals(entry.getKey())) {oneparaString = oneparaString.replace(entry.getKey(), entry.getValue());}}runs.get(i).setText(oneparaString, 0);}}FileOutputStream outStream = null;outStream = new FileOutputStream("D:\\tp\\test1.docx");document.write(outStream);outStream.close();//-----------------------------------这块为⽣成图⽚和插⼊图⽚DefaultPieDataset dataset = new DefaultPieDataset();dataset.setValue("修改类", 1);dataset.setValue("提⽰类", 1);dataset.setValue("校验不通过", 3);dataset.setValue("正常类", 3);JFreeChart chart = ChartFactory.createPieChart3D(null, dataset, true, false, false);chart.getLegend().setItemFont(new Font("⿊体", Font.BOLD, 15)); // 设置图例类别字体// TextTitle title = new TextTitle(titleString);// title.setFont(new Font("⿊体", Font.ITALIC, 20));//设置标题字体// chart.setTitle(title);PiePlot piePlot = (PiePlot) chart.getPlot();DecimalFormat df = new DecimalFormat("0.00%");NumberFormat nf = NumberFormat.getInstance();StandardPieSectionLabelGenerator generator = new StandardPieSectionLabelGenerator("{0} {2}", nf, df);// 获得StandardPieSectionLabelGenerator对象,⽣成的格式, // {0}表⽰section名,{1}表⽰section的值,{2}表⽰百分⽐。
通过Java往word中写入内容
1、向wor d中写入内容首先在word中设置书签,如书签名为book mark,javas cript中可以这样写va rword;wor d=new Activ eXObj ect("Word.Appli catio n");varra nge=w ord.R ange;word.Visi ble=t rue;varpa th="f ilepa th";word.Docum ents.Open(path);ran ge=wo rd.Ac tiveD ocume nt.Bo okmar ks("b ookma rk").Range;ran ge.In sertB efore("哈哈哈哈哈哈");庸-人发表于2010-07-0612:48:38Zm j一起聊2、把wo rd文件转成html文件<scrip tlang uage=javas cript>fun ction savew ord(){var oWord App=n ewAct iveXO bject("Wor d.App licat ion");var oDocu ment=oWord App.D ocume nts.O pen("C:\\d oc2ht ml\\x.doc");oD ocume nt.Sa veAs("C:\\test.htm",8)oW ordAp p.Qui t();}</s cript></H EAD><BODY>Cli ckthe"save"butt ontos aveth efile"C:\t est.d oc"to"C:\t est.h tm":<inpu ttype=butt ononc lick="save word()"val ue=sa ve></BOD Y></HTML>庸-人发表于2010-07-06 12:53:09Zmj一起聊拷贝tabl e1内的内容到wor d<s cript langu age="javas cript">fu nctio nOpen Word(){//导出wordLaye r1.st yle.b order=0;E xcelS heet=newAc tiveX Objec t('Wo rd.Ap plica tion');Ex celSh eet.A pplic ation.Visi ble=t rue;varmy doc=E xcelS heet.Docum ents.Add('',0,0);my Range=mydo c.Ran ge(0,1);m yRang e=myd oc.Ra nge(m yRang e.End-1,my Range.End);//设定起始点v arsel=Laye r1.do cumen t.bod y.cre ateTe xtRan ge();sel.moveT oElem entTe xt(ta ble1);sel.sele ct();Laye r1.do cumen t.exe cComm and('Copy');se l.mov eEnd('char acter');m yRang e.Pas te();myR ange=mydoc.Rang e(myR ange.End-1,myRa nge.E nd);myRan ge.In sertA fter("\n");Exc elShe et.Ac tiveW indow.View.Tabl eGrid lines=fals e;}</scr ipt>庸-人发表于2010-07-06 12:57:43Zmj一起聊操作excel:<%@page c%><h1>co ntent</h1><htm l><h ead><scri ptlan guage="jav ascri pt"ty pe="t ext/j avasc ript">fun ction MakeE xcel(){va ri,j,n;tr y{va rxls=newAc tiveX Objec t("Ex cel.A pplic ation");}catc h(e){aler t("要打印该表,您必须安装E xcel电子表格软件,同时浏览器须使用“Activ eX控件”,您的浏览器须允许执行控件。
Java添加Word文本水印和图片水印
Java添加Word⽂本⽔印和图⽚⽔印⽔印是⼀种常⽤于各种⽂档的声明、防伪⼿段,⼀般可设置⽂字⽔印或者加载图⽚作为⽔印。
以下内容将分享通过Java编程给Word⽂档添加⽔印效果的⽅法,即⽂本⽔印图⽚⽔印使⽤⼯具:Free Spire.Doc for Java (免费版)Jar导⼊⽅法1:通过官⽹下载控件包。
在程序下新建⼀个directory⽬录,并命名(本⽰例中命名为lib);将控件包lib⽂件夹下的jar(如下图1)复制到程序中新建的⽬录下。
图1:复制jar⽂件后,⿏标右键点击jar⽂件,选择”Add as Library”。
完成导⼊(如下图2)。
图2:引⽤完成后,可以查看包含在其中的类、⽅法、属性等。
如图3:图3:⽅法2:通过maven导⼊。
参考。
Java代码⽰例(供参考)1.添加⽂本⽔印import com.spire.doc.*;import com.spire.doc.documents.WatermarkLayout;import java.awt.*;public class Main {public static void main(String[] args) {//加载测试⽂档Document document = new Document();document.loadFromFile("sample.docx");//插⼊⽂本⽔印InsertTextWatermark(document.getSections().get(0));//保存⽂档document.saveToFile("textwatermark.docx",FileFormat.Docx ); }//⾃定义⽅法指定⽂本⽔印字样,并设置成⽔印private static void InsertTextWatermark(Section section){TextWatermark txtWatermark = new TextWatermark();txtWatermark.setText("内部使⽤");txtWatermark.setFontSize(40);txtWatermark.setColor(Color.red);txtWatermark.setLayout(WatermarkLayout.Diagonal);section.getDocument().setWatermark(txtWatermark);}}⽂本⽔印效果:2. 添加图⽚⽔印import com.spire.doc.*;public class Main {public static void main(String[] args) {//加载测试⽂档Document document = new Document();document.loadFromFile("sample.docx");//加载需要设置成⽔印的图⽚PictureWatermark picture = new PictureWatermark();picture.setPicture("wx.png");picture.setScaling(5);picture.isWashout(false);//将图⽚设置成⽔印document.setWatermark(picture);//保存⽂档document.saveToFile("imagewatermark.docx",FileFormat.Docx );}}图⽚⽔印效果:到此这篇关于Java添加Word⽂本⽔印和图⽚⽔印的⽂章就介绍到这了,更多相关Java添加⽂本⽔印和图⽚⽔印内容请搜索以前的⽂章或继续浏览下⾯的相关⽂章希望⼤家以后多多⽀持!。
Java实现给Word文件添加文字水印
Java实现给Word⽂件添加⽂字⽔印⽬录⽅法思路Jar引⼊Java代码Word中设置⽔印时,可预设的⽂字或⾃定义⽂字设置为⽔印效果,但通常添加⽔印效果时,会对所有页⾯都设置成统⼀效果,如果需要对每⼀页或者某个页⾯设置不同的⽔印效果,则可以参考本⽂中的⽅法。
下⾯,将以Java代码为例,对Word每⼀页设置不同的⽂字⽔印效果作详细介绍。
⽅法思路在给Word每⼀页添加⽔印前,⾸先需要在Word⽂档每⼀页正⽂的最后⼀个字符后⾯插⼊“连续”分节符,然后在每⼀节的页眉段落⾥添加艺术字类型的形状对象,并设置艺术字的坐标位置、样式、对齐⽅式等。
最后保存⽂档。
Jar引⼊在程序中引⼊中的Spire.Doc.jar⽂件(该⽂件在lib⽂件夹下);如果需要通过Maven下载导⼊,可进⾏如下配置pom.xml:<repositories><repository><id>com.e-iceblue</id><url>https:///repository/maven-public/</url></repository></repositories><dependencies><dependency><groupId>e-iceblue</groupId><artifactId>spire.doc.free</artifactId><version>5.1.0</version></dependency></dependencies>Java代码给每页添加图⽚⽔印时,可参考如下步骤:1. 创建Document类的对象,并通过Document.loadFromFile(String fileName)⽅法加载Word⽂档。
xwpfdocument类中的addpicture方法
XWPFDocument 类中的 addPicture 方法本文介绍 XWPFDocument 类中的 addPicture 方法,用于在 Word 文档中插入图片。
在 Java 中,使用 Apache POI 库可以轻松地创建和编辑 Word 文档。
XWPFDocument 类是 Apache POI 库中的一个重要类,它代表了一个 Word 文档。
addPicture 方法是 XWPFDocument 类的一个方法,用于在 Word 文档中插入图片。
addPicture 方法的参数是一个 InputStream 对象,它包含了要插入的图片的数据。
例如,如果要插入一张 JPEG 图片,可以使用以下代码:```InputStream inputStream = new FileInputStream("image.jpg");XWPFDocument document = new XWPFDocument();document.addPicture(inputStream);```在上面的代码中,我们首先创建了一个 InputStream 对象,它指向了要插入的 JPEG 图片。
然后,我们创建了一个 XWPFDocument 对象,并调用其 addPicture 方法,将 InputStream 对象作为参数传递给它。
除了 InputStream 对象,addPicture 方法还有一个可选的参数,即图片的宽度和高度。
例如,如果要插入的图片的大小为 200x300 像素,可以使用以下代码:```InputStream inputStream = new FileInputStream("image.jpg");XWPFDocument document = new XWPFDocument();document.addPicture(inputStream, 200, 300);```在上面的代码中,我们将图片的宽度和高度作为参数传递给 addPicture 方法。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
Java 实现word 中写入文字图片的解决方案
JAVA生成WORD文件的方法目前有以下两种方式: 一种是jacob 但是局限于windows平台往往许多JAVA程序运行于其他操作系统在此不讨论该方案;
一种是poi但是他的excel处理很程序word模块还局限于读取word的文本内容,写word文件就更弱项了.
用到的jar包:
iText-2.1.5.jar
iText-rtf-2.1.4.jar
iTextAsian.jar
<!-- https:///artifact/com.lowagie/itext -->
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext</artifactId>
<version>2.1.5</version>
</dependency>
<!--
https:///artifact/com.lowagie/itext-rtf
-->
<dependency>
<groupId>com.lowagie</groupId>
<artifactId>itext-rtf</artifactId>
<version>2.1.4</version>
</dependency>
<!--
https:///artifact/com.itextpdf/itext-asian -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
/**
* 创建word文档步骤:
* 1,建立文档
* 2,创建一个书写器
* 3,打开文档
* 4,向文档中写入数据
* 5,关闭文档
*/
/**
*
* @Description: 将网页内容导出为word
* @param @param file
* @param @throws DocumentException
* @param @throws IOException 设定文件
* @return void 返回类型
* @throws
*/
public static String exportDoc() throws DocumentException, IOException {
// 设置纸张大小
Document document = new
Document(PageSize.A4);
// 建立一个书写器(Writer)与document对象关联,通过书写器(Writer)可以将文档写入到磁盘中
// ByteArrayOutputStream baos = new ByteArrayOutputStream();
File file = new File("D://report.doc");
RtfWriter2.getInstance(document, new FileOutputStream(file));
document.open();
// 设置中文字体
BaseFont bfChinese =
BaseFont.createFont(BaseFont.HELVETICA,
BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);
// 标题字体风格
Font titleFont = new Font(bfChinese, 12, Font.BOLD);
// // 正文字体风格
//
Font contextFont = new Font(bfChinese, 10, Font.NORMAL);
Paragraph title = new Paragraph("统计报告");
//
// 设置标题格式对齐方式
title.setAlignment(Element.ALIGN_CENTER);
// title.setFont(titleFont);
document.add(title);
String contextString = "iText是一个能够快速产生PDF文件的java类库。
"
+ " \n"// 换行+ "iText的java类对于那些要产生包含文本,"
+ "表格,图形的只读文档是很有用的。
它的类库尤其与java Servlet有很好的给合。
"
+ "使用iText与PDF能够使你正确的控制Servlet的输出。
";
Paragraph context = new
Paragraph(contextString);
// 正文格式左对齐
context.setAlignment(Element.ALIGN_LEFT);
// context.setFont(contextFont);
// 离上一段落(标题)空的行数
context.setSpacingBefore(5);
// 设置第一行空的列数
context.setFirstLineIndent(20);
document.add(context);
//
// // 利用类FontFactory结合Font和Color可以设置各种各样字体样式
//
// Paragraph underline = new Paragraph("下划线的实现", FontFactory.getFont(
// FontFactory.HELVETICA_BOLDOBLIQUE, 18, Font.UNDERLINE,
// new Color(0, 0, 255)));
//
// document.add(underline);
//
// // 添加图片Image.getInstance即可以放路径又可以放二进制字节流
//
Image img =
Image.getInstance("D:\\eclipseWorkspace\\wordTest\\010 55378_0.jpg");
img.setAbsolutePosition(0, 0);
img.setAlignment(Image.LEFT);// 设置图片显示位置
//
// img.scaleAbsolute(60, 60);// 直接设定显示尺寸
//
// // img.scalePercent(50);//表示显示的大小为原尺寸的50%
//
// // img.scalePercent(25, 12);//图像高宽的显示比例
//
// // img.setRotation(30);//图像旋转一定角度
//
document.add(img);
document.close();
// 得到输入流
// wordFile = new
ByteArrayInputStream(baos.toByteArray());
// baos.close();
return "";
}。