Fork me on GitHub

Itext5常用操作

Itext

官网

Maven坐标

<properties>
    <itextpdf.version>5.5.6</itextpdf.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>${itextpdf.version}</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf.tool</groupId>
        <artifactId>xmlworker</artifactId>
        <version>${itextpdf.version}</version>
    </dependency>
    <!--中文支持-->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext-asian</artifactId>
        <version>5.2.0</version>
    </dependency>
</dependencies>

Java代码

常用

块、短语、段落、图片、超链接等对象

[官网](https://itextpdf.com/en)

## Maven坐标

​```xml
<properties>
    <itextpdf.version>5.5.6</itextpdf.version>
</properties>

<dependencies>
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>${itextpdf.version}</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf.tool</groupId>
        <artifactId>xmlworker</artifactId>
        <version>${itextpdf.version}</version>
    </dependency>
    <!--中文支持-->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext-asian</artifactId>
        <version>5.2.0</version>
    </dependency>
</dependencies>

Java代码

常用

块、短语、段落、图片、超链接等对象

//new一个Document对象,设置纸张大小
Document document = new Document(PageSize.A4);
//解析器
PdfWriter writer= PdfWriter.getInstance(document, new FileOutputStream("D://pdfText.pdf"));
//添加PDF属性
/*document.addAuthor("作者");
document.addTitle("标题");
document.addSubject("主题");
document.addKeywords("关键字");*/
/*页边距*/
document.setMargins(10, 20, 30, 40);

//打开document
document.open();

/***添加新段落***/
document.add(new Paragraph("Hello world"));  //英文段落添加成功
//字体的设置,如颜色,字体,大小等
Font titlefontChinese = new Font(bfChinese, 22, Font.BOLD, BaseColor.BLACK);
Paragraph title_hmc = new Paragraph("添加中文段落",titlefontChinese);
title_hmc.setAlignment(Element.ALIGN_CENTER);
title_hmc.setSpacingBefore(30f);
title_hmc.setSpacingAfter(20f);
document.add(title_hmc);  //中文段落添加成功


//添加新的空白页
document.newPage();
writer.setPageEmpty(true); //显示空白页

/*Chunk:块对象,可配置字符间距、字符+背景色、背景色的矩形大小可任意调整*/
document.newPage();
document.add(new Chunk("中文输出: ", getChineseFont()));
Chunk tChunk2 = new Chunk("输出的内容", getChineseFont());
tChunk2.setBackground(BaseColor.CYAN, 1f, 0.5f, 1f, 1.5f); // 设置背景色
tChunk2.setTextRise(6); // 上浮
tChunk2.setUnderline(0.2f, -2f); // 下划线
document.add(tChunk2);
document.add(Chunk.NEWLINE); // 新建一行

/*Phrase:短语可配置行间距、不会另起一行*/
document.newPage();
document.add(new Phrase("Phrase: "));
Phrase tPhrase = new Phrase();
Chunk name = new Chunk("Chunk1");
name.setUnderline(0.2f, -2f);
tPhrase.add(name);
tPhrase.add(Chunk.NEWLINE);// 放在容器中好用
tPhrase.add(new Chunk("换行Chunk: ", getChineseFont()));
tPhrase.add(new Chunk("Chunk2"));
tPhrase.setLeading(14f);// 行间距
document.add(tPhrase);

/*Paragraph:段落*/
document.newPage();
Paragraph info = new Paragraph("New page");
info.setLeading(20f); //设置行距
info.setSpacingBefore(5f);// 设置段落上空白
info.setSpacingAfter(10f);// 设置段落下空白
info.setFirstLineIndent(24);// 首行缩进
info.setIndentationLeft(12);// 左缩进
info.setIndentationRight(12);// 右缩进
info.setAlignment(Element.ALIGN_CENTER);  //设置居中
document.add(info);

/*Image:图片,继承自Rectangle,scaleToFit设置大小,setAbsolutePosition设置绝对位置*/
document.newPage();
Image img = Image.getInstance("C:\\Users\\Administrator\\Pictures\\img10B6-36.jpg");
img.setAlignment(Image.LEFT);  //对齐方式
img.setBorder(Image.BOX);  //边框
img.setBorderWidth(10);  //边框宽度
img.setBorderColor(BaseColor.WHITE);  //边框颜色
img.scaleToFit(800, 600);// 大小
img.setRotationDegrees(-3);// 旋转
document.add(img);

/*Anchor:超链接和锚点对象*/
document.newPage();
Paragraph paragraph = new Paragraph();
Anchor anchor = new Anchor("锚点文字", getChineseFont());
anchor.setName("achorName"); // 设置锚点的名字
anchor.setReference("http://www.baidu.com");// 连接
paragraph.add(anchor);
paragraph.add(String.format(": %d sites", 10000));
document.add(paragraph);

//关闭document
document.close();

表格

Document document = new Document(PageSize.A4.rotate());
//解析器
PdfWriter writer= PdfWriter.getInstance(document, new FileOutputStream("D://pdftable.pdf"));
/*页边距*/
document.setMargins(10, 20, 30, 40);
//打开document
document.open();

/*table:表格*/
document.newPage();
//中文字体
BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font fontChinese = new Font(bfChinese, 12, Font.NORMAL);

int colNumber = 6;
// 创建有6列的表格
PdfPTable datatable = new PdfPTable(colNumber);
// 定义表格的宽度
int[] cellsWidth = { 1, 1, 1, 1, 1, 1 };
datatable.setWidths(cellsWidth);// 单元格宽度
//datatable.setTotalWidth(300f);//表格的总宽度
//datatable.setWidthPercentage(100);// 表格的宽度百分比
datatable.getDefaultCell().setPadding(2);// 单元格的间隔
datatable.getDefaultCell().setBorderWidth(2);// 边框宽度
//设置表格的底色
datatable.getDefaultCell().setBackgroundColor(BaseColor.GREEN);
datatable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
//跨行跨列表格
PdfPCell pdfPCell; // 单元格
/*跨列*/
pdfPCell = new PdfPCell(new Phrase("大标题--跨6列", getChineseFont()));
pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //水平居中
pdfPCell.setColspan(6);// 跨3列
datatable.addCell(pdfPCell);
/*跨行*/
pdfPCell = new PdfPCell(new Phrase("标题一跨2行", getChineseFont()));
pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //水平居中
pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
pdfPCell.setRowspan(2);// 跨2行
datatable.addCell(pdfPCell);
pdfPCell = new PdfPCell(new Phrase("标题二跨2行", getChineseFont()));
pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //水平居中
pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
pdfPCell.setRowspan(2);// 跨2行
datatable.addCell(pdfPCell);
pdfPCell = new PdfPCell(new Phrase("标题三跨2行", getChineseFont()));
pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //居中
pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
pdfPCell.setColspan(2);// 跨3列
pdfPCell.setRowspan(1);// 跨2行
datatable.addCell(pdfPCell);
pdfPCell = new PdfPCell(new Phrase("标题四跨2行", getChineseFont()));
pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //居中
pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
pdfPCell.setRowspan(2);// 跨2行
datatable.addCell(pdfPCell);
pdfPCell = new PdfPCell(new Phrase("标题五跨2行", getChineseFont()));
pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //居中
pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
pdfPCell.setRowspan(2);// 跨2行
datatable.addCell(pdfPCell);
pdfPCell = new PdfPCell(new Phrase("3子标题", getChineseFont()));
pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //居中
datatable.addCell(pdfPCell);
datatable.addCell(pdfPCell);
// 添加表头元素
for (int i = 0; i < colNumber; i++) {
    datatable.addCell(new Paragraph("中文内容"+i, fontChinese));
}
// 添加表格的内容
for (int i = 0; i < colNumber; i++) {
    datatable.addCell(new Paragraph("Content"+i, fontChinese));
}
// 空白表格
for (int i = 0; i < colNumber; i++) {
    PdfPCell cell = new PdfPCell(new Paragraph(""));  //设置内容为空的表格
    cell.setFixedHeight(10);// 单元格高度
    datatable.addCell(cell);  //添加到表格
}
datatable.setSpacingAfter(40f);// 设置表格下面空白行
document.add(datatable);// 把表格加入文档

//关闭document
document.close();

获取默认字体

/**
 * 获取中国字体
 * @return
 */
public static Font getChineseFont() {
    BaseFont bfChinese;  //确认支持中文
    Font fontChinese = null;  //字体的设置,如颜色,字体,大小等
    try {
        bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        // fontChinese = new Font(bfChinese, 12, Font.NORMAL);
        fontChinese = new Font(bfChinese, 12, Font.NORMAL, BaseColor.BLACK);
    } catch (DocumentException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return fontChinese;
}

合并PDF

/** 合並pdf文件
 * @param files 要合並文件数组(绝对路劲{ "D:\\a1.pdf", "D:\\a2.pdf" })
 * @param savepath 合并后新产生的文件绝对路径如D:\\a.pdf
 */
public static void mergePdfFiles(String[] files, String savepath){
    try {
        //创建一个与a.pdf相同纸张大小的document
        /*PdfReader pdfReader = new PdfReader(files[0]);
        Rectangle pageSize = pdfReader.getPageSize(1);
        pdfReader.close(); //关闭流,不然会一直占用*/
        //创建A4大小的document
        Document document = new Document(PageSize.A4);
        PdfCopy copy = new PdfCopy(document, new FileOutputStream(savepath));
        document.open();
        for (int i = 0; i < files.length; i++) {  //遍历文件路径集合
            //一个一个的遍历现有的PDF
            PdfReader reader = null;  //获取文件
            try {
                reader = new PdfReader(files[i]);
            } catch (IOException e) {
                continue;  //如果文件不存在,则继续合并下一个文件
            }
            int n = reader.getNumberOfPages();  //获取文件总页数

            for (int j = 1; j <= n; j++) {  //遍历页数,放入document
                document.newPage();  //新页
                PdfImportedPage page = copy.getImportedPage(reader, j);  //从文件中的指定页码拿出page
                copy.addPage(page);  //将page放入PdfCopy
            }
            reader.close();  //关闭流
        }
        document.close();

    }catch (DocumentException e) {
        e.printStackTrace();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
}

添加水印

/**
 * 给pdf文件添加水印
 * @param InPdfFile 要加水印的原pdf文件路径
 * @param outPdfFile 加了水印后要输出的路径
 * @param textMark 水印文字
 * @param textWidth 文字横坐标
 * @param textHeight 文字纵坐标
 * @throws Exception
 */
public static void addPdfTextMark(String InPdfFile, String outPdfFile, String textMark,int textWidth,
                                  int textHeight) throws Exception {
    PdfReader reader = new PdfReader(InPdfFile, "PDF".getBytes());
    PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(new File(outPdfFile)));
    PdfContentByte under;
    BaseFont font = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1", "Identity-H", true);// 使用系统字体
    int pageSize = reader.getNumberOfPages();// 原pdf文件的总页数
    for(int i = 1; i <= pageSize; i++) {
        under = stamp.getUnderContent(i);// 水印在之前文本下
        // under = stamp.getOverContent(i);//水印在之前文本上
        under.beginText();
        under.setColorFill(BaseColor.GRAY);// 文字水印 颜色
        under.setFontAndSize(font, 38);// 文字水印 字体及字号
        under.setTextMatrix(textWidth, textHeight);// 文字水印 起始位置
        under.showTextAligned(Element.ALIGN_CENTER, textMark, textWidth, textHeight, 45);
        under.endText();
    }
    stamp.close();// 关闭
}


/**
 * 给pdf文件添加图片水印
 * @param InPdfFile 要加水印的原pdf文件路径
 * @param outPdfFile 加了水印后要输出的路径
 * @param markImagePath 水印图片路径
 * @param imgWidth 图片横坐标
 * @param imgHeight 图片纵坐标
 * @throws Exception
 */
public static void addPdfImgMark(String InPdfFile, String outPdfFile, String markImagePath,int imgWidth, int imgHeight) throws Exception {
    PdfReader reader = new PdfReader(InPdfFile, "PDF".getBytes());
    PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(new File(outPdfFile)));

    PdfContentByte under;
    PdfGState gs1 = new PdfGState();
    gs1.setFillOpacity(0.3f);// 透明度设置
    Image img = Image.getInstance(markImagePath);// 插入图片水印
    img.setAbsolutePosition(imgWidth, imgHeight); // 坐标
    img.setRotation(-20);// 旋转 弧度
    img.setRotationDegrees(45);// 旋转 角度
    // img.scaleAbsolute(200,100);//自定义大小
    // img.scalePercent(50);//依照比例缩放

    int pageSize = reader.getNumberOfPages();// 原pdf文件的总页数
    for(int i = 1; i <= pageSize; i++) {
        under = stamp.getUnderContent(i);// 水印在之前文本下
        // under = stamp.getOverContent(i);//水印在之前文本上
        under.setGState(gs1);// 图片水印 透明度
        under.addImage(img);// 图片水印
    }

    stamp.close();// 关闭
    // // 删除不带水印文件
    //File tempfile = new File(InPdfFile);
    //	if(tempfile.exists()) {
    //	tempfile.delete();
    //}
}

//new一个Document对象,设置纸张大小
Document document = new Document(PageSize.A4);
//解析器
PdfWriter writer= PdfWriter.getInstance(document, new FileOutputStream("D://pdfText.pdf"));
//添加PDF属性
/document.addAuthor("作者");
document.addTitle("标题");
document.addSubject("主题");
document.addKeywords("关键字");
/
/页边距/
document.setMargins(10, 20, 30, 40);

//打开document
document.open();

//添加新段落
document.add(new Paragraph("Hello world"));

//添加新的空白页
document.newPage();
writer.setPageEmpty(true); //显示空白页

/Chunk:块对象,可配置字符间距、字符+背景色、背景色的矩形大小可任意调整/
document.newPage();
document.add(new Chunk("中文输出: ", getChineseFont()));
Chunk tChunk2 = new Chunk("输出的内容", getChineseFont());
tChunk2.setBackground(BaseColor.CYAN, 1f, 0.5f, 1f, 1.5f); // 设置背景色
tChunk2.setTextRise(6); // 上浮
tChunk2.setUnderline(0.2f, -2f); // 下划线
document.add(tChunk2);
document.add(Chunk.NEWLINE); // 新建一行

/Phrase:短语可配置行间距、不会另起一行/
document.newPage();
document.add(new Phrase("Phrase: "));
Phrase tPhrase = new Phrase();
Chunk name = new Chunk("Chunk1");
name.setUnderline(0.2f, -2f);
tPhrase.add(name);
tPhrase.add(Chunk.NEWLINE);// 放在容器中好用
tPhrase.add(new Chunk("换行Chunk: ", getChineseFont()));
tPhrase.add(new Chunk("Chunk2"));
tPhrase.setLeading(14f);// 行间距
document.add(tPhrase);

/Paragraph:段落/
document.newPage();
Paragraph info = new Paragraph("New page");
info.setLeading(20f); //设置行距
info.setSpacingBefore(5f);// 设置段落上空白
info.setSpacingAfter(10f);// 设置段落下空白
info.setFirstLineIndent(24);// 首行缩进
info.setIndentationLeft(12);// 左缩进
info.setIndentationRight(12);// 右缩进
info.setAlignment(Element.ALIGN_CENTER); //设置居中
document.add(info);

/Image:图片,继承自Rectangle,scaleToFit设置大小,setAbsolutePosition设置绝对位置/
document.newPage();
Image img = Image.getInstance("C:\Users\Administrator\Pictures\img10B6-36.jpg");
img.setAlignment(Image.LEFT); //对齐方式
img.setBorder(Image.BOX); //边框
img.setBorderWidth(10); //边框宽度
img.setBorderColor(BaseColor.WHITE); //边框颜色
img.scaleToFit(800, 600);// 大小
img.setRotationDegrees(-3);// 旋转
document.add(img);

/Anchor:超链接和锚点对象/
document.newPage();
Paragraph paragraph = new Paragraph();
Anchor anchor = new Anchor("锚点文字", getChineseFont());
anchor.setName("achorName"); // 设置锚点的名字
anchor.setReference("http://www.baidu.com");// 连接
paragraph.add(anchor);
paragraph.add(String.format(": %d sites", 10000));
document.add(paragraph);

//关闭document
document.close();

### 表格

​```java
Document document = new Document(PageSize.A4.rotate());
//解析器
PdfWriter writer= PdfWriter.getInstance(document, new FileOutputStream("D://pdftable.pdf"));
/*页边距*/
document.setMargins(10, 20, 30, 40);
//打开document
document.open();

/*table:表格*/
document.newPage();
//中文字体
BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
Font fontChinese = new Font(bfChinese, 12, Font.NORMAL);

int colNumber = 6;
// 创建有6列的表格
PdfPTable datatable = new PdfPTable(colNumber);
// 定义表格的宽度
int[] cellsWidth = { 1, 1, 1, 1, 1, 1 };
datatable.setWidths(cellsWidth);// 单元格宽度
//datatable.setTotalWidth(300f);//表格的总宽度
//datatable.setWidthPercentage(100);// 表格的宽度百分比
datatable.getDefaultCell().setPadding(2);// 单元格的间隔
datatable.getDefaultCell().setBorderWidth(2);// 边框宽度
//设置表格的底色
datatable.getDefaultCell().setBackgroundColor(BaseColor.GREEN);
datatable.getDefaultCell().setHorizontalAlignment(Element.ALIGN_CENTER);
//跨行跨列表格
PdfPCell pdfPCell; // 单元格
/*跨列*/
pdfPCell = new PdfPCell(new Phrase("大标题--跨6列", getChineseFont()));
pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //水平居中
pdfPCell.setColspan(6);// 跨3列
datatable.addCell(pdfPCell);
/*跨行*/
pdfPCell = new PdfPCell(new Phrase("标题一跨2行", getChineseFont()));
pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //水平居中
pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
pdfPCell.setRowspan(2);// 跨2行
datatable.addCell(pdfPCell);
pdfPCell = new PdfPCell(new Phrase("标题二跨2行", getChineseFont()));
pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //水平居中
pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
pdfPCell.setRowspan(2);// 跨2行
datatable.addCell(pdfPCell);
pdfPCell = new PdfPCell(new Phrase("标题三跨2行", getChineseFont()));
pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //居中
pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
pdfPCell.setColspan(2);// 跨3列
pdfPCell.setRowspan(1);// 跨2行
datatable.addCell(pdfPCell);
pdfPCell = new PdfPCell(new Phrase("标题四跨2行", getChineseFont()));
pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //居中
pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
pdfPCell.setRowspan(2);// 跨2行
datatable.addCell(pdfPCell);
pdfPCell = new PdfPCell(new Phrase("标题五跨2行", getChineseFont()));
pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //居中
pdfPCell.setVerticalAlignment(Element.ALIGN_MIDDLE);  //垂直居中
pdfPCell.setRowspan(2);// 跨2行
datatable.addCell(pdfPCell);
pdfPCell = new PdfPCell(new Phrase("3子标题", getChineseFont()));
pdfPCell.setHorizontalAlignment(Element.ALIGN_CENTER);  //居中
datatable.addCell(pdfPCell);
datatable.addCell(pdfPCell);
// 添加表头元素
for (int i = 0; i < colNumber; i++) {
    datatable.addCell(new Paragraph("中文内容"+i, fontChinese));
}
// 添加表格的内容
for (int i = 0; i < colNumber; i++) {
    datatable.addCell(new Paragraph("Content"+i, fontChinese));
}
// 空白表格
for (int i = 0; i < colNumber; i++) {
    PdfPCell cell = new PdfPCell(new Paragraph(""));  //设置内容为空的表格
    cell.setFixedHeight(10);// 单元格高度
    datatable.addCell(cell);  //添加到表格
}
datatable.setSpacingAfter(40f);// 设置表格下面空白行
document.add(datatable);// 把表格加入文档

//关闭document
document.close();

获取默认字体

/**
 * 获取中国字体
 * @return
 */
public static Font getChineseFont() {
    BaseFont bfChinese;  //确认支持中文
    Font fontChinese = null;  //字体的设置,如颜色,字体,大小等
    try {
        bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        // fontChinese = new Font(bfChinese, 12, Font.NORMAL);
        fontChinese = new Font(bfChinese, 12, Font.NORMAL, BaseColor.BLACK);
    } catch (DocumentException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    return fontChinese;
}

合并PDF

/** 合並pdf文件
 * @param files 要合並文件数组(绝对路劲{ "D:\\a1.pdf", "D:\\a2.pdf" })
 * @param savepath 合并后新产生的文件绝对路径如D:\\a.pdf
 */
public static void mergePdfFiles(String[] files, String savepath) throws Exception{
    try {
        //创建一个与a.pdf相同纸张大小的document
        /*PdfReader pdfReader = new PdfReader(files[0]);
        Rectangle pageSize = pdfReader.getPageSize(1);
        pdfReader.close(); //关闭流,不然会一直占用*/
        //创建A4大小的document
        Document document = new Document(PageSize.A4);
        PdfCopy copy = new PdfCopy(document, new FileOutputStream(savepath));
        document.open();
        for (int i = 0; i < files.length; i++) {  //遍历文件路径集合
            //一个一个的遍历现有的PDF
            PdfReader reader = new PdfReader(files[i]);  //获取文件
            int n = reader.getNumberOfPages();  //获取文件总页数

            for (int j = 1; j <= n; j++) {  //遍历页数,放入document
                document.newPage();  //新页
                PdfImportedPage page = copy.getImportedPage(reader, j);  //从文件中的指定页码拿出page
                copy.addPage(page);  //将page放入PdfCopy
            }
            reader.close();  //关闭流
        }
        document.close();

    } catch (IOException e) {
        e.printStackTrace();
    } catch (DocumentException e) {
        e.printStackTrace();
    }
}

添加水印

/**
 * 给pdf文件添加水印
 * @param InPdfFile 要加水印的原pdf文件路径
 * @param outPdfFile 加了水印后要输出的路径
 * @param textMark 水印文字
 * @param textWidth 文字横坐标
 * @param textHeight 文字纵坐标
 * @throws Exception
 */
public static void addPdfTextMark(String InPdfFile, String outPdfFile, String textMark,int textWidth,
                                  int textHeight) throws Exception {
    PdfReader reader = new PdfReader(InPdfFile, "PDF".getBytes());
    PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(new File(outPdfFile)));
    PdfContentByte under;
    BaseFont font = BaseFont.createFont("C:/WINDOWS/Fonts/SIMSUN.TTC,1", "Identity-H", true);// 使用系统字体
    int pageSize = reader.getNumberOfPages();// 原pdf文件的总页数
    for(int i = 1; i <= pageSize; i++) {
        under = stamp.getUnderContent(i);// 水印在之前文本下
        // under = stamp.getOverContent(i);//水印在之前文本上
        under.beginText();
        under.setColorFill(BaseColor.GRAY);// 文字水印 颜色
        under.setFontAndSize(font, 38);// 文字水印 字体及字号
        under.setTextMatrix(textWidth, textHeight);// 文字水印 起始位置
        under.showTextAligned(Element.ALIGN_CENTER, textMark, textWidth, textHeight, 45);
        under.endText();
    }
    stamp.close();// 关闭
}


/**
 * 给pdf文件添加图片水印
 * @param InPdfFile 要加水印的原pdf文件路径
 * @param outPdfFile 加了水印后要输出的路径
 * @param markImagePath 水印图片路径
 * @param imgWidth 图片横坐标
 * @param imgHeight 图片纵坐标
 * @throws Exception
 */
public static void addPdfImgMark(String InPdfFile, String outPdfFile, String markImagePath,int imgWidth, int imgHeight) throws Exception {
    PdfReader reader = new PdfReader(InPdfFile, "PDF".getBytes());
    PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(new File(outPdfFile)));

    PdfContentByte under;
    PdfGState gs1 = new PdfGState();
    gs1.setFillOpacity(0.3f);// 透明度设置
    Image img = Image.getInstance(markImagePath);// 插入图片水印
    img.setAbsolutePosition(imgWidth, imgHeight); // 坐标
    img.setRotation(-20);// 旋转 弧度
    img.setRotationDegrees(45);// 旋转 角度
    // img.scaleAbsolute(200,100);//自定义大小
    // img.scalePercent(50);//依照比例缩放

    int pageSize = reader.getNumberOfPages();// 原pdf文件的总页数
    for(int i = 1; i <= pageSize; i++) {
        under = stamp.getUnderContent(i);// 水印在之前文本下
        // under = stamp.getOverContent(i);//水印在之前文本上
        under.setGState(gs1);// 图片水印 透明度
        under.addImage(img);// 图片水印
    }

    stamp.close();// 关闭
    // // 删除不带水印文件
    //File tempfile = new File(InPdfFile);
    //	if(tempfile.exists()) {
    //	tempfile.delete();
    //}
}
posted @ 2021-02-07 11:44  秋夜雨巷  阅读(2307)  评论(0编辑  收藏  举报