81,095
社区成员
341,712
社区内容
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;
}
}
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);
}
}
哆哆女性网暗黑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图男子被猫抓伤后确诊“猫抓病”