<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          SpringBoot 實(shí)現(xiàn) PDF 添加水印有哪些方案?

          共 588字,需瀏覽 2分鐘

           ·

          2023-06-20 09:43

          程序員的成長(zhǎng)之路
          互聯(lián)網(wǎng)/程序員/技術(shù)/資料共享?
          關(guān)注


          閱讀本文大概需要 8 分鐘。

          來自:cnblogs.com/hushaojun/p/16285486.html

          簡(jiǎn)介

          PDF(Portable Document Format,便攜式文檔格式)是一種流行的文件格式,它可以在多個(gè)操作系統(tǒng)和應(yīng)用程序中進(jìn)行查看和打印。在某些情況下,我們需要對(duì) PDF 文件添加水印,以使其更具有辨識(shí)度或者保護(hù)其版權(quán)。本文將介紹如何使用 Spring Boot 來實(shí)現(xiàn) PDF 添加水印的方式。

          方式一:使用 Apache PDFBox 庫(kù)

          PDFBox 是一個(gè)流行的、免費(fèi)的、用 Java 編寫的庫(kù),它可以用來創(chuàng)建、修改和提取 PDF 內(nèi)容。PDFBox 提供了許多 API,包括添加文本水印的功能。

          添加 PDFBox 依賴

          首先,在?pom.xml?文件中添加 PDFBox 的依賴:


          ????org.apache.pdfbox
          ????pdfbox
          ????2.0.24

          添加水印

          在添加水印之前,需要讀取原始 PDF 文件:

          PDDocument?document?=?PDDocument.load(new?File("original.pdf"));

          然后,遍歷 PDF 中的所有頁(yè)面,并使用?PDPageContentStream?添加水印:

          //?遍歷?PDF?中的所有頁(yè)面
          for?(int?i?=?0;?i?????PDPage?page?=?document.getPage(i);
          ????PDPageContentStream?contentStream?=?new?PDPageContentStream(document,?page,?PDPageContentStream.AppendMode.APPEND,?true,?true);

          ????//?設(shè)置字體和字號(hào)
          ????contentStream.setFont(PDType1Font.HELVETICA_BOLD,?36);

          ????//?設(shè)置透明度
          ????contentStream.setNonStrokingColor(200,?200,?200);

          ????//?添加文本水印
          ????contentStream.beginText();
          ????contentStream.newLineAtOffset(100,?100);?//?設(shè)置水印位置
          ????contentStream.showText("Watermark");?//?設(shè)置水印內(nèi)容
          ????contentStream.endText();

          ????contentStream.close();
          }

          最后,需要保存修改后的 PDF 文件:

          document.save(new?File("output.pdf"));
          document.close();

          完整代碼

          下面是使用 PDFBox 來實(shí)現(xiàn) PDF 添加水印的完整代碼:

          import?org.apache.pdfbox.pdmodel.PDDocument;
          import?org.apache.pdfbox.pdmodel.PDPage;
          import?org.apache.pdfbox.pdmodel.PDPageContentStream;
          import?org.apache.pdfbox.pdmodel.font.PDType1Font;

          import?java.io.File;
          import?java.io.IOException;

          public?class?PdfBoxWatermark?{
          ????public?static?void?main(String[]?args)?throws?IOException?{
          ????????//?讀取原始?PDF?文件
          ????????PDDocument?document?=?PDDocument.load(new?File("original.pdf"));

          ????????//?遍歷?PDF?中的所有頁(yè)面
          ????????for?(int?i?=?0;?i?????????????PDPage?page?=?document.getPage(i);
          ????????????PDPageContentStream?contentStream?=?new?PDPageContentStream(document,?page,?PDPageContentStream.AppendMode.APPEND,?true,?true);

          ????????????//?設(shè)置字體和字號(hào)
          ????????????contentStream.setFont(PDType1Font.HELVETICA_BOLD,?36);

          ????????????//?設(shè)置透明度
          ????????????contentStream.setNonStrokingColor(200,?200,?200);

          ????????????//?添加文本水印
          ????????????contentStream.beginText();
          ????????????contentStream.newLineAtOffset(100,?100);?//?設(shè)置水印位置
          ????????????contentStream.showText("Watermark");?//?設(shè)置水印內(nèi)容
          ????????????contentStream.endText();

          ????????????contentStream.close();
          ????????}

          ????????//?保存修改后的?PDF?文件
          ????????document.save(new?File("output.pdf"));
          ????????document.close();
          ????}
          }

          方式二:使用 iText 庫(kù)

          iText 是一款流行的 Java PDF 庫(kù),它可以用來創(chuàng)建、讀取、修改和提取 PDF 內(nèi)容。iText 提供了許多 API,包括添加文本水印的功能。

          添加 iText 依賴

          在?pom.xml?文件中添加 iText 的依賴:


          ????com.itextpdf
          ????itextpdf
          ????5.5.13

          添加水印

          在添加水印之前,需要讀取原始 PDF 文件:

          PdfReader?reader?=?new?PdfReader("original.pdf");
          PdfStamper?stamper?=?new?PdfStamper(reader,?new?FileOutputStream("output.pdf"));

          然后,遍歷 PDF 中的所有頁(yè)面,并使用?PdfContentByte?添加水印:

          //?獲取?PDF?中的頁(yè)數(shù)
          int?pageCount?=?reader.getNumberOfPages();

          //?添加水印
          for?(int?i?=?1;?i?<=?pageCount;?i++)?{
          ????PdfContentByte?contentByte?=?stamper.getUnderContent(i);?//?或者?getOverContent()
          ????contentByte.beginText();
          ????contentByte.setFontAndSize(BaseFont.createFont(),?36f);
          ????contentByte.setColorFill(BaseColor.LIGHT_GRAY);
          ????contentByte.showTextAligned(Element.ALIGN_CENTER,?"Watermark",?300,?400,?45);
          ????contentByte.endText();
          }

          最后,需要保存修改后的 PDF 文件并關(guān)閉文件流:

          stamper.close();
          reader.close();

          完整代碼

          下面是使用 iText 來實(shí)現(xiàn) PDF 添加水印的完整代碼:

          import?com.itextpdf.text.*;
          import?com.itextpdf.text.pdf.*;

          import?java.io.FileOutputStream;
          import?java.io.IOException;

          public?class?ItextWatermark?{
          ????public?static?void?main(String[]?args)?throws?IOException,?DocumentException?{
          ????????//?讀取原始?PDF?文件
          ????????PdfReader?reader?=?new?PdfReader("original.pdf");
          ????????PdfStamper?stamper?=?new?PdfStamper(reader,?new?FileOutputStream("output.pdf"));

          ????????//?獲取?PDF?中的頁(yè)數(shù)
          ????????int?pageCount?=?reader.getNumberOfPages();

          ????????//?添加水印
          ????????for?(int?i?=?1;?i?<=?pageCount;?i++)?{
          ????????????PdfContentByte?contentByte?=?stamper.getUnderContent(i);?//?或者?getOverContent()
          ????????????contentByte.beginText();
          ????????????contentByte.setFontAndSize(BaseFont.createFont(),?36f);
          ????????????contentByte.setColorFill(BaseColor.LIGHT_GRAY);
          ????????????contentByte.showTextAligned(Element.ALIGN_CENTER,?"Watermark",?300,?400,?45);
          ????????????contentByte.endText();
          ????????}

          ????????//?保存修改后的?PDF?文件并關(guān)閉文件流
          ????????stamper.close();
          ????????reader.close();
          ????}
          }

          方式三:用 Ghostscript 命令行

          Ghostscript 是一款流行的、免費(fèi)的、開源的 PDF 處理程序,它可以用來創(chuàng)建、讀取、修改和提取 PDF 內(nèi)容。Ghostscript 中提供了命令行參數(shù)來添加水印。

          Ghostscript

          首先需要在本地安裝 Ghostscript 程序。可通過以下鏈接下載安裝包:
          • Windows[1]
          • macOS[2]
          • Linux[3]

          添加水印

          可以在終端中使用 Ghostscript 的命令行工具執(zhí)行以下命令來實(shí)現(xiàn):

          gs?-dBATCH?-dNOPAUSE?-sDEVICE=pdfwrite?-sOutputFile=output.pdf?-c?"newpath?/Helvetica-Bold?findfont?36?scalefont?setfont?0.5?setgray?200?200?moveto?(Watermark)?show?showpage"?original.pdf

          上述命令中,-sDEVICE=pdfwrite?表示輸出為 PDF 文件;-sOutputFile=output.pdf?表示輸出文件名為?output.pdf;最后一個(gè)參數(shù)?original.pdf?則表示原始 PDF 文件的路徑;中間的字符串則表示添加的水印內(nèi)容。

          注意事項(xiàng)

          使用 Ghostscript 命令行添加水印時(shí),會(huì)直接修改原始 PDF 文件,因此建議先備份原始文件。

          方式四:Free Spire.PDF for Java

          下面介紹一下使用 Free Spire.PDF for Java 實(shí)現(xiàn) PDF 添加水印的方式。
          Free Spire.PDF for Java 是一款免費(fèi)的 Java PDF 庫(kù),它提供了一個(gè)簡(jiǎn)單易用的 API,用于創(chuàng)建、讀取、修改和提取 PDF 內(nèi)容。Free Spire.PDF for Java 也支持添加文本水印以及圖片水印。

          添加 Free Spire.PDF for Java 依賴

          首先,在?pom.xml?文件中添加 Free Spire.PDF for Java 的依賴:


          ????e-iceblue
          ????free-spire-pdf-for-java
          ????1.9.6

          添加文本水印

          在添加水印之前,需要讀取原始 PDF 文件:

          PdfDocument?pdf?=?new?PdfDocument();
          pdf.loadFromFile("original.pdf");

          然后,遍歷 PDF 中的所有頁(yè)面,并使用?PdfPageBase?添加水印:

          //?遍歷?PDF?中的所有頁(yè)面
          for?(int?i?=?0;?i?????PdfPageBase?page?=?pdf.getPages().get(i);

          ????//?添加文本水印
          ????PdfWatermark?watermark?=?new?PdfWatermark("Watermark");
          ????watermark.setFont(new?PdfFont(PdfFontFamily.Helvetica,?36));
          ????watermark.setOpacity(0.5f);
          ????page.getWatermarks().add(watermark);
          }

          最后,需要保存修改后的 PDF 文件:

          pdf.saveToFile("output.pdf");
          pdf.close();

          添加圖片水印

          添加圖片水印與添加文本水印類似,只需要將?PdfWatermark?的參數(shù)修改為圖片路徑即可。

          //?添加圖片水印
          PdfWatermark?watermark?=?new?PdfWatermark("watermark.png");
          watermark.setOpacity(0.5f);
          page.getWatermarks().add(watermark);

          完整代碼

          下面是使用 Free Spire.PDF for Java 來實(shí)現(xiàn) PDF 添加水印的完整代碼:

          import?com.spire.pdf.*;

          public?class?FreeSpirePdfWatermark?{
          ????public?static?void?main(String[]?args)?{
          ????????//?讀取原始?PDF?文件
          ????????PdfDocument?pdf?=?new?PdfDocument();
          ????????pdf.loadFromFile("original.pdf");

          ????????//?遍歷?PDF?中的所有頁(yè)面
          ????????for?(int?i?=?0;?i?????????????PdfPageBase?page?=?pdf.getPages().get(i);

          ????????????//?添加文本水印
          ????????????PdfWatermark?watermark?=?new?PdfWatermark("Watermark");
          ????????????watermark.setFont(new?PdfFont(PdfFontFamily.Helvetica,?36));
          ????????????watermark.setOpacity(0.5f);
          ????????????page.getWatermarks().add(watermark);

          ????????????//?添加圖片水印
          ????????????//?PdfWatermark?watermark?=?new?PdfWatermark("watermark.png");
          ????????????//?watermark.setOpacity(0.5f);
          ????????????//?page.getWatermarks().add(watermark);
          ????????}

          ????????//?保存修改后的?PDF?文件
          ????????pdf.saveToFile("output.pdf");
          ????????pdf.close();
          ????}
          }

          方式五:Aspose.PDF for Java

          Aspose.PDF for Java 是一個(gè)強(qiáng)大的 PDF 處理庫(kù),提供了添加水印的功能。結(jié)合 Spring Boot 使用 Aspose.PDF for Java 庫(kù)添加 PDF 水印的方式如下:
          首先,在?pom.xml?文件中添加 Aspose.PDF for Java 的依賴:


          ????com.aspose
          ????aspose-pdf
          ????21.4

          在 Spring Boot 應(yīng)用程序中調(diào)用 Aspose.PDF for Java 的 API 設(shè)置 PDF 水印。

          添加文本水印

          @PostMapping("/addTextWatermark")
          public?ResponseEntity?addTextWatermark(@RequestParam("file")?MultipartFile?file)?throws?IOException?{
          ????//?加載?PDF?文件
          ????Document?pdfDocument?=?new?Document(file.getInputStream());
          ????TextStamp?textStamp?=?new?TextStamp("Watermark");
          ????textStamp.setWordWrap(true);
          ????textStamp.setVerticalAlignment(VerticalAlignment.Center);
          ????textStamp.setHorizontalAlignment(HorizontalAlignment.Center);
          ????pdfDocument.getPages().get_Item(1).addStamp(textStamp);

          ????//?保存?PDF?文件
          ????ByteArrayOutputStream?outputStream?=?new?ByteArrayOutputStream();
          ????pdfDocument.save(outputStream);
          ????return?ResponseEntity.ok()
          ????????????.header(HttpHeaders.CONTENT_DISPOSITION,?"attachment;?filename=\"watermarked.pdf\"")
          ????????????.contentType(MediaType.APPLICATION_PDF)
          ????????????.body(outputStream.toByteArray());
          }

          添加圖片水印

          @PostMapping("/addImageWatermark")
          public?ResponseEntity?addImageWatermark(@RequestParam("file")?MultipartFile?file)?throws?IOException?{
          ????//?加載?PDF?文件
          ????Document?pdfDocument?=?new?Document(file.getInputStream());
          ????ImageStamp?imageStamp?=?new?ImageStamp("watermark.png");
          ????imageStamp.setWidth(100);
          ????imageStamp.setHeight(100);
          ????imageStamp.setVerticalAlignment(VerticalAlignment.Center);
          ????imageStamp.setHorizontalAlignment(HorizontalAlignment.Center);
          ????pdfDocument.getPages().get_Item(1).addStamp(imageStamp);

          ????//?保存?PDF?文件
          ????ByteArrayOutputStream?outputStream?=?new?ByteArrayOutputStream();
          ????pdfDocument.save(outputStream);
          ????return?ResponseEntity.ok()
          ????????????.header(HttpHeaders.CONTENT_DISPOSITION,?"attachment;?filename=\"watermarked.pdf\"")
          ????????????.contentType(MediaType.APPLICATION_PDF)
          ????????????.body(outputStream.toByteArray());
          }

          注意,以上代碼中的文件名、寬度、高度等參數(shù)需要根據(jù)實(shí)際情況進(jìn)行調(diào)整。

          完整代碼

          完整的 Spring Boot 控制器類代碼如下:

          import?com.aspose.pdf.*;
          import?org.springframework.http.HttpHeaders;
          import?org.springframework.http.MediaType;
          import?org.springframework.http.ResponseEntity;
          import?org.springframework.web.bind.annotation.*;
          import?org.springframework.web.multipart.MultipartFile;

          import?java.io.ByteArrayOutputStream;
          import?java.io.IOException;

          @RestController
          @RequestMapping("/api/pdf")
          public?class?PdfController?{
          ????@PostMapping("/addTextWatermark")
          ????public?ResponseEntity?addTextWatermark(@RequestParam("file")?MultipartFile?file)?throws?IOException?{
          ????????//?加載?PDF?文件
          ????????Document?pdfDocument?=?new?Document(file.getInputStream());
          ????????TextStamp?textStamp?=?new?TextStamp("Watermark");
          ????????textStamp.setWordWrap(true);
          ????????textStamp.setVerticalAlignment(VerticalAlignment.Center);
          ????????textStamp.setHorizontalAlignment(HorizontalAlignment.Center);
          ????????pdfDocument.getPages().get_Item(1).addStamp(textStamp);

          ????????//?保存?PDF?文件
          ????????ByteArrayOutputStream?outputStream?=?new?ByteArrayOutputStream();
          ????????pdfDocument.save(outputStream);
          ????????return?ResponseEntity.ok()
          ????????????????.header(HttpHeaders.CONTENT_DISPOSITION,?"attachment;?filename=\"watermarked.pdf\"")
          ????????????????.contentType(MediaType.APPLICATION_PDF)
          ????????????????.body(outputStream.toByteArray());
          ????}

          ????@PostMapping("/addImageWatermark")
          ????public?ResponseEntity?addImageWatermark(@RequestParam("file")?MultipartFile?file)?throws?IOException?{
          ????????//?加載?PDF?文件
          ????????Document?pdfDocument?=?new?Document(file.getInputStream());
          ????????ImageStamp?imageStamp?=?new?ImageStamp("watermark.png");
          ????????imageStamp.setWidth(100);
          ????????imageStamp.setHeight(100);
          ????????imageStamp.setVerticalAlignment(VerticalAlignment.Center);
          ????????imageStamp.setHorizontalAlignment(HorizontalAlignment.Center);
          ????????pdfDocument.getPages().get_Item(1).addStamp(imageStamp);

          ????????//?保存?PDF?文件
          ????????ByteArrayOutputStream?outputStream?=?new?ByteArrayOutputStream();
          ????????pdfDocument.save(outputStream);
          ????????return?ResponseEntity.ok()
          ????????????????.header(HttpHeaders.CONTENT_DISPOSITION,?"attachment;?filename=\"watermarked.pdf\"")
          ????????????????.contentType(MediaType.APPLICATION_PDF)
          ????????????????.body(outputStream.toByteArray());
          ????}
          }

          這里使用了兩個(gè) RESTful API:/addTextWatermark?和?/addImageWatermark,分別用于添加文本水印和圖片水印。在請(qǐng)求中通過?file?參數(shù)傳遞 PDF 文件。
          下面介紹如何使用 Postman 來測(cè)試 Spring Boot 應(yīng)用程序的 API。
          1. 下載并安裝 Postman。
          2. 打開 Postman,選擇 POST 請(qǐng)求方法。
          3. 在 URL 地址欄中輸入?http://localhost:8080/api/pdf/addTextWatermark
          4. 在 Headers 標(biāo)簽頁(yè)中設(shè)置 Content-Type 為 multipart/form-data。
          5. 在 Body 標(biāo)簽頁(yè)中選擇 form-data 類型,然后設(shè)置 key 為?file,value 選擇本地的 PDF 文件。
          6. 點(diǎn)擊 Send 按鈕發(fā)送請(qǐng)求,等待應(yīng)答結(jié)果。
          處理結(jié)果將會(huì)在響應(yīng)的 Body 中返回,也可以選擇瀏覽器下載或保存到本地磁盤。
          以上就是使用 Aspose.PDF for Java 庫(kù)結(jié)合 Spring Boot 添加 PDF 水印的方式。

          結(jié)論

          本文介紹了幾種使用 Spring Boot 實(shí)現(xiàn) PDF 添加水印的方式,分別是使用 Apache PDFBox 庫(kù)、iText 庫(kù)以及 Ghostscript 命令行等。選擇哪種方式,可以根據(jù)項(xiàng)目需求和個(gè)人偏好來決定。無論采用哪種方式,都需要注意保護(hù)原始 PDF 文件,不要在不必要的情況下直接修改原始文件。歡迎點(diǎn)贊收藏,在你老板安排你干這時(shí),希望你能夠及時(shí)找到相關(guān)的Java工具庫(kù),實(shí)現(xiàn)這項(xiàng)功能。

          推薦閱讀:

          自從用了這款牛逼的 IDEA 插件,團(tuán)隊(duì)的代碼寫得越來越規(guī)范了!!!

          一款可以拿來做畢設(shè)的圖書管理系統(tǒng),簡(jiǎn)單易掌握,非常nice!

          互聯(lián)網(wǎng)初中高級(jí)大廠面試題(9個(gè)G)

          內(nèi)容包含Java基礎(chǔ)、JavaWeb、MySQL性能優(yōu)化、JVM、鎖、百萬并發(fā)、消息隊(duì)列、高性能緩存、反射、Spring全家桶原理、微服務(wù)、Zookeeper......等技術(shù)棧!

          ?戳閱讀原文領(lǐng)取!? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ??朕已閱?

          瀏覽 34
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  美女裸身久久久 | 中国老年人A毛片视频 | www.操骚逼 | 日韩淫淫网 | 人人舔人人操人人干 |