RTF lib
От: Аноним  
Дата: 20.11.06 21:37
Оценка:
Добрый день.
Подскажите какую-либо библиотеку, которая бы позволяла создавать RTF документы. Содержимое документов — русский текст с различным форматированием (выравнивание абзацев, шрифт, цвет текста), таблицы в псевдографике, таблицы согласно спецификации rtf.
Re: RTF lib
От: Аноним  
Дата: 21.11.06 15:48
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Подскажите какую-либо библиотеку, которая бы позволяла создавать RTF документы. Содержимое документов — русский текст с различным форматированием (выравнивание абзацев, шрифт, цвет текста), таблицы в псевдографике, таблицы согласно спецификации rtf.


Простейших библиотек, которые создают базовые документы в RTF — полно в гугле
Хуже с созданием таблиц внутри документа. Такой библиотеки найти не получилось пришлось писать свое
Re[2]: RTF lib
От: Аноним  
Дата: 21.11.06 16:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, Аноним, Вы писали:


А>>Подскажите какую-либо библиотеку, которая бы позволяла создавать RTF документы. Содержимое документов — русский текст с различным форматированием (выравнивание абзацев, шрифт, цвет текста), таблицы в псевдографике, таблицы согласно спецификации rtf.


А>Простейших библиотек, которые создают базовые документы в RTF — полно в гугле

А>Хуже с созданием таблиц внутри документа. Такой библиотеки найти не получилось пришлось писать свое

А вот мне как-то не везет или я гуглом пользоваться не умею. Я нашел 3 небольшие библиотечки, но вот с символами юникода они не очень то дружат. Может подскажете какое-нибудь конкретное название? Или, если это возможно поделитесь своими наработками?
Re: RTF lib
От: Warturtle  
Дата: 21.11.06 17:40
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Добрый день.

А>Подскажите какую-либо библиотеку, которая бы позволяла создавать RTF документы. Содержимое документов — русский текст с различным форматированием (выравнивание абзацев, шрифт, цвет текста), таблицы в псевдографике, таблицы согласно спецификации rtf.

В исходниках doxygen'а есть файлы с говорящими названиями:
rtfdocvisitor.cpp
rtfdocvisitor.h
rtfgen.cpp
rtfgen.h
rtfstyle.cpp
rtfstyle.h

смотрим файл rtfgen.h, видим такую картину:
class RTFGenerator : public OutputGenerator
{
  public:
    RTFGenerator();
   ~RTFGenerator();
    static void init();
    static void writeStyleSheetFile(QFile &f);
    static void writeExtensionsFile(QFile &file);

    //OutputGenerator *copy();
    //OutputGenerator *clone() { return new RTFGenerator(*this); }
    //void append(const OutputGenerator *o);
    void enable() 
    { if (genStack->top()) active=*genStack->top(); else active=TRUE; }
    void disable() { active=FALSE; }
    void enableIf(OutputType o)  { if (o==RTF) active=TRUE;  }
    void disableIf(OutputType o) { if (o==RTF) active=FALSE; }
    void disableIfNot(OutputType o) { if (o!=RTF) active=FALSE; }
    bool isEnabled(OutputType o) { return (o==RTF && active); } 
    OutputGenerator *get(OutputType o) { return (o==RTF) ? this : 0; }

    void printDoc(DocNode *,const char *);

    void startFile(const char *name,const char *manName,const char *title);
    void writeFooter() {}
    void endFile();
    void clearBuffer();
    
    //void writeIndex();
    
    void startIndexSection(IndexSections);
    void endIndexSection(IndexSections);
    void startProjectNumber();
    void endProjectNumber();
    void writeStyleInfo(int part);
    void startTitleHead(const char *);
    void startTitle();
    void endTitleHead(const char *,const char *name);
    void endTitle() {} 

