Commit 4cf55208 authored by ElenaSubbotina's avatar ElenaSubbotina

OdfFormat - embedded office text (against text box)

parent fe1d4863
......@@ -74,6 +74,7 @@ static std::wstring get_mime_type(const std::wstring & extension)
else if (L"wav" == extension) return L"audio/wav";
else if (L"bin" == extension) return L"application/vnd.openxmlformats-officedocument.oleObject";
else if (L"xlsx" == extension) return L"application/vnd.openxmlformats-officedocument.spreadsheetml.sheet";
else if (L"docx" == extension) return L"application/vnd.openxmlformats-officedocument.wordprocessingml.document";
else if (L"doc" == extension) return L"application/msword";
else return L"application/octet-stream";
......
......@@ -378,7 +378,7 @@ void pptx_slide_context::set_text_box()
impl_->object_description_.type_ = typeShape;
impl_->object_description_.shape_type_ = 2; //2,3...
}
void pptx_slide_context::set_object(const std::wstring & path, const std::wstring & progId)
void pptx_slide_context::set_ms_object(const std::wstring & path, const std::wstring & progId)
{
impl_->object_description_.type_ = typeMsObject;
impl_->object_description_.xlink_href_ = path;
......@@ -391,7 +391,7 @@ void pptx_slide_context::set_ole_object(const std::wstring & path, const std::ws
impl_->object_description_.descriptor_ = progId;
}
void pptx_slide_context::set_image(std::wstring const & path)
void pptx_slide_context::set_image(const std::wstring & path)
{
if (impl_->object_description_.type_ == typeUnknown)
{
......@@ -403,6 +403,7 @@ void pptx_slide_context::set_image(std::wstring const & path)
impl_->object_description_.fill_.type = 2;
impl_->object_description_.fill_.bitmap = oox::oox_bitmap_fill::create();
impl_->object_description_.fill_.bitmap->xlink_href_ = path;
impl_->object_description_.fill_.bitmap->bStretch = true;
}
}
......@@ -411,7 +412,7 @@ void pptx_slide_context::start_frame()
impl_->object_description_.type_ = typeUnknown;
}
void pptx_slide_context::set_chart(std::wstring const & path)
void pptx_slide_context::set_chart(const std::wstring & path)
{
impl_->object_description_.type_ = typeChart;
impl_->object_description_.xlink_href_ = path;
......
......@@ -78,9 +78,9 @@ public:
std::wstring add_hyperlink(std::wstring const & ref, bool object);
void start_frame();
void set_image (std::wstring const & path);
void set_chart (std::wstring const & path);
void set_object (const std::wstring & path, const std::wstring & progId);
void set_image (const std::wstring & path);
void set_chart (const std::wstring & path);
void set_ms_object (const std::wstring & path, const std::wstring & progId);
void set_ole_object (const std::wstring & path, const std::wstring & progId);
void set_text_box ();
void end_frame();
......
......@@ -340,7 +340,7 @@ void _xlsx_drawing::serialize(std::wostream & strm)
void _xlsx_drawing::serialize_object (std::wostream & strm)
{
if (type != typeOleObject) return;
if (type != typeOleObject && type != typeMsObject) return;
CP_XML_WRITER(strm)
{
......
......@@ -288,8 +288,13 @@ void xlsx_drawing_context::set_ole_object(const std::wstring & path, const std::
impl_->object_description_.xlink_href_ = path;
impl_->object_description_.descriptor_ = progId;
}
void xlsx_drawing_context::set_image(std::wstring const & path)
void xlsx_drawing_context::set_ms_object(const std::wstring & path, const std::wstring & progId)
{
impl_->object_description_.type_ = typeMsObject;
impl_->object_description_.xlink_href_ = path;
impl_->object_description_.descriptor_ = progId;
}
void xlsx_drawing_context::set_image(const std::wstring & path)
{
if (impl_->object_description_.type_ == typeUnknown)
{
......@@ -312,7 +317,7 @@ void xlsx_drawing_context::end_frame()
impl_->current_level_->push_back(impl_->object_description_);
}
void xlsx_drawing_context::set_chart(std::wstring const & path)
void xlsx_drawing_context::set_chart(const std::wstring & path)
{
impl_->object_description_.type_ = typeChart;
impl_->object_description_.xlink_href_ = path;
......
......@@ -91,9 +91,10 @@ public:
void end_shape();
void start_frame();
void set_image (std::wstring const & path);
void set_chart (std::wstring const & path);
void set_image (const std::wstring & path);
void set_chart (const std::wstring & path);
void set_ole_object (const std::wstring & path, const std::wstring & progId);
void set_ms_object (const std::wstring & path, const std::wstring & progId);
void set_text_box ();
void end_frame();
......
......@@ -114,7 +114,7 @@ public:
{
for (int i = 0 ; i < xlsx_drawings_.size(); i++)
{
if (xlsx_drawings_[i].type != typeOleObject) continue;
if (xlsx_drawings_[i].type != typeOleObject && xlsx_drawings_[i].type != typeMsObject) continue;
xlsx_drawings_[i].serialize_object(strm);
}
......
......@@ -175,7 +175,7 @@ void object_odf_context::xlsx_convert(oox::xlsx_conversion_context & Context)
}
else if (object_type_ == 2 && office_text_)
{
office_text_->xlsx_convert(Context);
//embedded
}
else if (object_type_ == 3 && office_math_)
{
......@@ -183,6 +183,10 @@ void object_odf_context::xlsx_convert(oox::xlsx_conversion_context & Context)
Context.get_math_context().start();
office_math_->oox_convert(Context.get_math_context());
}
else if(object_type_ == 4 && office_spreadsheet_)
{
//embedded
}
}
void object_odf_context::docx_convert(oox::docx_conversion_context & Context)
{
......@@ -199,7 +203,7 @@ void object_odf_context::docx_convert(oox::docx_conversion_context & Context)
}
else if (object_type_ == 2 && office_text_)
{
office_text_->docx_convert(Context);
//embedded
}
else if (object_type_ == 3 && office_math_)
{
......@@ -227,7 +231,7 @@ void object_odf_context::docx_convert(oox::docx_conversion_context & Context)
}
else if(object_type_ == 4 && office_spreadsheet_)
{
//office_spreadsheet_
//embedded
}
}
void object_odf_context::pptx_convert(oox::pptx_conversion_context & Context)
......@@ -244,7 +248,7 @@ void object_odf_context::pptx_convert(oox::pptx_conversion_context & Context)
}
else if (object_type_ == 2 && office_text_)
{
office_text_->pptx_convert(Context);
//embedded
}
else if (object_type_ == 3 && office_math_)
{
......@@ -252,6 +256,10 @@ void object_odf_context::pptx_convert(oox::pptx_conversion_context & Context)
Context.get_math_context().start();
office_math_->oox_convert(Context.get_math_context());
}
else if(object_type_ == 4 && office_spreadsheet_)
{
//embedded
}
}
void object_odf_context::calc_cache_series(std::wstring adress, std::vector<std::wstring> & cash)
{
......
......@@ -339,6 +339,25 @@ std::wstring draw_object::office_convert(odf_document * odfDocument, int type)
std::wstring folderPath = odfDocument->get_folder();
std::wstring objectOutPath = FileSystem::Directory::CreateDirectoryWithUniqueName(folderPath);
if (type == 1)
{
oox::package::docx_document outputDocx;
oox::docx_conversion_context conversionDocxContext ( odfDocument);
conversionDocxContext.set_output_document (&outputDocx);
//conversionContext.set_font_directory (fontsPath);
if (odfDocument->docx_convert(conversionDocxContext))
{
outputDocx.write(objectOutPath);
href_result = common_xlink_attlist_.href_.get_value_or(L"Object");
int pos = href_result.find(L"./");
if (pos >= 0) href_result = href_result.substr(2);
href_result = L"docx" + href_result + L".docx";
}
}
if (type == 2)
{
oox::package::xlsx_document outputXlsx;
......
......@@ -1433,7 +1433,7 @@ void draw_object::docx_convert(oox::docx_conversion_context & Context)
boost::algorithm::replace_all(objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR);
cpdoccore::odf_reader::odf_document objectSubDoc(objectPath ,NULL);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//---------------------------------------------------------------------------------------------------------------------
draw_frame* frame = NULL;
oox::_docx_drawing * drawing = NULL;
office_element* contentSubDoc = objectSubDoc.get_impl()->get_content();
......@@ -1450,7 +1450,6 @@ void draw_object::docx_convert(oox::docx_conversion_context & Context)
if (frame)
drawing = dynamic_cast<oox::_docx_drawing *>(frame->oox_drawing_.get());
}
//------------------------------------------------------------------------------------------------------------
if (!frame || !drawing)
{
......
......@@ -273,11 +273,7 @@ void draw_object::pptx_convert(oox::pptx_conversion_context & Context)
boost::algorithm::replace_all(objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR);
cpdoccore::odf_reader::odf_document objectSubDoc(objectPath, NULL);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//в отдельных embd объектах чаще всего диаграммы, уравнения... но МОГУТ быть и обычные объекты подтипа frame!!!
//пример RemanejamentoOrcamentario.ods
///////////////////////////////////////////////////////////////////////////
//функциональная часть
//---------------------------------------------------------------------------------------------------------------------
office_element *contentSubDoc = objectSubDoc.get_impl()->get_content();
if (!contentSubDoc)
{
......@@ -290,9 +286,7 @@ void draw_object::pptx_convert(oox::pptx_conversion_context & Context)
process_build_object process_build_object_(objectBuild, objectSubDoc.odf_context());
contentSubDoc->accept(process_build_object_);
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//отображательная часть
//---------------------------------------------------------------------------------------------------------------------
if (objectBuild.object_type_ == 1)//диаграмма
{
const std::wstring href_draw = common_xlink_attlist_.href_.get_value_or(L"");
......@@ -300,25 +294,20 @@ void draw_object::pptx_convert(oox::pptx_conversion_context & Context)
Context.get_slide_context().set_chart(href_draw); // в рисовательной части только место объекта, рамочки ... и релсы
}
else if (objectBuild.object_type_ == 2)//odt текст
else if (objectBuild.object_type_ == 2)//odt text
{
Context.get_slide_context().set_text_box();
Context.get_text_context().start_object();
//сменить контекст с главного на другой ... проблема со стилями!!
Context.get_text_context().set_local_styles_container(&objectSubDoc.odf_context().styleContainer());
Context.get_slide_context().set_use_image_replacement();
objectBuild.pptx_convert(Context);
std::wstring href_new = office_convert( &objectSubDoc, 1);
std::wstring text_content_ = Context.get_text_context().end_object();
Context.get_text_context().set_local_styles_container(NULL);//вытираем вручную ...
if (!text_content_.empty())
if (!href_new.empty())
{
Context.get_slide_context().set_property(_property(L"text-content",text_content_));
bool isMediaInternal = true;
href += FILE_SEPARATOR_STR + href_new;
Context.get_slide_context().set_ms_object(href, L"Word.Document");
}
}
else if (objectBuild.object_type_ == 3) //мат формулы
else if (objectBuild.object_type_ == 3) //math
{
Context.get_slide_context().set_text_box();
......@@ -339,7 +328,7 @@ void draw_object::pptx_convert(oox::pptx_conversion_context & Context)
Context.get_slide_context().set_property(_property(L"text-content", text_content));
}
}
else if (objectBuild.object_type_ == 4) //embedded sheet
else if (objectBuild.object_type_ == 4) //ods sheet
{
Context.get_slide_context().set_use_image_replacement();
......@@ -349,7 +338,7 @@ void draw_object::pptx_convert(oox::pptx_conversion_context & Context)
{
bool isMediaInternal = true;
href += FILE_SEPARATOR_STR + href_new;
Context.get_slide_context().set_object(href, L"Excel.Sheet.12");
Context.get_slide_context().set_ms_object(href, L"Excel.Sheet");
}
}
else
......
......@@ -257,21 +257,16 @@ void draw_text_box::xlsx_convert(oox::xlsx_conversion_context & Context)
void draw_object::xlsx_convert(oox::xlsx_conversion_context & Context)
{
try {
const std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
std::wstring href = common_xlink_attlist_.href_.get_value_or(L"");
odf_reader::odf_document * odf_reader = Context.root();
std::wstring folderPath = odf_reader->get_folder();
std::wstring folderPath = Context.root()->get_folder();
std::wstring objectPath = folderPath + FILE_SEPARATOR_STR + href;
// normalize path ???? todooo
boost::algorithm::replace_all(objectPath, FILE_SEPARATOR_STR + std::wstring(L"./"), FILE_SEPARATOR_STR);
cpdoccore::odf_reader::odf_document objectSubDoc(objectPath,NULL);
////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//в отдельных embd объектах чаще всего диаграммы... но МОГУТ быть и обычные объекты подтипа frame!!! пример RemanejamentoOrcamentario.ods
///////////////////////////////////////////////////////////////////////////
//функциональная часть
//---------------------------------------------------------------------------------------------------------------------
office_element *contentSubDoc = objectSubDoc.get_impl()->get_content();
object_odf_context objectBuild(href);
......@@ -280,9 +275,7 @@ void draw_object::xlsx_convert(oox::xlsx_conversion_context & Context)
process_build_object process_build_object_(objectBuild, objectSubDoc.odf_context());
contentSubDoc->accept(process_build_object_);
}
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//отображательная часть
//---------------------------------------------------------------------------------------------------------------------
if (objectBuild.object_type_ == 1) //диаграмма
{
const std::wstring href_draw = common_xlink_attlist_.href_.get_value_or(L"");
......@@ -292,20 +285,15 @@ void draw_object::xlsx_convert(oox::xlsx_conversion_context & Context)
}
else if (objectBuild.object_type_ == 2) //текст (odt text)
{
Context.get_drawing_context().set_text_box();
Context.get_text_context().start_drawing_content();
//сменить контекст с главного на другой ... проблема со стилями!!
Context.get_text_context().set_local_styles_container(&objectSubDoc.odf_context().styleContainer());
Context.get_drawing_context().set_use_image_replacement();
objectBuild.xlsx_convert(Context);
std::wstring href_new = office_convert( &objectSubDoc, 1);
std::wstring text_content = Context.get_text_context().end_drawing_content();
Context.get_text_context().set_local_styles_container(NULL);//вытираем вручную ...
if (!text_content.empty())
if (!href_new.empty())
{
Context.get_drawing_context().set_property(_property(L"text-content", text_content));
bool isMediaInternal = true;
href += FILE_SEPARATOR_STR + href_new;
Context.get_drawing_context().set_ms_object(href, L"Word.Document");
}
}
else if (objectBuild.object_type_ == 3) //мат формулы
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment