【问题标题】:Changing text color in PdfSharp更改 PdfSharp 中的文本颜色
【发布时间】:2014-05-29 11:28:28
【问题描述】:

我目前正在使用 PdfSharp 创建一个 PDF,其中主要包含文本和一些图像。 文本元素有不同的颜色。我的问题是,一旦我使用与开始使用的颜色不同的颜色,文本在生成的 PDF 中不可见(例如,我从黑色文本开始,切换到红色文本,红色文本不可见)。所有文本元素都在生成的 PDF 中(我可以选择它们),但红色元素是不可见的。

代码如下:

// Create a new PDF document with one page
var document = new PdfDocument();
var page = document.AddPage();
page.Width = 800;
page.Height = 600;
var defaultFont = new XFont("Arial", 12, XFontStyle.Regular, new XPdfFontOptions(PdfFontEmbedding.Always));
var gfx = XGraphics.FromPdfPage(page);

// black text
gfx.DrawString("black", defaultFont, XBrushes.Black, new XRect(x, y, width, height), XStringFormats.Center);

// red text
gfx.DrawString("red", defaultFont, XBrushes.Red, new XRect(x2, y2, width2, height2), XStringFormats.Center);

我已经找到了一个解决方案(重新创建 XGraphics 对象),但它很安静,因为每次颜色更改后都需要调用它:

// ...

// black text
gfx.DrawString("black", defaultFont, XBrushes.Black, new XRect(x, y, width, height), XStringFormats.Center);

// disposing the old graphics context and creating a new one seems to help
gfx.Dispose();
gfx = XGraphics.FromPdfPage(page);

// red text
gfx.DrawString("red", defaultFont, XBrushes.Red, new XRect(x2, y2, width2, height2), XStringFormats.Center);

我想有更好的解决方案,但我还没有找到。

编辑

正如answer 中所建议的,我想创建一个 SSCCE。在创建过程中,我发现了实际的错误。我没有使用XBrushes.Red,而是使用了自己定义的XBrush,但在上面的代码sn-p中没有提到它,因为我认为没有必要。

【问题讨论】:

    标签: pdf pdfsharp


    【解决方案1】:

    正如问题的最后部分已经提到的,我使用了自己定义的画笔而不是XBrushes.Red

    我是这样定义的:

    XBrush redBrush = new XSolidBrush(new XColor {R = 207, G = 0, B = 44});
    

    这种方式只有在我处理完图形对象并创建一个新对象后才能使用。但经过一番谷歌搜索后,我找到了定义画笔的正确方法:

    XBrush redBrush = new XSolidBrush(XColor.FromArgb(207, 0, 44));
    

    【讨论】:

    • XColor.FromArgb(207, 0, 44) 初始化 XColor 的所有成员并创建不透明的颜色。 new XColor {R = 207, G = 0, B = 44} 只初始化 R、G 和 B,但 Alpha 为 0,其他一些成员也没有初始化。
    【解决方案2】:

    我尝试使用您的代码 sn-p 和 PDFsharp 1.32 版来复制您的问题。我使用 VS Express 2013 自动将所有项目转换为 .NET 4.5。

    我尝试了两种构建(GDI+ 和 WPF),所有颜色都适合我。

    因此,您应该提供一个 SSCCE,而不仅仅是一个代码 sn-p。

    另请参阅:
    http://forum.pdfsharp.net/viewtopic.php?p=2094#p2094

    【讨论】:

    • 感谢您的建议,我认为代码 sn-p 就足够了,但您证明我错了。在创建 SSCCE 期间,我发现了这个错误。我将发布解决方案作为答案。
    猜你喜欢
    • 1970-01-01
    • 2010-11-18
    • 2017-03-14
    • 2012-11-27
    • 1970-01-01
    • 2023-04-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多