在日常工作中,word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键。当我们需要批量处理、自动化生成包含图片的word文档时,手动操作显然效率低下。本文将深入探讨如何利用强大的spire.doc for java库,实现word文档插入图片的自动化,并精细控制图片环绕方式和图片定位,助你轻松驾驭java操作word的复杂场景,实现高效word自动化。
1. spire.doc for java库介绍与安装
spire.doc是一款功能强大且易于使用的java组件,专为处理word文档而设计。它允许开发者在java应用程序中创建、读取、编辑、转换和打印word文档,无需安装microsoft word。其优势在于api接口丰富、性能优越,能够满足各种复杂的文档处理需求。
maven依赖配置:
<repositories>
<repository>
<id>com.e-iceblue</id>
<name>e-iceblue</name>
<url>https://repo.e-iceblue.cn/repository/maven-public/</url>
</repository>
</repositories>
<dependencies>
<dependency>
<groupid>e-iceblue</groupid>
<artifactid>spire.doc</artifactid>
<version>13.11.2</version>
</dependency>
</dependencies>
2. 使用特定的环绕方式插入图片
在word中,图片的文本环绕方式决定了图片与周围文本的关系。spire.doc for java提供了灵活的api来设置这些环绕方式。
核心步骤:
- 加载或创建word文档。
- 获取文档中的某个段落或创建一个新段落。
- 创建
docpicture对象,并加载图片文件。 - 将
docpicture对象添加到段落中。 - 设置图片的环绕方式。
代码示例:
import com.spire.doc.*;
import com.spire.doc.documents.*;
import com.spire.doc.fields.*;
public class insertimage {
public static void main(string[] args) throws exception {
//创建 document 类的对象
document doc = new document();
//从磁盘载入 word 文件
doc.loadfromfile("d:/samples/sample.docx");
//创建 docpicture 类的对象
docpicture picture = new docpicture(doc);
//从磁盘加载图片
picture.loadimage("d:/samples/system.png");
//设置图片大小
picture.setwidth(75);
picture.setheight(90);
//将图片文本环绕方式设置为四周环绕
picture.settextwrappingstyle( textwrappingstyle.square);
//将图片插入到第二段
doc.getsections().get(0).getparagraphs().get(1).getchildobjects().insert(0,picture);
//保存文档
doc.savetofile("d:/javaoutput/insertimage.docx", fileformat.docx);
}
}
不同环绕方式的视觉效果和应用场景:
- 嵌入型 (inline) : 图片被视为文本字符,随文本流动。适用于图片与文字紧密结合,不希望图片浮动的情况。
- 四周型 (square) : 文本围绕图片的矩形边框。最常见的环绕方式,图片与文本互不遮挡。
- 紧密型 (tight) : 文本紧密地围绕图片的实际轮廓。比四周型更贴合图片形状,适用于不规则形状的图片。
- 浮于文字下方 (behind) : 图片位于文本下方,文本会覆盖图片。适用于作为背景水印或装饰性图片。
- 浮于文字上方 (infrontoftext) : 图片位于文本上方,会遮挡文本。适用于需要突出图片,或作为浮动元素。
- 上下型 (topandbottom) : 文本在图片上方和下方,不与图片左右两侧并排。
3. 在指定位置插入图片
除了环绕方式,精确控制图片在文档中的位置也至关重要。spire.doc for java允许你在段落、表格单元格甚至通过绝对坐标来定位图片。直接通过paragraph.getchildobjects().insert()即可在文档的任意位置插入图片,如下所示:
import com.spire.doc.*;
import com.spire.doc.documents.*;
import com.spire.doc.fields.*;
public class insertimage {
public static void main(string[] args) throws exception {
//创建 document 类的对象
document doc = new document();
//从磁盘加载 word 文档
doc.loadfromfile("d:/samples/sample.docx");
//创建 docpicture 类的对象
docpicture picture = new docpicture(doc);
//从磁盘加载图片
picture.loadimage("d:/samples/pdf.png");
//设置图片的大小
picture.setwidth(75);
picture.setheight(90);
//将图片的文本环绕方式设置为四周环绕
picture.settextwrappingstyle( textwrappingstyle.square);
//将图片插入到第二段
doc.getsections().get(0).getparagraphs().get(2).getchildobjects().insert(0,picture);
//设置图片的位置
picture.sethorizontalposition(370.0f);
picture.setverticalposition(10.0f);
//保存文档
doc.savetofile("d:/javaoutput/insertimage.docx", fileformat.docx);
}
}
docpicture定位属性详解:
sethorizontalposition() / setverticalposition(): 设置图片相对于其定位基准的偏移量。sethorizontalorigin() / setverticalorigin(): 设置图片水平/垂直定位的基准点,可选值包括page(页面)、column(列)、margin(页边距)、paragraph(段落)等。精确的定位通常需要选择page作为基准。
4. 常见问题解答
图片路径问题: 确保或loadimage()方法中提供的图片路径是正确的,可以是相对路径或绝对路径。对于web应用,可能需要将图片转换为字节流加载。
图片大小调整: 通过picture.setwidth()和picture.setheight()可以设置图片的尺寸。spire.doc也会自动根据图片原始尺寸进行一定程度的缩放,但手动设置可以更精确控制。
图片质量: 插入的图片质量取决于原始图片。如果图片过大,可能导致文档文件体积增大,可以考虑在插入前对图片进行压缩处理。
性能优化: 批量插入大量图片时,可能会影响性能。可以考虑分批处理,或优化图片加载和文档保存逻辑。对于大型文档,spire.doc提供了分段处理等机制来提高效率。
不支持的图片格式: 确保插入的图片格式是word支持的常见格式(如png, jpg, bmp, gif)。
文本环绕与定位冲突: 当设置了非嵌入型环绕方式后,图片会脱离文本流,此时可以通过sethorizontalposition和setverticalposition进行精确控制。
5.知识扩展
下面我们来看看java如何使用spire.doc实现插入文字、图片、表格、富文本吧
示例代码
import com.example.utils.docxutil;
import com.spire.doc.*;
import com.spire.doc.documents.*;
import com.spire.doc.fields.docpicture;
import java.awt.*;
import java.util.arraylist;
import java.util.list;
/**
* todo
*
* @description
* @author wl
* @date 2024/2/28
**/
public class docxaddparagraphtest {
public static void main(string[] args) {
//创建document对象
document document = new document("d:\\temp\\document-blank.docx");
//获取最后一个section
section newsec = document.getlastsection();
//添加文本
paragraph textparagtaph = newsec.addparagraph();
//设置文本格式
paragraphstyle stylecontent = new paragraphstyle(document);
stylecontent.setname("codestyle");
stylecontent.getcharacterformat().setfontname("宋体");
stylecontent.getcharacterformat().setfontsize(10f);
stylecontent.getparagraphformat().sethorizontalalignment(horizontalalignment.left);
document.getstyles().add(stylecontent);
textparagtaph.applystyle("codestyle");
textparagtaph.appendtext("第01号");
paragraph text1paragtaph = newsec.addparagraph();
//设置文本格式
paragraphstyle styletitle = new paragraphstyle(document);
//设置样式名称
styletitle.setname("titlestyle");
//设置字体
styletitle.getcharacterformat().setfontname("宋体");
//设置字体大小
styletitle.getcharacterformat().setfontsize(20f);
//设置文本颜色
styletitle.getcharacterformat().settextcolor(color.cyan);
//设置文本居中
styletitle.getparagraphformat().sethorizontalalignment(horizontalalignment.center);
//添加样式到文档
document.getstyles().add(styletitle);
//应用样式
text1paragtaph.applystyle("titlestyle");
//添加文本
text1paragtaph.appendtext("关于******公告");
//添加文本
paragraph textpeoparagtaph = newsec.addparagraph();
//设置文本格式
paragraphstyle stylepeocontent = new paragraphstyle(document);
stylepeocontent.setname("peostyle");
stylepeocontent.getcharacterformat().setfontname("宋体");
stylepeocontent.getcharacterformat().setfontsize(12f);
stylepeocontent.getparagraphformat().sethorizontalalignment(horizontalalignment.left);
document.getstyles().add(stylepeocontent);
textpeoparagtaph.applystyle("peostyle");
textpeoparagtaph.appendtext("姓名:姜xx\t\t\t手机号码:13866669999");
//添加文本
paragraph textaddparagtaph = newsec.addparagraph();
//设置文本格式
paragraphstyle styleaddcontent = new paragraphstyle(document);
styleaddcontent.setname("addstyle");
styleaddcontent.getcharacterformat().setfontname("宋体");
styleaddcontent.getcharacterformat().setfontsize(12f);
styleaddcontent.getparagraphformat().sethorizontalalignment(horizontalalignment.left);
document.getstyles().add(styleaddcontent);
textaddparagtaph.applystyle("addstyle");
textaddparagtaph.getformat().setfirstlineindent(30f);
textaddparagtaph.appendtext("联系地址:湖北武汉");
//添加表格
list<string> headerlist = new arraylist<>();
headerlist.add("姓名");
headerlist.add("电话");
headerlist.add("地址");
list<list<object>> datalist = new arraylist<>();
list<object> data1 = new arraylist<>();
data1.add("姜xx");
data1.add("18899996666");
data1.add("浙江");
datalist.add(data1);
list<object> data2 = new arraylist<>();
data2.add("tj");
data2.add("15549490011");
data2.add("杭州");
datalist.add(data2);
list<object> data3 = new arraylist<>();
data3.add("赵xx");
data3.add("135****713");
data3.add("武汉");
datalist.add(data3);
string tabletitle = "表格标题";
docxutil.createtable(newsec, headerlist, datalist, tabletitle);
//添加图片
// 创建 docpicture 类的对象
docpicture picture = new docpicture(document);
// 从磁盘加载图片
string images = "d:\\temp\\123.jpg";
picture.loadimage(images);
// 设置图片大小
picture.setwidth(180); //示例:80
picture.setheight(180);//示例:50
picture.sethorizontalposition(110); //示例:110.0f 水平位置
picture.setverticalposition(220); //示例:110.0f 垂直位置
paragraph picparagraph = newsec.addparagraph();
picparagraph.getchildobjects().add(picture);
//添加图片
// 创建 docpicture 类的对象
docpicture picture1 = new docpicture(document);
// 从磁盘加载图片
string images1 = "d:\\temp\\321.jpg";
picture1.loadimage(images1);
// 设置图片大小
picture1.setwidth(500); //示例:80
picture1.setheight(180);//示例:50
picture1.sethorizontalposition(110); //示例:110.0f 水平位置
picture1.setverticalposition(220); //示例:110.0f 垂直位置
paragraph picparagraph1 = newsec.addparagraph();
picparagraph1.getchildobjects().add(picture1);
//添加富文本
paragraph tempsectioncontentparagraph = newsec.addparagraph();
string htmlcontent = "<p>spire.doc for java 是一款专业的 java word 组件,开发人员使用它可以轻松地将 word 文档创建、读取、编辑、转换和打印等功能集成到自己的 java 应用程序中。作为一款完全独立的组件,spire.doc for java 的运行环境无需安装 microsoft office。</p>
<p>spire.doc for java 能执行多种 word 文档处理任务,包括生成、读取、转换和打印 word 文档,插入图片,添加页眉和页脚,创建表格,添加表单域和邮件合并域,添加书签,添加文本和图片水印,设置背景颜色和背景图片,添加脚注和尾注,添加超链接,加密和解密 word 文档,添加批注,添加形状等。</p>
<p><img src="data:image/jpeg;base64,ivborw0kggoaaaansuheugaaaesaaablcayaaaa4tnrqaaaaaxnsr0iars4c6qaabwvjrefueahtnf9ow1ucx3/njumwznxrquh7w+pyffa6nkagklvmhkgg+jaryygmfaqwl3v7w/cidj46fvberbhzi3tqx8angskiqpqwpyyolv1vowirxtajs5n79vvdqdao3oacc+9nbslj0/3z/f3o9/fj+xpvzw0b9ect0aq0au1ae9aenafnqbnomwhw5vy3nz8bijucwwqw9jjw/rhzkrebup0ty3amvvs2ngw0ecc0sgbm+ascog0c4g0zmcgdz8cyhdindc+34gaoym30xz/kamdf6kxd06of8gkrrd8aw++esvmyzmjkfbtlji3fylbjh76tpstrjifbtqevcjgm4xmrefopvjgobbccocqgjxv9o2hmgpdhrfizlzlkytsck2cmjncbf45dylp7gmyzwd5nw6uvzipw1xoyq9lorjl8y7btrxgul/mlfmabhnf4v1x8vswptexlyehqe53bcbynrmvmcmiroctfwch5vybwwdiywlnm4iwb83n4ldwj7halqlxorrimvbbfkp3fqubpvetg5qz2hobq+xfbbffktkkwavufqesv9nlapszspdobw8oo9t7lqtuloecllrxkbmfbxqhed44uvn+tdg0qdxtw3gdiqwonluki9ubtj74k2h/rclwwslj608+0gchcvw8e56hfood9fhowzcuyw8y5bbxxytnrmga6qgdl+nufxdnqmgf+sdmdqz5nwp7bowwsxvi96kc7vlzrbdqyo/tgbs5qf9snijyrb/jcnjz6vn32twfn9fcn1qcmpqpsqoacimmi8xgij40ulhe95pcn1pvu8thkun0zv869xgwffstgvidmja3ni3+rtuhlmlz6ro9d6xx+c2hber38eskjevwf5blnzvm7d7l1yivc9tkqjlozh6tklsd6dmtykyuy7xrqwvegh96bom53ciicq17jm3lvgaxf04xxvtz+wmafkw203xrytn6pbhkvsj1rfs+ebbfs5xm4dzwv01iotoidaqbarh1jw+lj49g1cuesxsmcfg0krdqqwakfaxlxkawlhzouyc3//g0o/fdfkneebmuhmqi2zn6fv0mc52zgth6jon5ulrqjzzp21ahvfadxs7ymbvwr7lm5gcqhxquk2gancgpszmk5ktszzoz6n4nqlw5jhprbtbfqu1gch2h0bptm6q+njir1rfp1ottberynrqy1esg6jgyl2itucbrvuhutgrbeoxyfolcmric2l80vbn7v5j33wovgxwlguzzar3uziqc2rngp1avq4dwn7qow4dz7+cpp0whuoj6pqwonxlr9vwm2sog81pcvw+wwhd/s/tehuz4btkxy/fh9g8kw7our7+b6eydt4fp1ax2wyqcbshdkp2stcg1d2atdqtewjl5zobttixxkuvrzhw8ovummfrzkghdtj+gl45tbvwbg5ieusdhj0xmrnovmcunxfevyae/jtm481qrtuaxdg7progxlaevziupcaqvnyqzkmlprdkk6smasmksiww6scf4rycfbeikqki2gjufww9kwjahishxp0rakcehidc/sscqiseh1z9kwjahisd33lhxiscbrxiikqp49w8i/yrncqudghkjnz7b6yvjsbyd9vd17hrvvofqxpumkp4vria95jc8qzj3dokzj27yfwydsrj8hqrgljay9ol4vk/sca/j6vzebg2151ctvn3p0veof3rp7aovszqrfj/a9k0nsyev30odky/fktn71qo7jn1hkgcxeo5e0/nuutxhanzwfbqtb8xbpte2vhkax8uqvldc3olot0aq0au1ae+gwancatcunfix0swkaaaaasuvork5cyii=" alt="" width="75" height="75" /></p>";
htmlcontent=htmlcontent+"<p> </p>";
tempsectioncontentparagraph.appendhtml(htmlcontent);
//添加文本
paragraph text3paragtaph = newsec.addparagraph();
paragraphstyle stylecontent3 = new paragraphstyle(document);
stylecontent3.setname("codestyle3");
stylecontent3.getcharacterformat().setfontname("宋体");
stylecontent3.getcharacterformat().setfontsize(15f);
document.getstyles().add(stylecontent3);
text3paragtaph.applystyle("codestyle3");
text3paragtaph.appendtext("第02号");
paragraph text4paragtaph = newsec.addparagraph();
//设置文本格式
paragraphstyle styletitle4 = new paragraphstyle(document);
styletitle4.setname("titlestyle4");
styletitle4.getcharacterformat().setfontname("宋体");
styletitle4.getcharacterformat().setfontsize(25f);
styletitle4.getcharacterformat().settextcolor(color.orange);
styletitle4.getparagraphformat().sethorizontalalignment(horizontalalignment.center);
document.getstyles().add(styletitle4);
text4paragtaph.applystyle("titlestyle4");
text4paragtaph.appendtext("关于***************************text");
docxutil.insertheaderandfooter(newsec);
document.savetofile("d:\\temp\\documentnew.docx", fileformat.docx_2013);
}
}使用到的工具
import com.spire.doc.*;
import com.spire.doc.documents.*;
import com.spire.doc.fields.textrange;
import java.awt.*;
import java.security.timestamp;
import java.text.simpledateformat;
import java.util.date;
import java.util.list;
/**
* todo
*
* @description
* @author wl
* @date 2024/2/28
**/
public class docxutil {
// 动态创建表格
public static void createtable(section section, list<string> header, list<list<object>> data, string title) {
//添加表格
table table = section.addtable(true);
//设置表格的行数和列数
table.resetcells(data.size()+ 2, header.size());
//设置第一行作为表格的表头并添加数据
tablerow row = table.getrows().get(1);
row.isheader(true);
row.setheight(40);
row.setheighttype(tablerowheighttype.exactly);
tablerow row3 = table.getrows().get(0);
row3.isheader(true);
row3.setheight(60);
row3.setheighttype(tablerowheighttype.exactly);
row3.getcells().get(0).getcellformat().setverticalalignment(verticalalignment.middle);
table.applyhorizontalmerge(0, 0, header.size() - 1);
paragraph p1 = row3.getcells().get(0).addparagraph();
p1.getformat().sethorizontalalignment(horizontalalignment.center);
textrange range3 = p1.appendtext(title);
range3.getcharacterformat().setfontname("仿宋_gb2312");
range3.getcharacterformat().setfontsize(12f);
range3.getcharacterformat().settextcolor(color.black);
range3.getcharacterformat().setbold(true);
for (int i = 0; i < header.size(); i++) {
row.getcells().get(i).getcellformat().setverticalalignment(verticalalignment.middle);
paragraph p = row.getcells().get(i).addparagraph();
p.getformat().sethorizontalalignment(horizontalalignment.center);
textrange range1 = p.appendtext(header.get(i));
range1.getcharacterformat().settextcolor(color.black);
range1.getcharacterformat().setfontname("仿宋_gb2312");
range1.getcharacterformat().setfontsize(12f);
range1.getcharacterformat().setbold(true);
}
//添加数据到剩余行
try{
for (int r = 0; r < data.size(); r++) {
tablerow datarow = table.getrows().get(r + 2);
datarow.setheight(25);
datarow.setheighttype(tablerowheighttype.exactly);
datarow.getrowformat().setbackcolor(color.white);
for (int c = 0; c < data.get(r).size(); c++) {
datarow.getcells().get(c).getcellformat().setverticalalignment(verticalalignment.middle);
string s = "";
if (data.get(r).get(c) instanceof timestamp) {
simpledateformat df = new simpledateformat("yyyy-mm-dd hh:mm:ss");//定义格式,不显示毫秒
s = df.format((timestamp) (data.get(r).get(c)));
} else if (data.get(r).get(c) instanceof date) {
simpledateformat df = new simpledateformat("yyyy-mm-dd hh:mm:ss");//定义格式,不显示毫秒
s = df.format((date) (data.get(r).get(c)));
} else if (data.get(r).get(c) == null) {
s = "";
} else {
s = data.get(r).get(c).tostring();
}
textrange range2 = datarow.getcells().get(c).addparagraph().appendtext(s);
range2.getcharacterformat().setfontname("仿宋_gb2312");
range2.getcharacterformat().setfontsize(10f);
}
}
}catch (exception e){
e.getmessage();
// log.info("插入数据有异常");
}
section.addparagraph();
}
//生成页眉和页脚
public static void insertheaderandfooter(section section) {
//分别获取section的页眉页脚
headerfooter header = section.getheadersfooters().getheader();
headerfooter footer = section.getheadersfooters().getfooter();
//添加段落到页眉
paragraph headerparagraph = header.addparagraph();
//添加文字到页眉的段落
textrange text = headerparagraph.appendtext("页眉测试");
text.getcharacterformat().setfontname("仿宋_gb2312");
text.getcharacterformat().setfontsize(10);
text.getcharacterformat().setitalic(true);
headerparagraph.getformat().sethorizontalalignment(horizontalalignment.left);
//设置页眉段落的底部边线样式
headerparagraph.getformat().getborders().getbottom().setbordertype(borderstyle.single);
headerparagraph.getformat().getborders().getbottom().setlinewidth(1f);
//添加段落到页脚
paragraph footerparagraph = footer.addparagraph();
//添加field_page和field_num_pages域到页脚段落,用于显示当前页码和总页数
footerparagraph.appendfield("page number", fieldtype.field_page);
footerparagraph.appendtext("/");
footerparagraph.appendfield("number of pages", fieldtype.field_num_pages);
footerparagraph.getformat().sethorizontalalignment(horizontalalignment.right);
//设置页脚段落的顶部边线样式
footerparagraph.getformat().getborders().gettop().setbordertype(borderstyle.single);
footerparagraph.getformat().getborders().gettop().setlinewidth(1f);
}
}6.总结
通过spire.doc for java库,我们不仅能够轻松实现word文档插入图片的基础功能,更能通过精细的api控制图片环绕方式和图片定位,从而满足复杂的文档自动化需求。无论是生成报告、合同,还是批量处理各类文档,spire.doc都提供了强大的支持。掌握这些技巧,将极大地提升你的java操作word效率,开启word自动化的新篇章,期待你在实际项目中探索更多可能!
到此这篇关于java使用spire.doc for java实现word自动化插入图片的文章就介绍到这了,更多相关java word插入图片内容请搜索代码网以前的文章或继续浏览下面的相关文章希望大家以后多多支持代码网!
发表评论