    void newParagraph();
    void writeString(const char *text);
    void startIndexList();
    void endIndexList();
    void startIndexKey();
    void endIndexKey();
    void startIndexValue(bool);
    void endIndexValue(const char *,bool);
    void startItemList();
    void endItemList();
    //void startEnumList();
    //void endEnumList();
    //void startAlphabeticalIndexList() {}
    //void endAlphabeticalIndexList() {} 
    //void writeIndexHeading(const char *) {}
    void writeIndexItem(const char *ref,const char *file,const char *name);
    void docify(const char *text);
    void codify(const char *text);
    void writeObjectLink(const char *ref,const char *file,
                         const char *anchor,const char *name);
    void writeCodeLink(const char *ref, const char *file,
                       const char *anchor,const char *name);
    void startTextLink(const char *f,const char *anchor);
    void endTextLink();
    void startHtmlLink(const char *url);
    void endHtmlLink();
    //void writeMailLink(const char *url);
    void startTypewriter() { t << "{\\f2 "; }
    void endTypewriter()   { t << "}";      }
    void startGroupHeader();
    void endGroupHeader();
    void writeListItem();

    void startMemberSections() {}
    void endMemberSections() {} 
    void startMemberHeader() { startGroupHeader(); }
    void endMemberHeader() { endGroupHeader(); }
    void startMemberSubtitle(); 
    void endMemberSubtitle(); 
    void startMemberList();
    void endMemberList();
    void startAnonTypeScope(int) {}
    void endAnonTypeScope(int) {}
    void startMemberItem(int);
    void endMemberItem();
    void startMemberTemplateParams() {}
    void endMemberTemplateParams() {}
    //void memberGroupSpacing(bool) {}
    //void memberGroupSeparator() {}
    void insertMemberAlign(bool) {}

    void writeRuler() { rtfwriteRuler_thin(); }
    
    void writeAnchor(const char *fileName,const char *name);
    void startCodeFragment();
    void endCodeFragment();
    //void startPreFragment()      { startCodeFragment(); }
    //void endPreFragment()        { endCodeFragment(); }
    //void startVerbatimFragment() { startCodeFragment(); }
    //void endVerbatimFragment()   { endCodeFragment(); }
    void writeLineNumber(const char *,const char *,const char *,int l) { t << l << " "; }
    void startCodeLine() { col=0; }
    void endCodeLine() { lineBreak(); }
    //void writeBoldString(const char *text) 
    //                     { t << "{\\b "; docify(text); t << "}"; }
    void startEmphasis() { t << "{\\i ";  }
    void endEmphasis()   { t << "}"; }
    void startBold()     { t << "{\\b "; }
    void endBold()       { t << "}"; }
    void startDescription();
    void endDescription();
    void startDescItem();
    void endDescItem();
    void lineBreak();
    void startMemberDoc(const char *,const char *,const char *,const char *);
    void endMemberDoc(bool);
    void startDoxyAnchor(const char *,const char *,const char *,const char *,const char *);
    void endDoxyAnchor(const char *,const char *);
    void startCodeAnchor(const char *) {};
    void endCodeAnchor() {};
    void writeChar(char c);
    void writeLatexSpacing() {};//{ t << "\\hspace{0.3cm}"; }
    //void writeLatexLabel(const char *scope,const char *anchor);
    void writeStartAnnoItem(const char *type,const char *file, 
                            const char *path,const char *name);
    void writeEndAnnoItem(const char *name);
    void startSubsection();
    void endSubsection();
    void startSubsubsection();
    void endSubsubsection();
    void startCenter()      { t << "{\\qc" << endl; }
    void endCenter()        { t << "}"; }
    void startSmall()       { t << "{\\sub "; }
    void endSmall()         { t << "}"; }
    //void startSubscript()   { t << "{\\sub " << endl;}
    //void endSubscript()     { t << "}"; }
    //void startSuperscript() { t << "{\\super " << endl;}
    //void endSuperscript()   { t << "}"; }
    //void startTable(bool,int);
    //void endTable(bool);
    //void startCaption();
    //void endCaption();
    //void nextTableRow();
    //void endTableRow();
    //void nextTableColumn();
    //void endTableColumn();
    //void writeCopyright()    { t << "\251"; }
    //void writeQuote()        { t << "\""; }
    //void writeUmlaut(char c);
    //void writeAcute(char c);
    //void writeGrave(char c);
    //void writeCirc(char c);
    //void writeTilde(char c);
    //void writeRing(char c);
    //void writeSharpS()       { t << "\337"; }
    //void writeCCedil(char c);

