Java批量向PDF文件中添加圖像水印實現(xiàn)細節(jié)
水印一般用于標注文檔的版權(quán)信息、作者、所屬機構(gòu)或者文檔屬性等。不同于文本批注等,文字水印是繪制到頁面中的元素,所以不會被輕易刪除。因此,水印也是一種很好的防偽手段。水印又分為文本水印和圖片水印兩種。之前已經(jīng)介紹過向PDF中添加文本水印的方法。這次,我將分享通過Java代碼給PDF文檔添加圖像水印的具體方法和示例代碼。使用到的工具是Free Spire.PDF for Java(免費版)。
程序環(huán)境
IntelliJ IDEA 2018 (jdk 1.8.0)
在進行操作之前先導入JAR包,請參考以下兩種導入方式:
方法一:如果您使用的是 maven,先創(chuàng)建maven項目。然后通過添加以下代碼來配置pom.xml 文件,再點擊Import Changes將 JAR文件導入到應用程序中。
<repositories> <repository> <id>com.e-iceblue</id> <name>e-iceblue</name> <url>https://repo.e-iceblue.cn/repository/maven-public/</url> </repository> </repositories> <dependencies> <dependency> <groupId>e-iceblue</groupId> <artifactId>spire.pdf.free</artifactId> <version>5.1.0</version> </dependency> </dependencies>
方法二:如果您沒有使用 maven,則可以從此鏈接下載Free Spire.PDF for Java,找到lib文件夾下的Spire.Pdf.jar并進行解壓;然后在IDEA中創(chuàng)建一個新項目,依次點擊“文件”(File),“項目結(jié)構(gòu)”(Project Structure),“組件”(Modules),“依賴項”(Dependencies),再點擊右方綠色“+”下的第一個選項“JAR文件或路徑”(JARs or Directories),找到解壓后的Spire.Pdf.jar 文件,點擊確認,將其導入到項目中。
單個圖像水印
代碼介紹:
首先,創(chuàng)建一個新的PdfDocument對象。接著,使用loadFromFile()方法從磁盤上載入PDF文檔和要嵌入的圖片。然后,循環(huán)遍歷所有頁面以插入水印。對于每個頁面,獲取頁面的寬度和高度,并設(shè)置圖片的透明度和初始坐標。使用drawImage()方法在頁面的中間位置繪制水印圖片。最后,使用saveToFile()方法指定要保存的文件名和文件格式,并將修改后的PDF文檔保存在磁盤上。
完整代碼:
import com.spire.pdf.PdfDocument; import com.spire.pdf.PdfPageBase; import com.spire.pdf.graphics.PdfImage; public class insertSingleImageWatermark { public static void main(String[] args) { //創(chuàng)建PdfDocument類的對象 PdfDocument pdf = new PdfDocument(); //載入PDF文檔 pdf.loadFromFile("sample.pdf"); //載入圖片 PdfImage image = PdfImage.fromFile("image.png"); //獲取圖片的寬度和高度用于計算插入水印的初始坐標 int imageWidth = image.getWidth(); int imageHeight = image.getHeight(); //循環(huán)遍歷所有頁面以插入水印 for (int i = 0; i < pdf.getPages().getCount(); i++) { //獲取一個頁面 PdfPageBase page = pdf.getPages().get(i); //獲取該頁面的寬度和高度,用于計算插入水印的初始坐標 float pageWidth = (float) (page.getActualSize().getWidth()); float pageHeight = (float) (page.getActualSize().getHeight()); //設(shè)置水印圖片的透明度 page.getCanvas().setTransparency(0.3f); //在頁面的中間位置繪制水印圖片 page.getCanvas().drawImage(image, pageWidth/2 - imageWidth/2, pageHeight/2 - imageHeight/2, imageWidth, imageHeight); } //保存文檔 pdf.saveToFile("result1.pdf"); } }
效果圖:
平鋪圖像水印
代碼解釋:
首先,創(chuàng)建一個新的PdfDocument對象。接著,使用loadFromFile()方法從磁盤上載入PDF文檔和要嵌入的圖片。然后,循環(huán)遍歷所有頁面以插入水印。對于每個頁面,使用自定義的insertImageWatermark()方法插入平鋪圖片水印。在insertImageWatermark()方法中,創(chuàng)建一個平鋪筆刷,并將圖片繪制在筆刷上。使用該平鋪筆刷繪制水印圖片,并通過drawRectangle()方法在頁面上繪制矩形并應用平鋪筆刷。最后,使用saveToFile()方法指定要保存的文件名和文件格式,最后保存文檔。
完整代碼:
import com.spire.pdf.PdfDocument; import com.spire.pdf.PdfPageBase; import com.spire.pdf.graphics.PdfImage; import com.spire.pdf.graphics.PdfTilingBrush; import java.awt.*; public class insertTiledImageWatermark { public static void main(String[] args) { //創(chuàng)建PdfDocument類的對象 PdfDocument pdf = new PdfDocument(); //載入PDF文檔 pdf.loadFromFile("sample.pdf"); //載入圖片 PdfImage image = PdfImage.fromFile("image.png"); //循環(huán)遍歷文檔頁面以插入水印 for (int i = 0; i < pdf.getPages().getCount(); i++ ) { //獲取一個頁面 PdfPageBase page = pdf.getPages().get(i); //使用自定義方法插入平鋪圖片水印 insertImageWatermark(page, image, 3, 3); } //保存文檔 pdf.saveToFile("result2.pdf"); } static void insertImageWatermark(PdfPageBase page, PdfImage image, int row, int column) { //創(chuàng)建一個平鋪筆刷 PdfTilingBrush brush = new PdfTilingBrush(new Dimension((int) (page.getActualSize().getWidth()/column), (int) (page.getActualSize().getHeight()/row))); brush.getGraphics().setTransparency(0.3f); brush.getGraphics().save(); brush.getGraphics().translateTransform(brush.getSize().getWidth()/2 - image.getWidth()/2, brush.getSize().getHeight()/2 - image.getHeight()/2); //將圖片繪制于筆刷 brush.getGraphics().drawImage(image, 0, 0); brush.getGraphics().restore(); //使用該平鋪筆刷繪制水印圖片 page.getCanvas().drawRectangle(brush, new Rectangle(new Point(0, 0), new Dimension((int) (page.getActualSize().getWidth()), (int) (page.getActualSize().getHeight())))); } }
效果圖:
以上就是Java 向PDF中添加圖像水印實現(xiàn)細節(jié)的詳細內(nèi)容,更多關(guān)于Java PDF添加圖像水印的資料請關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Spring Cloud Alibaba教程之Sentinel的使用
這篇文章主要介紹了Spring Cloud Alibaba教程之Sentinel的使用,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧2019-09-09使用@Autowired 注入RedisTemplate報錯的問題及解決
這篇文章主要介紹了使用@Autowired 注入RedisTemplate報錯的問題及解決方案,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2022-08-08synchronized及JUC顯式locks?使用原理解析
這篇文章主要為大家介紹了synchronized及JUC顯式locks?使用原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-12-12Spring中的@Conditional注解實現(xiàn)分析
這篇文章主要介紹了Spring中的@Conditional注解實現(xiàn)分析, @Conditional是Spring 4出現(xiàn)的注解,但是真正露出價值的是Spring Boot的擴展@ConditionalOnBean等,需要的朋友可以參考下2023-12-12基于SpringAI+DeepSeek實現(xiàn)流式對話功能
一般來說大模型的響應速度通常是很慢的,為了避免用戶用戶能夠耐心等待輸出的結(jié)果,我們通常會使用流式輸出一點點將結(jié)果輸出給用戶,那么問題來了,想要實現(xiàn)流式結(jié)果輸出,后端和前端要如何配合?下來本文給出具體的實現(xiàn)代碼,需要的朋友可以參考下2025-02-02Java中OkHttp 超時設(shè)置的實現(xiàn)
超時設(shè)置是網(wǎng)絡(luò)編程中不可忽視的一部分,本文就來介紹一下Java中OkHttp 超時設(shè)置的實現(xiàn),具有一定的參考價值,感興趣的可以了解一下2024-06-06SpringBoot的@ControllerAdvice處理全局異常詳解
這篇文章主要介紹了SpringBoot的@ControllerAdvice處理全局異常詳解,但有時卻往往會產(chǎn)生一些bug,這時候就破壞了返回數(shù)據(jù)的一致性,導致調(diào)用者無法解析,所以我們常常會定義一個全局的異常攔截器,需要的朋友可以參考下2024-01-01