Java POI 4.1.2 操作doc/docx文档 ,在文档指定字符串上添加公章 并设置透明以及悬浮于文字上
时间: 2024-04-06 09:30:53 浏览: 101
java实现word表格指定位置盖章,并且设置印章悬浮于文字之上
3星 · 编辑精心推荐
可以通过Java POI 4.1.2操作doc/docx文档,在文档指定字符串上添加公章并设置透明以及悬浮于文字上。具体的实现步骤如下:
1. 读取doc/docx文档,定位到需要添加公章的位置。
2. 创建一个空白的BufferedImage对象,用于存储公章图片。
3. 使用Java的Graphics2D类,在BufferedImage对象上绘制公章图片。
4. 将BufferedImage对象转换为ByteArrayOutputStream,并使用POI的XWPFDocument类创建一个新的图片。
5. 将新的图片插入到文档中,并设置透明度和位置。
下面是一个示例代码:
```java
import java.awt.Graphics2D;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import javax.imageio.ImageIO;
import org.apache.poi.openxml4j.opc.OPCPackage;
import org.apache.poi.util.IOUtils;
import org.apache.poi.xwpf.usermodel.XWPFDocument;
import org.apache.poi.xwpf.usermodel.XWPFPicture;
import org.apache.poi.xwpf.usermodel.XWPFRun;
import org.apache.xmlbeans.XmlCursor;
import org.openxmlformats.schemas.drawingml.x2006.picture.CTPicture;
public class AddWatermark {
public static void main(String[] args) throws Exception {
String filePath = "test.docx";
String watermarkPath = "watermark.png";
String searchText = "test";
// 读取文档
XWPFDocument doc = new XWPFDocument(OPCPackage.open(new FileInputStream(filePath)));
// 定位到需要添加水印的位置
XWPFRun run = null;
for (XWPFRun r : doc.getParagraphs().get(0).getRuns()) {
if (r.text().contains(searchText)) {
run = r;
break;
}
}
// 创建BufferedImage对象
BufferedImage image = ImageIO.read(new File(watermarkPath));
BufferedImage watermark = new BufferedImage(image.getWidth(), image.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = (Graphics2D) watermark.getGraphics();
g2d.drawImage(image, 0, 0, null);
g2d.dispose();
// 将BufferedImage对象转换为ByteArrayOutputStream
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(watermark, "png", baos);
byte[] bytes = baos.toByteArray();
// 创建新的图片
int id = doc.getAllPictures().size();
String filename = "watermark.png";
String contentType = "image/png";
XWPFPicture picture = doc.addPicture(bytes, XWPFDocument.PICTURE_TYPE_PNG);
CTPicture ctPic = picture.getCTPicture();
XmlCursor cursor = ctPic.newCursor();
cursor.toPrevSibling();
cursor.toNextSibling();
cursor.toParent();
cursor.removeXml();
// 插入新的图片
run.setText("", 0);
run.addPicture(picture, id, filename, image.getWidth(), image.getHeight());
// 设置图片透明度
ctPic.getSpPr().getXfrm().getExt().setCx(image.getWidth());
ctPic.getSpPr().getXfrm().getExt().setCy(image.getHeight());
ctPic.getSpPr().getXfrm().getOff().setX(0);
ctPic.getSpPr().getXfrm().getOff().setY(0);
ctPic.getSpPr().getPrstGeom().setPrst(STShapeType.RECT);
ctPic.getSpPr().getPrstGeom().addNewAvLst();
ctPic.getSpPr().addNewLn().addNewNoFill();
ctPic.getSpPr().addNewEffectLst();
ctPic.getSpPr().addNewLn().addNewNoFill();
ctPic.getSpPr().addNewLn().addNewNoFill();
ctPic.getSpPr().addNewLn().addNewNoFill();
ctPic.getSpPr().addNewLn().addNewNoFill();
FileOutputStream out = new FileOutputStream(filePath);
doc.write(out);
out.close();
}
}
```
在这个示例中,我们首先读取指定的docx文档,并定位到需要添加公章的位置。然后,我们使用Java的Graphics2D类,在BufferedImage对象上绘制公章图片,并将其转换为ByteArrayOutputStream。接下来,我们使用POI的XWPFDocument类创建一个新的图片,并将其插入到文档中。最后,我们设置图片的透明度和位置,并将文档写回到硬盘中。
请注意,这个示例仅仅是一个简单的实现,可能不够完善和健壮。如果您需要在生产环境中使用它,请自行根据实际情况进行修改和优化。
阅读全文