如何只使PDF图章的白色部分透明?

时间:2016-11-28 04:20:31

标签: c# pdf itext pdfstamper

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

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

感谢。

1 个答案:

答案 0 :(得分:2)

您基本上要求 Color Key Masking PDF功能。不幸的是

  

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

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

由于JPEG和JPEG通常使用 DCTDecode 过滤器嵌入PDF中,因此Color Key Masking可能无法正常工作。

您可能希望尝试使用其他混合模式,而不是使用透明度,例如变暗乘以

  

乘法 B(c b ,c s )= c b * c s < /子>

     

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

     

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

     

变暗 B(c b ,c s )= min(c b ,c 小号

     

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

     

注7:背景被光源较暗的光源所取代;否则,它保持不变。

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

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

state.FillOpacity = 0.1f;

您设置了混合模式

state.BlendMode = PdfGState.BM_MULTIPLY;

state.BlendMode = PdfGState.BM_DARKEN;