【问题标题】:Migradoc loses underline formatting before page breakMigradoc 在分页符之前丢失下划线格式
【发布时间】:2014-02-26 12:54:51
【问题描述】:

我有一个小的 HTML-to-PDF,它使用 MigraDoc 生成 PDF 文件。在段落中添加格式化文本似乎存在错误。问题是多页 PDF 中第一页上的所有文本的下划线格式都会丢失。粗体和斜体格式保留在所有页面上,但下划线仅从第二页开始显示。这是一个已知的 Migradoc 错误吗?

为了避免进一步的问题,这里是我的代码:

var textFormat = this.BuildTextFormat(isBold, isItalic, isUnderline);
var formattedText = paragraph.AddFormattedText(textFormat);
formattedText.Add(new Text(text));


private TextFormat BuildTextFormat(bool isBold, bool isItalic, bool isUnderline)
{
    var textFormat = TextFormat.NoUnderline;

    if (isUnderline)
    {
        textFormat = TextFormat.Underline;
    }

    if (isBold)
    {
        textFormat |= TextFormat.Bold;
    }

    if (isItalic)
    {
        textFormat |= TextFormat.Italic;
    }

    return textFormat;
}

更新:

只是让 PdfSharp 开发人员知道,虽然我解决了这个问题,但我仍然无法理解它是实现还是库错误,或两者兼而有之。通过更改样式的定义,更准确地说,更改字体颜色,解决了这个问题。

对于普通样式我们添加了类似如下的代码:

    var style = document.Styles["Normal"];
    style.Font.Color = Color.Parse("0x222222");

然后,从普通样式继承的其他样式也可以具有不同颜色的字体,也是从十六进制代码解析的。

最后的修复很小,只是像这样改变每个解析的颜色:

style.Font.Color = Color.Parse("0xFF222222");

解决此错误的另一种方法是创建 CMYK 颜色。作为一个单独的问题,当我这样做时,我还注意到用上面的行解析的颜色和 CMYK 生成的颜色略有不同,所以颜色解析器似乎也有问题。这里我假设 HEX 颜色 0x222222 应该与 CMYK(0,0,0,86.7) 相同。

问题是为什么所描述的修复解决了下划线问题错误,以及为什么该错误只出现在页面制动之前?另外,有趣的是,在调试这个问题时,我最初开始删除一些 pdf 内容,还有一种情况是,当从 PDF 文档中删除某些表格时,错误会消失,这对我来说毫无意义。

无论如何,感谢您让我知道如何创建 mdddl 文件。这很有帮助,因为它允许我测试一些东西。

【问题讨论】:

  • 避免问题的最佳方法是提供 SSCCE(另请参阅:sscce.org)。可能是 MigraDoc 错误,也可能是使用问题。您可以提供显示错误的 MigraDoc DDL 文件,而不是 SSCCE:pdfsharp.net/wiki/MigraDocDDL.ashx
  • "这是一个已知的 Migradoc 错误吗?"是 MigraDoc 错误还是使用问题?除了到目前为止发布的代码 sn-p 之外,如果能得到一些反馈,那就太好了。
  • 颜色“0x222222”是透明的,所以“0xff222222”是不透明颜色的正确值。 MigraDoc 将“0xff222222”转换为 CMYK(0,0,0,86.7),因此代码似乎没有错误。但 Adob​​e Reader 的计算似乎有点不同,CMYK(0,0,0,86.7) 看起来与“0xff222222”略有不同。所以“0x222222”应该是一种完全透明的颜色——但对于文本和下划线以及第 1 页和第 2 页应该看起来相同。但是“0xff222222”是正确的值,并且使用这个值一切正常。 MDDDL 文件允许您删除机密数据,我们可以复制该错误。
  • 感谢您的快速回复。英国时间 11.30 左右,我向 info2@empira 发送了一封电子邮件,其中包含 mdddl 文件。希望他们能帮助复制该错误,否则如果您需要其他任何内容,请告诉我。

标签: formatting pdf-generation underline migradoc


【解决方案1】:

我无法复制 MigraDoc 的问题。

这是我添加到 MigraDoc Hello World 示例中的代码:

paragraph2 = section.AddParagraph();
var textFormat0 = BuildTextFormat(false, false, false);
var textFormat1 = BuildTextFormat(false, false, true);
var textFormat2 = BuildTextFormat(false, true, false);
var textFormat3 = BuildTextFormat(false, true, true);
var textFormat4 = BuildTextFormat(true, false, false);
var textFormat5 = BuildTextFormat(true, false, true);
var textFormat6 = BuildTextFormat(true, true, false);
var textFormat7 = BuildTextFormat(true, true, true);
var formattedText = paragraph2.AddFormattedText(textFormat0);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat1);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat2);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat3);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat4);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat5);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat6);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat7);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat0);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat1);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat2);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat3);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat4);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat5);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat6);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat7);
formattedText.Add(new Text("Hello, World! "));
paragraph2 = section.AddParagraph();
formattedText = paragraph2.AddFormattedText(textFormat0);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat1);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat2);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat3);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat4);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat5);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat6);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat7);
formattedText.Add(new Text("Hello, World! "));
section.AddPageBreak();
paragraph2 = section.AddParagraph();
formattedText = paragraph2.AddFormattedText(textFormat0);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat1);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat2);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat3);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat4);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat5);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat6);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat7);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat0);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat1);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat2);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat3);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat4);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat5);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat6);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat7);
formattedText.Add(new Text("Hello, World! "));
paragraph2 = section.AddParagraph();
formattedText = paragraph2.AddFormattedText(textFormat0);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat1);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat2);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat3);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat4);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat5);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat6);
formattedText.Add(new Text("Hello, World! "));
formattedText = paragraph2.AddFormattedText(textFormat7);
formattedText.Add(new Text("Hello, World! "));

这会生成一个包含两页的 PDF 文件,并且带下划线的文本在两页上都能正确显示。

不是一般问题 - 我应该等待 SSCCE。

【讨论】:

  • 感谢并抱歉让您久等了。我更新了我的初始帖子。这个问题有点复杂,也很难复制。抱歉,我无法在这里提交我的完整代码
猜你喜欢
  • 1970-01-01
  • 2012-01-29
  • 1970-01-01
  • 2023-04-04
  • 2011-07-10
  • 1970-01-01
  • 1970-01-01
  • 2011-03-06
  • 1970-01-01
相关资源
最近更新 更多