【问题标题】:How to make only the white part of a PDF stamp transparent?如何仅使 PDF 邮票的白色部分透明?
【发布时间】:2016-11-28 04:20:30
【问题描述】:

使用iTextSharp,我想在 PDF 上盖章并使其透明。印章上有彩色文本(各种颜色),当整个图像透明时变得难以阅读,所以我不想让彩色文本透明 - 只有印章矩形中的白色背景。

基于this answer,我尝试了以下代码:

public void addImage(PdfDictionary oldAnnot, string imagePath, 
                         int pageNumber,iTextSharp.text.Rectangle someRectangle) {
    Stream inputImageStream = new FileStream(imagePath, FileMode.Open, FileAccess.Read, FileShare.Read);
    iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(inputImageStream);
    PdfAnnotation pdfStamp = PdfAnnotation.CreateStamp(pdfStamper.Writer, someRectangle, null, Guid.NewGuid().ToString());
    image.SetAbsolutePosition(0, 0);
    PdfAppearance app = pdfStamper.GetOverContent(pageNumber).CreateAppearance(image.Width, image.Height);
    app.SaveState();
    PdfGState state = new PdfGState();
    state.FillOpacity = 0.1f;
    app.SetGState(state);
    app.AddImage(image);
    app.RestoreState();
    pdfStamp.SetAppearance(PdfName.N, app);
    pdfStamp.SetPage();
    pdfStamper.AddAnnotation(pdfStamp, pageNumber);
}

但是,这会使图像的彩色部分变为半透明。如何只让图片的空白背景透明而让彩色部分不透明?

谢谢。

【问题讨论】:

  • 你在这里绕圈子。你想在 pdf 上盖章并使其透明,但不想使彩色文本透明。所以你不想使图章透明.. 你为什么不只是编辑存在于 imagePath 的图像?
  • 否则,兴趣点将是Stream inputImageStream.. 您需要将文件加载到 GraphicContext,进行相应修改,并将结果流提供给 `GetInstance '。
  • @BrettCaswell,在某些情况下,我们希望 imagePath 中的图像不透明(例如,在深灰色背景上标记时),而在其他情况下,我们希望它是透明的。在这种情况下,我试图替换 Foxit 应用的透明图章,使其在 Adob​​e 中不可读。你是说我不能用白色印章,必须从透明印章开始?
  • 我是说addImage 不是应该负责编辑图像的方法。
  • 首先,您应该重载此方法,将签名中的string imagePath 替换为Stream inputImageStream,并删除该重载方法中inputImageStream 的声明和赋值。因为,您将在调用此 addImage 方法之前修改图像。

标签: c# pdf itext pdfstamper


【解决方案1】:

您实际上是在要求 彩色键屏蔽 PDF 功能。很遗憾

当指定色键掩码时,对流使用 DCTDecode 或有损 JPXDecode 过滤器可能会产生意想不到的结果。

(第 8.9.6.4 节 - 颜色键掩蔽 - ISO 32000-1)

由于您拥有 JPEG,并且 JPEG 通常使用 DCTDecode 过滤器嵌入到 PDF 中,因此颜色键掩码可能无法按预期工作。


您可能想尝试使用不同的混合模式,而不是使用透明度,例如变暗相乘

相乘 B(cb, cs) = cb * cs

注意 1 将背景颜色值和源颜色值相乘。

注意 2 结果颜色始终至少与两种组成颜色中的任何一种一样深。将任何颜色与黑色相乘会产生黑色;与白色相乘会使原始颜色保持不变。用黑色或白色以外的颜色绘制连续重叠的对象会产生逐渐变暗的颜色。

变暗 B(cb, cs) = min(cb, c s)

注意 6 选择较暗的背景和源颜色。

注意 7 背景被替换为源较暗的源;否则,保持不变。

(表 136 - 标准可分离混合模式 - ISO 32000-1)

要选择混合模式,您可以像以前一样使用PdfGState,但不要设置不透明度

state.FillOpacity = 0.1f;

你设置了混合模式

state.BlendMode = PdfGState.BM_MULTIPLY;

state.BlendMode = PdfGState.BM_DARKEN;

【讨论】:

  • Darken 似乎提供了我正在寻找的透明度。谢谢。
猜你喜欢
  • 1970-01-01
  • 2016-06-23
  • 1970-01-01
  • 2018-07-18
  • 2018-07-26
  • 1970-01-01
  • 1970-01-01
  • 2020-03-03
  • 1970-01-01
相关资源
最近更新 更多