itext pdf 签名 怎么将签名图片不覆盖文件字

robert_2015 2016-12-19 06:40:17
public static void sign(String srcFile,String targetpdf,String cert_path,String cert_pwd,String img) throws Exception {
KeyStoreFactory ksFactory = KeyStoreFactory.getInstance();
ksFactory.initKeyStore(cert_path, cert_pwd);
PdfReader reader = new PdfReader(srcFile); //源文件
FileOutputStream fout = new FileOutputStream(targetpdf);
PdfStamper stp = PdfStamper.createSignature(reader, fout, '\0');

Image image = Image.getInstance(img);
//image.setAlignment(Image.UNDERLYING);
Rectangle rect= new Rectangle(300, 800, 400, 675);

PdfSignatureAppearance sap = stp.getSignatureAppearance();
sap.setSignatureGraphic(image);
sap.setRenderingMode(RenderingMode.GRAPHIC);
sap.setAcro6Layers(true);
sap.setVisibleSignature(rect, 2,null);
sap.setCertificationLevel(PdfSignatureAppearance.NOT_CERTIFIED);

sap.setCrypto(ksFactory.getPrivateKey(cert_pwd), ksFactory.getCertificateChain(), null,PdfSignatureAppearance.WINCER_SIGNED);
sap.setReason("q");
sap.setLocation("q");

stp.getWriter().setCompressionLevel(5);


if (stp != null) {
stp.close();
}
if (fout != null) {
fout.close();
}
if (reader != null) {
reader.close();
}
}

图覆盖到字




...全文
2310 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
xq1817 2020-03-23
  • 打赏
  • 举报
