iText简单demo
iText 7官网
(代码是从官网搬过来略做修改)
简单介绍两句,iText 主要是对pdf进行操作,下面两个demo主要是简单生成pdf和在pdf中插入水印(图片水印和文字水印),其他功能以后有空再看,感兴趣的可以上官网看看,示例更多。
废话不多说,直接上代码
一、maven依赖
<properties>
<itext.version>7.1.12</itext.version>
</properties>
<dependencies>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>kernel</artifactId>
<version>${itext.version}</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>io</artifactId>
<version>${itext.version}</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>layout</artifactId>
<version>${itext.version}</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>forms</artifactId>
<version>${itext.version}</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>pdfa</artifactId>
<version>${itext.version}</version>
</dependency>
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>pdftest</artifactId>
<version>${itext.version}</version>
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-log4j12</artifactId>
<version>1.7.18</version>
</dependency>
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>2.0.9</version>
</dependency>
</dependencies>
二、demo代码
简单生成pdf
package com.desolo.demo;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.colors.DeviceGray;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.xobject.PdfFormXObject;
import com.itextpdf.layout.Canvas;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Image;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.property.TextAlignment;
import java.io.File;
import java.io.IOException;
public class HelloPdf {
public static final String DEST = "D:/test/itext/chapter01/hello_world.pdf";
public static void main(String args[]) throws IOException {
File file = new File(DEST);
file.getParentFile().mkdirs();
new HelloPdf().createPdf(DEST);
}
public void createPdf(String dest) throws IOException {
//Initialize PDF writer
PdfWriter writer = new PdfWriter(dest);
//Initialize PDF document
PdfDocument pdf = new PdfDocument(writer);
// Initialize document
Document document = new Document(pdf);
//Add paragraph to the document
for(int i = 0;i<51;i++){
document.add(new Paragraph("Hello World!*****************************AAAAAAAAAAAAAAAAAAAAAAA*************************"+i));
}
//插入图片
/**
Image(ImageDataFactory.create("D:\\img\\car.jpg")), "Bruno"))
Image参数为图片和水印内容
这边水印不支持中文,想要支持中文的话看下面的demo,需要引入字体库,可能 还有其它解决方案,需要试试
*/
document.add(getWatermarkedImage(pdf, new Image(ImageDataFactory.create("D:\\img\\car.jpg")), "Bruno"));
// Document doc = new Document(pdfDoc);
document.add(getWatermarkedImage(pdf, new Image(ImageDataFactory.create("D:\\img\\dog.bmp")), "dog"));
document.add(getWatermarkedImage(pdf, new Image(ImageDataFactory.create("D:img\\logo.png")), "logo"));
Image image = new Image(ImageDataFactory.create("D:\\img\\senator.jpg"));
image.scaleToFit(400, 700);
document.add(getWatermarkedImage(pdf, image, "Bruno and Ingeborg"));
//Close document
document.close();
}
public Image getWatermarkedImage(PdfDocument pdfDoc, Image img, String watermark) {
float width = img.getImageScaledWidth();
float height = img.getImageScaledHeight();
PdfFormXObject template = new PdfFormXObject(new Rectangle(width, height));
new Canvas(template, pdfDoc).
add(img).
setFontColor(DeviceGray.BLACK).//setFont(PdfFont.).
showTextAligned(watermark, width / 2, height / 2, TextAlignment.CENTER, (float) Math.PI / 6);
return new Image(template);
}
}
生成水印(图片和文字)
package com.desolo.demo;
import com.itextpdf.io.font.PdfEncodings;
import com.itextpdf.io.image.ImageData;
import com.itextpdf.io.image.ImageDataFactory;
import com.itextpdf.kernel.font.PdfFont;
import com.itextpdf.kernel.font.PdfFontFactory;
import com.itextpdf.kernel.geom.Rectangle;
import com.itextpdf.kernel.pdf.PdfDocument;
import com.itextpdf.kernel.pdf.PdfPage;
import com.itextpdf.kernel.pdf.PdfReader;
import com.itextpdf.kernel.pdf.PdfWriter;
import com.itextpdf.kernel.pdf.canvas.PdfCanvas;
import com.itextpdf.kernel.pdf.extgstate.PdfExtGState;
import com.itextpdf.layout.Document;
import com.itextpdf.layout.element.Paragraph;
import com.itextpdf.layout.property.TextAlignment;
import com.itextpdf.layout.property.VerticalAlignment;
import java.io.File;
public class ImgBakTest {
public static final String DEST = "D:\\test\\itext\\dest.pdf";
public static final String IMG = "D:\\test\\img\\test.png";
public static final String SRC = "D:\\test\\itext\\test.pdf";
public static final String FONT = "D:\\test\\itext\\SIMHEI.TTF";
public static void main(String[] args) throws Exception {
File file = new File(DEST);
file.getParentFile().mkdirs();
new ImgBakTest().manipulatePdf(DEST);
}
protected void manipulatePdf(String dest) throws Exception {
PdfDocument pdfDoc = new PdfDocument(new PdfReader(SRC), new PdfWriter(dest));
Document doc = new Document(pdfDoc);
// PdfFont font = PdfFontFactory.createFont(StandardFonts.HELVETICA);
PdfFont font = PdfFontFactory.createFont(FONT, PdfEncodings.IDENTITY_H, false);
//没有字体库的话用上面注释掉的即可,只是不支持中文
Paragraph paragraph = new Paragraph("My watermark (中文)")
.setFont(font)
.setFontSize(30);
ImageData img = ImageDataFactory.create(IMG);
float w = img.getWidth();
float h = img.getHeight();
PdfExtGState gs1 = new PdfExtGState().setFillOpacity(0.5f);
// Implement transformation matrix usage in order to scale image
for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) {
PdfPage pdfPage = pdfDoc.getPage(i);
Rectangle pageSize = pdfPage.getPageSizeWithRotation();
// When "true": in case the page has a rotation, then new content will be automatically rotated in the
// opposite direction. On the rotated page this would look as if new content ignores page rotation.
pdfPage.setIgnorePageRotationForContent(true);
float x = (pageSize.getLeft() + pageSize.getRight()) / 2;
float y = (pageSize.getTop() + pageSize.getBottom()) / 2;
PdfCanvas over = new PdfCanvas(pdfDoc.getPage(i));
over.saveState();
over.setExtGState(gs1);
// if (i % 2 == 1) {
// doc.showTextAligned(paragraph, x, y, i, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
// } else {
over.addImageWithTransformationMatrix(img, w, 0, 0, h, x - (w / 2), y - (h / 2), false);
// over.addImage(img, w, 0, 0, h, x - (w / 2), y - (h / 2), false);
// }
/**
这边发现将生成图片水印和文字水印的放一起,会在图片水印上也能看见文字水印,这是我这边实现的一个需求,图片水印上加文字水印。
*/
over.addImage(img, w, 0, 0, h, x - (w / 2), y - (h / 2), false);
doc.showTextAligned(paragraph, x, y, i, TextAlignment.CENTER, VerticalAlignment.TOP, 0);
over.restoreState();
}
doc.close();
}
}
end…告辞…