本文主要是介绍Java使用Spire.Doc for Java实现Word自动化插入图片,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
《Java使用Spire.DocforJava实现Word自动化插入图片》在日常工作中,Word文档是不可或缺的工具,而图片作为信息传达的重要载体,其在文档中的插入与布局显得尤为关键,下面我们就来...
在日常工作中,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) : 图片被视为文本字符,随文本流动。适用于图片与文字紧密结合,不希望图片浮动的情况。
- 四周型 (SquaChina编程re) : 文本围绕图片的矩形边框。最常见的环绕方式,图片与文本互不遮挡。
- 紧密型 (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="Java使用Spire.Doc for Java实现Word自动化插入图片" 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 styleTChina编程itle4 = 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域到页脚段落,用于显示当前页码和总页数
footerParajsgraph.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插入图片内容请搜索编程China编程(www.chinasem.cn)以前的文章或继续浏览下面的相关文章希望大家以后多多支持China编程(www.chinasem.cn)!
这篇关于Java使用Spire.Doc for Java实现Word自动化插入图片的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!