    void startMemberDescription();
    void endMemberDescription();
    void startDescList(SectionTypes);
    //void endDescList();
    void startSimpleSect(SectionTypes,const char *,const char *,const char *);
    void endSimpleSect();
    void startParamList(ParamListTypes,const char *);
    void endParamList();
    //void endDescTitle();
    void writeDescItem();
    void startSection(const char *,const char *,SectionInfo::SectionType);
    void endSection(const char *,SectionInfo::SectionType);
    //void writeSectionRef(const char *,const char *,const char *,const char *);
    //void writeSectionRefItem(const char *,const char *,const char *);
    //void writeSectionRefAnchor(const char *,const char *,const char *);
    void addIndexItem(const char *,const char *);
    void startIndent();
    void endIndent();
    void writeSynopsis()     {}
    //void generateExternalIndex() {}
    void startClassDiagram();
    void endClassDiagram(ClassDiagram &,const char *filename,const char *name);
    //void startColorFont(uchar,uchar,uchar) {}
    //void endColorFont()   {}
    void startPageRef();
    void endPageRef(const char *,const char *);
    //void startQuickIndexItem(const char *,const char *) {}
    //void endQuickIndexItem() {}
    void writeQuickLinks(bool,HighlightedItem) {}
    //void writeFormula(const char *,const char *);
    void writeNonBreakableSpace(int);
    //void startImage(const char *,const char *,bool);
    //void endImage(bool);
    //void startDotFile(const char *,bool);
    //void endDotFile(bool);
    
    void startDescTable();
    void endDescTable();
    void startDescTableTitle();
    void endDescTableTitle();
    void startDescTableData();
    void endDescTableData();
    
    void startDotGraph();
    void endDotGraph(DotClassGraph &);
    void startInclDepGraph();
    void endInclDepGraph(DotInclDepGraph &);
    void startGroupCollaboration();
    void endGroupCollaboration(DotGroupCollaboration &g);
    void startCallGraph();
    void endCallGraph(DotCallGraph &);
    void startDirDepGraph();
    void endDirDepGraph(DotDirDeps &g);
    void writeGraphicalHierarchy(DotGfxHierarchyTable &) {}

    void startMemberGroupHeader(bool);
    void endMemberGroupHeader();
    void startMemberGroupDocs();
    void endMemberGroupDocs();
    void startMemberGroup();
    void endMemberGroup(bool);
    
    void startTextBlock(bool dense);
    void endTextBlock(bool);
    void lastIndexPage();

    void startMemberDocPrefixItem() {}
    void endMemberDocPrefixItem() {}
    void startMemberDocName(bool) {}
    void endMemberDocName() {}
    void startParameterType(bool,const char *) {}
    void endParameterType() {}
    void startParameterName(bool) {}
    void endParameterName(bool,bool,bool) {}
    void startParameterList(bool) {}
    void endParameterList() {}

    void startFontClass(const char *) {}
    void endFontClass() {}

    //void startHtmlOnly()  {}
    //void endHtmlOnly()    {}
    //void startLatexOnly() {}
    //void endLatexOnly()   {}

    //void startSectionRefList() {}
    //void endSectionRefList() {}

    void writeCodeAnchor(const char *) {}

    static bool preProcessFileInplace(const char *path,const char *name);
    
  private:
    RTFGenerator(const RTFGenerator &);
    RTFGenerator &operator=(const RTFGenerator &);

    const char *rtf_BList_DepthStyle();
    const char *rtf_CList_DepthStyle();
    const char *rtf_EList_DepthStyle();
    const char *rtf_LCList_DepthStyle();
    const char *rtf_DList_DepthStyle();
    const char *rtf_Code_DepthStyle();
    void incrementIndentLevel();
    void decrementIndentLevel();
    int  col;

    bool m_bstartedBody;  // has startbody been called yet?
    int  m_listLevel; // // RTF does not really have a addative indent...manually set list level.
    bool m_omitParagraph; // should a the next paragraph command be ignored?
    int  m_numCols; // number of columns in a table
    QCString relPath;

    void beginRTFDocument();
    void beginRTFChapter();
    void beginRTFSection();
    void rtfwriteRuler_doubleline();
    void rtfwriteRuler_emboss();
    void rtfwriteRuler_thick();
    void rtfwriteRuler_thin();
    void writeRTFReference(const char *label);
    char *getMultiByte(int c);
};

