You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何通过MigraDoc将数据库中的RTF字符串插入PDF文档?

在MigraDoc中插入RTF格式文本到PDF段落

MigraDoc本身没有直接导入RTF的内置方法,要实现这个需求,你可以借助.NET的RichTextBox控件(属于System.Windows.Forms程序集)来解析RTF内容,再将解析后的带格式文本转换为MigraDoc支持的格式添加到段落中。

实现步骤及代码示例

首先确保你的项目引用了System.Windows.Forms程序集,控制台程序还需要在Main方法上添加[STAThread]特性,之后用以下代码替换原有逻辑:

using System.Windows.Forms;
using MigraDoc.DocumentObjectModel;
using MigraDoc.Rendering;

[STAThread]
static void Main()
{
    Document document = new Document();
    Paragraph paragraph = document.LastSection.AddParagraph();

    // 读取RTF内容(替换为你的数据库RTF字符串)
    string rtfContent = File.ReadAllText("text.rtf");

    // 用RichTextBox解析RTF并转换为MigraDoc格式
    using (var richTextBox = new RichTextBox())
    {
        richTextBox.Rtf = rtfContent;
        
        // 批量处理连续相同格式的文本片段以优化性能
        int startIndex = 0;
        var currentFont = richTextBox.SelectionFont;
        var currentColor = richTextBox.SelectionColor;

        for (int i = 0; i < richTextBox.TextLength; i++)
        {
            richTextBox.Select(i, 1);
            var newFont = richTextBox.SelectionFont;
            var newColor = richTextBox.SelectionColor;

            // 格式变化时,处理上一段相同格式的文本
            if (!FontsMatch(currentFont, newFont) || !ColorsMatch(currentColor, newColor))
            {
                AddFormattedSegment(paragraph, richTextBox.Text.Substring(startIndex, i - startIndex), currentFont, currentColor);
                startIndex = i;
                currentFont = newFont;
                currentColor = newColor;
            }
        }
        // 处理最后一段文本
        AddFormattedSegment(paragraph, richTextBox.Text.Substring(startIndex), currentFont, currentColor);
    }

    PdfDocumentRenderer renderer = new PdfDocumentRenderer();
    renderer.Document = document;
    renderer.RenderDocument();
    string filename = "HelloMigraDoc.pdf";
    renderer.PdfDocument.Save(filename);
}

// 辅助方法:对比字体是否一致
private static bool FontsMatch(Font a, Font b)
{
    return a.Name == b.Name && a.Size == b.Size && a.Bold == b.Bold && a.Italic == b.Italic && a.Underline == b.Underline;
}

// 辅助方法:对比颜色是否一致
private static bool ColorsMatch(Color a, Color b)
{
    return a.R == b.R && a.G == b.G && a.B == b.B;
}

// 辅助方法:将文本片段转换为MigraDoc格式并添加到段落
private static void AddFormattedSegment(Paragraph paragraph, string text, Font font, Color color)
{
    var format = new FontFormat
    {
        Name = font.FontFamily.Name,
        Size = font.Size,
        Bold = font.Bold,
        Italic = font.Italic,
        Underline = font.Underline ? Underline.Single : Underline.None,
        Color = new MigraDoc.DocumentObjectModel.Color(color.R, color.G, color.B)
    };
    paragraph.AddFormattedText(text, format);
}

注意事项

  • 如果是WPF项目,也可以用FlowDocument解析RTF后再转换为MigraDoc内容,但WinForms的RichTextBox方式更适配MigraDoc的GDI版本。
  • 若RTF中包含复杂格式(如表格、图片),上述方法无法完全处理,这种情况建议先将RTF转换为PDF,再通过PDFsharp合并到目标文档中。

内容的提问来源于stack exchange,提问作者Modest

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.15 15:35:01