diff options
author | Oliver Specht <oliver.specht@cib.de> | 2016-03-18 15:57:17 +0100 |
---|---|---|
committer | Oliver Specht <oliver.specht@cib.de> | 2016-03-23 13:57:16 +0000 |
commit | 46fa816aa0a713c54836b9689fa7a1c9ff55ef5a (patch) | |
tree | 8dad103eca59e741a51a2b761c9bfd69a24f95fc | |
parent | f9cf53a082f1d99b313ebd09c8791541859eac40 (diff) |
tdf#63211: saving embedded images to HTML optional
This change re-introduces linked images in HTML export
but keeps embedded image export in mailmerge e-Mail function
Change-Id: I9e956b590f4c675b5954e19e4d3948c36b55f1e6
Reviewed-on: https://gerrit.libreoffice.org/23359
Tested-by: Jenkins <ci@libreoffice.org>
Reviewed-by: Oliver Specht <oliver.specht@cib.de>
-rw-r--r-- | include/svtools/htmlout.hxx | 4 | ||||
-rw-r--r-- | svtools/source/svhtml/htmlout.cxx | 15 | ||||
-rw-r--r-- | sw/inc/shellio.hxx | 7 | ||||
-rw-r--r-- | sw/source/filter/html/css1atr.cxx | 77 | ||||
-rw-r--r-- | sw/source/filter/html/htmlatr.cxx | 3 | ||||
-rw-r--r-- | sw/source/filter/html/htmlflywriter.cxx | 156 | ||||
-rw-r--r-- | sw/source/filter/html/htmlnumwriter.cxx | 3 | ||||
-rw-r--r-- | sw/source/filter/html/htmlplug.cxx | 23 | ||||
-rw-r--r-- | sw/source/filter/html/wrthtml.cxx | 39 | ||||
-rw-r--r-- | sw/source/filter/html/wrthtml.hxx | 11 | ||||
-rw-r--r-- | sw/source/filter/writer/writer.cxx | 63 | ||||
-rw-r--r-- | sw/source/ui/dbui/mmresultdialogs.cxx | 9 |
12 files changed, 344 insertions, 66 deletions
diff --git a/include/svtools/htmlout.hxx b/include/svtools/htmlout.hxx index 1547550b5bb8..715f0ba7534b 100644 --- a/include/svtools/htmlout.hxx +++ b/include/svtools/htmlout.hxx @@ -66,7 +66,8 @@ struct HTMLOutFuncs SVT_DLLPUBLIC static SvStream& Out_String( SvStream&, const OUString&, rtl_TextEncoding eDestEnc = RTL_TEXTENCODING_MS_1252, OUString *pNonConvertableChars = nullptr ); - SVT_DLLPUBLIC static SvStream& Out_Hex( SvStream&, sal_uLong nHex, sal_uInt8 nLen ); + SVT_DLLPUBLIC static SvStream& Out_Hex( SvStream&, sal_uLong nHex, sal_uInt8 nLen, + rtl_TextEncoding eDestEnc = RTL_TEXTENCODING_MS_1252 ); SVT_DLLPUBLIC static SvStream& Out_Color( SvStream&, const Color&, rtl_TextEncoding eDestEnc = RTL_TEXTENCODING_MS_1252 ); SVT_DLLPUBLIC static SvStream& Out_ImageMap( SvStream&, const OUString&, const ImageMap&, const OUString&, @@ -103,6 +104,7 @@ struct HTMLOutFuncs SvNumberFormatter& rFormatter, rtl_TextEncoding eDestEnc = RTL_TEXTENCODING_MS_1252, OUString *pNonConvertableChars = nullptr); + SVT_DLLPUBLIC static bool PrivateURLToInternalImg( OUString& rURL ); }; struct HtmlWriterHelper diff --git a/svtools/source/svhtml/htmlout.cxx b/svtools/source/svhtml/htmlout.cxx index 477c24d45108..99d9e38d5e84 100644 --- a/svtools/source/svhtml/htmlout.cxx +++ b/svtools/source/svhtml/htmlout.cxx @@ -558,7 +558,8 @@ SvStream& HTMLOutFuncs::FlushToAscii( SvStream& rStream, return rStream; } -SvStream& HTMLOutFuncs::Out_Hex( SvStream& rStream, sal_uLong nHex, sal_uInt8 nLen ) +SvStream& HTMLOutFuncs::Out_Hex( SvStream& rStream, sal_uLong nHex, sal_uInt8 nLen, + rtl_TextEncoding ) { // in einen Stream aus sal_Char aNToABuf[] = "0000000000000000"; @@ -977,6 +978,18 @@ OString HTMLOutFuncs::CreateTableDataOptionsValNum( return aStrTD.makeStringAndClear(); } +bool HTMLOutFuncs::PrivateURLToInternalImg( OUString& rURL ) +{ + if( rURL.getLength() > 14 && + rURL.compareTo( OOO_STRING_SVTOOLS_HTML_private_image, 14 ) == 0 ) + { + rURL = rURL.copy( 14 ); + return true; + } + + return false; +} + void HtmlWriterHelper::applyColor(HtmlWriter& rHtmlWriter, const OString &aAttributeName, const Color& rColor) { OStringBuffer sBuffer; diff --git a/sw/inc/shellio.hxx b/sw/inc/shellio.hxx index b23e1beb5e1f..9d492b38a322 100644 --- a/sw/inc/shellio.hxx +++ b/sw/inc/shellio.hxx @@ -374,7 +374,7 @@ protected: bool CopyNextPam( SwPaM ** ); void PutNumFormatFontsInAttrPool(); - void PutEditEngFontsInAttrPool(); + void PutEditEngFontsInAttrPool( bool bIncl_CJK_CTL = true ); virtual sal_uLong WriteStream() = 0; void SetBaseURL( const OUString& rURL ) { sBaseURL = rURL; } @@ -415,6 +415,8 @@ public: void SetShowProgress( bool bFlag ) { bShowProgress = bFlag; } + const OUString* GetOrigFileName() const { return pOrigFileName; } + const SwAsciiOptions& GetAsciiOptions() const { return aAscOpts; } void SetAsciiOptions( const SwAsciiOptions& rOpt ) { aAscOpts = rOpt; } @@ -434,6 +436,9 @@ public: static SwPaM * NewSwPaM(SwDoc & rDoc, sal_uLong const nStartIdx, sal_uLong const nEndIdx); + // If applicable copy a local file into internet. + bool CopyLocalFileToINet( OUString& rFileNm ); + // Stream-specific routines. Do not use in storage-writer! // Optimizing output on stream. diff --git a/sw/source/filter/html/css1atr.cxx b/sw/source/filter/html/css1atr.cxx index 547f28de197e..35f486187ed6 100644 --- a/sw/source/filter/html/css1atr.cxx +++ b/sw/source/filter/html/css1atr.cxx @@ -143,7 +143,8 @@ static Writer& OutCSS1_SvxULSpace_SvxLRSpace( Writer& rWrt, const SfxItemSet& rItemSet, bool bDeep ); static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt, - sal_uInt16 nMode ); + sal_uInt16 nMode, + const OUString *pGraphicName ); static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt ); static Writer& OutCSS1_SwFormatFrameSize( Writer& rWrt, const SfxPoolItem& rHt, sal_uInt16 nMode ); @@ -534,7 +535,7 @@ void SwHTMLWriter::OutCSS1_SfxItemSet( const SfxItemSet& rItemSet, } } -void SwHTMLWriter::OutStyleSheet( const SwPageDesc& rPageDesc ) +void SwHTMLWriter::OutStyleSheet( const SwPageDesc& rPageDesc, bool bUsed ) { m_bFirstCSS1Rule = true; @@ -603,7 +604,7 @@ void SwHTMLWriter::OutStyleSheet( const SwPageDesc& rPageDesc ) { const SwTextFormatColl* pColl = (*pDoc->GetTextFormatColls())[i]; sal_uInt16 nPoolId = pColl->GetPoolFormatId(); - if( nPoolId == RES_POOLCOLL_TEXT || + if( !bUsed || nPoolId == RES_POOLCOLL_TEXT || pDoc->IsUsed( *pColl ) ) OutCSS1_SwFormat( *this, *pColl, &pDoc->getIDocumentStylePoolAccess(), m_pTemplate ); } @@ -614,7 +615,7 @@ void SwHTMLWriter::OutStyleSheet( const SwPageDesc& rPageDesc ) { const SwCharFormat *pCFormat = (*pDoc->GetCharFormats())[i]; sal_uInt16 nPoolId = pCFormat->GetPoolFormatId(); - if( nPoolId == RES_POOLCHR_INET_NORMAL || + if( !bUsed || nPoolId == RES_POOLCHR_INET_NORMAL || nPoolId == RES_POOLCHR_INET_VISIT || pDoc->IsUsed( *pCFormat ) ) OutCSS1_SwFormat( *this, *pCFormat, &pDoc->getIDocumentStylePoolAccess(), m_pTemplate ); @@ -1832,7 +1833,8 @@ static Writer& OutCSS1_SwFootnoteInfo( Writer& rWrt, const SwEndNoteInfo& rInfo, return rWrt; } -Writer& OutCSS1_BodyTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet ) +Writer& OutCSS1_BodyTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet, + const OUString& rEmbeddedGraphicName ) { SwHTMLWriter& rHTMLWrt = static_cast<SwHTMLWriter&>(rWrt); @@ -1847,7 +1849,7 @@ Writer& OutCSS1_BodyTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet ) if( SfxItemState::SET == rItemSet.GetItemState( RES_BACKGROUND, false, &pItem ) ) { - OutCSS1_SvxBrush( rWrt, *pItem, CSS1_BACKGROUND_PAGE ); + OutCSS1_SvxBrush( rWrt, *pItem, CSS1_BACKGROUND_PAGE, &rEmbeddedGraphicName ); } if( SfxItemState::SET == rItemSet.GetItemState( RES_BOX, false, @@ -1916,7 +1918,7 @@ Writer& OutCSS1_TableBGStyleOpt( Writer& rWrt, const SfxPoolItem& rHt ) SwCSS1OutMode aMode( rHTMLWrt, CSS1_OUTMODE_STYLE_OPT_ON | CSS1_OUTMODE_ENCODE| CSS1_OUTMODE_TABLEBOX, nullptr ); - OutCSS1_SvxBrush( rWrt, rHt, CSS1_BACKGROUND_TABLE ); + OutCSS1_SvxBrush( rWrt, rHt, CSS1_BACKGROUND_TABLE, 0 ); if( !rHTMLWrt.m_bFirstCSS1Property ) rWrt.Strm().WriteChar( '\"' ); @@ -2163,7 +2165,7 @@ void SwHTMLWriter::OutCSS1_TableFrameFormatOptions( const SwFrameFormat& rFrameF const SfxPoolItem *pItem; const SfxItemSet& rItemSet = rFrameFormat.GetAttrSet(); if( SfxItemState::SET==rItemSet.GetItemState( RES_BACKGROUND, false, &pItem ) ) - OutCSS1_SvxBrush( *this, *pItem, CSS1_BACKGROUND_TABLE ); + OutCSS1_SvxBrush( *this, *pItem, CSS1_BACKGROUND_TABLE, 0 ); if( IsHTMLMode( HTMLMODE_PRINT_EXT ) ) OutCSS1_SvxFormatBreak_SwFormatPDesc_SvxFormatKeep( *this, rItemSet, false ); @@ -2195,7 +2197,7 @@ void SwHTMLWriter::OutCSS1_SectionFormatOptions( const SwFrameFormat& rFrameForm const SfxPoolItem *pItem; const SfxItemSet& rItemSet = rFrameFormat.GetAttrSet(); if( SfxItemState::SET==rItemSet.GetItemState( RES_BACKGROUND, false, &pItem ) ) - OutCSS1_SvxBrush( *this, *pItem, CSS1_BACKGROUND_SECTION ); + OutCSS1_SvxBrush( *this, *pItem, CSS1_BACKGROUND_SECTION, 0 ); if (pCol) { @@ -2217,7 +2219,7 @@ static bool OutCSS1_FrameFormatBrush( SwHTMLWriter& rWrt, nullptr != rBrushItem.GetGraphicLink() || 0 != rBrushItem.GetGraphicPos() ) { - OutCSS1_SvxBrush( rWrt, rBrushItem, CSS1_BACKGROUND_FLY ); + OutCSS1_SvxBrush( rWrt, rBrushItem, CSS1_BACKGROUND_FLY, 0 ); bWritten = true; } return bWritten; @@ -3195,12 +3197,13 @@ static Writer& OutCSS1_SvxFormatBreak_SwFormatPDesc_SvxFormatKeep( Writer& rWrt, // Wrapper for OutCSS1_SfxItemSet etc. static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt ) { - OutCSS1_SvxBrush( rWrt, rHt, CSS1_BACKGROUND_ATTR ); + OutCSS1_SvxBrush( rWrt, rHt, CSS1_BACKGROUND_ATTR, 0 ); return rWrt; } static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt, - sal_uInt16 nMode) + sal_uInt16 nMode, + const OUString* pGraphicName) { SwHTMLWriter& rHTMLWrt = static_cast<SwHTMLWriter&>(rWrt); @@ -3213,7 +3216,15 @@ static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt, // start getting a few values // const Brush &rBrush = static_cast<const SvxBrushItem &>(rHt).GetBrush(); const Color & rColor = static_cast<const SvxBrushItem &>(rHt).GetColor(); + OUString aLink = pGraphicName ? *pGraphicName + : ((const SvxBrushItem &)rHt).GetGraphicLink(); SvxGraphicPosition ePos = static_cast<const SvxBrushItem &>(rHt).GetGraphicPos(); + if( CSS1_BACKGROUND_PAGE==nMode && !rHTMLWrt.mbEmbedImages ) + { + // page style images are exported if not tiled + if( aLink.isEmpty() || GPOS_TILED==ePos ) + return rWrt; + } // get the color bool bColor = false; @@ -3228,24 +3239,35 @@ static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt, // and now the Graphic OUString aGraphicInBase64; + OUString aGraphicAsLink; // Embedded Grafic -> export WriteEmbedded - const Graphic* pGrf = static_cast<const SvxBrushItem &>(rHt).GetGraphic(); - if( pGrf ) + const Graphic* pGrf = 0; + if( rHTMLWrt.mbEmbedImages || aLink.isEmpty()) { - if( !XOutBitmap::GraphicToBase64(*pGrf, aGraphicInBase64) ) + pGrf = static_cast<const SvxBrushItem &>(rHt).GetGraphic(); + if( pGrf ) { - rHTMLWrt.m_nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE; + if( !XOutBitmap::GraphicToBase64(*pGrf, aGraphicInBase64) ) + { + rHTMLWrt.m_nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE; + } } + aLink.clear(); + } + else if( !pGraphicName && rHTMLWrt.m_bCfgCpyLinkedGrfs ) + { + aGraphicAsLink = aLink; + rWrt.CopyLocalFileToINet( aGraphicAsLink ); + aLink = aGraphicAsLink; } - // In tables we only export something if there is a Graphic - if( CSS1_BACKGROUND_TABLE==nMode && !pGrf ) + if( CSS1_BACKGROUND_TABLE==nMode && !pGrf && !aLink.isEmpty()) return rWrt; // if necessary, add the orientation of the Graphic const sal_Char *pRepeat = nullptr, *pHori = nullptr, *pVert = nullptr; - if( pGrf ) + if( pGrf || !aLink.isEmpty() ) { if( GPOS_TILED==ePos ) { @@ -3308,7 +3330,7 @@ static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt, // now build the string OUString sOut; - if( !pGrf && !bColor ) + if( !pGrf && aLink.isEmpty() && !bColor ) { // no color and no Link, but a transparent Brush if( bTransparent && CSS1_BACKGROUND_FLY != nMode ) @@ -3322,13 +3344,22 @@ static Writer& OutCSS1_SvxBrush( Writer& rWrt, const SfxPoolItem& rHt, sOut += OStringToOUString(sTmp, RTL_TEXTENCODING_ASCII_US); } - if( pGrf ) + if( pGrf || !aLink.isEmpty() ) { if( bColor ) sOut += " "; - sOut += OStringToOUString(sCSS1_url, RTL_TEXTENCODING_ASCII_US) + - "(\'" OOO_STRING_SVTOOLS_HTML_O_data ":" + aGraphicInBase64 + "\')"; + if(pGrf) + { + sOut += OStringToOUString(sCSS1_url, RTL_TEXTENCODING_ASCII_US) + + "(\'" OOO_STRING_SVTOOLS_HTML_O_data ":" + aGraphicInBase64 + "\')"; + } + else + { + sOut += OStringToOUString(sCSS1_url, RTL_TEXTENCODING_ASCII_US)+ + "(" + URIHelper::simpleNormalizedMakeRelative(rWrt.GetBaseURL(), + aLink) + ")"; + } if( pRepeat ) { diff --git a/sw/source/filter/html/htmlatr.cxx b/sw/source/filter/html/htmlatr.cxx index b285c9015b7a..fe8597ea5979 100644 --- a/sw/source/filter/html/htmlatr.cxx +++ b/sw/source/filter/html/htmlatr.cxx @@ -953,7 +953,8 @@ void OutHTML_SwFormat( Writer& rWrt, const SwFormat& rFormat, OSL_ENSURE( aNumInfo.GetNumRule(), "Wo ist die Numerierung geblieben???" ); OSL_ENSURE( nBulletGrfLvl < MAXLEVEL, "So viele Ebenen gibt's nicht" ); const SwNumFormat& rNumFormat = aNumInfo.GetNumRule()->Get(nBulletGrfLvl); - OutHTML_BulletImage( rWrt, OOO_STRING_SVTOOLS_HTML_image, rNumFormat.GetBrush() ); + OutHTML_BulletImage( rWrt, OOO_STRING_SVTOOLS_HTML_image, rNumFormat.GetBrush(), + rHWrt.m_aBulletGrfs[nBulletGrfLvl]); } rHWrt.GetNumInfo() = aNumInfo; diff --git a/sw/source/filter/html/htmlflywriter.cxx b/sw/source/filter/html/htmlflywriter.cxx index 1eacca53d60a..5b27c3b9defd 100644 --- a/sw/source/filter/html/htmlflywriter.cxx +++ b/sw/source/filter/html/htmlflywriter.cxx @@ -520,9 +520,10 @@ void SwHTMLWriter::OutFrameFormat( sal_uInt8 nMode, const SwFrameFormat& rFrameF OString SwHTMLWriter::OutFrameFormatOptions( const SwFrameFormat &rFrameFormat, const OUString& rAlternateText, - sal_uInt32 nFrameOpts ) + sal_uInt32 nFrameOpts, + const OString &rEndTags ) { - OString sRetEndTags; + OString sRetEndTags(rEndTags); OStringBuffer sOut; const SfxPoolItem* pItem; const SfxItemSet& rItemSet = rFrameFormat.GetAttrSet(); @@ -795,10 +796,11 @@ OString SwHTMLWriter::OutFrameFormatOptions( const SwFrameFormat &rFrameFormat, { sOut.append('<').append(OOO_STRING_SVTOOLS_HTML_linebreak). append(' ').append(OOO_STRING_SVTOOLS_HTML_O_clear). - append("=\"").append(pStr).append("\">"); + append("=\"").append(pStr).append("\">").append(rEndTags); sRetEndTags = sOut.makeStringAndClear(); } } + assert(sRetEndTags.endsWith(rEndTags)); // fdo#58286 return sRetEndTags; } @@ -1200,6 +1202,7 @@ OUString lclWriteOutImap(SwHTMLWriter& rHTMLWrt, const SfxItemSet& rItemSet, con } Writer& OutHTML_Image( Writer& rWrt, const SwFrameFormat &rFrameFormat, + const OUString& rGraphicURL, Graphic& rGraphic, const OUString& rAlternateText, const Size &rRealSize, sal_uInt32 nFrameOpts, const sal_Char *pMarkType, @@ -1217,6 +1220,10 @@ Writer& OutHTML_Image( Writer& rWrt, const SwFrameFormat &rFrameFormat, OutHTML_INetFormat( rWrt, *pINetFormat, false ); } + OUString aGraphicURL( rGraphicURL ); + if( !rHTMLWrt.mbEmbedImages && !HTMLOutFuncs::PrivateURLToInternalImg(aGraphicURL) ) + aGraphicURL = URIHelper::simpleNormalizedMakeRelative( rWrt.GetBaseURL(), aGraphicURL); + const SfxPoolItem* pItem; const SfxItemSet& rItemSet = rFrameFormat.GetAttrSet(); @@ -1362,10 +1369,18 @@ Writer& OutHTML_Image( Writer& rWrt, const SwFrameFormat &rFrameFormat, } OStringBuffer sBuffer; - sBuffer.append(OOO_STRING_SVTOOLS_HTML_O_data); - sBuffer.append(":"); - sBuffer.append(OUStringToOString(aGraphicInBase64, RTL_TEXTENCODING_UTF8)); - aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_src, sBuffer.makeStringAndClear().getStr()); + if(rHTMLWrt.mbEmbedImages) + { + sBuffer.append(OOO_STRING_SVTOOLS_HTML_O_data); + sBuffer.append(":"); + sBuffer.append(OUStringToOString(aGraphicInBase64, RTL_TEXTENCODING_UTF8)); + aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_src, sBuffer.makeStringAndClear().getStr()); + } + else + { + sBuffer.append(OUStringToOString(aGraphicURL, RTL_TEXTENCODING_UTF8)); + aHtml.attribute(OOO_STRING_SVTOOLS_HTML_O_src, sBuffer.makeStringAndClear().getStr()); + } // Events if (SfxItemState::SET == rItemSet.GetItemState(RES_FRMMACRO, true, &pItem)) @@ -1412,21 +1427,44 @@ Writer& OutHTML_Image( Writer& rWrt, const SwFrameFormat &rFrameFormat, Writer& OutHTML_BulletImage( Writer& rWrt, const sal_Char *pTag, - const SvxBrushItem* pBrush ) + const SvxBrushItem* pBrush, + const OUString &rGraphicURL) { SwHTMLWriter & rHTMLWrt = static_cast<SwHTMLWriter&>(rWrt); OUString aGraphicInBase64; + OUString aLink; if( pBrush ) { - const Graphic* pGrf = pBrush->GetGraphic(); - if( pGrf ) + aLink = pBrush->GetGraphicLink(); + if(rHTMLWrt.mbEmbedImages || aLink.isEmpty()) { - if( !XOutBitmap::GraphicToBase64(*pGrf, aGraphicInBase64) ) + const Graphic* pGrf = pBrush->GetGraphic(); + if( pGrf ) { - rHTMLWrt.m_nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE; + if( !XOutBitmap::GraphicToBase64(*pGrf, aGraphicInBase64) ) + { + rHTMLWrt.m_nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE; + } } } + else if(!aLink.isEmpty()) + { + if( rHTMLWrt.m_bCfgCpyLinkedGrfs ) + { + rHTMLWrt.CopyLocalFileToINet( aLink ); + } + + } + } + else if(!rHTMLWrt.mbEmbedImages) + { + aLink = rGraphicURL; + } + if(!aLink.isEmpty()) + { + if( !HTMLOutFuncs::PrivateURLToInternalImg(aLink) ) + aLink = URIHelper::simpleNormalizedMakeRelative( rWrt.GetBaseURL(), aLink); } OStringBuffer sOut; @@ -1434,12 +1472,22 @@ Writer& OutHTML_BulletImage( Writer& rWrt, sOut.append('<').append(pTag); sOut.append(' '); - sOut.append(OOO_STRING_SVTOOLS_HTML_O_style).append("=\""). - append("list-style-image: ").append("url("). - append(OOO_STRING_SVTOOLS_HTML_O_data).append(":"); - rWrt.Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() ); - HTMLOutFuncs::Out_String( rWrt.Strm(), aGraphicInBase64, rHTMLWrt.m_eDestEnc, &rHTMLWrt.m_aNonConvertableCharacters ); - sOut.append(");").append('\"'); + sOut.append(OOO_STRING_SVTOOLS_HTML_O_style).append("=\""); + if(!aLink.isEmpty()) + { + sOut.append(OOO_STRING_SVTOOLS_HTML_O_src).append("=\""); + rWrt.Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() ); + HTMLOutFuncs::Out_String( rWrt.Strm(), aLink, rHTMLWrt.m_eDestEnc, &rHTMLWrt.m_aNonConvertableCharacters ); + } + else + { + sOut.append("list-style-image: ").append("url("). + append(OOO_STRING_SVTOOLS_HTML_O_data).append(":"); + rWrt.Strm().WriteCharPtr( sOut.makeStringAndClear().getStr() ); + HTMLOutFuncs::Out_String( rWrt.Strm(), aGraphicInBase64, rHTMLWrt.m_eDestEnc, &rHTMLWrt.m_aNonConvertableCharacters ); + sOut.append(");"); + } + sOut.append('\"'); if (pTag) sOut.append('>'); @@ -1678,7 +1726,28 @@ static Writer & OutHTML_FrameFormatAsImage( Writer& rWrt, const SwFrameFormat& r ImageMap aIMap; Graphic aGraphic( ((SwFrameFormat &)rFrameFormat).MakeGraphic( &aIMap ) ); Size aSz( 0, 0 ); - OutHTML_Image( rWrt, rFrameFormat, aGraphic, rFrameFormat.GetName(), aSz, + OUString GraphicURL; + if(!rHTMLWrt.mbEmbedImages) + { + if( rHTMLWrt.GetOrigFileName() ) + GraphicURL = *rHTMLWrt.GetOrigFileName(); + if( aGraphic.GetType() == GRAPHIC_NONE || + XOutBitmap::WriteGraphic( aGraphic, GraphicURL, + OUString("JPG"), + (XOUTBMP_USE_GIF_IF_POSSIBLE| + XOUTBMP_USE_NATIVE_IF_POSSIBLE) ) != 0 ) + { + // leer oder fehlerhaft, da ist nichts auszugeben + rHTMLWrt.m_nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE; + return rWrt; + } + + GraphicURL = URIHelper::SmartRel2Abs( + INetURLObject(rWrt.GetBaseURL()), GraphicURL, + URIHelper::GetMaybeFileHdl() ); + + } + OutHTML_Image( rWrt, rFrameFormat, GraphicURL, aGraphic, rFrameFormat.GetName(), aSz, HTML_FRMOPTS_GENIMG, "frame", aIMap.GetIMapObjectCount() ? &aIMap : nullptr ); @@ -1705,7 +1774,54 @@ static Writer& OutHTML_FrameFormatGrfNode( Writer& rWrt, const SwFrameFormat& rF nFrameFlags |= HTML_FRMOPTS_IMG_CSS1; Graphic aGraphic = pGrfNd->GetGraphic(); - OutHTML_Image( rWrt, rFrameFormat, aGraphic, pGrfNd->GetTitle(), + OUString aGraphicURL; + if(!rHTMLWrt.mbEmbedImages) + { + const SwMirrorGrf& rMirror = pGrfNd->GetSwAttrSet().GetMirrorGrf(); + + if( !pGrfNd->IsLinkedFile() || RES_MIRROR_GRAPH_DONT != rMirror.GetValue() ) + { + // create a (mirrored) jpeg file + if( rHTMLWrt.GetOrigFileName() ) + aGraphicURL = *rHTMLWrt.GetOrigFileName(); + pGrfNd->GetGrf( sal_True ); + + sal_uLong nFlags = XOUTBMP_USE_GIF_IF_SENSIBLE | + XOUTBMP_USE_NATIVE_IF_POSSIBLE; + switch( rMirror.GetValue() ) + { + case RES_MIRROR_GRAPH_VERT: nFlags = XOUTBMP_MIRROR_HORZ; break; + case RES_MIRROR_GRAPH_HOR: nFlags = XOUTBMP_MIRROR_VERT; break; + case RES_MIRROR_GRAPH_BOTH: + nFlags = XOUTBMP_MIRROR_VERT | XOUTBMP_MIRROR_HORZ; + break; + } + + Size aMM100Size; + const SwFormatFrameSize& rSize = rFrameFormat.GetFrameSize(); + aMM100Size = OutputDevice::LogicToLogic( rSize.GetSize(), + MapMode( MAP_TWIP ), MapMode( MAP_100TH_MM )); + + sal_uInt16 nErr = XOutBitmap::WriteGraphic( pGrfNd->GetGrf(), aGraphicURL, + OUString("JPG"), nFlags, &aMM100Size ); + if( nErr ) + { + rHTMLWrt.m_nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE; + return rWrt; + } + aGraphicURL = URIHelper::SmartRel2Abs( + INetURLObject(rWrt.GetBaseURL()), aGraphicURL, + URIHelper::GetMaybeFileHdl() ); + } + else + { + pGrfNd->GetFileFilterNms( &aGraphicURL, 0 ); + if( rHTMLWrt.m_bCfgCpyLinkedGrfs ) + rWrt.CopyLocalFileToINet( aGraphicURL ); + } + + } + OutHTML_Image( rWrt, rFrameFormat, aGraphicURL, aGraphic, pGrfNd->GetTitle(), pGrfNd->GetTwipSize(), nFrameFlags, "graphic" ); return rWrt; diff --git a/sw/source/filter/html/htmlnumwriter.cxx b/sw/source/filter/html/htmlnumwriter.cxx index 5afc06a333bc..9042b5aa1556 100644 --- a/sw/source/filter/html/htmlnumwriter.cxx +++ b/sw/source/filter/html/htmlnumwriter.cxx @@ -219,7 +219,8 @@ Writer& OutHTML_NumBulListStart( SwHTMLWriter& rWrt, rWrt.Strm().WriteOString( sOut ); OutHTML_BulletImage( rWrt, nullptr, - rNumFormat.GetBrush() ); + rNumFormat.GetBrush(), + rWrt.m_aBulletGrfs[i]); } else { diff --git a/sw/source/filter/html/htmlplug.cxx b/sw/source/filter/html/htmlplug.cxx index 1ecfa949a72a..f85ab2e61736 100644 --- a/sw/source/filter/html/htmlplug.cxx +++ b/sw/source/filter/html/htmlplug.cxx @@ -1315,9 +1315,30 @@ Writer& OutHTML_FrameFormatOLENodeGrf( Writer& rWrt, const SwFrameFormat& rFrame } Graphic aGraphic( *pOLENd->GetGraphic() ); + OUString aGraphicURL; + if(!rHTMLWrt.mbEmbedImages) + { + const OUString* pTempFileName = rHTMLWrt.GetOrigFileName(); + if(pTempFileName) + aGraphicURL = *pTempFileName; + + sal_uInt16 nErr = XOutBitmap::WriteGraphic( aGraphic, aGraphicURL, + OUString("JPG"), + (XOUTBMP_USE_GIF_IF_POSSIBLE | + XOUTBMP_USE_NATIVE_IF_POSSIBLE) ); + if( nErr ) // fehlerhaft, da ist nichts auszugeben + { + rHTMLWrt.m_nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE; + return rWrt; + } + aGraphicURL = URIHelper::SmartRel2Abs( + INetURLObject(rWrt.GetBaseURL()), aGraphicURL, + URIHelper::GetMaybeFileHdl() ); + + } sal_uLong nFlags = bInCntnr ? HTML_FRMOPTS_GENIMG_CNTNR : HTML_FRMOPTS_GENIMG; - OutHTML_Image( rWrt, rFrameFormat, aGraphic, + OutHTML_Image( rWrt, rFrameFormat, aGraphicURL, aGraphic, pOLENd->GetTitle(), pOLENd->GetTwipSize(), nFlags, "ole" ); diff --git a/sw/source/filter/html/wrthtml.cxx b/sw/source/filter/html/wrthtml.cxx index 57978fbe53d8..1bb9512046bd 100644 --- a/sw/source/filter/html/wrthtml.cxx +++ b/sw/source/filter/html/wrthtml.cxx @@ -155,6 +155,7 @@ SwHTMLWriter::SwHTMLWriter( const OUString& rBaseURL ) , m_bCfgNetscape4( false ) , mbSkipImages(false) , mbSkipHeaderFooter(false) + , mbEmbedImages(false) , m_bCfgPrintLayout( false ) , m_bParaDotLeaders( false ) { @@ -186,6 +187,10 @@ void SwHTMLWriter::SetupFilterOptions(SfxMedium& rMedium) { mbSkipHeaderFooter = true; } + else if (sFilterOptions == "EmbedImages" ) + { + mbEmbedImages = true; + } } sal_uLong SwHTMLWriter::WriteStream() @@ -1057,8 +1062,10 @@ const SwPageDesc *SwHTMLWriter::MakeHeader( sal_uInt16 &rHeaderAttrs ) OutDirection( m_nDirection ); if( m_bCfgOutStyles ) - OutCSS1_BodyTagStyleOpt( *this, rItemSet ); - + { + OUString dummy; + OutCSS1_BodyTagStyleOpt( *this, rItemSet, dummy ); + } // Events anhaengen if( pDoc->GetDocShell() ) // nur mit DocShell ist Basic moeglich OutBasicBodyEvents(); @@ -1230,15 +1237,31 @@ void SwHTMLWriter::OutBackground( const SvxBrushItem *pBrushItem, bool bGraphic OUString aGraphicInBase64; const Graphic* pGrf = pBrushItem->GetGraphic(); - if( pGrf ) + OUString GraphicURL = pBrushItem->GetGraphicLink(); + if( mbEmbedImages || GraphicURL.isEmpty()) { - if( !XOutBitmap::GraphicToBase64(*pGrf, aGraphicInBase64) ) + if( pGrf ) { - m_nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE; + if( !XOutBitmap::GraphicToBase64(*pGrf, aGraphicInBase64) ) + { + m_nWarn = WARN_SWG_POOR_LOAD | WARN_SW_WRITE_BASE; + } + Strm().WriteCharPtr( " " OOO_STRING_SVTOOLS_HTML_O_background "=\"" ); + Strm().WriteCharPtr( OOO_STRING_SVTOOLS_HTML_O_data ":" ); + HTMLOutFuncs::Out_String( Strm(), aGraphicInBase64, m_eDestEnc, &m_aNonConvertableCharacters ).WriteChar( '\"' ); } - Strm().WriteCharPtr( " " OOO_STRING_SVTOOLS_HTML_O_background "=\"" ); - Strm().WriteCharPtr( OOO_STRING_SVTOOLS_HTML_O_data ":" ); - HTMLOutFuncs::Out_String( Strm(), aGraphicInBase64, m_eDestEnc, &m_aNonConvertableCharacters ).WriteChar( '\"' ); + } + else + { + if( m_bCfgCpyLinkedGrfs ) + { + CopyLocalFileToINet( GraphicURL ); + } + OUString s( URIHelper::simpleNormalizedMakeRelative( GetBaseURL(), GraphicURL)); + Strm().WriteCharPtr(" " OOO_STRING_SVTOOLS_HTML_O_background "=\"" ); + HTMLOutFuncs::Out_String( Strm(), s, m_eDestEnc, &m_aNonConvertableCharacters ); + Strm().WriteCharPtr("\""); + } } diff --git a/sw/source/filter/html/wrthtml.hxx b/sw/source/filter/html/wrthtml.hxx index 09eab5f13944..70e6be45cd3b 100644 --- a/sw/source/filter/html/wrthtml.hxx +++ b/sw/source/filter/html/wrthtml.hxx @@ -387,6 +387,7 @@ public: bool mbSkipImages : 1; /// If HTML header and footer should be written as well, or just the content itself. bool mbSkipHeaderFooter : 1; + bool mbEmbedImages : 1; #define sCSS2_P_CLASS_leaders "leaders" bool m_bCfgPrintLayout : 1; // PrintLayout option for TOC dot leaders @@ -433,7 +434,7 @@ public: void OutAndSetDefList( sal_uInt16 nNewLvl ); - void OutStyleSheet( const SwPageDesc& rPageDesc ); + void OutStyleSheet( const SwPageDesc& rPageDesc, bool bUsed=true ); inline void OutCSS1_PropertyAscii( const sal_Char *pProp, const sal_Char *pVal ); @@ -463,7 +464,7 @@ public: // Frame-Formats ausgeben und ggf. ein <BR CLEAR=...> vorne an // rEndTags anhaengen OString OutFrameFormatOptions( const SwFrameFormat& rFrameFormat, const OUString& rAltText, - sal_uInt32 nFrameOpts ); + sal_uInt32 nFrameOpts, const OString& rEndTags = OString() ); void writeFrameFormatOptions(HtmlWriter& aHtml, const SwFrameFormat& rFrameFormat, const OUString& rAltText, sal_uInt32 nFrameOpts); @@ -643,19 +644,21 @@ Writer& OutHTML_HeaderFooter( Writer& rWrt, const SwFrameFormat& rFrameFormat, bool bHeader ); Writer& OutHTML_Image( Writer&, const SwFrameFormat& rFormat, + const OUString& rGraphicURL, Graphic& rGraphic, const OUString& rAlternateText, const Size& rRealSize, sal_uInt32 nFrameOpts, const sal_Char *pMarkType = nullptr, const ImageMap *pGenImgMap = nullptr ); Writer& OutHTML_BulletImage( Writer& rWrt, const sal_Char *pTag, - const SvxBrushItem* pBrush ); + const SvxBrushItem* pBrush, + const OUString& rGraphicURL); Writer& OutHTML_SwFormatField( Writer& rWrt, const SfxPoolItem& rHt ); Writer& OutHTML_SwFormatFootnote( Writer& rWrt, const SfxPoolItem& rHt ); Writer& OutHTML_INetFormat( Writer&, const SwFormatINetFormat& rINetFormat, bool bOn ); -Writer& OutCSS1_BodyTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet ); +Writer& OutCSS1_BodyTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet, const OUString& rGraphicURL ); Writer& OutCSS1_ParaTagStyleOpt( Writer& rWrt, const SfxItemSet& rItemSet ); Writer& OutCSS1_HintSpanTag( Writer& rWrt, const SfxPoolItem& rHt ); diff --git a/sw/source/filter/writer/writer.cxx b/sw/source/filter/writer/writer.cxx index fb22f18b742f..caae537b17c0 100644 --- a/sw/source/filter/writer/writer.cxx +++ b/sw/source/filter/writer/writer.cxx @@ -63,6 +63,7 @@ struct Writer_Impl { SvStream * m_pStream; + std::auto_ptr< std::map<OUString, OUString> > pFileNameMap; std::vector<const SvxFontItem*> aFontRemoveLst; SwBookmarkNodeTable aBkmkNodePos; @@ -301,6 +302,59 @@ sal_uLong Writer::Write( SwPaM&, const uno::Reference < embed::XStorage >&, cons return ERR_SWG_WRITE_ERROR; } +bool Writer::CopyLocalFileToINet( OUString& rFileNm ) +{ + if( !pOrigFileName ) // can be happen, by example if we + return false; // write into the clipboard + + bool bRet = false; + INetURLObject aFileUrl( rFileNm ), aTargetUrl( *pOrigFileName ); + +// this is our old without the Mail-Export + if( ! ( INetProtocol::File == aFileUrl.GetProtocol() && + INetProtocol::File != aTargetUrl.GetProtocol() && + INetProtocol::Ftp <= aTargetUrl.GetProtocol() && + INetProtocol::VndSunStarWebdav >= aTargetUrl.GetProtocol() ) ) + return bRet; + + if (m_pImpl->pFileNameMap.get()) + { + // has the file been moved? + std::map<OUString, OUString>::iterator it = m_pImpl->pFileNameMap->find( rFileNm ); + if ( it != m_pImpl->pFileNameMap->end() ) + { + rFileNm = it->second; + return true; + } + } + else + { + m_pImpl->pFileNameMap.reset( new std::map<OUString, OUString>() ); + } + + OUString aSrc = rFileNm; + OUString aDest = aTargetUrl.GetPartBeforeLastName(); + aDest += OUString(aFileUrl.GetName()); + + SfxMedium aSrcFile( aSrc, StreamMode::READ ); + SfxMedium aDstFile( aDest, StreamMode::WRITE | StreamMode::SHARE_DENYNONE ); + + aDstFile.GetOutStream()->WriteStream( *aSrcFile.GetInStream() ); + + aSrcFile.Close(); + aDstFile.Commit(); + + bRet = 0 == aDstFile.GetError(); + + if( bRet ) + { + m_pImpl->pFileNameMap->insert( std::make_pair( aSrc, aDest ) ); + rFileNm = aDest; + } + + return bRet; +} + void Writer::PutNumFormatFontsInAttrPool() { // then there are a few fonts in the NumRules @@ -337,14 +391,17 @@ void Writer::PutNumFormatFontsInAttrPool() } } -void Writer::PutEditEngFontsInAttrPool() +void Writer::PutEditEngFontsInAttrPool( bool bIncl_CJK_CTL ) { SfxItemPool& rPool = pDoc->GetAttrPool(); if( rPool.GetSecondaryPool() ) { _AddFontItems( rPool, EE_CHAR_FONTINFO ); - _AddFontItems( rPool, EE_CHAR_FONTINFO_CJK ); - _AddFontItems( rPool, EE_CHAR_FONTINFO_CTL ); + if( bIncl_CJK_CTL ) + { + _AddFontItems( rPool, EE_CHAR_FONTINFO_CJK ); + _AddFontItems( rPool, EE_CHAR_FONTINFO_CTL ); + } } } diff --git a/sw/source/ui/dbui/mmresultdialogs.cxx b/sw/source/ui/dbui/mmresultdialogs.cxx index bb9990259dff..fd8f128d865d 100644 --- a/sw/source/ui/dbui/mmresultdialogs.cxx +++ b/sw/source/ui/dbui/mmresultdialogs.cxx @@ -1049,6 +1049,10 @@ IMPL_LINK_TYPED(SwMMResultEmailDialog, SendDocumentsHdl_Impl, Button*, pButton, aOpt.SetParaFlags( LINEEND_CR ); aOpt.WriteUserData( sFilterOptions ); } + else if(MM_DOCTYPE_HTML == nDocType) + { + sFilterOptions = "EmbedImages"; + } OUString sTargetTempURL = URIHelper::SmartRel2Abs( INetURLObject(), utl::TempFile::CreateTempName(), URIHelper::GetMaybeFileHdl()); @@ -1106,11 +1110,12 @@ IMPL_LINK_TYPED(SwMMResultEmailDialog, SendDocumentsHdl_Impl, Button*, pButton, URIHelper::GetMaybeFileHdl()) ); { - uno::Sequence< beans::PropertyValue > aFilterValues(MM_DOCTYPE_TEXT == nDocType ? 2 : 1); + bool withFilterOptions = MM_DOCTYPE_TEXT == nDocType || MM_DOCTYPE_HTML == nDocType; + uno::Sequence< beans::PropertyValue > aFilterValues(withFilterOptions ? 2 : 1); beans::PropertyValue* pFilterValues = aFilterValues.getArray(); pFilterValues[0].Name = "FilterName"; pFilterValues[0].Value <<= OUString(pSfxFlt->GetFilterName()); - if(MM_DOCTYPE_TEXT == nDocType) + if(withFilterOptions) { pFilterValues[1].Name = "FilterOptions"; pFilterValues[1].Value <<= sFilterOptions; |