горизонтально расположенные полосы: белая, синяя, красная

Слияние и замена RTF

SautinSoft.HtmlToRtf предоставляет API для объединения RTF-файлов и замены текста в них.

Чтобы разобраться, давайте рассмотрим, как работает механизм объединения документов RTF.

Предположим, нам нужно объединить два файла RTF: 1.rtf и 2.rtf

1.rtf

{\rtf1
{\fonttbl{\f0 Calibri;}{\f1 Arial;}{\f2 Verdana;}}
{\colortbl;\red255\green255\blue255;\red255\green0\blue0;}
\paperw12240\paperh15840
\f0\cf2 This is red text marked by Calibri font.}
строка текста красного цвета шрифтом 'Calibri'

2.rtf

{\rtf2
{\fonttbl{\f0 Times New Roman;}}
{\colortbl;\red255\green255\blue255;\red0\green0\blue255;}
\paperw24480\paperh15840
\f0\cf2 This is blue text marked by Times New Roman font.}
строка текста синего цвета шрифтом 'Times New Roman'

Чтобы объединить эти документы, мы должны:

  1. удалить последнюю скобку "}" в первом документе 1.rtf (строка 5),
  2. удалить первую скобку "{" во втором документе 2.rtf (строка 1),
  3. добавить новое ключевое слово '\ par' (single.rtf, строка 6) в качестве разделителя абзаца,
  4. объединить файлы в single.rtf:

single.rtf

{\rtf1
{\fonttbl{\f0 Calibri;}{\f1 Arial;}{\f2 Verdana;}}
{\colortbl;\red255\green255\blue255;\red255\green0\blue0;}
\paperw12240\paperh15840
\f0\cf2 This is red text marked by Calibri font.
\par
\rtf2
{\fonttbl{\f0 Times New Roman;}}
{\colortbl;\red255\green255\blue255;\red0\green0\blue255;}
\paperw24480\paperh15840
\f0\cf2 This is blue text marked by Times New Roman font.}
две строки красного цвета каждая шрифтом 'Calibri'

Отлично! Теперь любой RTF-reader уже может открыть новый файл single.rtf без ошибок.

Но у него есть небольшая проблема, которую можно увидеть на картинке. Мы ожидали увидеть вторую строку текста синего цвета шрифтом 'Times New Roman'. Почему получился другой шрифт и цвет?

Смотрим строку 11 в single.rtf. Ключевые моменты: \f0 и \cf2. То есть, нужно взять имя шрифта с индексом 0 и цвет с индексом 2 из наших таблиц {\fonttbl...} и {\colortbl...}.

Но в объединенном RTF мы не объединяли таблицы шрифтов - {\fonttbl...} и таблицы цветов {\colortbl...}. И поэтому RTF-ридер видит только 1-ю таблицу шрифтов (single.rtf, строка 2) и первую таблицу цветов (single.rtf, строка 3). Проще говоря, \f0 теперь соответствует Calibri, а \cf2 - красному цвету.

Наши действия:

  1. Объединить таблицы шрифтов, цветов и стилей из обоих файлов;
  2. Обновить индексы шрифтов, цветов и стилей в содержимом 2-го файла;
  3. При необходимости объединить размер страницы и данные полей;
  4. Удалить все повторяющиеся данные.

Подводя итог, взглянем на исправленный single.rtf с объединенными таблицами шрифтов и цветов:

{\rtf1
{\fonttbl{\f0 Calibri;}{\f1 Arial;}{\f2 Verdana;}{\f3 Times New Roman;}}
{\colortbl;\red255\green255\blue255;\red255\green0\blue0;\red0\green0\blue255;}
\paperw12240\paperh15840
\f0\cf2 This is red text marked by Calibri font.
\par
\f3\cf3 This is blue text marked by Times New Roman font.}

Чтобы увидеть правильный результат слияния, создайте пустой файл single.rtf и скопируйте содержимое из маркера кода с помощью кнопки изображение кнопки 'копировать' - 2 наложенных длуг на друга листа A4

Три примера слияния RTF-файлов на C# и VB.NET:

  1. Простое консольное приложение для объединения RTF-файлов.
  2. WinForms и RichTextbox для слияния RTF в виде строк.
  3. Приложение для объединения двух RTF-документов с помощью ASP.NET

Чтобы продолжить, пожалуйста, загрузите компонент SautinSoft.HtmlToRtf. Далее перейдите в Solution Explorer и добавьте ссылку на файл "SautinSoft.HtmlToRtf.dll" в ваш проект. Чтобы получить пример кода на C# или VB.NET, следуйте:

путь по папкам на ПК для выбора языка программирования C# или VB.NET

Затем перейдите в одну из папок, необходимую вам:

  • "Merge multiple RTF files"
  • "WinForms - merge RTF from RichTextBox controls"
  • "ASP.NET - Merge RTF documents on fly"

1. Простое консольное приложение для объединения RTF-файлов.

