summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorSamuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>2018-07-03 15:16:58 +0200
committerSamuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>2018-07-05 08:05:40 +0200
commit7bafb7ca8ef9467f5c55766d2a38ba0d0a60837c (patch)
tree0f05fc92976b40a018c0e3f05d07d419c0536aaa
parent961908dde51e44b93567cb59bd398778fe1ece10 (diff)
tdf#117901 Write signature line images as emf to ooxml
Change-Id: Idbf60be3cef2d9dde454da0279d2810488b1e157 Reviewed-on: https://gerrit.libreoffice.org/56871 Tested-by: Jenkins Reviewed-by: Samuel Mehrbrodt <Samuel.Mehrbrodt@cib.de>
-rw-r--r--comphelper/source/misc/graphicmimetype.cxx33
-rw-r--r--include/comphelper/graphicmimetype.hxx2
-rw-r--r--include/svx/xoutbmp.hxx6
-rw-r--r--svx/source/xoutdev/_xoutbmp.cxx49
-rw-r--r--xmlsecurity/source/helper/ooxmlsecexporter.cxx35
5 files changed, 102 insertions, 23 deletions
diff --git a/comphelper/source/misc/graphicmimetype.cxx b/comphelper/source/misc/graphicmimetype.cxx
index 2f8ba2efbae4..0c0ca8057549 100644
--- a/comphelper/source/misc/graphicmimetype.cxx
+++ b/comphelper/source/misc/graphicmimetype.cxx
@@ -88,5 +88,38 @@ OUString GraphicMimeTypeHelper::GetMimeTypeForImageStream(Reference<XInputStream
return GetMimeTypeForXGraphic(xGraphic);
}
+
+OUString GraphicMimeTypeHelper::GetMimeTypeForConvertDataFormat(ConvertDataFormat convertDataFormat)
+{
+ switch (convertDataFormat)
+ {
+ case ConvertDataFormat::BMP:
+ return OUString("image/bmp");
+ case ConvertDataFormat::GIF:
+ return OUString("image/gif");
+ case ConvertDataFormat::JPG:
+ return OUString("image/jpeg");
+ case ConvertDataFormat::PCT:
+ return OUString("image/x-pict");
+ case ConvertDataFormat::PNG:
+ return OUString("image/png");
+ case ConvertDataFormat::SVM:
+ return OUString("image/x-svm");
+ case ConvertDataFormat::TIF:
+ return OUString("image/tiff");
+ case ConvertDataFormat::WMF:
+ return OUString("image/x-wmf");
+ case ConvertDataFormat::EMF:
+ return OUString("image/x-emf");
+ case ConvertDataFormat::SVG:
+ return OUString("image/svg+xml");
+ case ConvertDataFormat::PDF:
+ return OUString("application/pdf");
+ case ConvertDataFormat::MET: // What is this?
+ case ConvertDataFormat::Unknown:
+ default:
+ return OUString("");
+ }
+}
}
/* vim:set shiftwidth=4 softtabstop=4 expandtab: */
diff --git a/include/comphelper/graphicmimetype.hxx b/include/comphelper/graphicmimetype.hxx
index ad081c46e2e5..6b8ed4293805 100644
--- a/include/comphelper/graphicmimetype.hxx
+++ b/include/comphelper/graphicmimetype.hxx
@@ -12,6 +12,7 @@
#include <comphelper/comphelperdllapi.h>
#include <rtl/ustring.hxx>
+#include <vcl/salctype.hxx>
#include <com/sun/star/graphic/XGraphic.hpp>
#include <com/sun/star/io/XInputStream.hpp>
@@ -26,6 +27,7 @@ public:
static OUString GetMimeTypeForXGraphic(css::uno::Reference<css::graphic::XGraphic> xGraphic);
static OUString
GetMimeTypeForImageStream(css::uno::Reference<css::io::XInputStream> xInputStream);
+ static OUString GetMimeTypeForConvertDataFormat(ConvertDataFormat convertDataFormat);
};
}
diff --git a/include/svx/xoutbmp.hxx b/include/svx/xoutbmp.hxx
index ba33ed989746..5a02045da52f 100644
--- a/include/svx/xoutbmp.hxx
+++ b/include/svx/xoutbmp.hxx
@@ -25,6 +25,8 @@
#include <com/sun/star/beans/PropertyValue.hpp>
#include <svx/svxdllapi.h>
#include <o3tl/typed_flags_set.hxx>
+#include <vcl/salctype.hxx>
+
enum class XOutFlags {
NONE = 0x00000000,
@@ -62,7 +64,9 @@ public:
const OUString& rFilterName, const XOutFlags nFlags,
const Size* pMtfSize_100TH_MM = nullptr,
const css::uno::Sequence< css::beans::PropertyValue >* pFilterData = nullptr);
- static bool GraphicToBase64(const Graphic& rGraphic, OUString& rOUString, bool bAddPrefix=true);
+ static bool GraphicToBase64(const Graphic& rGraphic, OUString& rOUString,
+ bool bAddPrefix = true,
+ ConvertDataFormat aTargetFormat = ConvertDataFormat::Unknown);
static ErrCode ExportGraphic( const Graphic& rGraphic, const INetURLObject& rURL,
GraphicFilter& rFilter, const sal_uInt16 nFormat,
diff --git a/svx/source/xoutdev/_xoutbmp.cxx b/svx/source/xoutdev/_xoutbmp.cxx
index 05998009e14a..2d187c7609b6 100644
--- a/svx/source/xoutdev/_xoutbmp.cxx
+++ b/svx/source/xoutdev/_xoutbmp.cxx
@@ -20,6 +20,7 @@
#include <sal/config.h>
#include <comphelper/base64.hxx>
+#include <comphelper/graphicmimetype.hxx>
#include <tools/poly.hxx>
#include <vcl/bitmapaccess.hxx>
#include <vcl/virdev.hxx>
@@ -346,33 +347,33 @@ ErrCode XOutBitmap::WriteGraphic( const Graphic& rGraphic, OUString& rFileName,
}
}
-bool XOutBitmap::GraphicToBase64(const Graphic& rGraphic, OUString& rOUString, bool bAddPrefix)
+bool XOutBitmap::GraphicToBase64(const Graphic& rGraphic, OUString& rOUString, bool bAddPrefix,
+ ConvertDataFormat aTargetFormat)
{
SvMemoryStream aOStm;
- OUString aMimeType;
GfxLink aLink = rGraphic.GetGfxLink();
- ConvertDataFormat aCvtType;
- switch( aLink.GetType() )
+
+ if (aTargetFormat == ConvertDataFormat::Unknown)
{
- case GfxLinkType::NativeJpg:
- aCvtType = ConvertDataFormat::JPG;
- aMimeType = "image/jpeg";
- break;
- case GfxLinkType::NativePng:
- aCvtType = ConvertDataFormat::PNG;
- aMimeType = "image/png";
- break;
- case GfxLinkType::NativeSvg:
- aCvtType = ConvertDataFormat::SVG;
- aMimeType = "image/svg+xml";
- break;
- default:
- // save everything else (including gif) into png
- aCvtType = ConvertDataFormat::PNG;
- aMimeType = "image/png";
- break;
+ switch (aLink.GetType())
+ {
+ case GfxLinkType::NativeJpg:
+ aTargetFormat = ConvertDataFormat::JPG;
+ break;
+ case GfxLinkType::NativePng:
+ aTargetFormat = ConvertDataFormat::PNG;
+ break;
+ case GfxLinkType::NativeSvg:
+ aTargetFormat = ConvertDataFormat::SVG;
+ break;
+ default:
+ // save everything else (including gif) into png
+ aTargetFormat = ConvertDataFormat::PNG;
+ break;
+ }
}
- ErrCode nErr = GraphicConverter::Export(aOStm,rGraphic,aCvtType);
+
+ ErrCode nErr = GraphicConverter::Export(aOStm,rGraphic,aTargetFormat);
if ( nErr )
{
SAL_WARN("svx", "XOutBitmap::GraphicToBase64() invalid Graphic? error: " << nErr );
@@ -385,7 +386,11 @@ bool XOutBitmap::GraphicToBase64(const Graphic& rGraphic, OUString& rOUString, b
rOUString = aStrBuffer.makeStringAndClear();
if (bAddPrefix)
+ {
+ OUString aMimeType
+ = comphelper::GraphicMimeTypeHelper::GetMimeTypeForConvertDataFormat(aTargetFormat);
rOUString = aMimeType + ";base64," + rOUString;
+ }
return true;
}
diff --git a/xmlsecurity/source/helper/ooxmlsecexporter.cxx b/xmlsecurity/source/helper/ooxmlsecexporter.cxx
index abb0a648b520..9ca95c5d755e 100644
--- a/xmlsecurity/source/helper/ooxmlsecexporter.cxx
+++ b/xmlsecurity/source/helper/ooxmlsecexporter.cxx
@@ -18,13 +18,16 @@
#include <comphelper/ofopxmlhelper.hxx>
#include <o3tl/make_unique.hxx>
#include <rtl/ref.hxx>
+#include <svx/xoutbmp.hxx>
#include <unotools/datetime.hxx>
+#include <vcl/salctype.hxx>
#include <xmloff/attrlist.hxx>
#include <documentsignaturehelper.hxx>
#include <xsecctl.hxx>
using namespace com::sun::star;
+using namespace css::xml::sax;
struct OOXMLSecExporter::Impl
{
@@ -68,6 +71,7 @@ struct OOXMLSecExporter::Impl
/// Writes <SignatureInfoV1>.
void writeSignatureInfo();
void writePackageSignature();
+ void writeSignatureLineImages();
};
bool OOXMLSecExporter::Impl::isOOXMLBlacklist(const OUString& rStreamName)
@@ -417,6 +421,36 @@ void OOXMLSecExporter::Impl::writePackageSignature()
m_xDocumentHandler->endElement("Object");
}
+void OOXMLSecExporter::Impl::writeSignatureLineImages()
+{
+ if (m_rInformation.aValidSignatureImage.is())
+ {
+ rtl::Reference<SvXMLAttributeList> pAttributeList(new SvXMLAttributeList());
+ pAttributeList->AddAttribute("Id", "idValidSigLnImg");
+ m_xDocumentHandler->startElement(
+ "Object", uno::Reference<xml::sax::XAttributeList>(pAttributeList.get()));
+ OUString aGraphicInBase64;
+ Graphic aGraphic(m_rInformation.aValidSignatureImage);
+ if (!XOutBitmap::GraphicToBase64(aGraphic, aGraphicInBase64, false, ConvertDataFormat::EMF))
+ SAL_WARN("xmlsecurity.helper", "could not convert graphic to base64");
+ m_xDocumentHandler->characters(aGraphicInBase64);
+ m_xDocumentHandler->endElement("Object");
+ }
+ if (m_rInformation.aInvalidSignatureImage.is())
+ {
+ rtl::Reference<SvXMLAttributeList> pAttributeList(new SvXMLAttributeList());
+ pAttributeList->AddAttribute("Id", "idInvalidSigLnImg");
+ m_xDocumentHandler->startElement(
+ "Object", uno::Reference<xml::sax::XAttributeList>(pAttributeList.get()));
+ OUString aGraphicInBase64;
+ Graphic aGraphic(m_rInformation.aInvalidSignatureImage);
+ if (!XOutBitmap::GraphicToBase64(aGraphic, aGraphicInBase64, false, ConvertDataFormat::EMF))
+ SAL_WARN("xmlsecurity.helper", "could not convert graphic to base64");
+ m_xDocumentHandler->characters(aGraphicInBase64);
+ m_xDocumentHandler->endElement("Object");
+ }
+}
+
OOXMLSecExporter::OOXMLSecExporter(const uno::Reference<uno::XComponentContext>& xComponentContext,
const uno::Reference<embed::XStorage>& xRootStorage,
const uno::Reference<xml::sax::XDocumentHandler>& xDocumentHandler,
@@ -440,6 +474,7 @@ void OOXMLSecExporter::writeSignature()
m_pImpl->writePackageObject();
m_pImpl->writeOfficeObject();
m_pImpl->writePackageSignature();
+ m_pImpl->writeSignatureLineImages();
m_pImpl->m_xDocumentHandler->endElement("Signature");
}