#pragma once #include "DocFile.h" #include "../../Common/DocxFormat/Source/DocxFormat/Docx.h" //#include "../../Common/DocxFormat/Source/Utility/Parse.h" #include "../../Common/DocxFormat/Source/Utility/Unit.h" #include "InternalElements.h" #include "TableUtils.h" #include "../Common/Callback.h" namespace DOCXTODOC { class CPrCopier { public: CPrCopier(PrlList* dest, PrlList* source): m_dest(dest), m_source(source) { if ((NULL != m_dest) && (NULL != m_source)) { AddOrReplaceProperties(); } } private: inline void AddOrReplaceProperties() { for (vector::const_iterator iter = m_source->begin(); iter != m_source->end(); ++iter) { RemovePropertyByCode(iter->GetSprmCode()); m_dest->push_back(*iter); } } inline void RemovePropertyByCode(unsigned short sprm) { for (vector::iterator iter = m_dest->begin(); iter != m_dest->end(); ++iter) { if (iter->GetSprmCode() == sprm) { m_dest->erase(iter); RemovePropertyByCode(sprm); break; } } } private: PrlList* m_dest; PrlList* m_source; }; class CFileTransformer { public: CFileTransformer (); ~CFileTransformer(); long Convert(const wchar_t* ooxFolder, const wchar_t* docFile, const ProgressCallback* ffCallBack); private: bool UpdateProgress (const ProgressCallback* ffCallBack, long nComplete); void ConvertDocument (const OOX::Document& oXmlDoc); void ConvertContent (const vector& oItems); template ASCDocFileFormat::Paragraph ConvertParagraph (const OOX::Logic::Paragraph& oXmlParagraph); // Document std::wstring GetFontNameByThemeName(const std::wstring& themeName); vector BuildXASs(const OOX::Logic::Table& docxTable, const vector& tableCells); bool ValidParagraph (const OOX::Logic::Paragraph& oXmlParagraph); template ASCDocFileFormat::Hyperlink ConvertHyperlink( const OOX::Logic::Hyperlink& docxHyperlink, const PrlList& styleDocRunProperties); template void UpdateItemByCondition( T* docItem, const wstring& condition); const PrlList ConvertRunProperties (const OOX::Logic::RunProperty& docxRunProperties); const PrlList ConvertParagraphProperties( const OOX::Logic::ParagraphProperty& docxParagraphProperties); PrlList ConvertTableProperties( const OOX::Logic::TableProperty& docxTableProperties, unsigned int cellsCount = 0); ASCDocFileFormat::Constants::VerticalMergeFlag ConvertTableVerticalMergeFlag( const nullable& vMerge); template void ConvertFldSimple( const OOX::Logic::FldSimple& fldSimpleDocx, const PrlList& styleDocRunProperties, ASCDocFileFormat::Paragraph& docParagraph, wstring& runType); // настройки страниц документа ASCDocFileFormat::SectionProperties ConvertSectionProperties (const OOX::Logic::SectorProperty& oSection); bool AddLineNumberingSettings (const OOX::Logic::SectorProperty& oSection, PrlList& arrSettings); // верхний колонтитул ASCDocFileFormat::Header ConvertHeader (const OOX::Header& oHeader); // нижний колонтитул ASCDocFileFormat::Footer ConvertFooter (const OOX::Footer& oFooter); // Table template ASCDocFileFormat::Table CreateTable (const OOX::Logic::Table& oXmlTable); const PrlList ConvertTableRowCellsProperties(const OOX::Logic::Table& oXmlTable, int nY, int nCY, const vector& docxTableCells, const OOX::Styles::Style& oStyle); const PrlList ConvertTableRowProperties(int nY, const OOX::Logic::TableRowProperties& oXmlRow); // Fonts void AddInternalFont(const std::wstring& strFontName); void ConvertFontTable(const OOX::FontTable& oFontTable); ASCDocFileFormat::PANOSE ConvertPanose (const std::wstring& strPanose); // Styles PrlList GetParagraphPropertiesFromStyleHierarchy (const string& styleID, PrlList* styleDocRunLinkProperties); PrlList GetRunPropertiesFromStyleHierarchy (const string& styleID); PrlList GetTablePropertiesFromStyleHierarchy (const string& styleID); void ConvertStyleSheet (const OOX::Styles& oStyleSheet); vector ConvertLatentStyles (/*const OOX::Styles::LattentStyles& latentStyles*/); vector ConvertStyleDefinitions (const vector& arrStyles); std::string GetStyleID (const OOX::Logic::Paragraph& oXmlParagraph); // Numbering const vector ConvertAbstractNums (const vector& arrNums); const vector ConvertLVLs (const OOX::Numbering& numbering, const vector& _abstractNums); const ASCDocFileFormat::LVL ConvertLVL (const OOX::Numbering::Level& _level); const ASCDocFileFormat::Xst ConvertLvlText (const std::wstring& _lvlText, ASCDocFileFormat::Constants::MSONFC _nfc); void ConvertNumbering (const OOX::Numbering& _numbering); const ASCDocFileFormat::PlfLfo ConvertNums (const vector& _nums); int FindAbstractNumIdWithStyleRef (const OOX::Numbering& numbering, const std::wstring& refLink); // run rule transform template ASCDocFileFormat::Run ConvertRun(const OOX::Logic::Run& oXml, const PrlList& styleDocRunProperties, std::wstring& strRunType); template bool TextXmlRunTransform (const OOX::Logic::Text& oXml, ASCDocFileFormat::Run& oBinRun); template bool FldCharXmlRunTransform (const OOX::Logic::FldChar& oXml, ASCDocFileFormat::Run& oBinRun, std::wstring& strRunType); template bool InstrTextXmlRunTransform (const OOX::Logic::InstrText& oXml, ASCDocFileFormat::Run& oBinRun, std::wstring& strRunType); template bool DrawingXmlRunTransform (const OOX::Logic::Drawing& oDrawing, ASCDocFileFormat::Run& oBinRun); template bool PictXmlRunTransform (const OOX::Logic::Pict& oXml, ASCDocFileFormat::Run& oBinRun); template bool DelTextXmlRunTransform (const OOX::Logic::DelText& oXml, ASCDocFileFormat::Run& oBinRun); template bool SymbolXmlRunTransform (const OOX::Logic::Symbol& oXml, ASCDocFileFormat::Run& oBinRun); template bool BreakXmlRunTransform (const OOX::Logic::Break& oXml, ASCDocFileFormat::Run& oBinRun); template bool TabXmlRunTransform (const OOX::Logic::Tab& oXml, ASCDocFileFormat::Run& oBinRun); template bool FootnoteReferenceXmlRunTransform (const OOX::Logic::FootnoteReference& oXml, ASCDocFileFormat::Run& oBinRun); template bool FootnoteRefXmlRunTransform (const OOX::Logic::FootnoteRef& oXml, ASCDocFileFormat::Run& oBinRun); template bool EndnoteReferenceXmlRunTransform (const OOX::Logic::EndnoteReference& oXml, ASCDocFileFormat::Run& oBinRun); template bool EndnoteRefXmlRunTransform (const OOX::Logic::EndnoteRef& oXml, ASCDocFileFormat::Run& oBinRun); // Images template OOX::Image* GetImageDOCX (const TXmlImage* pXmlImage); template bool CreateImage (const OOX::Logic::Pict& oPicture, ASCDocFileFormat::Run& oBinRun); template OOX::Image* GetImageWithId(const OOX::RId& nID); template bool CreateTextureFillShape (const OOX::Logic::Pict& oXml, ASCDocFileFormat::Run& oBinRun); // Group template ASCDocFileFormat::COArtGroup* CreateGroup(const OOX::Logic::Group& oXmlGroup); template bool PictGroupXmlTransform (const OOX::Logic::Pict& oXml, ASCDocFileFormat::Run& oBinRun); // TextBox bool BuildContentTbRef (const OOX::Logic::Pict& oXml); bool TransformTb (const std::vector& oXmlItems, std::vector& oTextItems); private: std::map m_mapFontTableMap; std::vector m_arrInternalFonts; map lidMap; map predefinedStyleIDMap; std::map m_mapStyleSheetMap; map styleTypeMap; map numFmtMap; map idLsidMap; map idIndexMap; map kulMap; map sectionBreakTypeMap; map verticalPositionCodeMap; map horizontalPositionCodeMap; map textFrameWrappingMap; map tableCellWidthMap; map customTabStopAlignment; map customTabStopLeader; Docx::Folder m_docxInputFile; ASCDocFileFormat::CDocFile* m_pDocFile; bool m_bHaveSeparateFldChar; bool m_bIsInlineShape; ASCDocFileFormat::COArtBuilder m_oOArtBuilder; // Office Drawing Binary File Format - Builder ASCDocFileFormat::InlineShape m_oInlineShape; bool m_bIsHaveRunPr; }; }