JAVA 图片加水印 支持水印换行 水印背景

Java PDF水印实现:iText库多行旋转与自动换行技术详解 PDF文档处理是Java后端开发中常见的需求,其核心在于理解PDF的页面坐标系、图层模型和字体嵌入机制。通过操作图形变换矩阵,可以实现文本和图像的精准定位与旋转,确保水印样式稳定。这项技术在文档安全、版权保护和流程管理等领域具有重要价值,尤其适用于合同、报告等需要动态添加标识的场景。本文基于iText库,深入解析了支持自动换行和任意角度旋转的PDF水印实现方案,解决了多行文本对齐和复杂版式适配等工程难题,为Java开发者提供了可直接复用的高性能解决方案。 阅读详情
package com.ifudata.common.utils;
import java.awt.AlphaComposite;
import java.awt.BasicStroke;
import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.RenderingHints;
import java.awt.image.BufferedImage;
import java.io.ByteArrayOutputStream;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.net.URL;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
 * 功能:图片水印工具类
 *
 * @Date 2022/3/4
 * @Version 1.0
 */


public class ImageRemarkUtil {
	private static final Logger log = LoggerFactory.getLogger(ImageRemarkUtil.class);
    // 水印透明度
    private static float alpha = 0.8f;
    // 水印横向位置
    private static int positionWidth = 100;
    // 水印纵向位置
    private static int positionHeight = 100;
    // 水印文字字体
    private static Font font = new Font("宋体", Font.BOLD, 18);
    // 水印文字颜色
    private static Color color = Color.white;

    /**
     * @param alpha          水印透明度
     * @param positionWidth  水印横向位置
     * @param positionHeight 水印纵向位置
     * @param font           水印文字字体
     * @param color          水印文字颜色
     */
    public static void setImageMarkOptions(float alpha, int positionWidth, int positionHeight, Font font, Color color) {
        if (alpha != 0.0f)
            ImageRemarkUtil.alpha = alpha;
        if (positionWidth != 0)
            ImageRemarkUtil.positionWidth = positionWidth;
        if (positionHeight != 0)
            ImageRemarkUtil.positionHeight = positionHeight;
        if (font != null)
            ImageRemarkUtil.font = font;
        if (color != null)
            ImageRemarkUtil.color = color;
    }

    /**
     * 给图片添加水印图片
     *
     * @param iconPath   水印图片路径
     * @param srcImgPath 源图片路径
     * @param targerPath 目标图片路径
     */
    public static void markImageByIcon(String iconPath, String srcImgPath, String targerPath) {
        markImageByIcon(iconPath, srcImgPath, targerPath, null);
    }

    /**
     * 给图片添加水印图片、可设置水印图片旋转角度
     *
     * @param iconPath   水印图片路径
     * @param srcImgPath 源图片路径
     * @param targerPath 目标图片路径
     * @param degree     水印图片旋转角度
     */
    public static void markImageByIcon(String iconPath, String srcImgPath, String targerPath, Integer degree) {
        OutputStream os = null;
        try {
            Image srcImg = ImageIO.read(new File(srcImgPath));
            BufferedImage buffImg = new BufferedImage(srcImg.getWidth(null), srcImg.getHeight(null), BufferedImage.TYPE_INT_RGB);
            // 1、得到画笔对象
            Graphics2D g = buffImg.createGraphics();
            // 2、设置对线段的锯齿状边缘处理
            g.setRenderingHint(RenderingHints.KEY_INTERPOLATION, RenderingHints.VALUE_INTERPOLATION_BILINEAR);
            g.drawImage(srcImg.getScaledInstance(srcImg.getWidth(null), srcImg.getHeight(null), Image.SCALE_SMOOTH), 0, 0, null);
            // 3、设置水印旋转
            if (null != degree) {
                g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);
            }
            // 4、水印图片的路径 水印图片一般为gif或者png的,这样可设置透明度
            ImageIcon imgIcon = new ImageIcon(iconPath);
            // 5、得到Image对象。
            Image img = imgIcon.getImage();
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
            // 6、水印图片的位置
            g.drawImage(img, positionWidth, positionHeight, null);
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
            // 7、释放资源
            g.dispose();
            // 8、生成图片
            os = new FileOutputStream(targerPath);
            ImageIO.write(buffImg, "JPG", os);
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != os)
                    os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    /**
     * 给图片添加水印文字
     *
     * @param logoText   水印文字
     * @param srcImgPath 源图片路径
     * @param targerPath 目标图片路径
     * @throws IOException 
     * @throws FileNotFoundException 
     */
    public static void markImageByText(String logoText, String srcImgPath, String targerPath,double widthRate) throws FileNotFoundException, IOException {
        markImageByText(logoText, srcImgPath, targerPath, null, widthRate );
    }

