解决ofd获取图像宽高不正确的问题
This commit is contained in:
parent
6612f777f9
commit
d414abc6dc
|
@ -151,32 +151,137 @@ HGResult HGOfdReaderImpl::GetPageInfo(HGUInt page, HGOfdPageInfo* info)
|
|||
return HGBASE_ERR_FAIL;
|
||||
}
|
||||
|
||||
HGResult ret = HGBASE_ERR_FAIL;
|
||||
tinyxml2::XMLDocument xmlDoc;
|
||||
|
||||
std::string resId;
|
||||
if (tinyxml2::XML_SUCCESS == xmlDoc.Parse(content.c_str()))
|
||||
{
|
||||
tinyxml2::XMLElement* root = xmlDoc.RootElement();
|
||||
if (NULL != root)
|
||||
{
|
||||
tinyxml2::XMLElement* area = root->FirstChildElement("ofd:Area");
|
||||
if (NULL != area)
|
||||
tinyxml2::XMLElement* content = root->FirstChildElement("ofd:Content");
|
||||
if (NULL != content)
|
||||
{
|
||||
tinyxml2::XMLElement* physicalBox = area->FirstChildElement("ofd:PhysicalBox");
|
||||
if (NULL != physicalBox)
|
||||
tinyxml2::XMLElement* layer = content->FirstChildElement("ofd:Layer");
|
||||
if (NULL != layer)
|
||||
{
|
||||
double data[4];
|
||||
if (GetRect(physicalBox->GetText(), data))
|
||||
const char* attr = layer->Attribute("Type");
|
||||
#if defined(HG_CMP_MSC)
|
||||
if (NULL == attr || 0 != _stricmp("Background", attr))
|
||||
#else
|
||||
if (NULL == attr || 0 != strcasecmp("Background", attr))
|
||||
#endif
|
||||
{
|
||||
info->width = (HGUInt)data[2];
|
||||
info->height = (HGUInt)data[3];
|
||||
ret = HGBASE_ERR_OK;
|
||||
tinyxml2::XMLElement* p = layer->NextSiblingElement("ofd:Layer");
|
||||
while (NULL != p)
|
||||
{
|
||||
const char* attr = p->Attribute("Type");
|
||||
#if defined(HG_CMP_MSC)
|
||||
if (NULL != attr && 0 == _stricmp("Background", attr))
|
||||
#else
|
||||
if (NULL != attr && 0 == strcasecmp("Background", attr))
|
||||
#endif
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
p = p->NextSiblingElement("ofd:Layer");
|
||||
}
|
||||
|
||||
layer = p;
|
||||
}
|
||||
|
||||
if (NULL != layer)
|
||||
{
|
||||
tinyxml2::XMLElement* imgObject = layer->FirstChildElement("ofd:ImageObject");
|
||||
if (NULL != imgObject)
|
||||
{
|
||||
resId = imgObject->Attribute("ResourceID");
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
if (resId.empty())
|
||||
{
|
||||
return HGBASE_ERR_FAIL;
|
||||
}
|
||||
|
||||
if (!ReadXml("Doc_0/DocumentRes.xml", content))
|
||||
{
|
||||
return HGBASE_ERR_FAIL;
|
||||
}
|
||||
|
||||
std::string imgName;
|
||||
if (tinyxml2::XML_SUCCESS == xmlDoc.Parse(content.c_str()))
|
||||
{
|
||||
tinyxml2::XMLElement* root = xmlDoc.RootElement();
|
||||
if (NULL != root)
|
||||
{
|
||||
tinyxml2::XMLElement* multiMedias = root->FirstChildElement("ofd:MultiMedias");
|
||||
if (NULL != multiMedias)
|
||||
{
|
||||
tinyxml2::XMLElement* multiMedia = multiMedias->FirstChildElement("ofd:MultiMedia");
|
||||
if (NULL != multiMedia)
|
||||
{
|
||||
const char* attr = multiMedia->Attribute("ID");
|
||||
#if defined(HG_CMP_MSC)
|
||||
if (NULL == attr || 0 != _stricmp(resId.c_str(), attr))
|
||||
#else
|
||||
if (NULL == attr || 0 != strcasecmp(resId.c_str(), attr))
|
||||
#endif
|
||||
{
|
||||
tinyxml2::XMLElement* p = multiMedia->NextSiblingElement("ofd:MultiMedia");
|
||||
while (NULL != p)
|
||||
{
|
||||
const char* attr = p->Attribute("ID");
|
||||
#if defined(HG_CMP_MSC)
|
||||
if (NULL != attr && 0 == _stricmp(resId.c_str(), attr))
|
||||
#else
|
||||
if (NULL != attr && 0 == strcasecmp(resId.c_str(), attr))
|
||||
#endif
|
||||
{
|
||||
break;
|
||||
}
|
||||
|
||||
p = p->NextSiblingElement("ofd:MultiMedia");
|
||||
}
|
||||
|
||||
multiMedia = p;
|
||||
}
|
||||
|
||||
if (NULL != multiMedia)
|
||||
{
|
||||
tinyxml2::XMLElement* mediaFile = multiMedia->FirstChildElement("ofd:MediaFile");
|
||||
if (NULL != mediaFile)
|
||||
{
|
||||
imgName = mediaFile->GetText();
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (imgName.empty())
|
||||
{
|
||||
return HGBASE_ERR_FAIL;
|
||||
}
|
||||
|
||||
char img_name[128];
|
||||
sprintf(img_name, "Doc_0/Res/%s", imgName.c_str());
|
||||
|
||||
HGJpegLoadInfo jpegInfo;
|
||||
if (!ReadJpeg(img_name, &jpegInfo, 0, 0, 0, 0, NULL))
|
||||
{
|
||||
return HGBASE_ERR_FAIL;
|
||||
}
|
||||
|
||||
info->width = jpegInfo.width;
|
||||
info->height = jpegInfo.height;
|
||||
return HGBASE_ERR_OK;
|
||||
}
|
||||
|
||||
HGResult HGOfdReaderImpl::LoadImage(HGUInt page, HGFloat xScale, HGFloat yScale,
|
||||
|
@ -187,6 +292,11 @@ HGResult HGOfdReaderImpl::LoadImage(HGUInt page, HGFloat xScale, HGFloat yScale,
|
|||
return HGBASE_ERR_FAIL;
|
||||
}
|
||||
|
||||
if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin)
|
||||
{
|
||||
return HGBASE_ERR_INVALIDARG;
|
||||
}
|
||||
|
||||
if (page >= (HGUInt)m_contentNames.size() || NULL == image)
|
||||
{
|
||||
return HGBASE_ERR_INVALIDARG;
|
||||
|
@ -322,7 +432,7 @@ HGResult HGOfdReaderImpl::LoadImage(HGUInt page, HGFloat xScale, HGFloat yScale,
|
|||
|
||||
char img_name[128];
|
||||
sprintf(img_name, "Doc_0/Res/%s", imgName.c_str());
|
||||
if (!ReadJpeg(img_name, xScale, yScale, imgType, imgOrigin, image))
|
||||
if (!ReadJpeg(img_name, NULL, xScale, yScale, imgType, imgOrigin, image))
|
||||
{
|
||||
return HGBASE_ERR_FAIL;
|
||||
}
|
||||
|
@ -371,7 +481,7 @@ bool HGOfdReaderImpl::ReadXml(const char* name, std::string& content)
|
|||
return true;
|
||||
}
|
||||
|
||||
bool HGOfdReaderImpl::ReadJpeg(const char* name, HGFloat xScale, HGFloat yScale, HGUInt imgType, HGUInt imgOrigin, HGImage* image)
|
||||
bool HGOfdReaderImpl::ReadJpeg(const char* name, HGJpegLoadInfo* info, HGFloat xScale, HGFloat yScale, HGUInt imgType, HGUInt imgOrigin, HGImage* image)
|
||||
{
|
||||
struct zip_stat st;
|
||||
zip_stat_init(&st);
|
||||
|
@ -406,7 +516,7 @@ bool HGOfdReaderImpl::ReadJpeg(const char* name, HGFloat xScale, HGFloat yScale,
|
|||
|
||||
HGBuffer buffer = NULL;
|
||||
HGBase_CreateBufferWithData(content, (size_t)size, &buffer);
|
||||
HGResult ret = HGImgFmt_LoadJpegImageFromBuffer(buffer, NULL, imgType, imgOrigin, image);
|
||||
HGResult ret = HGImgFmt_LoadJpegImageFromBuffer(buffer, info, imgType, imgOrigin, image);
|
||||
HGBase_DestroyBuffer(buffer);
|
||||
|
||||
free(content);
|
||||
|
|
|
@ -26,7 +26,7 @@ public:
|
|||
|
||||
private:
|
||||
bool ReadXml(const char *name, std::string &content);
|
||||
bool ReadJpeg(const char* name, HGFloat xScale, HGFloat yScale, HGUInt imgType, HGUInt imgOrigin, HGImage* image);
|
||||
bool ReadJpeg(const char* name, HGJpegLoadInfo *info, HGFloat xScale, HGFloat yScale, HGUInt imgType, HGUInt imgOrigin, HGImage* image);
|
||||
|
||||
private:
|
||||
zip* m_zip;
|
||||
|
|
|
@ -184,6 +184,11 @@ HGResult HGPdfReaderImpl::LoadImage(HGUInt page, HGFloat xScale, HGFloat yScale,
|
|||
return HGBASE_ERR_FAIL;
|
||||
}
|
||||
|
||||
if (HGBASE_IMGORIGIN_TOP != imgOrigin && HGBASE_IMGORIGIN_BOTTOM != imgOrigin)
|
||||
{
|
||||
return HGBASE_ERR_INVALIDARG;
|
||||
}
|
||||
|
||||
if (NULL == image)
|
||||
{
|
||||
return HGBASE_ERR_INVALIDARG;
|
||||
|
|
Loading…
Reference in New Issue