Java生成水印

Java生成水印

package src.wmf.test;

import javax.imageio.ImageIO;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;

/**
 * @author
 * @version 1.0
 * @date 2021/4/23 17:22
 */
public class HelloWorld {

    public static void main(String[] args) {
        markImageByText("张菊", "D:\\Users\\31330\\IdeaProjects\\test\\hello\\src\\main\\resources\\01.jpg", "02.jpg", 0, Color.red, "jpg");
        System.out.println("-----结束-----");
    }

    /**
     * @param logoText     要写入的文字
     * @param srcImgPath   源图片路径
     * @param newImagePath 新图片路径
     * @param degree       旋转角度
     * @param color        字体颜色
     * @param formaName    图片后缀
     */
    public static void markImageByText(String logoText, String srcImgPath, String newImagePath, Integer degree, Color color, String formaName) {
        InputStream is = null;
        OutputStream os = null;
        try {
            // 1、源图片
            Image srcImg = ImageIO.read(new File(srcImgPath));
            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
            // 2、得到画笔对象
            Graphics2D g = buffImg.createGraphics();
            // 3、设置对线段的锯齿状边缘处理
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), java.awt.Image.SCALE_SMOOTH), 0, 0, null);
            // 4、设置水印旋转
            if (null != degree) {
                g.rotate(Math.toRadians(degree), buffImg.getWidth() / 2, buffImg.getHeight() / 2);
            }
            // 5、设置水印文字颜色
            g.setColor(color);
            // 6、设置水印文字Font
            g.setFont(new java.awt.Font("宋体", java.awt.Font.BOLD, 50));
            // 7、设置水印文字透明度
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.85f));
            // 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
            g.drawString(logoText, 10, 50);
            // 9、释放资源
            g.dispose();
            // 10、生成图片
            os = new FileOutputStream(newImagePath);
            ImageIO.write(buffImg, formaName, os);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != is){
                    is.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }

            try {
                if (null != os){
                    os.close();
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }
}


Java 中为生成的 PDF 文件添加水印,可以使用多种库来实现,常见的选择包括 iText 和 Apache PDFBox。下面将分别介绍如何使用这两个库来实现为 PDF 添加水印的功能。 ### 使用 iText 为 PDF 添加水印 iText 是一个功能强大的 PDF 处理库,支持创建、修改和操作 PDF 文档。以下是一个使用 iText 5(较旧版本)为 PDF 添加水印的示例代码: ```java import com.itextpdf.text.Document; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfGState; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; import java.io.FileOutputStream; public class WatermarkWithIText { public static void addWatermark(String src, String dest, String watermarkText) throws Exception { PdfReader reader = new PdfReader(src); PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(dest)); PdfContentByte canvas; for (int i = 1; i <= reader.getNumberOfPages(); i++) { canvas = stamper.getOverContent(i); // 设置透明度 PdfGState gState = new PdfGState(); gState.setFillOpacity(0.3f); // 设置透明度 canvas.setGState(gState); // 设置字体和大小 canvas.beginText(); canvas.setFontAndSize(BaseFont.createFont(BaseFont.HELVETICA_BOLD, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED), 60); // 设置水印文本的位置和颜色 canvas.setColorFill(BaseColor.LIGHT_GRAY); canvas.showTextAligned(Element.ALIGN_CENTER, watermarkText, 300, 400, 45); // 旋转角度为45度 canvas.endText(); } stamper.close(); reader.close(); } public static void main(String[] args) throws Exception { addWatermark("input.pdf", "output_with_watermark.pdf", "Sample Watermark"); } } ``` 此代码读取现有的 PDF 文件,并在其每一页上添加指定的水印文本。通过 `PdfGState` 类设置了水印的透明度,同时通过 `setFontAndSize` 方法设置了字体和大小,最后通过 `showTextAligned` 方法将水印文本绘制到页面上。 ### 使用 PDFBox 为 PDF 添加水印 Apache PDFBox 是另一个流行的开源 PDF 处理库,它也提供了丰富的 API 来处理 PDF 文档。以下是使用 PDFBox 为 PDF 添加水印的一个简单示例: ```java import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.common.PDRectangle; import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject; import org.apache.pdfbox.pdmodel.PDPageContentStream; import org.apache.pdfbox.util.Matrix; import java.io.File; import java.io.IOException; public class WatermarkWithPDFBox { public static void addWatermark(String srcPath, String destPath, String imagePath) throws IOException { try (PDDocument document = PDDocument.load(new File(srcPath))) { PDImageXObject pdImage = PDImageXObject.createFromFile(imagePath, document); for (PDPage page : document.getPages()) { PDPageContentStream contentStream = new PDPageContentStream(document, page, PDPageContentStream.AppendMode.APPEND, true, true); // 获取页面尺寸 PDRectangle pageSize = page.getMediaBox(); float width = pageSize.getWidth(); float height = pageSize.getHeight(); // 计算水印图片的位置 float x = (width - pdImage.getWidth()) / 2; float y = (height - pdImage.getHeight()) / 2; // 应用变换矩阵以旋转水印 Matrix matrix = Matrix.getRotateInstance(Math.toRadians(45), x + pdImage.getWidth() / 2, y + pdImage.getHeight() / 2); contentStream.transform(matrix); // 绘制水印图片 contentStream.drawImage(pdImage, x, y); contentStream.close(); } document.save(destPath); } } public static void main(String[] args) throws IOException { addWatermark("input.pdf", "output_with_watermark.pdf", "watermark.png"); } } ``` 在这个例子中,首先加载了原始的 PDF 文件,然后对于每一个页面,创建了一个内容流对象 `PDPageContentStream`,并通过 `drawImage` 方法将水印图片绘制到页面上。此外,还使用了 `Matrix` 类来对水印进行旋转操作,使其呈现出倾斜的效果[^2]。 ### 结论 无论是使用 iText 还是 PDFBox,都可以方便地为 PDF 文件添加水印。选择哪个库取决于具体的需求和个人偏好。iText 提供了更为丰富的 PDF 操作功能,而 PDFBox 则以其简洁易用著称。在实际开发过程中,可以根据项目需求和技术栈来决定使用哪一个库。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

wmf_helloWorld

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值