    /**
     * 给网络图片添加水印文字
     *
     * @param logoText   水印文字
     * @param srcImgPath 源图片路径
     * @param targerPath 目标图片路径
     */
    public static void markNetImageByText(String logoText, String srcImgPath, String targerPath, String watermarkPosition) {
        markNetImageByText(logoText, srcImgPath, targerPath, null, watermarkPosition);
    }

   
    

    

   

    /**
     * 给图片添加水印文字、可设置水印文字的旋转角度
     *
     * @param logoText   水印文字
     * @param srcImgPath 图片地址
     * @param targerPath 存放地址
     * @param degree     旋转角度
     */
    public static void markImageByText(String logoText, String srcImgPath, String targerPath, Integer degree,double widthRate) {
        InputStream is = null;
        OutputStream os = null;
        try {
            // 1、源图片
        	File file =  new File(srcImgPath);
            Image srcImg = ImageIO.read(file);
            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), Image.SCALE_SMOOTH), 0, 0, null);
            // 4、设置水印旋转
            if (null != degree) {
                g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);
            }
            // 5、设置水印文字颜色
            g.setColor(color);
            // 6、设置水印文字Font
            int size = srcImg.getWidth(null) / 300 * 10;
            if (size == 0) {
                size = 10;
            }
            Font font = new Font("宋体", Font.BOLD, size);
            g.setFont(font);
            // 7、设置水印文字透明度
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
            // 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
            if(logoText.indexOf("###")>-1){
            	String[] waterMarkContentList = logoText.split("###");
                // 将换行后的文字放入新的集合
            	int startRow = srcImg.getHeight(null)-waterMarkContentList.length*size*1;
            	g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 0.3f));
            	g.setColor(Color.GRAY);
            	g.setStroke(new BasicStroke(1f));
            	g.fillRect(0, startRow-size*2, srcImg.getWidth(null), startRow+size);
                // 释放对象 透明度设置结束
                g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER));
                g.setColor(Color.WHITE);
                for (int i = 0; i < waterMarkContentList.length; i++) {
//                	JLabel label = new JLabel(waterMarkContentList[i]);/*获取自定义水印信息*/
//                    FontMetrics metrics = label.getFontMetrics(font);
//                    int waterWidth = metrics.stringWidth(label.getText());//文字水印的宽
//                    int rowsNumber = waterWidth/;// 图片的高  除以  文字水印的宽  打印的行数(以文字水印的宽为间隔)
//                    int columnsNumber = width / waterWidth;//图片的宽 除以 文字水印的宽  每行打印的列数(以文字水印的宽为间隔)
                    //g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, 1.0f));
                    g.drawString(waterMarkContentList[i],  (int)Math.floor(srcImg.getWidth(null)*widthRate), startRow+i*size);//画出水印,并设置水印位置
                }

            }else{
            	g.drawString(logoText, (int)Math.floor(buffImg.getWidth()*widthRate), (int)Math.floor(buffImg.getHeight()));
            }
            // 9、释放资源
            g.dispose();
            // 10、生成图片
            String fileTyle=srcImgPath.substring(srcImgPath.lastIndexOf(".")+1,srcImgPath.length()); 
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            ImageIO.write(buffImg, fileTyle.toUpperCase(), stream);
            os = new FileOutputStream(targerPath);
            ImageIO.write(buffImg, fileTyle.toUpperCase(), os);
            log.info("加水成功");
        } catch (Exception e) {
            log.error("加水印异常:{}",e);
        } finally {
            try {
                if (null != is)
                    is.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
            try {
                if (null != os)
                    os.close();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    }

    
    /*
     * 中文转unicode编码
     */
    public static String gbEncoding(final String gbString) {
        char[] utfBytes = gbString.toCharArray();
        String unicodeBytes = "";
        for (int i = 0; i < utfBytes.length; i++) {
            String hexB = Integer.toHexString(utfBytes[i]);
            if (hexB.length() <= 2) {
                hexB = "00" + hexB;
            }
            unicodeBytes = unicodeBytes + "\\u" + hexB;
        }
        return unicodeBytes;
    }
   
    public static int getCharLen(char c, Graphics2D g) {
        return g.getFontMetrics(g.getFont()).charWidth(c);
    }

    

    /**
     * 给网络图片添加水印文字、可设置水印文字的旋转角度
     *
     * @param logoText
     * @param srcImgPath
     * @param targerPath
     * @param degree
     */
    public static void markNetImageByText(String logoText, String srcImgPath, String targerPath, Integer degree, String watermarkPosition) {
        InputStream is = null;
        OutputStream os = null;
        try {
            // 1、源图片
            File file = getFile(srcImgPath);
            Image srcImg = ImageIO.read(file);
            int srcWidth = srcImg.getWidth(null);
            int srcHeight = srcImg.getHeight(null);
            double dmarkWidth = srcWidth * 0.2;// 设置水印的宽度为图片宽度的0.2倍
            double dmarkHeight = dmarkWidth * ((double) srcHeight / (double) srcHeight);//强转为double计算宽高比例
            int imarkWidth = (int) dmarkWidth;
            int imarkHeight = (int) dmarkHeight;
            int x;
            int y;
            switch (watermarkPosition) {
                case "topLeft":
                    x = 100;
                    y = 100;
                    break;
                case "topRight":
                    x = srcWidth - imarkWidth;
                    y = 100;
                    break;
                case "bottomLeft":
                    x = 100;
                    y = srcHeight - imarkHeight / 4;
                    break;
                case "bottomRight":
                    x = srcWidth - imarkWidth;
                    y = srcHeight - imarkHeight / 4;
                    break;
                default:
                    x = srcWidth - imarkWidth;
                    y = srcHeight - imarkHeight / 4;
                    break;
            }
            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), Image.SCALE_SMOOTH), 0, 0, null);
            // 4、设置水印旋转
            if (null != degree) {
                g.rotate(Math.toRadians(degree), (double) buffImg.getWidth() / 2, (double) buffImg.getHeight() / 2);
            }
            // 5、设置水印文字颜色
            g.setColor(color);
            // 6、设置水印文字Font
            g.setFont(font);
            // 7、设置水印文字透明度
            g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
            // 8、第一参数->设置的内容,后面两个参数->文字在图片上的坐标位置(x,y)
            g.drawString(logoText, x, y);
            // 9、释放资源
            g.dispose();
            // 10、生成图片
            os = new FileOutputStream(targerPath);
            ImageIO.write(buffImg, "JPG", 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();
            }
        }
    }

   

    /**
     * 将网络图片转file文件
     *
     * @param url
     * @return
     */
    public static File getFile(String url) {
        //对本地文件命名
        String fileName = url.substring(url.lastIndexOf("."));
        File file = null;
        URL urlfile;
        InputStream inStream = null;
        OutputStream os = null;
        try {
            file = File.createTempFile("net_url", fileName);
            //下载
            urlfile = new URL(url);
            inStream = urlfile.openStream();
            os = new FileOutputStream(file);
            int bytesRead = 0;
            byte[] buffer = new byte[8192];
            while ((bytesRead = inStream.read(buffer, 0, 8192)) != -1) {
                os.write(buffer, 0, bytesRead);
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            try {
                if (null != os) {
                    os.close();
                }
                if (null != inStream) {
                    inStream.close();
                }
                if (null != file) {
                    file.deleteOnExit(); //程序退出时删除临时文件
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
        return file;
    }

    
  public static void main(String[] args) throws FileNotFoundException, IOException {
	  ImageRemarkUtil.markImageByText("ssss###aaa###ssss###aaa###sssssssssssssssssssssssssssssssssssssssssssssssss", "d:/11111.png", "d:/11112.png",0.02);
  }
  
}

ImageCombiner是一个专门用于Java服务端图片合成的工具 最近公司上了不少传播方面的需求,免不了合成各种营销图片,图片合成本身并不是什么高深的技术,但用底层api去搞确实繁琐,于是抽时间封装了一个小工具,初衷是解放生产力,后来发现挺好使,那就开源吧,花了一个整天重新整理了一下代码,作为自己从业十年第一个开源项目(打破零记录,哈哈),希望能够帮助到需要的小伙伴~ 阅读详情

相关推荐

Java中使用Graphics2D实现图片添加文字/图片水印

java实现给图片添加水印实现步骤:获取原图片对象信息(本地图片或网络图片)添加水印(设置水印颜色、字体、坐标等)处理输出目标图片。

BADAO_LIUMANG_QIZHI的博客 1532

达夫设备 java_波特-达夫规则!

早在1984年,托马斯·波特(Thomas Porter)和汤姆·达夫(Tom Duff)撰写了一篇题为“合成数字图像”的论文,该论文描述了结合两个图像的12条规则。 在Java语言的1.2版中首次引入的AlphaComposite类中找到了对这些合成规则的支持。 当前处于beta 2中的1.4版支持所有12条规则。 对于诸如游戏之类的应用程序,包括多种图像类型(包括背景图像,玩家角色图像...

cusi77914的博客 716

数字IC后端实现之快速获取innovus中drv violation的所有net list

数字IC后端设计实现之快速获取innovus中drv violation的所有net list

weixin_37584728的博客 3350

java实现pdf水印详解,支持换行、旋转且样式不会错乱,贼透彻

Java中使用itext对pdf'文件添加水印,代码清晰,样式简洁大方,非常适合新手阅读,同时对于有开发经验的伙伴也同样适用。

蓝桉 6827

stackelberg博弈_博弈论、多智能体、强化学习(随便记点东西)

多智能体应用场景:已实现:游戏AI。正在努力:UAV,物资运输,快递分发,交通系统。未来:社会学,预测群体行为,城市区域合作,国际关系。博弈论基本定义:玩家集合: 策略集合: 收益函数: 囚徒困境:两智能体矩阵博弈坦白抵赖坦白1,13,0抵赖0,32,2占优策略与最佳应对:上表中两者均具有占优策略,即无论如何都应该选坦白。那么构造下表。坦白抵赖坦白1,13,0抵赖0,12,2对于玩家一来说,坦白...

weixin_39611722的博客 2997

关于使用CMT2300A FIFO缓存区间设置为64Byte的问题

帮助你解决在使用CMT2300A 时遇到的各种问题,若有需要,请及时与我交流

teleger的博客 1429

Java实现图片水印文字换行、平铺、旋转效果

Java代码实现对图片的水印文字的添加。 水印的效果是:水印文字的换行、水印文字的平铺、水印文字的旋转。 import java.awt.Color; import java.awt.Font; import java.awt.Graphics2D; import java.awt.Image; import java.awt.image.BufferedImage; import java.io.File; import java.io.FileOutputStream; import javax.im

stepMore的博客 3091

AUTOSAR E2E Protocol实战:Profile1到Profile5的配置差异与最佳实践

本文深入解析AUTOSAR E2E Protocol中Profile1到Profile5的核心配置差异与适用场景。针对经典CAN、CAN FD及以太网等不同总线,详细对比了计数器、CRC、DataID等关键参数,并结合实战代码与配置示例,为工程师根据功能安全等级、数据长度与带宽限制选择最佳Profile提供了清晰的选型路径与工程实践指南。

milk5的博客 944

图片添加文字水印,自动换行,左右留白

参考的博客:https://blog.youkuaiyun.com/m0_37798992/article/details/80856338 原文实现了根据文字自动换行的逻辑。参考后略加修改和优化,实现了左右留白,文字在最下面显示。 package util; import java.awt.Color; import java.awt.Font; import java.awt.Graphics; ...

dlutsunmingze的专栏 1962

SAP FICO实操:如何修改已发生业务数据的成本中心公司代码(附RKACOR06程序运行指南)

本文详细解析了SAP FICO系统中使用RKACOR06程序修改已发生业务数据的成本中心和公司代码的实操方法。通过实战案例分享,提供从前期准备到后期验证的全流程指南,帮助企业应对组织架构重组或财务核算体系调整时的数据迁移挑战,特别适用于跨公司代码的成本中心划转场景。

weixin_27303545的博客 189

华为OD机试真题 新系统2026-04-01 Python&JS 实现【空间占用计算】

员工A的磁盘空间经常被耗尽,他需要找到占用空间最大的目录或文件,然后决定如何清理文件释放空间。给定某一目录,请编写程序帮助他统计该目录内一级子目录和文件的占用空间,并返回目标目录一级子项(文件或子目录)中占用空间最大的项。

MISAYAONE的博客 1303

Java图片添加文字/水印

@Test public void upload3 (){ String waterMarkContent="你好你是谁啊啊啊啊啊 你好你是谁啊啊啊啊啊啊啊啊啊啊啊啊 啊啊的方式发士 大夫是否地方是的防守打法是的你好你是谁啊啊啊啊啊 你好你是谁啊啊啊啊啊啊啊啊啊啊啊啊 啊啊的方式发士 大夫是否地方是的防守打法是的你好你是谁啊啊啊啊啊 你好你是谁啊啊啊啊啊啊啊啊啊啊啊啊 啊啊的方式发士 大夫是否...

miao_mingming的博客 1524

u-boot-2014.10移植第22天----添加nand flash命令支持(四)

解决问题:nand0: MTD Erase failure: -5 drivers/mtd/nand/nand_bbt.c文件中初始化bbt/* * Allocate memory (2bit per block) and clear the memory bad block * table. */ this->bbt = kzalloc(len, GFP_

fulinux的博客 3632

java基于原生awt实现 在图片上添加文字水印,支持多水印、自动换行和位置定义

简单的工具类,废话不多说,直接上代码

奋斗的足球狗的专栏 880

STM32(HAL库)驱动HC-SR04测距模块

本文介绍通过STM32F103C8T6单片机对HC-SR04测距模块进行驱动,并且通过串口对数据进行打印。

weixin_44597885的博客 2203

ET2012新版免狗免安装绿色软件

ET2012新版免狗免安祖昂绿色软件。,新界面,新视觉,

Java后台给PDF加水印并且合并多个PDF文件

目录前言准备环境代码添加依赖工具类测试测试加水印与背景测试pdf合并 前言 本文基于itext7实现pdf加水印和合并的操作。实际上在我们实际项目应用中,对于pdf的操作也是比较常见的,我上一个项目中就有将结果转成pdf导出的需求。本文是基于茶佬的笔记《JAVA 后端给 PDF 添加水印》写成。 准备环境 jdk8,idea2020.1.1,maven3 代码 添加依赖 <dependency> <groupId>cn.hutool</groupId> &

Curtisjia的博客 1792

Statistics and Machine Learning Toolbox

Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具

Java文件处理:Image 图片裁剪、缩放和水印

Java文件处理:Image 图片裁剪、缩放和水印

取经人的博客 2759

Devexpress16.2.6破解工具

Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具Devexpress16.2.6破解工具

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

java生成水印_(Java)图片添加水印,生成邀请函

用途说明:1.可以用于生成自定义的水印2.可以动态生成邀请函,指定特定对象的姓名、内容3.可以生成手写书信(这个下载对应的手写字体,安装到电脑就可用了)源码的功能:1.提供自定义字体属性(样式,大小,颜色)2.可以实现自动换行3.可以旋转文字4.可以保存多种格式,支持jpeg、jpg、png等样例展示:邀请函水印水平方向水印旋转源码分析:1.AddContent2Picture类的设计使用了构造者...

weixin_42353186的博客 311

echart 固定刻度文字宽度_Java图片处理工具类:水印文字、缩放、切割、类型转换、颜色转换、图片属性...

功能简介使用 javax 和 java.awt 包下的 API 在 Java后台处理图片操作,主要提供如下的功能:添加水印文字(本文重点)图片缩放图片切割图片类型转换图片彩色转黑白获取图片属性背景 项目中做的喜报功能要往指定的群里推送喜报图片消息,使用固定模板图片,在图片模板上填充喜报相关的关键文字信息,在Java后台进行图片水印文字的绘制,本文主要介绍图片添加水印文字。效果图 水...

weixin_31133141的博客 163

java文字水印换行_java把指定文字输出为图片流,支持文字换行

public classIamgeUtils {private static final int WIDTH = 350;private static final int HEIGHT = 100;private static Random random = newRandom();public static void main(String[] args) throwsIOException {...

weixin_39626613的博客 259

Java实现PDF多行水印:换行、旋转、平铺全解析

在数字化文档流转中,水印是保护信息版权和标识密级的重要手段,其本质是对文本内容的排版控制。通过底层坐标变换与文本布局引擎,可以实现多行文字斜向铺满整个页面的效果,既保证视觉可辨识性,又不破坏原始文档结构。在Java生态中,利用开源的OpenPDF库的PdfContentByte与ColumnText组件,开发者能够在保留PDF矢量特性的前提下,灵活控制字体、透明度、旋转角度和网格间距,从而构建稳健的水印工具。此类技术适用于报告导出、合同管理、证书防伪等场景,帮助企业在不牺牲文档质量的前提下满足合规要求。方案

weixin_30235225的博客 361

Java好用的合成图片工具

前言:互联网本质还是流量的生意,谁收割的流量最多,谁便是下一个赢家。“自古流量出社交”也就可以解释为什么每个APP都有一个社交梦,每个PM都有一颗想做社交的心。无论是B端产品还是C端产品,能够讲好一个“社交故事”,就很有可能给资本市场带来无穷的想象空间。公司一直有分享合成图片的场景,之前自己写起来比较费劲,最近找了一个比较好用的工具分享给大家码云地址,感谢opensourcechen的分享。 话不多说,直接上例子看效果 public void testCombineTopicImage() throws

Aubergines的专栏 628

Android调用相机拍照并添加水印

最近项目提出新需求,要求在拍照后在图片上添加用户信息的水印,so,楼主重新整理封装了一个简单的拍照+水印的工具类,需求不同,仅供参考。文件操作及权限做了适配,支持androidN及以上版本,放心使用。 效果演示: 如何调用相机这里就不介绍了,因为小伙伴们基本都使用过,主要介绍下实现水印的方式,实现水印效果也很简单,利用paint及canvas操作bitmap在对应位置进行绘制文

c664543330的博客 1万+

Excel转图片(Java方式)

Excel转换为图片工具,使用Java开发

qq_36007926的博客 3199

java生成jpg_【JAVA】图片生成工具类

package com.XXX.utils.image;package com.hlf.vpos.common.utils.image;import javax.imageio.ImageIO;import javax.swing.*;import java.awt.*;import java.awt.image.BufferedImage;import java.io.*;import java...

weixin_39852647的博客 277
上一篇: JQuery dataTable 扩展+Ajax Post,Get一些基本操作(一)
lb8607
博客等级 码龄18年 17粉丝 18原创
评论 2
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

打赏作者

lb8607

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

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

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

打赏作者

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

抵扣说明:

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

余额充值