Java使用itextpdf實(shí)現(xiàn)生成PDF并添加圖片,水印和文字
一、概述
在上一篇博客中,介紹了excel轉(zhuǎn)pdf的方法;在這里,整理了一些方法:在生成pdf時(shí),插入圖片、新增水印、添加文字等。
二、依賴(lài)
依賴(lài)和上一篇博客相同,在這里不再贅述。
三、相關(guān)工具類(lèi)
1. FontGenerater.java (在上篇博客中,已貼出)
2. Excel2Pdf.java (在上篇博客中,已貼出)
3. PDFUtil.java
public class PDFUtil {
/**
* 給pdf添加圖片水印
* @param waterMar
* @param imgpath 圖片路徑
* @throws Exception
*/
public static void addImgWaterMark(PdfContentByte waterMar, String imgpath) throws Exception {
waterMar.beginText();
PdfGState gs = new PdfGState();
// 設(shè)置填充字體不透明度為0.4f
gs.setFillOpacity(0.2f);
waterMar.setFontAndSize(FontGenerater.getFont(FontGenerater.FONT_SONTI_NAME), 40);
// 設(shè)置透明度
waterMar.setGState(gs);
// 設(shè)置水印對(duì)齊方式 水印內(nèi)容 X坐標(biāo) Y坐標(biāo) 旋轉(zhuǎn)角度
Image img = Image.getInstance(imgpath);
img.setAbsolutePosition(200, 380);
img.scaleAbsolute(200, 200);
waterMar.addImage(img);
// 設(shè)置水印顏色
waterMar.setColorFill(BaseColor.GRAY);
//結(jié)束設(shè)置
waterMar.endText();
waterMar.stroke();
}
/**
* 給pdf添加文字水?。ㄆ戒仯?
* @param waterMar
* @param text 水印文本
* @throws Exception
*/
public static void addTextFullWaterMark(PdfContentByte waterMar, String text) throws Exception {
waterMar.beginText();
PdfGState gs = new PdfGState();
// 設(shè)置填充字體不透明度為0.4f
gs.setFillOpacity(0.2f);
waterMar.setFontAndSize(FontGenerater.getFont(FontGenerater.FONT_SONTI_NAME), 40);
// 設(shè)置透明度
waterMar.setGState(gs);
// 設(shè)置水印對(duì)齊方式 水印內(nèi)容 X坐標(biāo) Y坐標(biāo) 旋轉(zhuǎn)角度
for (int x = 0; x <= 700; x += 200) {
for (int y = 0; y <= 800; y += 200) {
waterMar.showTextAligned(Element.ALIGN_RIGHT, text, x, y, 35);
}
}
// 設(shè)置水印顏色
waterMar.setColorFill(BaseColor.GRAY);
//結(jié)束設(shè)置
waterMar.endText();
waterMar.stroke();
}
/**
* 給pdf添加文字水?。▎蝹€(gè))
* @param waterMar
* @param text 水印文本
* @throws Exception
*/
public static void addTextWaterMark(PdfContentByte waterMar, String text) throws Exception {
waterMar.beginText();
PdfGState gs = new PdfGState();
// 設(shè)置填充字體不透明度為0.4f
gs.setFillOpacity(0.2f);
waterMar.setFontAndSize(FontGenerater.getFont(FontGenerater.FONT_SONTI_NAME), 80);
// 設(shè)置透明度
waterMar.setGState(gs);
// 設(shè)置水印對(duì)齊方式 水印內(nèi)容 X坐標(biāo) Y坐標(biāo) 旋轉(zhuǎn)角度
waterMar.showTextAligned(Element.ALIGN_RIGHT, text, 475, 600, 45);
// 設(shè)置水印顏色
waterMar.setColorFill(BaseColor.GRAY);
//結(jié)束設(shè)置
waterMar.endText();
waterMar.stroke();
}
/**
* 添加頁(yè)眉、頁(yè)腳
* @param writer
* @param content
* @param pagewidth
* @param pageheight
* @throws Exception
*/
public static void addText(PdfWriter writer, String content, int pagewidth, int pageheight) throws Exception {
PdfPTable table = new PdfPTable(1);
table.setTotalWidth(530);
PdfPCell cell = new PdfPCell(new Phrase(content, Excel2Pdf.getFont(FontGenerater.FONT_SONTI_NAME, 12, false)));
cell.setBorder(0);
// cell.setPaddingLeft(30f);
cell.setPaddingTop(-15f);
cell.setPaddingRight(20f);
table.addCell(cell);
Header event = new Header(table, pagewidth, pageheight);
writer.setPageEvent(null);
writer.setPageEvent(event);
}
//頁(yè)眉事件
private static class Header extends PdfPageEventHelper {
public static PdfPTable header;
public int pagewidth;
public int pageheight;
public Header(PdfPTable header, int pagewidth, int pageheight) {
Header.header = header;
this.pagewidth = pagewidth;
this.pageheight = pageheight;
}
@Override
public void onEndPage(PdfWriter writer, Document document) {
//把頁(yè)眉表格定位
header.writeSelectedRows(0, -1, this.pagewidth, this.pageheight, writer.getDirectContent());
}
}
/**
* 添加圖片
* @param document
* @param imgPath
* @param newWidth
* @param newHeight
* @param absoluteX
* @param absoluteY
* @throws IOException
* @throws DocumentException
*/
public static void addImg(Document document, String imgPath, float newWidth, float newHeight,
float absoluteX, float absoluteY) throws IOException, DocumentException {
Image img1 = Image.getInstance(imgPath);
img1.setAbsolutePosition(absoluteX, absoluteY);
img1.scaleAbsolute(newWidth, newHeight);
document.add(img1);
}
}
四、示例
1.添加圖片水印
// A4大小
RectangleReadOnly shuban = new RectangleReadOnly(PageSize.A4);
Document document = new Document(shuban);
// 獲取一個(gè)pdfwriter實(shí)例
FileOutputStream stream = new FileOutputStream("D:\\website\\demo.pdf");
PdfWriter writer = PdfWriter.getInstance(document, stream);
// 打開(kāi)document
document.open();
// 新增頁(yè)
document.newPage();
// **************添加水印**************
PdfContentByte waterMar = writer.getDirectContentUnder();
PDFUtil.addImgWaterMark(waterMar, "D:\\website\\java.png");
// **************完成圖片水印添加***********
// 關(guān)閉
document.close();
writer.close();
stream.close();

