ПРОДУКТЫ   СКАЧАТЬ КУПИТЬ ПОМОЩЬ БЛОГ  О КОМПАНИИ  
 
Основные возможности
HTML в RTF
HTML в Text
>>Объединение RTF
Скачать пробную версию
Купить
Online-demo
Документация
Новости
Отзывы и обзоры
How to convert multiple HTML files to a single RTF using C# .Net platform.

Как объединить RTF-документы в Console, WinForms или ASP.Net приложении с помощью C# и VB.Net

Три примера объединения RTF-файлов на C# и VB .Net

Краткий пример объединения двух RTF-документов

    Для начала давайте рассмотрим, как работает механизм объединения RTF-документов. Предположим, нам нужно объединить два RTF-файла: 1.rtf и 2.rtf.

1.rtf
{\rtf1
{\fonttbl{\f0 Calibri;}{\f1 Arial;}{\f2 Calibri;}{\f3 Verdana;}}
{\colortbl;\red255\green255\blue255;\red255\green0\blue0;}
\paperw12240\paperh15840
\f0\cf2 This is red text marked by Calibri font.}
1.rtf
2.rtf:
{\rtf1
{\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.}
2.rtf

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

{\rtf1
{\fonttbl{\f0 Calibri;}{\f1 Arial;}{\f2 Calibri;}{\f3 Verdana;}}
{\colortbl;\red255\green255\blue255;\red255\green0\blue0;}
\paperw12240\paperh15840
\f0\cf2 This is red text marked by Calibri font.
\par
\rtf1
{\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.}

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

Но у нового файла есть кое-какие проблемы, которые мы можем видеть на картинке:

This is merged RTF, note that 2nd line has a red color instead of blue and incorrect font.
    Строка 2 на картинке стала красной, а шрифт был изменен на Calibri.
Возникает вопрос: "Я ожидал синий текст Times New Roman. Почему получился другой шрифт и цвет?"

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

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

    Теперь вопрос на миллион: что мы должны сделать во время слияния двух документов RTF?

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

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

{\rtf1
{\fonttbl{\f0 Calibri;}{\f1 Arial;}{\f2 Calibri;}{\f3 Verdana;}{\f4 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
\f4\cf3 This is blue text marked by Times New Roman font.}
    Для наглядности результата этого процесса создайте пустой файл single.rtf и скопируйте содержимое из маркера кода с помощью кнопки Copy to clipboard.

Консольное приложение: объединение нескольких RTF-файлов на C# и VB.Net

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

    Во-первых, пожалуйста, загрузите «HTML to RTF .Net», который берет на себя все заботы об объединении RTF-файлов.

    Затем перейдите в Solution Explorer и добавьте ссылку на файл "SautinSoft.HtmlToRtf.dll" в Ваш проект.

          
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);
        }
    }
}

Чтобы получить аналогичный пример кода на C# или VB.Net, пожалуйста, следуйте по этому пути:

The folder structure of HTML to RTF .Net component
   Далее выберите папку "\Merge and Replace\Merge multiple RTF files".

Приложение Winforms: объединение содержимого двух RichTextBox-ов с помощью C# и VB.Net

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

Во-первых, пожалуйста, скачайте «HTML to RTF .Net», который предоставит API для объединения RTF.

Затем добавьте ссылку на файл "SautinSoft.HtmlToRtf.dll" в Ваш проект.

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);
            }
        }
    }
}

Чтобы получить это приложение WinForms на C# или VB.Net, пожалуйста, следуйте по этому пути:

The folder structure of HTML to RTF .Net component
    Далее перейдите в папку "WinForms - merge RTF from RichTextBox controls".

ASP.Net приложение: объединить два RTF-файла и выдать результат в браузере на C# и VB.Net

    Создайте новое ASP.Net приложение и добавьте два элемента управления загрузкой файлов(FileUpload), кнопку для объединения RTF-файлов(Button) и метку для отображения сообщений(Label).

    Затем скопируйте файл 'SautinSoft.HtmlToRtf.dll' в каталог Вашего проекта '\Bin'. Эта сборка .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);
        }
    }
}

Чтобы получить это ASP.Net приложение, скачайте «HTML to RTF .Net» компонент.
Затем распакуйте его:

The folder structure of HTML to RTF .Net component
   Далее выберите папку "ASP.Net - Merge RTF documents on fly".



NuGet   Online Demo   Скачать, 7.1.4 (17 апр. 2019)



Есть вопрос?

  • Если у Вас есть вопросы,
  • нужна помощь
  • или пример кода как конвертировать на C#, VB.Net, ASP.Net,
обращайтесь в нашу службу поддержки по адресу support@sautinsoft.com или спросите в онлайн-чате (правый нижний угол этой страницы). Мы Вам обязательно поможем!
 
 
Программы Скачать Помощь О компании
SautinSoft on Facebook SautinSoft on Twitter SautinSoft on Youtube Our Blog
Авторское право © 2002 - 2020 SautinSoft (начало с сайта sautin.com). Все права защищены.