2016-11-28 45 views
0

使用iTextSharp,我想在PDF上加一個印章並使其透明。郵票上有各種顏色的文字(各種顏色),當整個圖像是透明的時候,這些文字變得難以閱讀,所以我不想讓彩色文字透明 - 只是郵票矩形中的白色背景。如何僅使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); 
} 

然而,這使得圖像半透明的彩色部分。我怎樣才能使圖像的空白背景透明,並使彩色部分不透明?

謝謝。

+0

你在這裏說話的圈子..你想在PDF上加一個印章,並使其透明,但不想讓顏色文本透明..所以你不想讓郵票透明..爲什麼你不只是編輯imagePath存在的圖像? –

+0

否則,興趣點將成爲'Stream inputImageStream' ..您將改爲將該文件加載到GraphicContext中,相應地對其進行修改,並將結果流提供給'GetInstance'。 –

+0

@BrettCaswell,在某些情況下,我們希望imagePath中的圖像不透明(例如,在深灰色背景上打印時),而在其他情況下,我們希望它透明。在這種情況下,我試圖用一種使它在Adobe中無法讀取的方式替換由福昕應用的透明郵票。你是說我不能使用白色郵票,並且必須以透明郵票開始? – sigil

回答

1

您實質上是要求彩色密鑰掩碼 PDF功能。不幸的是

當指定色鍵掩蔽,用於流使用DCTDecode或有損JPXDecode濾波器可產生意想不到的效果。

(第8.9.6.4 - 色鍵遮罩 - ISO 32000-1)

當你有一個JPEG和JPEG通常嵌入在使用DCTDecode過濾器的PDF文件,顏色鍵遮罩可能不按要求工作。


您可能想嘗試使用不同的混合模式,例如, 變暗乘以

乘法 B(C b,C 小號)= C b * C 小號

注1乘以背景和源色彩值。

注2結果顏色總是至少與兩種組成顏色中的任何一種顏色一樣黑。將任何顏色與黑色相乘都會產生黑色;用白色葉子乘以原來的顏色不變。用黑色或白色以外的顏色繪製連續的重疊對象會產生逐漸變暗的顏色。

變暗 B(C b,C 小號)= 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; 
+0

**變暗**似乎提供了我正在尋找的透明度。謝謝。 – sigil