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