首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >layer2中的签名外观字体颜色(itext 7)

layer2中的签名外观字体颜色(itext 7)
EN

Stack Overflow用户
提问于 2018-01-26 10:44:09
回答 2查看 1.3K关注 0票数 1

我试图使用iText7 7.1.0 (java)中的字体颜色生成外观签名。

使用iText5,在调用FontFactory.getFont()时包含了fontColor,然后:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
Font font = FontFactory.getFont(fontName, encoding, embedFont, fontSize, style, bColor); 
appearance.setLayer2Font(font); 

但是,在iText7中,字体似乎丢失了fontSize和fontColor信息。有一个新的appearance.setLayer2FontSize()方法用于fontSize。但我无法找到指示layer2字体颜色的方法。

我在clases文本或段落中找到了一个setFontColor。

但是,在生成signatureApperance时,要调用的方法似乎是PdfSignatureAppearance.setLayer2Text(String),参数只是一个字符串。

如何在layer2中修改iText7字体颜色?

提前谢谢。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-01-29 07:26:44

显然,在将iText 5移植到PdfSignatureAppearance 5到iText 7时,没有考虑到在iText 5字体对象中传输颜色的选项,至少我没有看到将所需颜色传输到外观创建过程中的任何官方方法。

在这种情况下,最明显的选择是手动创建第2层。这样做,您有所有的选项,以设计外观,你想要的。您可以复制和粘贴原始代码,包括所需的隐藏助手方法,以便从原始iText设计开始您的设计。

如果您不想这样做,也就是说,如果您仍然希望iText创建外观,而只是稍微调整一下外观,那么就有一个解决办法:您可以要求iText创建外观,然后对它们进行一些操作。

不幸的是,这现在需要反射,因为生成外观的PdfSignatureAppearance方法getAppearance()protected。(它曾经是public in iText 5.)

如果你对这样的工作没意见,你可以把你的文字涂成这样的颜色:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
PdfSigner signer = ...;
PdfSignatureAppearance appearance = signer.getSignatureAppearance();

[... customize the appearance using its usual methods ...]

// call appearance.getAppearance() using reflection
// this initializes the layers in the appearance object
Method getAppearanceMethod = PdfSignatureAppearance.class.getDeclaredMethod("getAppearance");
getAppearanceMethod.setAccessible(true);
getAppearanceMethod.invoke(appearance);

// add a fill color setting instruction
// at the start of layer 2
PdfFormXObject layer2 = appearance.getLayer2();
PdfStream layer2Stream = layer2.getPdfObject();
byte[] layer2Bytes = layer2Stream.getBytes();
layer2Stream.setData("1 0 0 rg\n".getBytes());
layer2Stream.setData(layer2Bytes, true);

signer.signDetached(...);

