java -PDF添加文本水印与图片水印

java pdf添加水印文本及图片文本

PDF文件添加文本水印:

    private static int interval = 30;  
    public static void waterMark(String inputFile,String outputFile, String waterMarkName) { 
        try {  
            PdfReader reader = new PdfReader(inputFile);  
            PdfStamper stamper = new PdfStamper(reader, new FileOutputStream(outputFile));
            //这里的字体设置比较关键,这个设置支持中文的写法
            BaseFont base = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H",   BaseFont.EMBEDDED);  //使用系统字体
            Rectangle pageRect = null;
            PdfGState gs = new PdfGState();
            //设置透明度
            gs.setFillOpacity(0.3f);
            gs.setStrokeOpacity(0.3f);
            int total = reader.getNumberOfPages() + 1;
            JLabel label = new JLabel();
            FontMetrics metrics;
            int textH = 0;
            int textW = 0;
            label.setText(waterMarkName);
            metrics = label.getFontMetrics(label.getFont()); 
            textH = metrics.getHeight();
            textW = metrics.stringWidth(label.getText());
            PdfContentByte under; 
            for (int i = 1; i < total; i++) {
                pageRect = reader.getPageSizeWithRotation(i);
                under = stamper.getOverContent(i);
                under.saveState(); 
                under.setGState(gs); 
                under.beginText();  
                under.setFontAndSize(base, 30); //控制字体间宽度
                // 水印文字成30度角倾斜
                for (int height = interval + textH; height < pageRect.getHeight();  height = height + textH*8) {
                    for (int width = interval + textW; width < pageRect.getWidth() + textW;  width = width + textW*4) {
                        under.showTextAligned(Element.ALIGN_LEFT , waterMarkName, width - textW, 
                                height - textH, 30);  }  } 
                // 添加水印文字     
                under.endText(); 
                }   
            //关闭流  
            stamper.close();  
            reader.close(); 
            } catch (Exception e) {     
                e.printStackTrace();     
            }   
        }

 

 

PDF添加图片水印:

private static final float IAMGE_HEIGHT = 110f; // 水印图片的的高度
    private static final float IAMGE_WIDTH = 110f; // 水印图片的的宽度
    public static void addPdfMark(String pdfPath,String logoPath, String outPath) throws Exception {

        PdfReader reader = new PdfReader(pdfPath, "PDF".getBytes());
        // 如果是web项目,直接下载应该放到response的流里面
        // PdfStamper stamp = new PdfStamper(reader,response.getOutputStream());
        // 添加水印之后的pdf文件
        PdfStamper stamp = new PdfStamper(reader, new FileOutputStream(outPath));
        int pageSize = reader.getNumberOfPages();

        float pageHeight = reader.getPageSize(1).getHeight();
        float pageWidth = reader.getPageSize(1).getWidth();
        try {
            // 每两行显示两个 左边一个,右边一个
            int lineNum = (int) (pageHeight / IAMGE_HEIGHT); // 行数
            int middleY = (int) pageWidth / 2;
            for (int i = 1; i <= pageSize; i++) {
                for (int j = 0, k = 0; j < lineNum; j = j + 4, k++) {
                    Random random = new Random();
                    // 放入水印
                    Image img = Image.getInstance(logoPath);
                    img.scaleAbsolute(IAMGE_WIDTH, IAMGE_HEIGHT * 184 / 455);
                    // 将水印显示到最底层
                    img.setAlignment(Image.UNDERLYING);
                    int trueY;
                    while (true) {
                        trueY = random.nextInt(middleY);
                        if (trueY > IAMGE_WIDTH / 2 && trueY < (middleY - IAMGE_WIDTH)) {
                            break;
                        }
                    }
                    // 水印的位置
                    img.setAbsolutePosition(trueY, j * IAMGE_HEIGHT + (float) random.nextInt((int) IAMGE_HEIGHT) - (k % 2) * 10);
                    // 旋转 角度
                    img.setRotationDegrees(random.nextInt(360));
                    PdfContentByte under = stamp.getUnderContent(i);

                    PdfGState gs = new PdfGState();
                    // 设置透明度为0.5
                    gs.setFillOpacity(0.5f);
                    under.setGState(gs);
                    under.addImage(img);
                    while (true) {
                        trueY = random.nextInt(middleY) + middleY;
                        if (trueY > middleY + IAMGE_WIDTH / 2 && trueY < (2 * middleY - IAMGE_WIDTH)) {
                            break;
                        }
                    }
                    // 水印的位置
                    img.setAbsolutePosition(trueY, j * IAMGE_HEIGHT + (float) random.nextInt((int) IAMGE_HEIGHT) - (k % 2) * 10);
                    // 旋转角度
                    img.setRotationDegrees(random.nextInt(360));
                    under.addImage(img);
                }
            }
        } catch (Exception e) {
            throw e;
        } finally {
            stamp.close();
            reader.close();
        }

测试--------------------------------------------------------------------------------

public static void main(String[] args) throws Exception {
        waterMark("xxx.pdf", "yyy.pdf", "测试工程");
        //addPdfMark("xxx.pdf","image.png","yyy.xml");
        System.out.println("结束");
    }
    }      

 

