gpt4 book ai didi

c# - 使用 iText 创建具有完整自己外观的签名

转载 作者:行者123 更新时间:2023-11-30 21:53:40 28 4
gpt4 key购买 nike

我需要创建签名,其中仅包含签名名称和日期。此外,这两个字段必须放置在精确的坐标处,因为这两个字段必须放置在预定义的“修订表”中。

这可能吗?

这是我的代码,非常(!)与 Bruno Lowagie 的示例非常相似,可能甚至不接近问题的解决方案:

namespace signatures.chapter3 {
public class C3_11_SignWithToken
{
public static String SRC = "../../../../resources/hello.pdf";
public static String DEST = "../../../../results/chapter3/hello_token.pdf";

public void Sign(String src, String dest,
ICollection<X509Certificate> chain, X509Certificate2 pk,
String digestAlgorithm, CryptoStandard subfilter,
String reason, String location,
ICollection<ICrlClient> crlList,
IOcspClient ocspClient,
ITSAClient tsaClient,
int estimatedSize)
{

// Creating the reader and the stamper
PdfReader reader = null;
PdfStamper stamper = null;
FileStream os = null;

try
{
reader = new PdfReader(src);
os = new FileStream(dest, FileMode.Create);
// os = new FileStream(dest, FileMode.Create, FileAccess.Write);

//Activate MultiSignatures
stamper = PdfStamper.CreateSignature(reader, os, '\0', null, true);
//To disable Multi signatures uncomment this line : every new signature will invalidate older ones !
//stamper = PdfStamper.CreateSignature(reader, os, '\0');


// Creating the appearance
PdfSignatureAppearance appearance = stamper.SignatureAppearance;
//appearance.Location = location;
//appearance.SetVisibleSignature(new Rectangle(36, 612, 144, 644), 1, "sig4");

appearance.Reason = "marked as changed";
appearance.Location = location;
//appearance.SetVisibleSignature("Reason");
appearance.Layer2Text = "Signed on " + DateTime.Now;
appearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.DESCRIPTION;


// Creating the signature
IExternalSignature pks = new X509Certificate2Signature(pk, digestAlgorithm);
MakeSignature.SignDetached(appearance, pks, chain, crlList, ocspClient, tsaClient, estimatedSize, subfilter);

}

catch (Exception ex) {
Console.WriteLine("GMA: " + ex.Message);
}
finally
{
if (reader != null)
reader.Close();
if (stamper != null)
stamper.Close();
if (os != null)
os.Close();
}
}
}

非常感谢!

最佳答案

谢谢@mkl。你的提示很有帮助,解决了这个问题。这是我的代码,它就像一个魅力:

public class SignWithToken   {
public void Sign(String src, String dest,
ICollection<X509Certificate> chain, X509Certificate2 pk,
String digestAlgorithm, CryptoStandard subfilter,
String reason, String location,
ICollection<ICrlClient> crlList,
IOcspClient ocspClient,
ITSAClient tsaClient,
int estimatedSize, int RowIdx, int RowHeight, int x, int y, int NameWidth, int DateWidth,
String RevIndex, String RevStep, String Reason, String Name, String Date)
{

// Creating the reader and the stamper
PdfReader reader = null;
PdfStamper stamper = null;
FileStream os = null;

try
{
reader = new PdfReader(src);
os = new FileStream(dest, FileMode.Create);
// os = new FileStream(dest, FileMode.Create, FileAccess.Write);

//Activate MultiSignatures
stamper = PdfStamper.CreateSignature(reader, os, '\0', null, true);
//To disable Multi signatures uncomment this line : every new signature will invalidate older ones !
//stamper = PdfStamper.CreateSignature(reader, os, '\0');


// Creating the appearance
PdfSignatureAppearance appearance = stamper.SignatureAppearance;

Rectangle rectangle = new Rectangle(x, y + RowIdx * RowHeight, x + NameWidth + DateWidth, y + (RowIdx+1) * RowHeight);
appearance.SetVisibleSignature(rectangle, 1, "Revision " + RevIndex + "|" + RevStep);

appearance.Reason = "marked as changed";
appearance.Location = location;

appearance.Layer2Text = "Signed on " + DateTime.Now;
appearance.SignatureRenderingMode = PdfSignatureAppearance.RenderingMode.DESCRIPTION;
PdfTemplate n2 = appearance.GetLayer(2);
Font font = new Font();
font.SetColor(255, 0, 0);
font.Size = 10;

ColumnText ct1 = new ColumnText(n2);
ct1.SetSimpleColumn(new Phrase(Name, font), 0, 0, NameWidth, rectangle.Height, 15, Element.ALIGN_LEFT);
ct1.Go();

ColumnText ct2 = new ColumnText(n2);
ct2.SetSimpleColumn(new Phrase(Date, font), NameWidth, 0, rectangle.Width, rectangle.Height, 15, Element.ALIGN_LEFT);
ct2.Go();

//n2.ConcatCTM(1, 0, 0, -1, 0, 0);
//n2.SaveState();

// Creating the signature
IExternalSignature pks = new X509Certificate2Signature(pk, digestAlgorithm);
MakeSignature.SignDetached(appearance, pks, chain, crlList, ocspClient, tsaClient, estimatedSize, subfilter);
}

catch (Exception ex)
{
Console.WriteLine("GMA: " + ex.Message);
}
finally
{
if (reader != null)
reader.Close();
if (stamper != null)
stamper.Close();
if (os != null)
os.Close();
}
}
}

关于c# - 使用 iText 创建具有完整自己外观的签名,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33734663/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com