# Itext Pdf 5 教程
Posted 爱码代码的喵
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了# Itext Pdf 5 教程相关的知识,希望对你有一定的参考价值。
Itext Pdf 5 教程
Itext Pdf
-
Itext7
收费,故使用Itext5
传统版,Itext5
不再维护 -
Itext5 Java Api 地址
:iText 5 Java | iText PDF
依赖
<!-- itextpdf -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itextpdf</artifactId>
<version>5.5.13.3</version>
</dependency>
<!-- pdf 中文支持 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>itext-asian</artifactId>
<version>5.2.0</version>
</dependency>
<!--itext 转化pdf -->
<dependency>
<groupId>org.xhtmlrenderer</groupId>
<artifactId>core-renderer</artifactId>
<version>R8</version>
</dependency>
<!-- 单元格样式等属性 -->
<dependency>
<groupId>com.itextpdf</groupId>
<artifactId>layout</artifactId>
<version>7.2.3</version>
</dependency>
本文说明
- 使用
com.itextpdf.kernel
和com.itextpdf.layout
的相关属性进行操作Pdf
- 使用
com.itextpdf.text
操作PDF
文档请看 https://blog.csdn.net/qq_37248504/article/details/124224968 - 两种方式相关
API
不同
效果展示
完整测试代码见
常用API
创建Document
/**
* 获取 Document
*
* @param byteArrayOutputStream byte array output stream
* @return Document
*/
private Document getDocument(ByteArrayOutputStream byteArrayOutputStream)
PdfDocument pdfDoc = new PdfDocument(new PdfWriter(byteArrayOutputStream, new WriterProperties().setFullCompressionMode(true)));
// 创建文档对象 设置文档大小为 A4
Document document = new Document(pdfDoc, PageSize.A4);
// 设置 document 的 margin
document.setMargins(10, 10, 10, 10);
return document;
中文字体设置
iText-Asian
包支持的中文字体如下图iText-Asian
包支持的中文字体只有简体的STSong
华文宋体和三种繁体
引入其它字体
- 注意不同版本创建字体
api
不同但是大致一样
// 获取中文字体
PdfFont chineseFont = PdfFontFactory.createFont("src/main/resources/fonts/STSong.ttf", PdfEncodings.IDENTITY_H);
// 获取英文字体
PdfFont englishFont = PdfFontFactory.createFont(FontFactory.TIMES_ROMAN);
- 注意创建的字体做缓存,如果每次都创建会导致
Pdf
文件过大
添加段落
/**
* 获取段落
*
* @return Paragraph
* @throws IOException Io exception
*/
private Paragraph getParagraph() throws IOException
// 获取中文字体
PdfFont chineseFont = PdfFontFactory.createFont("src/main/resources/fonts/STSong.ttf", PdfEncodings.IDENTITY_H);
// 获取英文字体
PdfFont englishFont = PdfFontFactory.createFont(FontFactory.TIMES_ROMAN);
Paragraph englishText = new Paragraph("Hello world!");
englishText.setFont(englishFont);
Paragraph chineseText = new Paragraph("你好早安!");
chineseText.add(englishText);
chineseText.setFont(chineseFont);
chineseText.setBorder(getSolidBorder(ItextPdfConst.BLACK));
return chineseText;
字体设置颜色
chineseText.setFontColor(ColorConstants.RED, 2);
Hello World 示例
- 中文字体使用宋体、英文字体使用新罗马
@Test
public void test4() throws IOException
ByteArrayOutputStream byteArrayOutputStream = new ByteArrayOutputStream();
Document document = getDocument(byteArrayOutputStream);
OutputStream out = new FileOutputStream(FILENAME);
document.add(getParagraph());
document.close();
byteArrayOutputStream.writeTo(out);
添加表格
- 创建10列的表格
/**
* 获取表格
*
* @return IBlockElement
* @throws IOException io Exception
*/
private IBlockElement getTable() throws IOException
Table table = new Table(ItextKernelUtils.TABLE_PROPORTION);
table.setMargins(5, 5, 5, 5);
List<Cell> tableCell = getTableCell();
for (Cell cell : tableCell)
table.addCell(cell);
return table;
/**
* 获取表格中的单元格
*
* @return List
* @throws IOException Io Exception
*/
private List<Cell> getTableCell() throws IOException
List<Cell> cellList = new ArrayList<>();
Cell cell;
for (int i = 0; i < 20; i++)
cell = new Cell();
cell.add(getCellParagraph(i + 1));
cellList.add(cell);
return cellList;
- 文档增加表格
document.add(getTable());
图片打印
/**
* 获取图片
*
* @return Cell
* @throws MalformedURLException Exception
*/
private Cell getPicture() throws MalformedURLException
Cell cell = new Cell();
Image image = new Image(ImageDataFactory.create("src/main/resources/picture/one.jpg"));
// 设置等比例缩放
image.setAutoScale(true);
cell.add(image);
return cell;
document.add(getPicture());
Pdf添加水印
- 效果图如下
单一水印
/**
* Pdf 添加水印
*
* @param sourceFile 源文件
* @param targetFile 目标文件
* @param waterMark 水印
* @throws IOException Io exception
* @throws DocumentException document exception
*/
public static void addWatermark(String sourceFile, String targetFile, String waterMark) throws IOException, DocumentException
// 待加水印的文件
PdfReader reader = new PdfReader(new FileInputStream(sourceFile));
// 加完水印的文件
PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(targetFile));
// 设置字体
BaseFont baseFont = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
// 设置透明度
PdfGState gs = new PdfGState();
// pdf页数
int pageCount = reader.getNumberOfPages() + 1;
PdfContentByte content;
// 循环对每页插入水印
for (int i = 1; i < pageCount; i++)
// 水印的起始
content = stamper.getOverContent(i);
gs.setFillOpacity(0.5f);
content.setGState(gs);
// 开始
content.beginText();
// 设置颜色 默认为黑色
content.setColorFill(BaseColor.LIGHT_GRAY);
// 设置字体及字号
content.setFontAndSize(baseFont, 50);
// 开始写入水印
content.showTextAligned(Element.ALIGN_BASELINE, waterMark, 180, 340, 45);
content.endText();
stamper.close();
reader.close();
满屏水印
/**
* 水印填满整个页面
*
* @param stamper 输出已添加水印的文件
* @param waterMarkName 水印文字
*/
public static void fillUpWaterMark(PdfStamper stamper, String waterMarkName)
try
BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Rectangle pageRect;
PdfGState gs = new PdfGState();
// 设置透明度
gs.setFillOpacity(0.5f);
gs.setStrokeOpacity(0.5f);
int total = stamper.getReader().getNumberOfPages();
JLabel label = new JLabel();
FontMetrics metrics;
label.setText(waterMarkName);
metrics = label.getFontMetrics(label.getFont());
int textH = metrics.getHeight();
int textW = metrics.stringWidth(label.getText());
PdfContentByte under;
for (int i = 1; i <= total; i++)
pageRect = stamper.getReader().getPageSizeWithRotation(i);
under = stamper.getOverContent(i);
under.saveState();
under.setGState(gs);
under.beginText();
// 设置水印字体大小颜色
under.setFontAndSize(base, 20);
under.setColorFill(BaseColor.RED);
// 水印文字成30度角倾斜
float height1 = pageRect.getHeight();
for (int height = 5 + textH; height < height1; height = height + textH * 3)
float width1 = pageRect.getWidth();
for (int width = 5 + textW; width < width1 + textW; width = width + textW + 3)
under.showTextAligned(Element.ALIGN_LEFT, waterMarkName, width - textW, height - textH, 45);
// 添加水印文字
under.endText();
stamper.close();
catch (Exception e)
logger.error(e.getMessage(), e);
增加一个新区域
/**
* 增加新的一页
* @return
*/
private AreaBreak getAreaBreak()
AreaBreak areaBreak = new AreaBreak();
areaBreak.setPageSize(PageSize.A5);
return areaBreak;
// document.add(getAreaBreak());
增加列表
- 效果如下
/**
* 获取列表
*
* @return List
*/
private com.itextpdf.layout.element.List getList()
com.itextpdf.layout.element.List list = new com.itextpdf.layout.element.List();
// Add elements to the list
list.add("Java");
list.add("JavaFX");
list.add("Apache Tika");
list.add("OpenCV");
list.add("WebGL");
list.add("Coffee Script");
list.add("Java RMI");
list.add("Apache Pig");
return list;
// document.add(getList());
合并拆分Pdf
ItextMergeTest.java
public class ItextMergeTest
private static final String FILE_NAME1 = "demo.pdf";
private static final String FILE_NAME2 = "demo1.pdf";
private static final String DEST = "MergeDemo.pdf";
private static final String DEST_FOLDER = "./file/pdftest";
/**
* 使用 copyPagesTo 合并
*
* @throws IOException ioexception
*/
@Test
public void test1() throws IOException
PdfWriter pdfWriter = new PdfWriter(DEST);
// 最终合并的 dpf
PdfDocument pdfDocument = new PdfDocument(pdfWriter);
PdfReader pdfReader1 = new PdfReader(FILE_NAME1);
PdfDocument pdfDocument1 = new PdfDocument(pdfReader1);
pdfDocument1.copyPagesTo(1, pdfDocument1.getNumberOfPages(), pdfDocument);
PdfReader pdfReader2 = new PdfReader(FILE_NAME2);
PdfDocument pdfDocument2 = new PdfDocument(pdfReader2);
pdfDocument2.copyPagesTo(1, pdfDocument2.getNumberOfPages(), pdfDocument);
pdfReader1.close();
pdfDocument1.close();
pdfReader2.close();
pdfDocument2.close();
pdfDocument.close();
/**
* 使用 pdfMerger.merge
*
* @throws IOException ioexception
*/
@Test
public void test2() throws IOException
PdfWriter pdfWriter = new PdfWriter(DEST);
// 最终合并的 dpf
PdfDocument pdfDocument = new PdfDocument(pdfWriter);
PdfMerger pdfMerger = new PdfMerger(pdfDocument);
PdfReader pdfReader1 = new PdfReader(FILE_NAME1);
PdfDocument pdfDocument1 = new PdfDocument(pdfReader1);
pdfMerger.merge(pdfDocument1, 1, pdfDocument1.getNumberOfPages());
PdfReader pdfReader2 = new PdfReader(FILE_NAME2);
PdfDocument pdfDocument2 = new PdfDocument(pdfReader2);
pdfMerger.merge(pdfDocument2, 1, pdfDocument2.getNumberOfPages());
pdfReader1.close();
pdfDocument1.close();
pdfReader2.close();
pdfDocument2.close();
pdfDocument.close();
/**
* 每个文件 1 页 分割
*
* @throws IOException ioexception
*/
@Test
public void test3() throws IOException
pdfSplitter(DEST, 1, DEST_FOLDER);
/**
* 在指定目录等分pdf
*
* @param fileName 要分割的文档
* @param pageNum 分割尺寸
* @param desDir 分割后存储路径
* @throws IOException ioexception
*/
private void pdfSplitter(String fileName以上是关于# Itext Pdf 5 教程的主要内容,如果未能解决你的问题,请参考以下文章
iText7高级教程之html2pdf——5.自定义标签和CSS应用
iText7高级教程之html2pdf——5.自定义标签和CSS应用