1*1d2dbeb0SAndrew Rist /************************************************************** 2cdf0e10cSrcweir * 3*1d2dbeb0SAndrew Rist * Licensed to the Apache Software Foundation (ASF) under one 4*1d2dbeb0SAndrew Rist * or more contributor license agreements. See the NOTICE file 5*1d2dbeb0SAndrew Rist * distributed with this work for additional information 6*1d2dbeb0SAndrew Rist * regarding copyright ownership. The ASF licenses this file 7*1d2dbeb0SAndrew Rist * to you under the Apache License, Version 2.0 (the 8*1d2dbeb0SAndrew Rist * "License"); you may not use this file except in compliance 9*1d2dbeb0SAndrew Rist * with the License. You may obtain a copy of the License at 10*1d2dbeb0SAndrew Rist * 11*1d2dbeb0SAndrew Rist * http://www.apache.org/licenses/LICENSE-2.0 12*1d2dbeb0SAndrew Rist * 13*1d2dbeb0SAndrew Rist * Unless required by applicable law or agreed to in writing, 14*1d2dbeb0SAndrew Rist * software distributed under the License is distributed on an 15*1d2dbeb0SAndrew Rist * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY 16*1d2dbeb0SAndrew Rist * KIND, either express or implied. See the License for the 17*1d2dbeb0SAndrew Rist * specific language governing permissions and limitations 18*1d2dbeb0SAndrew Rist * under the License. 19*1d2dbeb0SAndrew Rist * 20*1d2dbeb0SAndrew Rist *************************************************************/ 21*1d2dbeb0SAndrew Rist 22*1d2dbeb0SAndrew Rist 23cdf0e10cSrcweir 24cdf0e10cSrcweir #ifndef _ENHANCEDPDFEXPORTHELPER_HXX 25cdf0e10cSrcweir #define _ENHANCEDPDFEXPORTHELPER_HXX 26cdf0e10cSrcweir 27cdf0e10cSrcweir #include <vcl/pdfextoutdevdata.hxx> 28cdf0e10cSrcweir #include <i18npool/lang.h> 29cdf0e10cSrcweir #include <swrect.hxx> 30cdf0e10cSrcweir #include <swtypes.hxx> 31cdf0e10cSrcweir 32cdf0e10cSrcweir #include <map> 33cdf0e10cSrcweir #include <vector> 34cdf0e10cSrcweir #include <set> 35cdf0e10cSrcweir 36cdf0e10cSrcweir namespace vcl 37cdf0e10cSrcweir { 38cdf0e10cSrcweir class PDFExtOutDevData; 39cdf0e10cSrcweir } 40cdf0e10cSrcweir class OutputDevice; 41cdf0e10cSrcweir class SwFrm; 42cdf0e10cSrcweir class SwLinePortion; 43cdf0e10cSrcweir class SwTxtPainter; 44cdf0e10cSrcweir class SwEditShell; 45cdf0e10cSrcweir namespace rtl 46cdf0e10cSrcweir { 47cdf0e10cSrcweir class OUString; 48cdf0e10cSrcweir } 49cdf0e10cSrcweir class MultiSelection; 50cdf0e10cSrcweir class SwTxtNode; 51cdf0e10cSrcweir class SwNumRule; 52cdf0e10cSrcweir class SwTable; 53cdf0e10cSrcweir class SwNumberTreeNode; 54cdf0e10cSrcweir class String; 55cdf0e10cSrcweir class SvxLanguageItem; 56cdf0e10cSrcweir 57cdf0e10cSrcweir 58cdf0e10cSrcweir /* 59cdf0e10cSrcweir * Mapping of OOo elements to tagged pdf elements: 60cdf0e10cSrcweir * 61cdf0e10cSrcweir * OOo element tagged pdf element 62cdf0e10cSrcweir * ----------- ------------------ 63cdf0e10cSrcweir * 64cdf0e10cSrcweir * Grouping elements: 65cdf0e10cSrcweir * 66cdf0e10cSrcweir * SwRootFrm Document 67cdf0e10cSrcweir * Part 68cdf0e10cSrcweir * Art 69cdf0e10cSrcweir * SwSection Sect 70cdf0e10cSrcweir * SwFtnContFrm and SwFlyFrm Div 71cdf0e10cSrcweir * SwFmt "Quotations" BlockQuote 72cdf0e10cSrcweir * SwFmt "Caption" Caption 73cdf0e10cSrcweir * SwSection (TOC) TOC 74cdf0e10cSrcweir * SwTxtNode in TOC TOCI 75cdf0e10cSrcweir * SwSection (Index) Index 76cdf0e10cSrcweir * 77cdf0e10cSrcweir * Block-Level Structure Elements: 78cdf0e10cSrcweir * 79cdf0e10cSrcweir * SwTxtNode P 80cdf0e10cSrcweir * SwFmt "Heading" H 81cdf0e10cSrcweir * SwTxtNode with Outline H1 - H6 82cdf0e10cSrcweir * SwTxtNode with NumRule L, LI, LBody 83cdf0e10cSrcweir * SwTable Table 84cdf0e10cSrcweir * SwRowFrm TR 85cdf0e10cSrcweir * SwCellFrm in Headline row or 86cdf0e10cSrcweir * SwFtm "Table Heading" TH 87cdf0e10cSrcweir * SwCellFrm TD 88cdf0e10cSrcweir * 89cdf0e10cSrcweir * Inline-Level Structure Elements: 90cdf0e10cSrcweir * 91cdf0e10cSrcweir * SwTxtPortion Span 92cdf0e10cSrcweir * SwFmt "Quotation" Quote 93cdf0e10cSrcweir * SwFtnFrm Note 94cdf0e10cSrcweir * Form 95cdf0e10cSrcweir * Reference 96cdf0e10cSrcweir * SwFldPortion (AuthorityField) BibEntry 97cdf0e10cSrcweir * SwFmt "Source Text" Code 98cdf0e10cSrcweir * SwFtnPortion, SwFldPortion (RefField) Link 99cdf0e10cSrcweir * 100cdf0e10cSrcweir * Illustration elements: 101cdf0e10cSrcweir * 102cdf0e10cSrcweir * SwFlyFrm with SwNoTxtFrm Figure 103cdf0e10cSrcweir * SwFlyFrm with Math OLE Object Formula 104cdf0e10cSrcweir * 105cdf0e10cSrcweir */ 106cdf0e10cSrcweir 107cdf0e10cSrcweir struct Num_Info 108cdf0e10cSrcweir { 109cdf0e10cSrcweir const SwFrm& mrFrm; Num_InfoNum_Info110cdf0e10cSrcweir Num_Info( const SwFrm& rFrm ) : mrFrm( rFrm ) {}; 111cdf0e10cSrcweir }; 112cdf0e10cSrcweir 113cdf0e10cSrcweir struct Frm_Info 114cdf0e10cSrcweir { 115cdf0e10cSrcweir const SwFrm& mrFrm; Frm_InfoFrm_Info116cdf0e10cSrcweir Frm_Info( const SwFrm& rFrm ) : mrFrm( rFrm ) {}; 117cdf0e10cSrcweir }; 118cdf0e10cSrcweir 119cdf0e10cSrcweir struct Por_Info 120cdf0e10cSrcweir { 121cdf0e10cSrcweir const SwLinePortion& mrPor; 122cdf0e10cSrcweir const SwTxtPainter& mrTxtPainter; Por_InfoPor_Info123cdf0e10cSrcweir Por_Info( const SwLinePortion& rPor, const SwTxtPainter& rTxtPainer ) 124cdf0e10cSrcweir : mrPor( rPor ), mrTxtPainter( rTxtPainer ) {}; 125cdf0e10cSrcweir }; 126cdf0e10cSrcweir 127cdf0e10cSrcweir struct lt_TableColumn 128cdf0e10cSrcweir { operator ()lt_TableColumn129cdf0e10cSrcweir bool operator()( long nVal1, long nVal2 ) const 130cdf0e10cSrcweir { 131cdf0e10cSrcweir return nVal1 + ( MINLAY - 1 ) < nVal2; 132cdf0e10cSrcweir } 133cdf0e10cSrcweir }; 134cdf0e10cSrcweir 135cdf0e10cSrcweir /************************************************************************* 136cdf0e10cSrcweir * class SwTaggedPDFHelper 137cdf0e10cSrcweir * Analyses a given frame during painting and generates the appropriate 138cdf0e10cSrcweir * structure elements. 139cdf0e10cSrcweir *************************************************************************/ 140cdf0e10cSrcweir 141cdf0e10cSrcweir class SwTaggedPDFHelper 142cdf0e10cSrcweir { 143cdf0e10cSrcweir private: 144cdf0e10cSrcweir 145cdf0e10cSrcweir // This will be incremented for each BeginTag() call. 146cdf0e10cSrcweir // It denotes the number of tags to close during EndStructureElements(); 147cdf0e10cSrcweir sal_uInt8 nEndStructureElement; 148cdf0e10cSrcweir 149cdf0e10cSrcweir // If an already existing tag is reopened for follows of flow frames, 150cdf0e10cSrcweir // this value stores the tag id which has to be restored. 151cdf0e10cSrcweir sal_Int32 nRestoreCurrentTag; 152cdf0e10cSrcweir 153cdf0e10cSrcweir vcl::PDFExtOutDevData* mpPDFExtOutDevData; 154cdf0e10cSrcweir 155cdf0e10cSrcweir const Num_Info* mpNumInfo; 156cdf0e10cSrcweir const Frm_Info* mpFrmInfo; 157cdf0e10cSrcweir const Por_Info* mpPorInfo; 158cdf0e10cSrcweir 159cdf0e10cSrcweir void BeginTag( vcl::PDFWriter::StructElement aTagRole, const String& rTagName ); 160cdf0e10cSrcweir void EndTag(); 161cdf0e10cSrcweir 162cdf0e10cSrcweir void SetAttributes( vcl::PDFWriter::StructElement eType ); 163cdf0e10cSrcweir 164cdf0e10cSrcweir // These functions are called by the c'tor, d'tor 165cdf0e10cSrcweir void BeginNumberedListStructureElements(); 166cdf0e10cSrcweir void BeginBlockStructureElements(); 167cdf0e10cSrcweir void BeginInlineStructureElements(); 168cdf0e10cSrcweir void EndStructureElements(); 169cdf0e10cSrcweir 170cdf0e10cSrcweir bool CheckReopenTag(); 171cdf0e10cSrcweir bool CheckRestoreTag() const; 172cdf0e10cSrcweir 173cdf0e10cSrcweir public: 174cdf0e10cSrcweir 175cdf0e10cSrcweir // pFrmInfo != 0 => BeginBlockStructureElement 176cdf0e10cSrcweir // pPorInfo != 0 => BeginInlineStructureElement 177cdf0e10cSrcweir // pFrmInfo, pPorInfo = 0 => BeginNonStructureElement 178cdf0e10cSrcweir SwTaggedPDFHelper( const Num_Info* pNumInfo, const Frm_Info* pFrmInfo, const Por_Info* pPorInfo, 179cdf0e10cSrcweir OutputDevice& rOut ); 180cdf0e10cSrcweir ~SwTaggedPDFHelper(); 181cdf0e10cSrcweir 182cdf0e10cSrcweir static bool IsExportTaggedPDF( const OutputDevice& rOut ); 183cdf0e10cSrcweir }; 184cdf0e10cSrcweir 185cdf0e10cSrcweir /************************************************************************* 186cdf0e10cSrcweir * class SwEnhancedPDFExportHelper 187cdf0e10cSrcweir * Analyses the document structure and export Notes, Hyperlinks, References, 188cdf0e10cSrcweir * and Outline. Link ids created during pdf export are stored in 189cdf0e10cSrcweir * aReferenceIdMap and aHyperlinkIdMap, in order to use them during 190cdf0e10cSrcweir * tagged pdf output. Therefore the SwEnhancedPDFExportHelper is used 191cdf0e10cSrcweir * before painting. Unfortunately links from the EditEngine into the 192cdf0e10cSrcweir * Writer document require to be exported after they have been painted. 193cdf0e10cSrcweir * Therefore SwEnhancedPDFExportHelper also has to be used after the 194cdf0e10cSrcweir * painting process, the parameter bEditEngineOnly indicated that only 195cdf0e10cSrcweir * the bookmarks from the EditEngine have to be processed. 196cdf0e10cSrcweir *************************************************************************/ 197cdf0e10cSrcweir 198cdf0e10cSrcweir typedef std::set< long, lt_TableColumn > TableColumnsMapEntry; 199cdf0e10cSrcweir typedef std::pair< SwRect, sal_Int32 > IdMapEntry; 200cdf0e10cSrcweir typedef std::vector< IdMapEntry > LinkIdMap; 201cdf0e10cSrcweir typedef std::map< const SwTable*, TableColumnsMapEntry > TableColumnsMap; 202cdf0e10cSrcweir typedef std::map< const SwNumberTreeNode*, sal_Int32 > NumListIdMap; 203cdf0e10cSrcweir typedef std::map< const SwNumberTreeNode*, sal_Int32 > NumListBodyIdMap; 204cdf0e10cSrcweir typedef std::map< const void*, sal_Int32 > FrmTagIdMap; 205cdf0e10cSrcweir 206cdf0e10cSrcweir class SwEnhancedPDFExportHelper 207cdf0e10cSrcweir { 208cdf0e10cSrcweir private: 209cdf0e10cSrcweir 210cdf0e10cSrcweir SwEditShell& mrSh; 211cdf0e10cSrcweir OutputDevice& mrOut; 212cdf0e10cSrcweir 213cdf0e10cSrcweir MultiSelection* pPageRange; 214cdf0e10cSrcweir 215cdf0e10cSrcweir bool mbSkipEmptyPages; 216cdf0e10cSrcweir bool mbEditEngineOnly; 217cdf0e10cSrcweir 218cdf0e10cSrcweir static TableColumnsMap aTableColumnsMap; 219cdf0e10cSrcweir static LinkIdMap aLinkIdMap; 220cdf0e10cSrcweir static NumListIdMap aNumListIdMap; 221cdf0e10cSrcweir static NumListBodyIdMap aNumListBodyIdMap; 222cdf0e10cSrcweir static FrmTagIdMap aFrmTagIdMap; 223cdf0e10cSrcweir 224cdf0e10cSrcweir static LanguageType eLanguageDefault; 225cdf0e10cSrcweir 226cdf0e10cSrcweir void EnhancedPDFExport(); 227cdf0e10cSrcweir sal_Int32 CalcOutputPageNum( const SwRect& rRect ) const; 228cdf0e10cSrcweir 229cdf0e10cSrcweir void MakeHeaderFooterLinks( vcl::PDFExtOutDevData& rPDFExtOutDevData, 230cdf0e10cSrcweir const SwTxtNode& rTNd, const SwRect& rLinkRect, 231cdf0e10cSrcweir sal_Int32 nDestId, const String& rURL, bool bIntern ) const; 232cdf0e10cSrcweir 233cdf0e10cSrcweir public: 234cdf0e10cSrcweir 235cdf0e10cSrcweir SwEnhancedPDFExportHelper( SwEditShell& rSh, 236cdf0e10cSrcweir OutputDevice& rOut, 237cdf0e10cSrcweir const rtl::OUString& rPageRange, 238cdf0e10cSrcweir bool bSkipEmptyPages, 239cdf0e10cSrcweir bool bEditEngineOnly ); 240cdf0e10cSrcweir 241cdf0e10cSrcweir ~SwEnhancedPDFExportHelper(); 242cdf0e10cSrcweir GetTableColumnsMap()243cdf0e10cSrcweir static TableColumnsMap& GetTableColumnsMap() {return aTableColumnsMap; } GetLinkIdMap()244cdf0e10cSrcweir static LinkIdMap& GetLinkIdMap() { return aLinkIdMap; } GetNumListIdMap()245cdf0e10cSrcweir static NumListIdMap& GetNumListIdMap() {return aNumListIdMap; } GetNumListBodyIdMap()246cdf0e10cSrcweir static NumListBodyIdMap& GetNumListBodyIdMap() {return aNumListBodyIdMap; } GetFrmTagIdMap()247cdf0e10cSrcweir static FrmTagIdMap& GetFrmTagIdMap() { return aFrmTagIdMap; } 248cdf0e10cSrcweir GetDefaultLanguage()249cdf0e10cSrcweir static LanguageType GetDefaultLanguage() {return eLanguageDefault; } 250cdf0e10cSrcweir }; 251cdf0e10cSrcweir 252cdf0e10cSrcweir #endif 253