0

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

基于这个答案,我尝试了以下代码:

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);
}

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

谢谢。

4

1 回答 1

3

您实际上是在要求使用颜色键掩码PDF 功能。很遗憾

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

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

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


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

B(c b , c s ) = c b * c s

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

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

加深B(c b , c s ) = min(c b , c s )

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

注 7 用光源较暗的光源代替背景;否则,它保持不变。

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

要选择混合模式,您可以PdfGState像已经做的那样使用,而不是设置不透明度

state.FillOpacity = 0.1f;

你设置混合模式

state.BlendMode = PdfGState.BM_MULTIPLY;

或者

state.BlendMode = PdfGState.BM_DARKEN;
于 2016-11-29T08:29:03.030 回答