2009-03-10 10 views
6

Ich habe eine Reihe von RTFs in Strings in C# gespeichert ist eine Möglichkeit, diese in ein Dokument zum Drucken zusammenzuführen, wie der Benutzer sie als ein Dokument mit den Druckeinstellungen erscheint einmal drucken möchte. Ich kann Büro-Interop bei Bedarf verwenden, offensichtlich zu vermeiden, das ist besser.RTF-Dateien verschmelzen

Edit: Ein Seitenumbruch würde zwischen jedem Dokument denken notwendig sein, ich kann ich nur \ Seite für diese einsetzen obwohl

Antwort

0

Here Sie gehen (C# -Code ist enthalten in)

+0

Dies ist der Grund, warum Link-Only-Antworten abgeraten werden. Die Verbindung ist momentan tot. –

+0

@ScottChamberlain: Entschuldigung! Ich habe den Link aktualisiert. – anhldbk

+1

@anhldbk Bitte geben Sie die benötigten Informationen in die Antwort selbst, ich kann nicht auf die verknüpfte Website zugreifen, so ist die Antwort derzeit nicht hilfreich für mich – Breeze

4

Sie würden den nachgestellten entfernen müssen} aus dem ersten Dokument.

Sie müssten die Abschnitte {\ rtf1 ... und {fonttbl .. und {colortbl ... aus dem zweiten Dokument entfernen. Möglicherweise müssen Sie auf Kopfzeile, Ränder usw. schauen, die Sie haben könnten.

Trennen Sie sie durch eine \ Seite, wie Sie sagen.

Dies setzt voraus, dass die Schriftart- und Farbtabellen identisch sind.

Wahrscheinlich besser, um die Druckeinstellungen vom Benutzer zu erhalten, dann druckt jedes Dokument einzeln still, wenn das eine Option ist.

Dokument 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 
} 

Dokument 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 
} 

Merged Dokumente:

{\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 
} 
+0

Dies funktioniert nicht für komplexere RTFs wie die, die ich habe. Am Ende habe ich Interop benutzt. – PeteT

+0

Dies funktioniert auch nicht für Dokumente, die die Schriftart und Farbtabellen nicht genau teilen – Beta033

0

Ich denke, es ist auch ein Weg, dies zu tun, ohne in die Details der immer RTF-Format Speichern Sie Ihre RTFs als Dateien und verwenden Sie die Automatisierung von MS Word, um Dokumente zu öffnen und anzuhängen (speichern Sie sie dann erneut als RTF).

+0

Denken Sie, das ist der Ansatz, den ich am Ende nehmen werde, nur fragen, ob ich es tun kann, ohne die temporären separaten Dateien jetzt zu schreiben. – PeteT

0

Ich habe diese code two merge to rtf files verwendet, verwenden Sie die Methode Merge with de Pfad der de-Dateien. Wenn Sie nur Text haben, können Sie ihn ändern, aber wenn Sie ein größeres Dokument haben, liegt ein Speicherfehler vor. Es tut mir leid für mein Englisch.

+0

Code zum Zusammenführen von zwei RTF-Dateien –

3

Nur die Schriftarttabelle Entfernen nur funktioniert, wenn beide Dokumente den gleichen Satz von Schriftarten verwenden. Sie müssen die Fonttabellen (font-element weise) eindeutig zusammenführen (union), wenn Sie die Font-Informationen der beiden rtfs beibehalten möchten. Dies wird für n Anzahl von rtfs funktionieren, aber wieder brauchen wir die Vereinigung der einzelnen Font-Tabellen .. Ich bin derzeit arbeiten an der Entwicklung des Codes für diese Union wird einmal bereit ..

In unserem Projekt haben wir auch verwendet Office Doc-Objekt zum Rendern von rtfs und zum Nutzen der Automatisierung von Wörtern. Aber es erzeugt eine Abhängigkeit davon, dass ms-word installiert ist. Insbesondere kann es zu Problemen führen, wenn der Code von einem Server ausgeführt werden muss, auf dem auch Speicher eine Rolle spielt, da die Verwendung der Wort-API die Instanz von ms-word veranlasst, in den Speicher geladen zu werden. Aber die Lösung funktioniert !!

Okay !! So bereit mit dem Code für die Vereinigung von Font-Tabellen in zwei rtfs und das Zusammenführen von ihnen, um verschiedene Schriftarten zu erhalten .. Lesen Sie bitte die RTFs in Strings.

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


} 
} 
+0

Ich glaube nicht, dass dies funktioniert. Dadurch werden die Codes im zweiten Dokument nicht aktualisiert, wenn sie angewendet werden. was ich meine ist, in dem zweiten Dokument/f2 kann auf etwas Text angewendet werden, aber/f2 ist jetzt/f14 in der zusammengeführten Tabelle, so dass alle/f2 Codes im zweiten Dokument auf/f14 für die Schriftart aktualisiert werden müssen beibehalten werden. – Beta033

2

Sie können zwei Rich Text-Boxen verwenden. Lesen Sie die rtf-Datei in ein Rich-Text-Feld (rtbTemp), und schneiden Sie den Text aus und fügen Sie ihn in den anderen Text (rtbMerged) ein.Zum Beispiel:

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

Ich entferne nur 3 charecter vom Ende der ersten rtf-Datei und eines der ersten Zeichen der zweiten rtf-Datei und es gut funktionieren!

RichTextBox r = new RichTextBox(); 
r.Rtf = rtf1.Rtf.Substring(0, rtf1.Rtf.Length - 3) + rtf2.Rtf.Substring(1,rtf2.Rtf.Length - 1)