如何使用itextsharp更改PDF中的背景图像颜色

时间:2017-10-07 05:03:36

标签: c# itext

我正在使用itextsharp来创建pdf及其工作效果,但现在当我尝试添加背景图像(作为水印)时,我想将图像颜色更改为黑白但不知道怎么做我正在发布截图以及我用于添加背景图像的代码。

enter image description here

代码:

public class PdfWriterEvents : IPdfPageEvent
        {
            string watermarkText = string.Empty;

            public PdfWriterEvents(string watermark)
            {
                watermarkText = watermark;
            }
            public void OnStartPage(PdfWriter writer, Document document)
            {
                float width = document.PageSize.Width;
                float height = document.PageSize.Height;
                try
                {
                    PdfContentByte under = writer.DirectContentUnder;
                    Image image = Image.GetInstance(watermarkText);                     
                    image.ScaleToFit(275f, 275f);
                    image.SetAbsolutePosition(150, 300);
                    under.AddImage(image);
                }
                catch (Exception ex)
                {
                    Console.Error.WriteLine(ex.Message);
                }
            }
            public void OnEndPage(PdfWriter writer, Document document) { }
            public void OnParagraph(PdfWriter writer, Document document, float paragraphPosition) { }
            public void OnParagraphEnd(PdfWriter writer, Document document, float paragraphPosition) { }
            public void OnChapter(PdfWriter writer, Document document, float paragraphPosition, Paragraph title) { }
            public void OnChapterEnd(PdfWriter writer, Document document, float paragraphPosition) { }
            public void OnSection(PdfWriter writer, Document document, float paragraphPosition, int depth, Paragraph title) { }
            public void OnSectionEnd(PdfWriter writer, Document document, float paragraphPosition) { }
            public void OnGenericTag(PdfWriter writer, Document document, Rectangle rect, String text) { }
            public void OnOpenDocument(PdfWriter writer, Document document) { }
            public void OnCloseDocument(PdfWriter writer, Document document) { }
        }

打电话给:

writer.PageEvent = new PdfWriterEvents(LogoImage);

那么如何将颜色更改为黑白,就像普通的水印图像一样。

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以通过两种方式更改图像颜色:

  1. 显然最简单的一个:使用像MS Paint或Adobe Photoshop这样的图像编辑器来更改图像内容颜色。

  2. 在运行时,正如您在评论中所述: “我想知道是否有任何其他选项可以通过后端代码使用itextsharp来改变图像的颜色”。您可以尝试以下代码,而不是使用public void goNext() { curr = curr.next; }


  3. itextsharp

    致谢:DareDevil's answer

    您可以使用提供的方法编辑图像。

    PS:当你完成并对结果感到满意时,请给@dareDevil的答案,这是一个很棒的发现!

答案 1 :(得分:1)

首先,您使用OnStartPage创建背景。这实际上是错误的。 iText开发人员一再强调,OnStartPage中的文档不应添加任何内容。相反,应该使用OnEndPage,在你的情况下不会产生任何问题,所以你应该这样做。

如果您只有一个位图,最好的方法是在某些图像处理软件中打开该位图,然后更改颜色以使图像最佳为水印背景。

另一方面,如果您有许多可能的图像用作背景,可能您甚至会为每个新文档获得单独的图像,然后您无法再将每个图像调整到最佳状态。相反,您可以通过某些服务操作位图本身,也可以使用PDF特定功能来操作图像外观。

E.g。使用您的页面事件监听器我得到了这个:

original green image in background

使用混合模式 Hue 用白色覆盖背景,这变为:

Changed image colors hue to white

看起来很暗但我们可以在混合模式下用浅灰色遮盖背景屏幕

Lightened up image

为此,我将代码从您的PdfWriterEvents方法OnStartPage移至OnEndPage(请参阅我的回答的开头)并将其更改为:

public void OnEndPage(PdfWriter writer, Document document)
{
    float width = document.PageSize.Width;
    float height = document.PageSize.Height;
    try
    {
        iTextSharp.text.Image image = iTextSharp.text.Image.GetInstance(watermarkText);
        image.ScaleToFit(275f, 275f);
        image.SetAbsolutePosition(150, 300);

        PdfGState gStateHue = new PdfGState();
        gStateHue.BlendMode = new PdfName("Hue");

        PdfGState gStateScreen = new PdfGState();
        gStateScreen.BlendMode = new PdfName("Screen");

        PdfContentByte under = writer.DirectContentUnder;
        under.SaveState();
        under.SetColorFill(BaseColor.WHITE);
        under.Rectangle(document.PageSize.Left, document.PageSize.Bottom, document.PageSize.Width, document.PageSize.Height);
        under.Fill();
        under.AddImage(image);
        under.SetGState(gStateHue);
        under.SetColorFill(BaseColor.WHITE);
        under.Rectangle(document.PageSize.Left, document.PageSize.Bottom, document.PageSize.Width, document.PageSize.Height);
        under.Fill();
        under.SetGState(gStateScreen);
        under.SetColorFill(BaseColor.LIGHT_GRAY);
        under.Rectangle(document.PageSize.Left, document.PageSize.Bottom, document.PageSize.Width, document.PageSize.Height);
        under.Fill();
        under.RestoreState();
    }
    catch (Exception ex)
    {
        Console.Error.WriteLine(ex.Message);
    }
}

我从IconArchive复制了图片。