回复
引用 11 楼 Aulang 的回复:
给app[2]添加透明度,如代码所示: [ [/code]
添加透明度,印章图片颜色会变淡了。还有更好的办法吗
xq1817 2020-03-23
  • 打赏
  • 举报
回复
引用 8 楼 帅衡衡 的回复:
楼主 解决了吗 我也在做这个 但是我找到方法解决了 就是把章的图片变成水印放到文字下方 然后签名的图片用一张透明的图片两个位置放在一起就可以了
如果文档已经有签名了,做第二个签名时,按照你的方法就破坏文档的一个签名了。
Aulang 2018-11-01
  • 打赏
  • 举报
回复
给app[2]添加透明度,如代码所示:

package com.itextpdf.text.pdf;

import com.itextpdf.text.*;
import com.itextpdf.text.error_messages.MessageLocalization;
import com.itextpdf.text.pdf.security.CertificateInfo;

import java.security.cert.Certificate;
import java.security.cert.X509Certificate;

public class ExPdfSignatureAppearance extends PdfSignatureAppearance {
protected static final float TOP_SECTION = 0.3f;
protected static final float MARGIN = 2;

private float opacity = 0.75f;

ExPdfSignatureAppearance(PdfStamperImp writer) {
super(writer);
}

@Override
public PdfTemplate getAppearance() throws DocumentException {
PdfTemplate app2 = getLayer(2);

PdfGState gs = new PdfGState();
gs.setFillOpacity(opacity);
app2.setGState(gs);


String text = "";
if (getLayer2Text() != null) {
text = getLayer2Text();
}

Font font = new Font();
float size = font.getSize();

Rectangle dataRect = null;
Rectangle signatureRect = null;

Rectangle rect = getRect();
int runDirection = getRunDirection();
Certificate signCertificate = getCertificate();
Image signatureGraphic = getSignatureGraphic();
RenderingMode renderingMode = getRenderingMode();


if (renderingMode == RenderingMode.NAME_AND_DESCRIPTION
|| renderingMode == RenderingMode.GRAPHIC_AND_DESCRIPTION && signatureGraphic != null) {
// origin is the bottom-left
signatureRect = new Rectangle(
MARGIN,
MARGIN,
rect.getWidth() / 2 - MARGIN,
rect.getHeight() - MARGIN);
dataRect = new Rectangle(
rect.getWidth() / 2 + MARGIN / 2,
MARGIN,
rect.getWidth() - MARGIN / 2,
rect.getHeight() - MARGIN);

if (rect.getHeight() > rect.getWidth()) {
signatureRect = new Rectangle(
MARGIN,
rect.getHeight() / 2,
rect.getWidth() - MARGIN,
rect.getHeight());
dataRect = new Rectangle(
MARGIN,
MARGIN,
rect.getWidth() - MARGIN,
rect.getHeight() / 2 - MARGIN);
}
} else if (renderingMode == RenderingMode.GRAPHIC) {
if (signatureGraphic == null) {
throw new IllegalStateException(MessageLocalization.getComposedMessage("a.signature.image.should.be.present.when.rendering.mode.is.graphic.only"));
}
signatureRect = new Rectangle(
MARGIN,
MARGIN,
rect.getWidth() - MARGIN, // take all space available
rect.getHeight() - MARGIN);
} else {
dataRect = new Rectangle(
MARGIN,
MARGIN,
rect.getWidth() - MARGIN,
rect.getHeight() * (1 - TOP_SECTION) - MARGIN);
}

switch (renderingMode) {
case NAME_AND_DESCRIPTION:
String signedBy = CertificateInfo.getSubjectFields((X509Certificate) signCertificate).getField("CN");
if (signedBy == null) {
signedBy = CertificateInfo.getSubjectFields((X509Certificate) signCertificate).getField("E");
}
if (signedBy == null) {
signedBy = "";
}
Rectangle sr2 = new Rectangle(signatureRect.getWidth() - MARGIN, signatureRect.getHeight() - MARGIN);
float signedSize = ColumnText.fitText(font, signedBy, sr2, -1, runDirection);

ColumnText ct2 = new ColumnText(app2);
ct2.setRunDirection(runDirection);
ct2.setSimpleColumn(new Phrase(signedBy, font), signatureRect.getLeft(), signatureRect.getBottom(), signatureRect.getRight(), signatureRect.getTop(), signedSize, Element.ALIGN_LEFT);

ct2.go();
break;
case GRAPHIC_AND_DESCRIPTION:
if (signatureGraphic == null) {
throw new IllegalStateException(MessageLocalization.getComposedMessage("a.signature.image.should.be.present.when.rendering.mode.is.graphic.and.description"));
}
ct2 = new ColumnText(app2);
ct2.setRunDirection(runDirection);
ct2.setSimpleColumn(signatureRect.getLeft(), signatureRect.getBottom(), signatureRect.getRight(), signatureRect.getTop(), 0, Element.ALIGN_RIGHT);

Image im = Image.getInstance(signatureGraphic);
im.scaleToFit(signatureRect.getWidth(), signatureRect.getHeight());

Paragraph p = new Paragraph();
// must calculate the point to draw from to make image appear in middle of column
float x = 0;
// experimentation found this magic number to counteract Adobe's signature graphic, which
// offsets the y co-ordinate by 15 units
float y = -im.getScaledHeight() + 15;

x = x + (signatureRect.getWidth() - im.getScaledWidth()) / 2;
y = y - (signatureRect.getHeight() - im.getScaledHeight()) / 2;
p.add(new Chunk(im, x + (signatureRect.getWidth() - im.getScaledWidth()) / 2, y, false));
ct2.addElement(p);
ct2.go();
break;
case GRAPHIC:
ct2 = new ColumnText(app2);
ct2.setRunDirection(runDirection);
ct2.setSimpleColumn(signatureRect.getLeft(), signatureRect.getBottom(), signatureRect.getRight(), signatureRect.getTop(), 0, Element.ALIGN_RIGHT);

im = Image.getInstance(signatureGraphic);
im.scaleToFit(signatureRect.getWidth(), signatureRect.getHeight());

p = new Paragraph(signatureRect.getHeight());
// must calculate the point to draw from to make image appear in middle of column
x = (signatureRect.getWidth() - im.getScaledWidth()) / 2;
y = (signatureRect.getHeight() - im.getScaledHeight()) / 2;
p.add(new Chunk(im, x, y, false));
ct2.addElement(p);
ct2.go();
break;
default:
break;
}

if (renderingMode != RenderingMode.GRAPHIC) {
if (size <= 0) {
Rectangle sr = new Rectangle(dataRect.getWidth(), dataRect.getHeight());
size = ColumnText.fitText(font, text, sr, 12, runDirection);
}
ColumnText ct = new ColumnText(app2);
ct.setRunDirection(runDirection);
ct.setSimpleColumn(new Phrase(text, font), dataRect.getLeft(), dataRect.getBottom(), dataRect.getRight(), dataRect.getTop(), size, Element.ALIGN_LEFT);
ct.go();
}

return super.getAppearance();
}

public float getOpacity() {
return opacity;
}

public void setOpacity(float opacity) {
if (opacity > 0 && opacity <= 1) {
this.opacity = opacity;
}
}
}



package com.itextpdf.text.pdf;

import com.itextpdf.text.DocumentException;

import java.io.IOException;
import java.io.OutputStream;

public class ExPdfStamper extends PdfStamper {
public static PdfStamper createSignature(final PdfReader reader, final OutputStream os) throws DocumentException, IOException {
ByteBuffer bout = new ByteBuffer();
PdfStamper stp = new PdfStamper(reader, bout, '\u0000', true);
stp.sigApp = new ExPdfSignatureAppearance(stp.stamper);
stp.sigApp.setSigout(bout);
stp.sigApp.setOriginalout(os);
stp.sigApp.setStamper(stp);
stp.hasSignature = true;
PdfDictionary catalog = reader.getCatalog();
PdfDictionary acroForm = (PdfDictionary) PdfReader.getPdfObject(catalog.get(PdfName.ACROFORM), catalog);
if (acroForm != null) {
acroForm.remove(PdfName.NEEDAPPEARANCES);
stp.stamper.markUsed(acroForm);
}
return stp;
}
}
Aulang 2018-10-29
  • 打赏
  • 举报
回复
Itext7实现:

public class ExPdfSigner extends PdfSigner {
public ExPdfSigner(PdfReader reader, OutputStream outputStream, boolean append) throws IOException {
super(reader, outputStream, append);
}

public ExPdfSigner(PdfReader reader, OutputStream outputStream, String path, boolean append) throws IOException {
super(reader, outputStream, path, append);
}

@Override
protected void preClose(Map<PdfName, Integer> exclusionSizes) throws IOException {
appearance.setLayer2Text("").setRenderingMode(PdfSignatureAppearance.RenderingMode.DESCRIPTION);

int page = appearance.getPageNumber();
Rectangle rectangle = appearance.getPageRect();

Image image = new Image(appearance.getSignatureGraphic());
image.setWidth(rectangle.getWidth()).setHeight(rectangle.getHeight()).setOpacity(0.75f);
image.setFixedPosition(page, rectangle.getLeft(), rectangle.getBottom());

Document doc = new Document(document).add(image);

doc.getRenderer().flush();
doc.getRenderer().close();

super.preClose(exclusionSizes);
}
}

思路是设置图片透明度,IText的实现盖章的图片无法设置透明度,就把电子签名和签名图片分开,签名图片单独作为图片添加。
回复一下,做个标记,方便以后的人参考。
帅衡衡 2017-04-27
  • 打赏
  • 举报
回复
楼主 解决了吗 我也在做这个 但是我找到方法解决了 就是把章的图片变成水印放到文字下方 然后签名的图片用一张透明的图片两个位置放在一起就可以了
robert_2015 2016-12-29
  • 打赏
  • 举报
回复
顶一下啊,有没有大哥会啊
bcsflilong 2016-12-20
  • 打赏
  • 举报
回复
我有个问题 虽然我不太明白这块的东西? 你这个要求是客户提的需求吗? 按照正常来说 那个签章盖住文字不是正常吗 如果签章在下面 那不就是背景水印了吗?还做电子签章做什么?
robert_2015 2016-12-20
  • 打赏
  • 举报
回复
有没有大牛啊,自己顶
robert_2015 2016-12-20
  • 打赏
  • 举报
回复
引用 5 楼 bcsflilong 的回复:
我有个问题 虽然我不太明白这块的东西? 你这个要求是客户提的需求吗? 按照正常来说 那个签章盖住文字不是正常吗 如果签章在下面 那不就是背景水印了吗?还做电子签章做什么?
因为这个章有可能覆盖住文字,影响文档的可读性(特别是图纸类的,如果在上面有可能会盖住参数) 不然就可能要重新找空白位置签,我们现实的红章盖在纸上的字上,还是可以看到文字的
robert_2015 2016-12-19
  • 打赏
  • 举报
回复
引用 1 楼 rumlee的回复:
调用pdfpwriter的getDirectContentUnder()方法获取PdfContentByte对象,再通过调用PdfContentByte的addimg方法可以将图片添加到文字下方,
sap.setSignatureGraphic(image); 上面已添加了图片
robert_2015 2016-12-19
  • 打赏
  • 举报
回复
引用 1 楼 rumlee的回复:
调用pdfpwriter的getDirectContentUnder()方法获取PdfContentByte对象,再通过调用PdfContentByte的addimg方法可以将图片添加到文字下方,
但是这种签名的怎么写,大哥
rumlee 2016-12-19
  • 打赏
  • 举报
回复
调用pdfpwriter的getDirectContentUnder()方法获取PdfContentByte对象,再通过调用PdfContentByte的addimg方法可以将图片添加到文字下方,
Itext PDF文档的数签名说明文档.pdf
itext官方数签名白皮书 我只翻译了我用到的一部分 关于数证书加密的内容 其他的关联内容并没有翻译
PDF签名ITEXT+keytool)
用keytool生成数证书,利用itext生成签名pdf,完整工程代码。
利用poi+itextpdf进行word转pdf.zip
将word转换成pdf确实有很多种方案!最近正好需要做一个这样的功能,需求是将word模板进行签名后转换为pdf。为此,我花了一点时间去网上找方案。这里记录一下最终的方案:利用poi+itextpdf进行word转pdf。此资源按包含源码和maven依赖。
java多种方式实现pdf文件电子签名
java实现pdf文件电子签名,可以直接在eclipse上运行,采用itextpdfpdfbox 两种方式实现!!!
itextpdf文件签名
NULL 博文链接:https://swordshadow.iteye.com/blog/1980063
Web 开发

