以下代码,如有问题,请大家不吝指出,如有更优实现方案,欢迎一起讨论。
最近在做一个需求:在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));
}
}