(https://github.com/mkl-public/testarea-itext7/blob/master/src/test/java/mkl/testarea/itext7/signature/CreateSpecialSignatureAppearance.java#L79测试方法testColorizeLayer2Text__)

由于最初生成的外观中的填充颜色不是显式设置的,而是默认设置为黑色的,此预置指令将所有文本红色(使用100%红色、0%绿色和0%蓝色的RGB颜色)着色。

实际上,我对iText 7仍然携带着所有这些签名层内容感到有点惊讶。至少自从ISO 32000-1在2008年发布以来,除了支持Adobe特有的行为之外,没有理由再使用这些层了,即使是Adobe自己也在ISO 32000-1之前几年就已经声明了这些行为。

是否有这么大的利益集团游说支持这些不受欢迎的行为?

票数 2
EN

Stack Overflow用户

发布于 2022-01-12 06:49:05

您可以使用这种方法创建自定义层2,然后对其添加修改。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// Create the signature appearance
            Rectangle rect = new Rectangle(36, 50, 200, 100);
            PdfSignatureAppearance appearance = signer.getSignatureAppearance();
            appearance
            .setLocation(location)

            // Specify if the appearance before field is signed will be used
            // as a background for the signed field. The "false" value is the default value.
            .setReuseAppearance(false)
            .setPageRect(rect)
            .setPageNumber(r.getNumberOfPages());
            signer.setFieldName("sig");
            
            appearance.setLayer2Font(PdfFontFactory.createFont(StandardFonts.TIMES_ITALIC));
            
            // Get the background layer and draw a gray rectangle as a background.
            PdfFormXObject n0 = appearance.getLayer0();
            float x = n0.getBBox().toRectangle().getLeft();
            float y = n0.getBBox().toRectangle().getBottom();
            float width = n0.getBBox().toRectangle().getWidth();
            float height = n0.getBBox().toRectangle().getHeight();
            PdfCanvas canvas = new PdfCanvas(n0, signer.getDocument());
            canvas.setFillColor(ColorConstants.CYAN);
            canvas.rectangle(x, y, width, height);
            canvas.fill();

            // Set the signature information on layer 2
            PdfFormXObject n2 = appearance.getLayer2();
            Paragraph p = new Paragraph("This document was signed by Bruno Specimen.");
            new Canvas(n2, signer.getDocument()).add(p);

            // Creating the signature
            IExternalSignature pks = new PrivateKeySignature(pk, digestAlgorithm, provider);
            IExternalDigest digest = new BouncyCastleDigest();
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48467637

复制
相关文章
并发编程时遇到的问题
观察逻辑发现这个数组中的每个元素执行起来,其实没有必然的先后关系,完全可以并发执行,于是我改了一版代码:
有财君
2023/03/22
5130
并发编程时遇到的问题
处理solr时遇到的问题
前面的博客说了,我在解决solr索引的问题,但是后面我遇到的问题一次比一次严重,上次还能访问solr和系统,上次博客中看到我的solr上面有报错,那是我new_core出现的问题,我作死的在linux中删除了new_core文件
余生大大
2022/11/02
6260
处理solr时遇到的问题
继承HibernateDaoSupport时遇到的问题
都知道spring提供的有零配置功能,而且看见别人的一个项目使用spring+mybatis,只在applicationContext.xml里定义了sqlSessionFactory,然后什么都不用配置了,baseDao继承自SqlSessionDaoSupport,只需要在每个dao上加@Repository注解,spring会自动向对象中注入sqlSessionFactory对象。
用户1212940
2019/05/28
9910
EasyGBS查找大华设备的录像列表时失败
EasyGBS查找大华设备的录像列表时页面提示query recordinfo return 400 Bad Request
EasyNVR
2020/04/23
7860
EasyGBS查找大华设备的录像列表时失败
Python在import时遇到的惨案
    最近使用基于python语言的django框架开发web相关的应用,但是在访问页面的时候会不定时的报错,import导入报错
用户9127725
2022/08/08
4370
MeterSphere教程:列表数据断言遇到的问题
另外的话,如果测试环境经常会删数据之类的,那么接口里面的测试数据可能就会受到影响,要尽可能的保证用例的稳定正常的执行。
小博测试成长之路
2023/02/24
1K0
MeterSphere教程:列表数据断言遇到的问题
我在移动web开发中遇到的各种问题
目前(2015年8月3日15:02:24)在大部分安卓手机都发现这个问题,触发bug的条件知道了,但是原因未知。触发bug的条件是需要横向滚动的层不能位于纵向滚动不是body的层下面(后面有具体解释)。
黒之染
2018/10/19
1.8K0
LAMP安装mysql 时遇到的问题汇总
1: 缺少 libaio 包, libaio是Linux下的一个异步非阻塞方式读写文件的接口。 1 2 3 [[email protected] MySQL]# ./scripts/mysql_install_db --user=mysql --datadir=/data/mysql Installing MySQL system tables... ./bin/mysqld: error while loading shared libraries: libaio.so.1:
老七Linux
2018/05/09
1.5K0
AIR切换SDK版本时遇到的问题
切换SDK,有时候会遇到这个问题。上面我使用的是sdk4.5,只需要修改应用程序的app.xml配置就可以正常运行air程序了。
meteoric
2018/11/16
7340
Impala删除kudu表时遇到的问题
在IMPALA上面创建了KUDU表之后DROP TABLE了该表,想要重新执行建表语句,但是发现报错了,提示表已存在无法新建。
chimchim
2023/10/17
4890
Impala删除kudu表时遇到的问题
记录使用mongoDB时遇到的有趣问题
最近在开发金融类的k线、盘口业务,而这些业务的海量数据如何存储,公司的技术选型,选择了MongoDB。
Blue_007
2023/10/21
2230
记录使用mongoDB时遇到的有趣问题
Struts框架搭建时所遇到的问题
        解决方案:将以下7个jar拷贝到项目工程中_(workspace_项目名_webRoot_WEB-INF_lib下),其他用到的包再慢慢添加:                             struts2-core-2.1.6.jar、                             xwork-2.1.2.jar、                             freemarker-2.3.13.jar、                            ognl-2.6.11.jar、                            commons-logging-1.0.4.jar、                            commons-fileupload-1.2.1.jar、                            commons-io-1.3.2.jar
shirayner
2018/08/10
4380
python 中如何查找列表长度
In this article, we will be unveiling techniques to find the length of a Python list. Finding the length actually means fetching the count of data elements in an iterable.
用户8418197
2022/01/09
2.7K0
在MATLAB中优化大型数据集时通常会遇到的问题以及解决方案
以上是在MATLAB中优化大型数据集时可能遇到的问题,对于每个问题,需要根据具体情况选择合适的解决方案。
一凡sir
2023/08/09
6490
在使用Qt5.8完成程序动态语言切换时遇到的问题
因为之前了解过一些Qt国际化的东西,所以在写程序的时候需要显示给用户的字符都使用了 tr(" ")的形式,然后使用 Qt Linguist得到相应的 qm(Qt message)文件,再通过网上介绍的方式,在 main函数中使用 installTranslator,即可让程序在启动时自动判断语言环境,加载相应语言。 至此,静态语言切换已经完成,下面要做的是动态切换(即不需要重启软件)。 1.首先,令语言能够切换的 GUI组件用的是 QComboBox,信号是 currentIndexChanged,在于这个
用户1653704
2018/06/07
1.6K0
我在面试机器学习、大数据岗位时遇到的各种问题
自己的专业方向是机器学习、数据挖掘,就业意向是互联网行业与本专业相关的工作岗位。各个企业对这类岗位的命名可能有所不同,比如数据挖掘/自然语言处理/机器学习算法工程师,或简称算法工程师,还有的称为搜索/推荐算法工程师,甚至有的并入后台工程师的范畴,视岗位具体要求而定。 机器学习、大数据相关岗位的职责 自己参与面试的提供算法岗位的公司有 BAT、小米、360、飞维美地、宜信、猿题库 等,根据业务的不同,岗位职责大概分为: 平台搭建类 数据计算平台搭建,基础算法实现,当然,要求支持大样本量、高维度数据,所以可能
小莹莹
2018/04/20
1.3K0
我在面试机器学习、大数据岗位时遇到的各种问题
在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”?
在查找预编译头时遇到意外的文件结尾。是否忘记了向源中添加“#include "StdAfx.h"”? 右键选择该文件.cpp格式的->属性->预编译头,→ 不使用预编译头 错误描述:fatal err
战神伽罗
2019/07/24
8.4K0
使用jQuery中hover事件时遇到的一个小问题
在jQuery中有一个hover()方法,它可以实现模拟css中:hover这个伪类的效果。
colezhou
2019/11/24
1.8K0
如何解决爬虫程序中登录时遇到的动态Token问题
在进行网络爬虫开发时,我们经常会遇到登录网站的需求。然而,有些网站为了增加安全性,会采用动态Token的方式进行用户认证。这就给爬虫程序的开发带来了一定的的挑战。所以今天我们就重点来介绍如何解决爬虫程序中登录时遇到的动态问题。
小白学大数据
2023/08/16
1.3K0
点击加载更多

相似问题

在Prolog中查找列表长度时遇到的问题

21

在测试python中是否存在列表中的内容时遇到问题

10

在Puppet中查找模板时遇到问题

22

在python selenium中查找元素时遇到的问题

15

查找每个会话的列表消息查询时遇到问题

10
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文