pdf及word右上角添加图片(Java实现)

xiaoxiao2025-10-11  14

以下代码,如有问题,请大家不吝指出,如有更优实现方案,欢迎一起讨论。

最近在做一个需求:在pdf和word右上角添加一个二维码

其中,pdf可以灵活实现二维码的位置,但是word由于我是在页眉处添加的图片,因此我的方法只能在页眉处添加图片。

首先定义一个接口(先抛出Exception,还没优化)

public interface DocAddQRCodeI { int QRCodeLength = 70; void addQRCode(String beforePath, String afterPath, String imagePath) throws Exception; }

1.pdf

Maven中添加如下依赖:

<dependency> <groupId>com.lowagie</groupId> <artifactId>itext</artifactId> <version>2.1.7</version> </dependency> import com.lowagie.text.Image; import com.lowagie.text.pdf.PdfContentByte; import com.lowagie.text.pdf.PdfReader; import com.lowagie.text.pdf.PdfStamper; import java.io.FileOutputStream; public class PdfAddQRCode implements DocAddQRCodeI { private static final int left = 430; //左边距 private static final int button = 720; //底边距 public void addQRCode(String beforePath, String afterPath, String imagePath) throws Exception { PdfReader reader = new PdfReader(beforePath); int pageCount = reader.getNumberOfPages(); FileOutputStream resOutputStream = new FileOutputStream(afterPath); PdfStamper stamper = new PdfStamper(reader, resOutputStream); Image image = Image.getInstance(imagePath); image.scaleAbsolute(QRCodeLength, QRCodeLength); //二维码大小 image.setAbsolutePosition(left, button); //设置 左边距、底边距 //在每一页都加了二维码,也可只在某一页加,大家按需取用 for (int i = 1; i <= pageCount; i++) { PdfContentByte overContent = stamper.getOverContent(i); overContent.addImage(image); overContent.stroke(); } stamper.close(); reader.close(); } }

2.word

在maven中添加如下依赖:

<dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.15</version> </dependency>

代码如下:

import org.apache.poi.util.Units; import org.apache.poi.xwpf.model.XWPFHeaderFooterPolicy; import org.apache.poi.xwpf.usermodel.*; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTSectPr; import org.openxmlformats.schemas.wordprocessingml.x2006.main.CTTabStop; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STHdrFtr; import org.openxmlformats.schemas.wordprocessingml.x2006.main.STTabJc; import java.io.File; import java.io.FileInputStream; import java.io.FileOutputStream; import java.io.InputStream; import java.math.BigInteger; public class WordAddQRCode implements DocAddQRCodeI { public void addQRCode(String beforePath, String afterPath, String imagePath) throws Exception { InputStream is = new FileInputStream(new File(beforePath)); XWPFDocument doc = new XWPFDocument(is); //添加页眉,在页眉上添加二维码图片 CTSectPr sectPr = doc.getDocument().getBody().addNewSectPr(); XWPFHeaderFooterPolicy headerFooterPolicy = new XWPFHeaderFooterPolicy(doc, sectPr); //其实本来想只在第一页添加二维码的,但是该方法参数改为STHdrFtr.FIRST后并无效果,我没有思路,有兴趣的同学欢迎研究 XWPFHeader header = headerFooterPolicy.createHeader(STHdrFtr.DEFAULT); XWPFParagraph paragraph = header.getParagraphArray(0); paragraph.setAlignment(ParagraphAlignment.LEFT); CTTabStop tabStop = paragraph.getCTP().getPPr().addNewTabs().addNewTab(); tabStop.setVal(STTabJc.RIGHT); int twipsPerInch = 1440; tabStop.setPos(BigInteger.valueOf(6 * twipsPerInch)); XWPFRun run = paragraph.createRun(); run.addTab(); XWPFPicture picture = run.addPicture(new FileInputStream(imagePath), XWPFDocument.PICTURE_TYPE_PNG, imagePath, Units.toEMU(QRCodeLength), Units.toEMU(QRCodeLength)); String blipID = ""; for (XWPFPictureData picturedata : header.getAllPackagePictures()) { blipID = header.getRelationId(picturedata); } picture.getCTPicture().getBlipFill().getBlip().setEmbed(blipID); doc.write(new FileOutputStream(afterPath)); } }

 

转载请注明原文地址: https://www.6miu.com/read-5037758.html

最新回复(0)