PDF 水印

转自:http://www.w2bc.com/article/157372


public class pdfUtil {
    /**
     * 添加条码
     * @param str  条码内容
     * @param filepath  pdf 文件绝对路径
     * @param l_height  水平位置
     * @param l_weight  垂直位置
     */public static void addString(String str,String filepath,int l_height,int l_weight){
        BufferedImage localBufferedImage=null;
        JBarcode jbcode = null;
        try {
            //1.创建条码图像
            jbcode = new org.jbarcode.JBarcode(Code39Encoder.getInstance(), WideRatioCodedPainter.getInstance(),BaseLineTextPainter.getInstance());   
            localBufferedImage = jbcode.createBarcode(str);
            ByteArrayOutputStream bao= new ByteArrayOutputStream();
            ImageIO.write(localBufferedImage, "png", bao);
            Image img = Image.getInstance(bao.toByteArray());
            img.setAlignment(1);                         //居中显示
            img.setAbsolutePosition(l_height,  l_weight);//显示位置,根据需要调整
            img.scalePercent(60);                          //显示为原条形码图片大小的比例,百分比
            //2.创建pdf输入输出流
            InputStream is = new FileInputStream(filepath);
            PdfReader reader = new PdfReader(is);
            OutputStream os =  new FileOutputStream(filepath);
            PdfStamper stamp = new PdfStamper(reader, os);
            PdfContentByte contentByte = null;
            int n = reader.getNumberOfPages();
            //3. 设置透明度
            PdfGState gs = new PdfGState();
            gs.setFillOpacity(0.7f);
            gs.setStrokeOpacity(0.7f);
 
            //4.在pdf每页右上角添加条码
            for (int i = 1; i <= n; i++){
                contentByte = stamp.getOverContent(i);     // getOverContent 水印会把正文盖住    getUnderContent 水印会被正文的图片盖住  
                contentByte.setGState(gs);
                contentByte.addImage(img);
                //contentByte.addImage(Image.getInstance("D:/primeton/yunda/ide/eclipse/workspace/ydsoa/com.yd.soa.budget/src/webcontent/comm/logo.jpg"));
            }
            //5.关闭所有输入输出
            reader.close();
            stamp.close();
            IOUtils.closeQuietly(bao);
            IOUtils.closeQuietly(is);
            IOUtils.closeQuietly(os);
        } catch (InvalidAtributeException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        } catch (BadElementException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        }  
    }
 
    /**
     * 添加图片水印 居中
     * @param imagepath  图片文件绝对路径
     * @param filepath  pdf 文件绝对路径
     */public static void addWaterImage(String imagepath,String filepath){
        InputStream is = null;
        PdfReader reader = null;
        OutputStream os = null;
        PdfStamper stamp = null;
      try {
            //1.创建pdf输入输出流
              is = new FileInputStream(filepath);
              reader = new PdfReader(is);
              os =  new FileOutputStream(filepath);
            stamp = new PdfStamper(reader, os);
 
            PdfContentByte contentByte = null;
            int n = reader.getNumberOfPages();
            //2. 设置透明度
            PdfGState gs = new PdfGState();
            gs.setFillOpacity(0.5f);
            gs.setStrokeOpacity(0.5f);
            //3. 读取图片
            Image logo = Image.getInstance(imagepath);
            //4.在pdf每页右上角添加条码
            for (int i = 1; i <= n; i++){
                contentByte = stamp.getUnderContent(i);     // getOverContent 水印会把正文盖住    getUnderContent 水印会被正文的图片盖住  
                contentByte.setGState(gs);
                Rectangle rectangle = reader.getPageSize(i);
                 float width = rectangle.getWidth();
                 System.out.println("pdf:" + width);
                 System.out.println("logo:" + logo.getWidth()/2);
                 float height = rectangle.getHeight();
                 System.out.println("pdf:" + height);
                 System.out.println("logo:" + logo.getHeight()/2);
                logo.setAbsolutePosition(width/2-logo.getWidth()/2, height/2-logo.getHeight()/2);
                contentByte.addImage(logo);
            }
        } catch (IOException e) {
            e.printStackTrace();
        } catch (BadElementException e) {
            e.printStackTrace();
        } catch (DocumentException e) {
            e.printStackTrace();
        }finally{
            //5.关闭所有输入输出
            reader.close();
            try {
                stamp.close();
            } catch (DocumentException e) {
            } catch (IOException e) {
            }
            IOUtils.closeQuietly(is);
            IOUtils.closeQuietly(os);
        }
    }
 
 
    public static void main(String[] args){
        addString("条码内容", "pdf 路径", 400, 795);
        addWaterImage("水印图路径", "pdf 路径");
 
    }
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
由于 PDF 文件一旦生成,无法直接修改,因此要去除 PDF 文件中的水印,需要使用专门的 PDF 编辑器软件。以下是使用 Java 编程语言实现去除 PDF 水印的步骤: 1. 导入 PDF 编辑器库:Java 中常用的 PDF 编辑器库有 iText、PDFBox 等,可以通过 Maven 或 Gradle 等构建工具引入相关库。 2. 加载 PDF 文件:使用 PDF 编辑器库中的 API,加载需要去除水印PDF 文件。 3. 定位水印位置:使用 PDF 编辑器库中的 API,定位 PDF 文件中水印的位置。 4. 删除水印:使用 PDF 编辑器库中的 API,将定位到的水印删除。 5. 保存 PDF 文件:使用 PDF 编辑器库中的 API,保存已删除水印PDF 文件。 下面是使用 iText 库实现去除 PDF 水印的示例代码: ```java import java.io.File; import java.io.IOException; import com.itextpdf.io.IOException; import com.itextpdf.kernel.pdf.PdfDocument; import com.itextpdf.kernel.pdf.PdfName; import com.itextpdf.kernel.pdf.PdfObject; import com.itextpdf.kernel.pdf.PdfPage; import com.itextpdf.kernel.pdf.PdfReader; import com.itextpdf.kernel.pdf.PdfWriter; import com.itextpdf.kernel.pdf.canvas.parser.PdfCanvasProcessor; import com.itextpdf.kernel.pdf.canvas.parser.listener.TextRenderInfo; public class PdfWatermarkRemover { public static void main(String[] args) throws IOException { // 加载 PDF 文件 PdfDocument pdfDoc = new PdfDocument(new PdfReader("input.pdf"), new PdfWriter("output.pdf")); // 遍历 PDF 文件中的所有页面 for (int i = 1; i <= pdfDoc.getNumberOfPages(); i++) { PdfPage page = pdfDoc.getPage(i); // 遍历页面中的所有文本 PdfCanvasProcessor parser = new PdfCanvasProcessor(new TextRenderListener()); parser.processContent(page); } // 保存 PDF 文件 pdfDoc.close(); } private static class TextRenderListener implements IEventListener { @Override public void eventOccurred(IEventData data, EventType type) { if (data instanceof TextRenderInfo) { TextRenderInfo text = (TextRenderInfo) data; String textContent = text.getText(); // 判断文本是否为水印,如果是则删除该文本 if (textContent.contains("watermark")) { PdfObject obj = text.getPdfObject(); obj.getIndirectReference().getPdfObject().remove(PdfName.Matrix); } } } @Override public Set<EventType> getSupportedEvents() { return Collections.singleton(EventType.RENDER_TEXT); } } } ``` 以上代码中,我们遍历 PDF 文件中的所有页面和文本,判断文本是否为水印,如果是则删除该文本的 Matrix 对象,最后保存已删除水印PDF 文件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值