【问题标题】:How to add a printable or non-printable bitmap stamp to a PDF?如何在 PDF 中添加可打印或不可打印的位图图章?
【发布时间】:2015-05-27 14:05:16
【问题描述】:

我想在 PDF 文件中添加位图图章,根据实际的 Acrobat Reader 打印设置,该图章可以是可打印的还是不可打印的。

即当用户在AR打印对话框中选择组合框时,选项“文档” - 然后不会被打印,但选择“文档和标记”时,则位图会打印。

现在我可以创建可打印或不可打印的位图,但我无法创建根据用户选择既可打印又不可打印的位图

使用PdfStamper

这可能吗?

【问题讨论】:

  • 您是否知道您正在创建签名字段,而不是实际的数字签名? (您声称可以创建带有数字签名的 PDF,但这不是您在代码 sn-p 中所做的!)另外:如果您想添加图章注释,为什么要为签名添加小部件注释场地?如果您想要戳记注释,为什么不添加戳记注释?这个问题非常令人困惑。
  • @BrunoLowagie 我认为 OP 认为 Adob​​e Reader Stamps 与 iText PdfStamper“戳”到 PDF 上的内容一致。 @Vojtěch 请注意,Adobe Reader 认为邮票是一种非常特殊的注释,而签名可视化不是这样的邮票。
  • @mkl 啊哈,好的。并且签名字段不是签名。现在,似乎 OP 正在使用签名字段作为印章,但是一旦文档被签名,签名字段的外观就会改变,因此他为空签名字段定义的任何外观都无关紧要:它不会不再出现在签署的文件中。
  • @BrunoLowagie 感谢这个 cmets,抱歉,我不想添加太多代码,所以可能会造成混淆。似乎添加 Stamp 注释而不只是注释可以解决问题,但尚不确定如何实现。
  • 我已从 Adob​​e 查找有关 adbe.pkcs7.sha1 主题的官方信息,但一无所获, - 在此主题上,您不应从 Adob​​e 查找信息,而是从 ISO 获取信息。 2008 年的当前 PDF 规范 (ISO 32000-1) 已经建议使用 adbe.pkcs7.detached。我在这里拥有的最新 ISO 32000-2 草案指出“值 adbe.pkcs7.sha1 已被弃用。为了支持向后兼容性,PDF 阅读器应处理此密钥的此值,但 PDF 编写器不应使用此键的此值。”

标签: c# pdf pdf-generation itextsharp digital-signature


【解决方案1】:

my book 的第 7 章描述了创建戳记注释,更具体地说,在 TimeTableAnnotations3 示例中:

PdfAnnotation annotation = PdfAnnotation.createStamp(stamper.getWriter(),
    rect, "Press only", "NotForPublicRelease");
annotation.setFlags(PdfAnnotation.FLAGS_PRINT);

如果您查看打印预览,您会发现如果您打印不带图章的文档,这些注释不会显示:

在 C# 中,代码与 Java 代码非常相似:

 PdfAnnotation annotation = PdfAnnotation.CreateStamp(
     stamper.Writer, rect, "Press only", "NotForPublicRelease"
 );
 annotation.Flags = PdfAnnotation.FLAGS_PRINT;

请注意,PDF 查看器至少应具有以下名称的预定义图标:

  • 已批准,
  • 实验性,
  • 未批准,
  • 原样,
  • 已过期,
  • NotForPublicRelease,
  • 机密,
  • 决赛,
  • 已售出,
  • 部门,
  • 评论,
  • 绝密,
  • 草稿,
  • 公开发布。

这些图标的外观取决于不同的观看者。

【讨论】:

  • 谢谢,这很有趣 - 是否可以使用 itextsharp 创建自定义图章?
  • 是的,如果您查看示例创建的 PDF,您会发现您要求的功能也适用于线条注释、方形注释、圆形注释……@987654323 @
【解决方案2】:

我将在此处添加可行的解决方案,因为从提供的示例中找出它并不是很简单。现在PDF文档中有一个自定义的位图戳记注释,点击后会出现数字签名的属性窗口。

PdfReader reader = new PdfReader(this.inputPDF);
PdfStamper stamper = new PdfStamper(reader, fs);
PdfSignatureAppearance sap;
Rectangle stampRect = null;
//Add stamp annotation
if (StampImagePath != null && StampImagePath.Length > 0 && File.Exists(StampImagePath))
{
    Image stampImg = Image.GetInstance(stampImagePath);
    Rectangle location = new Rectangle(stampXpos, stampYpos, stampXpos + stampImg.Width, stampYpos + stampImg.Height);
    PdfAnnotation pdfStamp = PdfAnnotation.CreateStamp(
        stamper.Writer, location, null, Guid.NewGuid().ToString());                    
    stampImg.SetAbsolutePosition(0, 0);
    PdfAppearance app = stamper.GetOverContent(1).CreateAppearance(stampImg.Width, stampImg.Height);
    app.AddImage(stampImg);
    pdfStamp.SetAppearance(PdfName.N, app);
    pdfStamp.SetPage();
    pdfStamp.Flags = PdfAnnotation.FLAGS_PRINT;
    stamper.AddAnnotation(pdfStamp, 1);
    stampRect = location;
}

....
//After signing the document set visible signature to the annotation rectangle
if (stampRect!=null)
      sap.SetVisibleSignature(stampRect, 1, "SignatureESift");

【讨论】:

    猜你喜欢
    • 2015-07-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-05-13
    • 1970-01-01
    相关资源
    最近更新 更多