سؤال

ولدي مجموعة من لRTF المخزنة في السلاسل في C # وعلى طريقة لدمج هذه في وثيقة واحدة للطباعة كما يريد المستخدم لطباعتها وثيقة واحدة مع إعدادات الطباعة التي تظهر مرة واحدة. يمكنني استخدام مكتب إمكانية التشغيل المتداخل إذا لزم الأمر، وتجنب من الواضح أن هذا هو أفضل.

وتحرير: والاختراق الصفحة يكون ضروريا بين كل وثيقة أعتقد أنني يمكن أن مجرد إدراج \ صفحة لهذا على الرغم

هل كانت مفيدة؟

المحلول

هنا تذهب (C # رمز ل المدرجة في)

نصائح أخرى

وأنت سيكون لديك لإزالة زائدة} من الوثيقة الأولى.

وأنت سيكون لديك لإزالة {\ rtf1 ... و {fonttbl .. و {colortbl ... مقاطع من المستند الثاني. قد تحتاج إلى إلقاء نظرة على أي رأس، وهوامش وما إلى ذلك قد تكون لديكم.

وتفصلهم عن طريق \ الصفحة كما تقول.

وهذا يفترض الجداول الخط واللون هي نفسها.

وربما أفضل للحصول على إعدادات الطباعة من المستخدم ثم بصمت طباعة كل وثيقة على حدة، إن خيار.

والوثيقة 1:

{\rtf1\ansi\ansicpg1252\deff0\deflang5129
{\fonttbl{\f0\fswiss\fprq2\fcharset0 Arial;}}
{\colortbl;\red0\green0\blue0;}
\margl1134\margr1134\margt1134\margb1134\sectd 
\pard
Document One Content
\line
}

والوثيقة 2:

{\rtf1\ansi\ansicpg1252\deff0\deflang5129
{\fonttbl{\f0\fswiss\fprq2\fcharset0 Arial;}}
{\colortbl;\red0\green0\blue0;}
\margl1134\margr1134\margt1134\margb1134\sectd 
\pard
Document Two Content
\line
}

والمستندات المدمجة:

{\rtf1\ansi\ansicpg1252\deff0\deflang5129
{\fonttbl{\f0\fswiss\fprq2\fcharset0 Arial;}}
{\colortbl;\red0\green0\blue0;}
\margl1134\margr1134\margt1134\margb1134\sectd 
\pard
Document One Content

\page

\pard

Document Two Content
\line
}

ومجرد إزالة سوف الجدول الخط تعمل فقط في حالة استخدام كلتا الوثيقتين نفس مجموعة من الخطوط. سوف تحتاج إلى دمج فريد (الاتحاد) الجداول الخط (عنصر الخط الحكمة) إذا كنت ترغب في الحفاظ على المعلومات الخط كل من rtfs. وهذا العمل لعدد ن من rtfs ولكن مرة أخرى نحن بحاجة إلى اتحاد الجداول الخط الفردية .. أنا ركين حاليا على تطوير رمز لهذا الاتحاد سيتم نشر مرة واحدة جاهزة ..:)

في مشروعنا ونحن أيضا استخدام الكائن مكتب دوك لتقديم rtfs والاستفادة من الأتمتة كلمة ل. ولكنه يخلق تبعية بعد مايكروسوفت وورد مثبتة. خاصة أنها يمكن أن تثير مشكلة إذا كان رمز يحتاج إلى تشغيل من الملقم حيث الذاكرة هي أيضا مصدر قلق مثل استخدام كلمة API يسبب مثيل مايكروسوفت وورد ليتم تحميلها في الذاكرة. ولكن الحل لا يعمل !!

وحسنا !! استعداد لذلك مع رمز للوحدة من الجداول الخط في اثنين rtfs ودمجها للحفاظ متفاوتة fonts..Please قراءة RTFs في السلاسل.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Collections;
//Arjun 02nd May
namespace MergeRtf
{
class RTFUtils
{
    public static string getRTFBlock(string blockName,string rtf){

       int i=rtf.IndexOf(@"{\"+blockName);
        int startOfBlock = i;
        //Next find the end of style sheet element tag
        Stack<char> braceHolder=new Stack<char>();
        braceHolder.Push('{');

        string stylesheetBlock = "";

        while (braceHolder.Count != 0&&i<rtf.Length) {
            i++;
            if (rtf[i] == '{') {
                braceHolder.Push('{');
                continue;
            }
            if (rtf[i] == '}') {
                braceHolder.Pop();
            }
        }
        if (braceHolder.Count == 0) { 
        //encountered the ending tag for stylesheet
            stylesheetBlock = rtf.Substring(startOfBlock, i-startOfBlock+1); 
            return stylesheetBlock;
        }
        else
        {
            //Error in doc format
            throw (new Exception("Error in doc format"));
        }


    }



    public static string MergeRTFs(string rtf1,string rtf2,string mergingBreak){ 
        //mergingBreak is the type of break that will be sandwiched between the docs
        //get the fonttbl blocks for both the documents
        string fontTableOfDoc1 = getRTFBlock("fonttbl", rtf1);
        string fontTableOfDoc2 = getRTFBlock("fonttbl", rtf2);

        //get font lists
        List<string> fontList1 = ExtractRTFFonts(fontTableOfDoc1);
        List<string> fontList2 = ExtractRTFFonts(fontTableOfDoc2);

        //Union the font list
        IEnumerable<string> mergedfonts = fontList1.Union(fontList2);
        List<string> fontList3 = new List<string>(mergedfonts);
        string mergedFontListBlock = @"{\fonttbl";
        foreach (string font in fontList3) {
            mergedFontListBlock += font;
        }
        mergedFontListBlock += "}";

        //Find location of the fonttable in doc 1 and doc 2
        int indexOfFontTable1 = rtf1.IndexOf(@"{\fonttbl");
        int indexOfFontTable2 = rtf2.IndexOf(@"{\fonttbl");

        string rtfMerged = "";
        //Get rtf content before and after fonttable
        string headerRTF1 = rtf1.Substring(0, indexOfFontTable1);
        int endOfFontTableIndex=indexOfFontTable1 + (fontTableOfDoc1.Length-1);
        string trailerRTF1 = rtf1.Substring(endOfFontTableIndex + 1,      rtf1.LastIndexOf('}') - (endOfFontTableIndex + 1)); //-2 to remove ending } of 1st doc
        //create the first rtf with merged fontlist
        rtfMerged = headerRTF1 + mergedFontListBlock + trailerRTF1;
        //next identify trailer part after font table in rtf 2
        string trailerRTF2 = rtf2.Substring(indexOfFontTable2 + fontTableOfDoc2.Length);
        rtfMerged += mergingBreak + trailerRTF2;

        return rtfMerged;
    }

    private static List<string> ExtractRTFFonts(string fontTableBlock) {
        Stack<char> braces = new Stack<char>();
        List<string> fonts = new List<string>();
        int fontDefStart=0,fontDefLength;
        braces.Push('{');
        int i=0;
        while (braces.Count > 0 && i < fontTableBlock.Length) { 
            i++;
            if (fontTableBlock[i] == '{') {
                braces.Push('{');
                if (braces.Count == 2) { 
                //means font definition brace started store the position
                    fontDefStart = i;
                }
                continue;
            }
            if (fontTableBlock[i] == '}') {
                braces.Pop();
                if (braces.Count == 1) { 
                //means only root level brace left identifying one font definition ended
                    fontDefLength = i - fontDefStart + 1;
                    fonts.Add(fontTableBlock.Substring(fontDefStart,fontDefLength));
                }
            }
        }

        if (braces.Count == 0)
        {
            //everything is fine then
            return fonts;
        }
        else { 
        //malformed font table passed
            throw (new Exception("Malformed font table passed"));
        }
    }


}
} 

ويمكنك استخدام مربعي نص الغنية. قراءة الملف الخانات في مربع النص الغني واحد (rtbTemp)، ثم قص ولصق النص في الآخر (rtbMerged). على سبيل المثال:

RichTextBox rtbTemp = new RichTextBox();
RichTextBox rtbMerged = new RichTextBox();

string Merge(string s1, string s2)
{
    rtbTemp.Rtf = s1;
    rtbTemp.SelectAll();
    rtbTemp.Cut();
    rtbMerged.Paste();

    rtbMerged.AppendText(Environment.NewLine);
    rtbMerged.AppendText(Environment.NewLine);

    rtbTemp.Rtf = s2;
    rtbTemp.SelectAll();
    rtbTemp.Cut();
    rtbMerged.Paste();

    return rtbMerged.Rtf;
}

وأعتقد أن هناك أيضا وسيلة للقيام بذلك دون الدخول في تفاصيل شكل RTF. حفظ RTFs كملفات واستخدام النظام الآلي لMS Word لفتح وإلحاق الوثائق إلى بعضها البعض (ثم الحفظ مرة أخرى كما RTF).

ولقد استعملت هذه كود اثنين الدمج إلى RTF الملفات ، واستخدام دي طريقة دمج جو مستقر دي مسار ملفات دي. إذا كان لديك فقط النص دي يمكنك تعديله، ولكن إذا كان لديك وثيقة الأكبر سوف يكون في خطأ من الذاكرة. أنا آسف لغتي الإنجليزية.

وأنا فقط إزالة 3 حرف من نهاية الملف الخانات الأول، واحدة من الحرف الأول من ملف RTF الثاني وعمل جيدة!

RichTextBox r = new RichTextBox();
r.Rtf = rtf1.Rtf.Substring(0, rtf1.Rtf.Length - 3) + rtf2.Rtf.Substring(1,rtf2.Rtf.Length - 1)
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top