— обнадеживающие названия, не правда ли?
Re[2]: RTF lib
От: Аноним  
Дата: 21.11.06 18:40
Оценка:
Здравствуйте, Warturtle, Вы писали:

W>Здравствуйте, Аноним, Вы писали:


А>>Добрый день.

А>>Подскажите какую-либо библиотеку, которая бы позволяла создавать RTF документы. Содержимое документов — русский текст с различным форматированием (выравнивание абзацев, шрифт, цвет текста), таблицы в псевдографике, таблицы согласно спецификации rtf.

W>В исходниках doxygen'а есть файлы с говорящими названиями:

W>- обнадеживающие названия, не правда ли?

Названия то обнадеживающие, но вот пытаться отделить эти несколько файлов от всего остального проекта большого желания не возникает. Особенно, когда на первый взгляд отделять особо нечего.
Re[3]: RTF lib
От: Y_G Россия  
Дата: 22.11.06 16:37
Оценка:
Здравствуйте, Аноним, Вы писали:

А>А вот мне как-то не везет или я гуглом пользоваться не умею. Я нашел 3 небольшие библиотечки, но вот с символами юникода они не очень то дружат.

Угу, согласен, "полно" — это я погорячился , был неправ.
sourceforge.org : rtflib — самая "независимая". остальные там представлены под конкретные цели, и, судя по описаниям, еще проще; также можно глянуть на codeproject.com.
По повду юникода — тоже сложный вопрос. Таких не найдено .

А>Может подскажете какое-нибудь конкретное название? Или, если это возможно поделитесь своими наработками?

Могу помочь советами и разной степени длины примерами кода
Кстати, если есть желание что-то раскрутить, можно поразбирать OpenOffice. Но. Как средство воспроизведения и создания rtf документов он не идентичен Word . Короче, результат не гарантирован.
Re[4]: RTF lib
От: Warturtle  
Дата: 22.11.06 17:48
Оценка:
Здравствуйте, Y_G, Вы писали:

Y_G>Здравствуйте, Аноним, Вы писали:

Y_G>...
Y_G>Кстати, если есть желание что-то раскрутить, можно поразбирать OpenOffice. Но. Как средство воспроизведения и создания rtf документов он не идентичен Word ...
Что касается воспроизведения, то даже Wordpad (т.е. стандартный контрол RichEdit) не идентичен Word'у.
Re[5]: RTF lib
От: Y_G Россия  
Дата: 22.11.06 18:17
Оценка:
Здравствуйте, Warturtle, Вы писали:

W>Что касается воспроизведения, то даже Wordpad (т.е. стандартный контрол RichEdit) не идентичен Word'у.

Ну это то вполне естественно. Но как-то вроде сравниваются несколько разноплановые вещи? Функциональность RichEdit в части RTF формата вообще достаточно простая.
Re: RTF lib
От: sjukov Украина  
Дата: 23.11.06 06:28
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Добрый день.

А>Подскажите какую-либо библиотеку, которая бы позволяла создавать RTF документы. Содержимое документов — русский текст с различным форматированием (выравнивание абзацев, шрифт, цвет текста), таблицы в псевдографике, таблицы согласно спецификации rtf.

Предлагаю способ немного иного характера —

создать обычный html — с таблицами, форматированием и т.д. — это очень просто.
Потом готовый файл уже существующими текстовыми конвертерами перебросить в rtf.
Для своих нужд я так и делал.
... << RSDN@Home 1.1.4 stable SR1 rev. 568>>
Re[6]: RTF lib
От: Warturtle  
Дата: 25.11.06 17:29
Оценка:
Здравствуйте, Y_G, Вы писали:

Y_G>Здравствуйте, Warturtle, Вы писали:


W>>Что касается воспроизведения, то даже Wordpad (т.е. стандартный контрол RichEdit) не идентичен Word'у.

Y_G>Ну это то вполне естественно. Но как-то вроде сравниваются несколько разноплановые вещи? Функциональность RichEdit в части RTF формата вообще достаточно простая.
Простая или не простая, а показывать один и тот же rtf-файл они должны одинаково, во всяком случае, в общей части. Не зря же в спецификации rtf есть раздел "Conventions of an RTF reader".
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.