前言:
现在有很多pdf版本的协议,需要动态填写用户相关参数和粘贴用户相关图片,如果项目jdk版本为1.6或更低请使用itext5实现,详情见我另外一章itext5实现参数和图片替换的文章,itext7不支持jdk1.6(亲测);
引入的依赖包如下:
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext7-core</artifactId>
<version>7.1.2</version>
<type>pom</type>
</dependency>
1.参数替换代码:
public class ReplaceStream extends GenericTest {
public static final String DEST = "./target/test/resources/sandbox/stamper/replace_stream.pdf";
public static final String SRC = "./src/test/resources/pdfs/hello.pdf";
public static void main(String[] args) throws Exception {
File file = new File(DEST);
file.getParentFile().mkdirs();
new ReplaceStream().manipulatePdf(DEST);
}
@Override
protected void manipulatePdf(String dest) throws Exception {
PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC), new PdfWriter(DEST));
PdfPage page = pdfDoc.getFirstPage();
PdfDictionary dict = page.getPdfObject();
PdfObject object = dict.get(PdfName.Contents);
if (object instanceof PdfStream) {
PdfStream stream = (PdfStream) object;
byte[] data = stream.getBytes();
stream.setData(new String(data).replace("Hello World", "HELLO WORLD").getBytes("UTF-8"));
}
pdfDoc.close();
}
}
2.图片替换代码
public class ReplaceImage extends GenericTest {
public static final String DEST = "./target/test/resources/sandbox/images/replace_image.pdf";
public static final String SRC = "./src/test/resources/pdfs/image.pdf";
public static void main(String[] args) throws Exception {
File file = new File(DEST);
file.getParentFile().mkdirs();
new ReplaceImage().manipulatePdf(DEST);
}
public static Image makeBlackAndWhitePng(PdfImageXObject image) throws IOException {
BufferedImage bi = image.getBufferedImage();
BufferedImage newBi = new BufferedImage(bi.getWidth(), bi.getHeight(), BufferedImage.TYPE_USHORT_GRAY);
newBi.getGraphics().drawImage(bi, 0, 0, null);
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(newBi, "png", baos);
return new Image(ImageDataFactory.create(baos.toByteArray()));
}
public static void replaceStream(PdfStream orig, PdfStream stream) throws IOException {
orig.clear();
orig.setData(stream.getBytes());
for (PdfName name : stream.keySet()) {
orig.put(name, stream.get(name));
}
}
@Override
protected void manipulatePdf(String dest) throws Exception {
PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC), new PdfWriter(dest));
PdfDictionary page = pdfDoc.getFirstPage().getPdfObject();
PdfDictionary resources = page.getAsDictionary(PdfName.Resources);
PdfDictionary xobjects = resources.getAsDictionary(PdfName.XObject);
PdfName imgRef = xobjects.keySet().iterator().next();
PdfStream stream = xobjects.getAsStream(imgRef);
Image img = makeBlackAndWhitePng(new PdfImageXObject(stream));
replaceStream(stream, img.getXObject().getPdfObject());
pdfDoc.close();
}
}