添加圖片水印示例
2.添加平鋪的文字水印
// **************添加平鋪的文字水印************** PdfContentByte waterMar = writer.getDirectContentUnder(); String text = "這是一個(gè)示例"; PDFUtil.addTextFullWaterMark(waterMar, text); // **************完成水印***********************

添加平鋪的文字水印示例
3.添加單個(gè)文字水印
// **************添加單個(gè)的文字水印************** PdfContentByte waterMar = writer.getDirectContentUnder(); String text = "這是一個(gè)示例"; PDFUtil.addTextWaterMark(waterMar, text); // **************完成水印***********************

添加單個(gè)文字水印示例
4.插入文字、圖片
// 插入文字,最后兩個(gè)參數(shù)是文字的位置 PDFUtil.addText(writer, "這是一段文字", 480, 802); // 插入圖片,第二、三個(gè)參數(shù)表示圖片寬高,第四、五個(gè)參數(shù)表示位置 PDFUtil.addImg(document, "D:\\website\\start.png", 100, 100, 70, 700);

插入文字、圖片示例
以上就是Java使用itextpdf實(shí)現(xiàn)生成PDF并添加圖片,水印和文字的詳細(xì)內(nèi)容,更多關(guān)于Java itextpdf生成PDF的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Mybatis plus實(shí)現(xiàn)Distinct去重功能
這篇文章主要介紹了Mybatis plus實(shí)現(xiàn)Distinct去重功能,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-12-12
Spring?Boot多數(shù)據(jù)源事務(wù)@DSTransactional的使用詳解
本文主要介紹了Spring?Boot多數(shù)據(jù)源事務(wù)@DSTransactional的使用詳解,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2023-06-06
mybatis中oracle實(shí)現(xiàn)分頁(yè)效果實(shí)例代碼
實(shí)現(xiàn)分頁(yè)的方式有很多,但常用的是通過(guò)SQL來(lái)顯示分頁(yè)。這篇文章主要介紹了mybatis中oracle實(shí)現(xiàn)分頁(yè)效果實(shí)例代碼,有興趣的可以了解一下。2017-04-04
Java 線程安全與 volatile與單例模式問(wèn)題及解決方案
文章主要講解線程安全問(wèn)題的五個(gè)成因(調(diào)度隨機(jī)、變量修改、非原子操作、內(nèi)存可見(jiàn)性、指令重排序)及解決方案,強(qiáng)調(diào)使用volatile關(guān)鍵字可同時(shí)解決內(nèi)存可見(jiàn)性和指令重排問(wèn)題,并結(jié)合單例模式中的餓漢與懶漢實(shí)現(xiàn)方式分析線程安全的處理,感興趣的朋友一起看看吧2025-06-06
@Transactional注解異常報(bào)錯(cuò)之多數(shù)據(jù)源詳解
這篇文章主要介紹了@Transactional注解異常報(bào)錯(cuò)之多數(shù)據(jù)源詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-01-01
Mybatis-Plus雪花id的使用以及解析機(jī)器ID和數(shù)據(jù)標(biāo)識(shí)ID實(shí)現(xiàn)
這篇文章主要介紹了Mybatis-Plus雪花id的使用以及解析機(jī)器ID和數(shù)據(jù)標(biāo)識(shí)ID實(shí)現(xiàn),文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08
Spring Security結(jié)合JWT的方法教程
這篇文章主要給大家介紹了關(guān)于Spring Security結(jié)合JWT的方法教程,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧。2017-12-12
Java將字符串String轉(zhuǎn)換為整型Int的兩種方式
這篇文章主要介紹了Java如何將字符串String轉(zhuǎn)換為整型Int,在 Java 中要將 String 類(lèi)型轉(zhuǎn)化為 int 類(lèi)型時(shí),需要使用 Integer 類(lèi)中的 parseInt() 方法或者 valueOf() 方法進(jìn)行轉(zhuǎn)換,本文通過(guò)實(shí)例代碼給大家詳細(xì)講解,需要的朋友可以參考下2023-04-04
java圖論普利姆及克魯斯卡算法解決最小生成樹(shù)問(wèn)題詳解
這篇文章主要為大家介紹了java圖論普利姆算法及克魯斯卡算法解決最小生成樹(shù)問(wèn)題的示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助2021-11-11
Java微信掃碼登錄功能并實(shí)現(xiàn)認(rèn)證授權(quán)全過(guò)程
這篇文章主要給大家介紹了關(guān)于Java微信掃碼登錄功能并實(shí)現(xiàn)認(rèn)證授權(quán)的相關(guān)資料,要在Java中實(shí)現(xiàn)微信掃碼登錄,您可以按照以下步驟進(jìn)行操作,文中通過(guò)代碼介紹的非常詳細(xì),需要的朋友可以參考下2023-10-10

