2013-01-10 189 views
2

我使用iTextSharp(4.1.6.0)的不推荐版本从我的MVC3应用程序生成PDF,并且确实需要能够在其他顶部放置半透明形状形状和图像,目标是淡化图像下方的颜色,或将其变灰。我本来以为这将是作为设置选择颜色时形状填充Alpha通道那么简单,所以我想这:在iTextSharp中使用半透明填充绘制形状4.1.6.0

Document doc = new Document(); 
PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(@"C:/Filepath/doc.pdf", FileMode.Create)) 
doc.Open(); 
PdfContentByte over = writer.DirectContent; 

// draw shape to be faded out 
over.Rectangle(10, 10, 50, 50); 
over.SetColorFill(Color.BLUE); 
over.Fill(); 

// draw shape over the top to do the fading (red so i can easily see where it is) 
over.Rectangle(0, 0, 60, 60); 
over.SetColorFill(new Color(255,0,0,150)); // rgba 
over.Fill(); 

doc.Close(); 

我希望它可以绘制页面左下角附近的两个矩形,一个小的蓝色覆盖着一个更大的红色,半透明的,但红色的不是半透明的!

所以我做了一些谷歌上搜索,发现这个page,这实际上是关于iText的不是iTextSharp的,他们建议使用PdfGstate设置填充不透明度是这样的:

PdfGState gstate = new PdfGState(); 
gstate.setFillOpacity(0.3); 

但是当我尝试了gstate对象没有类似.setFillOpacity()的任何方法!如果任何人都能指出我正确的方向,我将非常感激。

回答

3

将Java库转换为C#库的规则之一是所有getXYZ和setXYZ方法都应转换为简单的C#属性。 所以gstate.setFillOpacity(0.3);将来到gstate.FillOpacity = 0.3f;

using (Document doc = new Document()) 
    { 
     PdfWriter writer = PdfWriter.GetInstance(doc, new FileStream(@"mod.pdf", FileMode.Create)); 
     doc.Open(); 
     PdfContentByte over = writer.DirectContent; 

     over.SaveState(); 

     over.Rectangle(10, 10, 50, 50); 
     over.SetColorFill(BaseColor.BLUE); 
     over.Fill(); 


     PdfGState gs1 = new PdfGState(); 
     gs1.FillOpacity = 0.5f; 
     over.SetGState(gs1); 

     over.Rectangle(0, 0, 60, 60); 
     over.SetColorFill(new BaseColor(255, 0, 0, 150)); 
     over.Fill(); 

     over.RestoreState(); 

     doc.Close(); 
    } 
+0

哦,我看,我不知道。虽然它不会引发任何错误,但它也不会导致任何透明度。我在Adobe Reader 11和Windows 8的pdf阅读器中打开它,两者的结果都一样。 – Ben

+0

我修改了应用PdfGState的答案。它适用于我,现在红色的矩形是透明的。 – VahidN

+0

优秀!完美的作品非常感谢你。值得注意的是,设置alpha在这里没有什么区别,透明度的高低完全取决于FillOpacity。 – Ben