81,095

社区成员

341,712

社区内容

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今

加载中

查看更多榜单
社区公告
暂无公告

试试用AI创作助手写篇文章吧

+ 用AI写文章

哆哆女性网暗黑2悔恨品牌宣传网站建设增城网站建设开发姓氏何起名字女孩网站建设公司高端seo营销代理猫咪起什么名字好近年起名出现率最高的字男孩起名免费2021年周易预测古宅凶灵设计 招标 网站办个婚礼婚庆要多少钱青铜峡网站建设电子公司起名大全两字河北省邮编建设网站制作公司的邓超演过的全部电视剧有哪些上海网站制作公司哪家好帮设计网站给虎年人起名字周易怎么算的潮牌男装起名好听的店名大全刘伯温算命邵阳网站制作多少钱网站设计和室内设计seo臻系统混凝土养生是什么意思一言既出驷马难追的意思一夜城淀粉肠小王子日销售额涨超10倍罗斯否认插足凯特王妃婚姻不负春光新的一天从800个哈欠开始有个姐真把千机伞做出来了国产伟哥去年销售近13亿充个话费竟沦为间接洗钱工具重庆警方辟谣“男子杀人焚尸”男子给前妻转账 现任妻子起诉要回春分繁花正当时呼北高速交通事故已致14人死亡杨洋拄拐现身医院月嫂回应掌掴婴儿是在赶虫子男孩疑遭霸凌 家长讨说法被踢出群因自嘲式简历走红的教授更新简介网友建议重庆地铁不准乘客携带菜筐清明节放假3天调休1天郑州一火锅店爆改成麻辣烫店19岁小伙救下5人后溺亡 多方发声两大学生合买彩票中奖一人不认账张家界的山上“长”满了韩国人?单亲妈妈陷入热恋 14岁儿子报警#春分立蛋大挑战#青海通报栏杆断裂小学生跌落住进ICU代拍被何赛飞拿着魔杖追着打315晚会后胖东来又人满为患了当地回应沈阳致3死车祸车主疑毒驾武汉大学樱花即将进入盛花期张立群任西安交通大学校长为江西彩礼“减负”的“试婚人”网友洛杉矶偶遇贾玲倪萍分享减重40斤方法男孩8年未见母亲被告知被遗忘小米汽车超级工厂正式揭幕周杰伦一审败诉网易特朗普谈“凯特王妃P图照”考生莫言也上北大硕士复试名单了妈妈回应孩子在校撞护栏坠楼恒大被罚41.75亿到底怎么缴男子持台球杆殴打2名女店员被抓校方回应护栏损坏小学生课间坠楼外国人感慨凌晨的中国很安全火箭最近9战8胜1负王树国3次鞠躬告别西交大师生房客欠租失踪 房东直发愁萧美琴窜访捷克 外交部回应山西省委原副书记商黎光被逮捕阿根廷将发行1万与2万面值的纸币英国王室又一合照被质疑P图男子被猫抓伤后确诊“猫抓病”

哆哆女性网 XML地图 TXT地图 虚拟主机 SEO 网站制作 网站优化