java poi word 添加图片水印
时间: 2023-09-22 10:14:33 浏览: 443
好的,你可以使用Java中的POI库来添加图片水印。具体步骤如下:
1. 创建一个XWPFDocument对象,表示要操作的Word文档。
2. 使用createParagraph方法创建一个段落对象。
3. 使用addPictureData方法添加图片数据。
4. 使用createRun方法创建一个运行对象。
5. 使用addPicture方法将图片插入到运行对象中。
6. 使用setFontFamily方法设置字体样式。
7. 使用setFontSize方法设置字体大小。
8. 使用setTextPosition方法设置图片水印的位置。
9. 保存文档,即可生成带有图片水印的Word文档。
需要注意的是,要确保图片文件已经存在,并且传入的文件路径正确才能插入水印。此外,不同版本的POI库可能存在一些差异,需要根据实际情况进行调整。
相关问题
java poi word添加水印
在Java中,使用Apache POI库操作Microsoft Word文档(.docx),可以为其添加水印。Apache POI是HSSF和XSSF的简称,分别用于处理Excel和Word文档。以下是一个简单的步骤:
1. 首先,你需要导入必要的Apache POI库和`docx4j`库,因为它提供了更方便的操作`.docx`文件的功能。
```java
import org.apache.poi.xwpf.usermodel.*;
import org.docx4j.wml.*;
// ...
try {
XWPFDocument document = new XWPFDocument(new FileInputStream("your_file.docx"));
// ...
} catch (IOException e) {
e.printStackTrace();
}
```
2. 创建一个`CTImage`对象来表示水印图片,或者创建`CTInline`对象来添加文本水印。
对于图片水印:
```java
CTImage img = CTImageFactory.createImagePart(document, new File("watermark.png"));
```
对于文本水印:
```java
CTBody body = document.getBody();
CTParagraph paragraph = body.addNewParagraph();
CTText cttext = paragraph.addNewR();
cttext.setText("Watermark Text");
CTOnFlyUnicodeFont font = new CTOnFlyUnicodeFont();
font.setName("Arial"); // 设置字体
CTCharacterRunProperties properties = cttext.getCharacterProperties();
properties.setFont(font);
```
3. 添加水印到文档。如果是图片水印,通常会插入到页面背景,然后设置透明度;如果是文本水印,则直接放在需要的位置:
```java
if (img != null) {
CTGraphicFrame graphicFrame = new CTGraphicFrame();
graphicFrame.setAnchor(new CTJMCollapseAnchor(0, 0, 1, 1)); // 全屏覆盖
graphicFrame.setGraphic(img);
CTPictureData pictureData = graphicFrame.getpic().addNewBlipFill();
pictureData.setUrl(img.getUrl());
}
if (paragraph != null) {
paragraph.setSpaceAfter(BigInteger.valueOf(500)); // 文本下方留空
}
```
4. 最后,保存修改后的文档:
```java
document.write(new FileOutputStream("output_with_watermark.docx"));
```
java poi 3.10 word 加水印 代码
以下是Java POI 3.10 Word加水印代码示例:
```
import java.io.*;
import org.apache.poi.xwpf.usermodel.*;
import org.apache.poi.util.*;
import org.apache.poi.openxml4j.opc.*;
import org.apache.poi.xwpf.model.*;
import org.apache.xmlbeans.*;
public class WordWatermark {
public static void main(String[] args) throws Exception {
// 创建一个新的Word文档
XWPFDocument doc = new XWPFDocument();
// 添加文档内容
XWPFParagraph para = doc.createParagraph();
XWPFRun run = para.createRun();
run.setText("Hello World!");
// 添加水印
String watermarkText = "Confidential";
addWatermark(doc, watermarkText);
// 保存Word文档
FileOutputStream out = new FileOutputStream("test.docx");
doc.write(out);
out.close();
doc.close();
}
// 添加水印
public static void addWatermark(XWPFDocument doc, String watermarkText) throws Exception {
// 创建水印段落
XWPFParagraph watermarkPara = doc.createParagraph();
watermarkPara.setAlignment(ParagraphAlignment.CENTER);
watermarkPara.setVerticalAlignment(TextAlignment.CENTER);
// 创建水印文字
XWPFRun watermarkRun = watermarkPara.createRun();
watermarkRun.setText(watermarkText);
watermarkRun.setColor("C0C0C0");
watermarkRun.setFontSize(100);
// 获取页面大小
CTPageSz pageSize = doc.getDocument().getBody().getSectPr().getPgSz();
// 计算水印位置
int posX = (pageSize.getW().intValue() - watermarkRun.getText().length() * 50) / 2;
int posY = (pageSize.getH().intValue() - 100) / 2;
// 创建水印图片
byte[] rgb = new byte[] { (byte)192, (byte)192, (byte)192 };
XWPFRun run = doc.createParagraph().createRun();
String blipId = run.getCTR().addNewPict().addNewBlipFill().addNewBlip().getEmbed();
File imageFile = createImage(rgb);
FileInputStream fis = new FileInputStream(imageFile);
int picInd = doc.addPicture(fis, XWPFDocument.PICTURE_TYPE_PNG);
fis.close();
String picXml = getPicXml(blipId, picInd, posX, posY, 100, 100);
CTInline inline = CTInline.Factory.parse(picXml);
run.getCTR().set(inline);
// 设置水印透明度
CTPicture ctPicture = run.getCTR().getPictArray(0);
CTBlipFillProperties ctBlipFillProperties = ctPicture.getBlipFill();
CTAlphaTransform ctAlphaTransform = ctBlipFillProperties.addNewAlphaBiLevel();
ctAlphaTransform.setVal(80000);
}
// 创建水印图片
public static File createImage(byte[] rgb) throws Exception {
BufferedImage image = new BufferedImage(100, 100, BufferedImage.TYPE_INT_RGB);
Graphics2D graphics = image.createGraphics();
graphics.setColor(new Color(rgb[0], rgb[1], rgb[2]));
graphics.fillRect(0, 0, 100, 100);
File file = File.createTempFile("watermark", ".png");
ImageIO.write(image, "png", file);
return file;
}
// 获取水印图片XML
public static String getPicXml(String blipId, int picInd, int posX, int posY, int width, int height) {
String picXml = "" + "<a:graphic xmlns:a=\"http://schemas.openxmlformats.org/drawingml/2006/main\">" +
"<a:graphicData uri=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" +
"<pic:pic xmlns:pic=\"http://schemas.openxmlformats.org/drawingml/2006/picture\">" +
"<pic:nvPicPr>" +
"<pic:cNvPr id=\""+picInd+"\" name=\"Generated\"/>" +
"<pic:cNvPicPr/>" +
"</pic:nvPicPr>" +
"<pic:blipFill>" +
"<a:blip r:embed=\""+blipId+"\" xmlns:r=\"http://schemas.openxmlformats.org/officeDocument/2006/relationships\"/>" +
"<a:stretch>" +
"<a:fillRect/>" +
"</a:stretch>" +
"</pic:blipFill>" +
"<pic:spPr>" +
"<a:xfrm>" +
"<a:off x=\""+posX+"\" y=\""+posY+"\"/>" +
"<a:ext cx=\""+width+"\" cy=\""+height+"\"/>" +
"</a:xfrm>" +
"<a:prstGeom prst=\"rect\">" +
"<a:avLst/>" +
"</a:prstGeom>" +
"</pic:spPr>" +
"</pic:pic>" +
"</a:graphicData>" +
"</a:graphic>";
return picXml;
}
}
```
在示例中,我们创建了一个新的Word文档,并添加了一些文本内容。然后,我们调用了addWatermark方法来添加水印。在该方法中,我们首先创建了一个水印段落,然后创建了一个包含水印文字的运行。接下来,我们使用CTPageSz类获取页面大小,并计算出水印的位置。然后,我们创建了一个水印图片,并将其添加到Word文档中。最后,我们使用CTAlphaTransform类设置水印的透明度。
需要注意的是,水印的位置和大小可能需要根据不同的Word文档进行调整。
阅读全文