参考了很多前辈的,希望能帮到各位!

模块所需jar包(itextpdf-5.5.13.1.jar)

转载于:https://www.cnblogs.com/gccsbg/p/11126634.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
实现将 PDF 转换为图片可以使用 Apache PDFBox 库,而将图片转换为 PDF 可以使用 iText 库。以下是实现将 PDF 转换为图片,去掉水印后再转换为 PDF 的示例代码: ```java import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.rendering.PDFRenderer; import org.apache.pdfbox.rendering.RenderDestination; import org.apache.pdfbox.rendering.RenderedImage; import org.apache.pdfbox.rendering.RenderingHints; import javax.imageio.ImageIO; import java.awt.*; import java.awt.image.BufferedImage; import java.io.File; import java.util.ArrayList; import java.util.List; public class PdfWatermarkRemover { public static void main(String[] args) { try { // 读取原始 PDF 文件 PDDocument document = PDDocument.load(new File("original.pdf")); // 获取 PDF 页面数量 int pageCount = document.getNumberOfPages(); // 创建一个 PDF 渲染器 PDFRenderer renderer = new PDFRenderer(document); // 创建一个图片列表 List<BufferedImage> images = new ArrayList<>(); // 遍历每一页 for (int i = 0; i < pageCount; i++) { // 渲染 PDF 页面为图片 BufferedImage image = renderer.renderImageWithDPI(i, 300, RenderingHints.VALUE_RENDER_QUALITY); // 将图片添加到列表中 images.add(image); } // 关闭 PDF 文档 document.close(); // 创建一个 iText 文档 com.itextpdf.text.Document itextDocument = new com.itextpdf.text.Document(); // 创建一个 PDF 输出器 com.itextpdf.text.pdf.PdfWriter writer = com.itextpdf.text.pdf.PdfWriter.getInstance(itextDocument, new FileOutputStream("output.pdf")); itextDocument.open(); // 遍历每张图片 for (BufferedImage image : images) { // 去掉图片上的水印 Graphics2D g2d = image.createGraphics(); g2d.setComposite(AlphaComposite.Clear); g2d.fillRect(0, 0, image.getWidth(), image.getHeight()); g2d.dispose(); // 将图片添加到 iText 文档中 com.itextpdf.text.Image itextImage = com.itextpdf.text.Image.getInstance(image, null); itextDocument.add(itextImage); } // 关闭 iText 文档 itextDocument.close(); } catch (Exception e) { e.printStackTrace(); } } } ``` 需要注意的是,这段代码只能移除一些简单的文字水印,如果水印图片或者其他复杂的形式,可能需要更加复杂的处理方法。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值