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

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

最近在做一个需求:在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));
    }

}

猜你喜欢

转载自blog.csdn.net/qq_37043780/article/details/83385656