Предположим, у нас есть папка с файлами RTF с именами 1.rtf, 2.rtf, 3.rtf и так далее. Давайте создадим консольное приложение на C#, которое объединит все эти файлы в один - Single.rtf.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.IO;

namespace FunWithMergeRtf
{
  class Program
  {
    static void Main(string[] args)
    {
      string dirWithRtfs = @"c:\Rtf files\";
      string pathToSingleRtf = @"c:\Single.rtf";

      List <string>rtfFiles = new List<string> (Directory.GetFiles(dirWithRtfs, "*.rtf"));
      if (rtfFiles.Count < 1)
        return;
        // 1.rtf, 10.rtf, 2.rtf => 1.rtf, 2.rtf, 10.rtf
        rtfFiles.Sort(new MyFileComparer());

        // 1. Let's take 1st file from collection
        // And create Single.rtf from it.
        File.Copy(rtfFiles[0], pathToSingleRtf, true);

        // 2. Merge all files starting from 2nd file
        SautinSoft.HtmlToRtf h = new SautinSoft.HtmlToRtf();
        for (int i = 1; i < rtfFiles.Count; i++)
        {
          h.MergeRtfFile(pathToSingleRtf, rtfFiles[i], pathToSingleRtf);
        }
      }
    }
    // Compares files names by order: 1.rtf, 2.rtf, 10.rtf
    public class MyFileComparer : IComparer <string>
    {
      public int Compare(string path1, string path2)
      {
        string name1 = Path.GetFileNameWithoutExtension(path1);
        string name2 = Path.GetFileNameWithoutExtension(path2);
        return int.Parse(name1) - int.Parse(name2);
      }
    }
  }
}

2. Приложение Winforms. Объединение содержимого двух элементов управления RichTextBox с помощью C# и VB.NET

Предположим, у нас есть приложение WinForms с двумя элементами управления RichTextBox и кнопкой "Merge".

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.IO;

namespace MergeRichTextBoxes
{
  public partial class Form1 : Form
  {
    public Form1()
    {
      InitializeComponent();
    }
    private void btnMerge_Click(object sender, EventArgs e)
    {
      SautinSoft.HtmlToRtf h = new SautinSoft.HtmlToRtf();
      string pathToSingleRtf = @"c:\Single.rtf";

      // Specify to split documents by page break
      h.MergeOptions.PageBreakBetweenDocuments = true;
      // Merge two Rtf strings in memory
      string singleRtf = h.MergeRtfString(richTextBox1.Rtf, richTextBox2.Rtf);
      // Open result in default RTF-reader
      if (singleRtf != null)
      {
        File.WriteAllText(pathToSingleRtf, singleRtf);
        System.Diagnostics.Process.Start(pathToSingleRtf);
      }
    }
  }
}

3. Приложение ASP.NET: Объединить два RTF-файла и показать результат в браузере на C# и VB.NET

Создадим новое ASP.NET приложение и добавим два элемента управления загрузкой, кнопку для объединения RTF-файлов и ярлык для отображения сообщений.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using System.Web.UI;
using System.Web.UI.WebControls;
using System.IO;

namespace FunWithRtfMerging
{
  public partial class _default : System.Web.UI.Page
  {
    protected void Page_Load(object sender, EventArgs e)
    {
      lblMessage.Text="";
    }
    protected void btnMerge_Click(object sender, EventArgs e)
    {
      if (FileUpload1.FileBytes == null || FileUpload2.FileBytes == null)
      {
        lblMessage.Text = "Error! Please select two RTF files!";
        return;
      }
      // Let's merge our RTFs
      SautinSoft.HtmlToRtf h = new SautinSoft.HtmlToRtf();
      string singleRtf = h.MergeRtfString(BytesToString(FileUpload1.FileBytes),
      BytesToString(FileUpload2.FileBytes));

      // Show result to a user
      if (singleRtf != null)
      {
        Response.Buffer = true;
        Response.Clear();
        Response.ContentType = "application/rtf";
        Response.AddHeader("content-disposition", "inline; filename=\"Single.Rtf\"");
        byte[] data = System.Text.Encoding.UTF8.GetBytes(singleRtf);
        Response.BinaryWrite(data);
        Response.Flush();
        Response.End();
      }
    }
    static string BytesToString(byte[] b)
    {
      return System.Text.Encoding.UTF8.GetString(b);
    }
  }
}

Больше примеров кода смотрите здесь.

Есть вопрос?

стоящий в позе задумчивости человечек у красного знака вопроса выше его роста
  • Если у вас есть вопросы,
  • нужна помощь
  • или пример кода,

обращайтесь в нашу службу поддержки по адресу: [email protected] или спросите в онлайн-чате (правый нижний угол этой страницы). Мы Вам обязательно поможем!

Другие функции SautinSoft.HtmlToRtf

HTML →RTF HTML в DOCX HTML в Text ✦ Слияние/Замена RTF
 ВВЕРХ