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