1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
3 * This file is part of the LibreOffice project.
5 * This Source Code Form is subject to the terms of the Mozilla Public
6 * License, v. 2.0. If a copy of the MPL was not distributed with this
7 * file, You can obtain one at http://mozilla.org/MPL/2.0/.
9 * This file incorporates work covered by the following license notice:
11 * Licensed to the Apache Software Foundation (ASF) under one or more
12 * contributor license agreements. See the NOTICE file distributed
13 * with this work for additional information regarding copyright
14 * ownership. The ASF licenses this file to you under the Apache
15 * License, Version 2.0 (the "License"); you may not use this file
16 * except in compliance with the License. You may obtain a copy of
17 * the License at http://www.apache.org/licenses/LICENSE-2.0 .
20 #ifndef INCLUDED_VCL_PDFEXTOUTDEVDATA_HXX
21 #define INCLUDED_VCL_PDFEXTOUTDEVDATA_HXX
23 #include <vcl/dllapi.h>
25 #include <vcl/pdfwriter.hxx>
26 #include <vcl/extoutdevdata.hxx>
34 struct SwEnhancedPDFState
;
35 struct ScEnhancedPDFState
;
41 A PDFExtOutDevBookmarkEntry is being created by the EditEngine if
42 a bookmark URL has been parsed. The Application is requested to take
43 care of each bookmark entry by emptying out the bookmark vector.
45 struct PDFExtOutDevBookmarkEntry
47 /** ID of the link pointing to the bookmark, or -1 if the entry denotes a destination instead of a link.
51 /** ID of the named destination denoted by the bookmark, or -1 if the entry denotes a link instead of a named destination.
55 /** link target name, respectively destination name
59 PDFExtOutDevBookmarkEntry()
67 Class that is being set at the OutputDevice allowing the
68 application to send enhanced PDF commands like CreateLink
71 struct GlobalSyncData
;
72 class VCL_DLLPUBLIC PDFExtOutDevData final
: public ExtOutDevData
75 const OutputDevice
& mrOutDev
;
79 bool mbExportNotesInMargin
;
80 bool mbExportNotesPages
;
81 bool mbTransitionEffects
;
82 bool mbUseLosslessCompression
;
83 bool mbReduceImageResolution
;
84 bool mbExportFormFields
;
85 bool mbExportBookmarks
;
86 bool mbExportHiddenSlides
;
87 bool mbSinglePageSheets
;
88 bool mbExportNDests
; //i56629
90 sal_Int32 mnCompressionQuality
;
91 css::lang::Locale maDocLocale
;
93 std::unique_ptr
<PageSyncData
> mpPageSyncData
;
94 std::unique_ptr
<GlobalSyncData
> mpGlobalSyncData
;
96 std::vector
< PDFExtOutDevBookmarkEntry
> maBookmarks
;
97 std::vector
<OUString
> maChapterNames
;
98 // map from annotation SdrObject to annotation index
99 ::std::map
<SdrObject
const*, ::std::vector
<sal_Int32
>> m_ScreenAnnotations
;
101 SwEnhancedPDFState
* m_pSwPDFState
= nullptr;
102 ScEnhancedPDFState
* m_pScPDFState
= nullptr;
106 PDFExtOutDevData( const OutputDevice
& rOutDev
);
107 virtual ~PDFExtOutDevData() override
;
109 bool PlaySyncPageAct( PDFWriter
& rWriter
, sal_uInt32
& rCurGDIMtfAction
, const GDIMetaFile
& rMtf
);
110 void ResetSyncData(PDFWriter
* pWriterIfRemoveTransparencies
);
112 void PlayGlobalActions( PDFWriter
& rWriter
);
114 bool GetIsExportNotes() const { return mbExportNotes
;}
115 void SetIsExportNotes( const bool bExportNotes
);
117 bool GetIsExportNotesInMargin() const { return mbExportNotesInMargin
;}
118 void SetIsExportNotesInMargin( const bool bExportNotesInMargin
);
120 bool GetIsExportNotesPages() const { return mbExportNotesPages
;}
121 void SetIsExportNotesPages( const bool bExportNotesPages
);
123 bool GetIsExportTaggedPDF() const { return mbTaggedPDF
;}
124 void SetIsExportTaggedPDF( const bool bTaggedPDF
);
126 bool GetIsExportTransitionEffects() const { return mbTransitionEffects
;}
127 void SetIsExportTransitionEffects( const bool bTransitionalEffects
);
129 bool GetIsExportFormFields() const { return mbExportFormFields
;}
130 void SetIsExportFormFields( const bool bExportFormFields
);
132 bool GetIsExportBookmarks() const { return mbExportBookmarks
;}
133 void SetIsExportBookmarks( const bool bExportBookmarks
);
135 bool GetIsExportHiddenSlides() const { return mbExportHiddenSlides
;}
136 void SetIsExportHiddenSlides( const bool bExportHiddenSlides
);
138 void SetIsSinglePageSheets( const bool bSinglePageSheets
);
140 bool GetIsExportNamedDestinations() const { return mbExportNDests
;} //i56629
141 void SetIsExportNamedDestinations( const bool bExportNDests
); //i56629
143 // PageNumber, Compression is being set by the PDFExport
144 sal_Int32
GetCurrentPageNumber() const { return mnPage
;}
145 void SetCurrentPageNumber( const sal_Int32 nPage
);
147 bool GetIsLosslessCompression() const { return mbUseLosslessCompression
;}
148 void SetIsLosslessCompression( const bool bLosslessCompression
);
150 void SetCompressionQuality( const sal_Int32 nQuality
);
152 bool GetIsReduceImageResolution() const { return mbReduceImageResolution
;}
153 void SetIsReduceImageResolution( const bool bReduceImageResolution
);
155 const css::lang::Locale
& GetDocumentLocale() const { return maDocLocale
;}
156 void SetDocumentLocale( const css::lang::Locale
& rLoc
);
158 std::vector
< PDFExtOutDevBookmarkEntry
>& GetBookmarks() { return maBookmarks
;}
159 const std::vector
<OUString
>& GetChapterNames() const { return maChapterNames
; }
161 SwEnhancedPDFState
* GetSwPDFState() { return m_pSwPDFState
; }
162 void SetSwPDFState(SwEnhancedPDFState
*const pSwPDFState
) { m_pSwPDFState
= pSwPDFState
; }
164 ScEnhancedPDFState
* GetScPDFState() { return m_pScPDFState
; }
165 void SetScPDFState(ScEnhancedPDFState
* const pScPDFState
) { m_pScPDFState
= pScPDFState
; }
167 const Graphic
& GetCurrentGraphic() const;
169 /** Start a new group of render output
171 Use this method to group render output.
175 /** End render output
177 This method ends grouped render output, that can be
178 represented by a GfxLink. This is typically used for
179 external graphic files, such as JPEGs, EPS files etc.
180 The BeginGroup/EndGroup calls must exactly enclose the
181 relevant OutputDevice calls issued to render the
182 graphic the normal way.
185 The link to the original graphic
188 Eight bit transparency value, with 0 denoting full opacity,
189 and 255 full transparency.
192 The output rectangle of the graphic.
194 @param rVisibleOutputRect
195 The visible part of the output. This might be less than
196 rOutputRect, e.g. for cropped graphics.
198 void EndGroup( const Graphic
& rGraphic
,
199 sal_uInt8 nTransparency
,
200 const tools::Rectangle
& rOutputRect
,
201 const tools::Rectangle
& rVisibleOutputRect
);
203 /// Detect if stream is compressed enough to avoid de-compress / scale & re-compress
204 bool HasAdequateCompression( const Graphic
&rGraphic
,
205 const tools::Rectangle
&rOutputRect
,
206 const tools::Rectangle
&rVisibleOutputRect
) const;
209 /** Create a new named destination to be used in a link to this document from another PDF document
210 (see PDF spec 1.4, 8.2.1)
213 the name this destination will be addressed with from others PDF document
216 target rectangle on page to be displayed if dest is jumped to
219 number of page the dest is on (as returned by NewPage)
220 or -1 in which case the current page is used
223 the destination id (to be used in SetLinkDest) or
224 -1 if page id does not exist
226 sal_Int32
CreateNamedDest( const OUString
& sDestName
, const tools::Rectangle
& rRect
, sal_Int32 nPageNr
= -1 );
228 /** registers a destination for which a destination ID needs to be known immediately, instead of later on setting it via
231 This is used in contexts where a destination is referenced by means other than a link.
233 Later in the export process, a call to DescribeRegisteredDest must be made, providing the information about
237 the unique Id of the destination
239 sal_Int32
RegisterDest();
241 /** provides detailed information about a destination range which previously has been registered using RegisterDest.
243 void DescribeRegisteredDest( sal_Int32 nDestId
, const tools::Rectangle
& rRect
, sal_Int32 nPageNr
, PDFWriter::DestAreaType eType
= PDFWriter::DestAreaType::XYZ
);
247 /** Create a new destination to be used in a link
250 target rectangle on page to be displayed if dest is jumped to
253 number of page the dest is on (as returned by NewPage)
254 or -1 in which case the current page is used
257 what dest type to use
260 the destination id (to be used in SetLinkDest) or
261 -1 if page id does not exist
263 sal_Int32
CreateDest( const tools::Rectangle
& rRect
, sal_Int32 nPageNr
= -1, PDFWriter::DestAreaType eType
= PDFWriter::DestAreaType::XYZ
);
264 /** Create a new link on a page
267 active rectangle of the link (that is the area that has to be
268 hit to activate the link)
271 number of page the link is on (as returned by NewPage)
272 or -1 in which case the current page is used
275 Alt text for the link
278 the link id (to be used in SetLinkDest, SetLinkURL) or
279 -1 if page id does not exist
281 sal_Int32
CreateLink(const tools::Rectangle
& rRect
, OUString
const& rAltText
, sal_Int32 nPageNr
= -1);
283 /// Create a Screen annotation.
284 sal_Int32
CreateScreen(const tools::Rectangle
& rRect
, OUString
const& rAltText
, OUString
const& rMimeType
, sal_Int32 nPageNr
, SdrObject
const* pObj
);
286 /// Get back the annotations created for one SdrObject.
287 ::std::vector
<sal_Int32
> const& GetScreenAnnotIds(SdrObject
const* pObj
) const;
289 /** Set the destination for a link
290 <p>will change a URL type link to a dest link if necessary</p>
293 the link to be changed
296 the dest the link shall point to
298 void SetLinkDest( sal_Int32 nLinkId
, sal_Int32 nDestId
);
299 /** Set the URL for a link
300 <p>will change a dest type link to a URL type link if necessary</p>
302 the link to be changed
305 the URL the link shall point to.
306 there will be no error checking or any kind of
307 conversion done to this parameter except this:
308 it will be output as 7bit Ascii. The URL
309 will appear literally in the PDF file produced
311 void SetLinkURL( sal_Int32 nLinkId
, const OUString
& rURL
);
313 /// Set URL for a linked Screen annotation.
314 void SetScreenURL(sal_Int32 nScreenId
, const OUString
& rURL
);
315 /// Set URL for an embedded Screen annotation.
316 void SetScreenStream(sal_Int32 nScreenId
, const OUString
& rURL
);
318 /** Create a new outline item
321 declares the parent of the new item in the outline hierarchy.
322 An invalid value will result in a new toplevel item.
325 sets the title text of the item
328 declares which Dest (created with CreateDest) the outline item
332 the outline item id of the new item
334 sal_Int32
CreateOutlineItem( sal_Int32 nParent
, const OUString
& rText
, sal_Int32 nDestID
);
336 /** Create a new note on a page
339 active rectangle of the note (that is the area that has to be
340 hit to popup the annotation)
343 specifies the contents of the note
346 number of page the note is on (as returned by NewPage)
347 or -1 in which case the current page is used
349 void CreateNote( const tools::Rectangle
& rRect
, const PDFNote
& rNote
, sal_Int32 nPageNr
= -1 );
351 /** begin a new logical structure element
353 BeginStructureElement/EndStructureElement calls build the logical structure
354 of the PDF - the basis for tagged PDF. Structural elements are implemented
355 using marked content tags. Each structural element can contain sub elements
356 (e.g. a section can contain a heading and a paragraph). The structure hierarchy
357 is build automatically from the Begin/EndStructureElement calls.
359 The easy way is to call WrapBeginStructureElement, but it's also possible
360 to call EnsureStructureElement/InitStructureElement/BeginStructureElement
361 (its 3 parts) manually for more control; this way a placeholder SE can be
362 inserted and initialised later.
364 A structural element need not be contained on one page; e.g. paragraphs often
365 run from one page to the next. In this case the corresponding EndStructureElement
366 must be called while drawing the next page.
368 BeginStructureElement and EndStructureElement must be called only after
369 PDFWriter::NewPage has been called and before
370 PDFWriter::Emit gets called. The current page
371 number is an implicit context parameter for Begin/EndStructureElement.
373 For pagination artifacts that are not part of the logical structure
374 of the document (like header, footer or page number) the special
375 StructElement NonStructElement exists. To place content
376 outside of the structure tree simply call
377 BeginStructureElement( NonStructElement ) then draw your
378 content and then call EndStructureElement(). Any children
379 of a NonStructElement will not be part of the structure as well.
382 denotes what kind of element to begin (e.g. a heading or paragraph)
385 the specified alias will be used as structure tag. Also an entry in the PDF's
386 role map will be created mapping alias to regular structure type.
389 the id of the newly created structural element
391 sal_Int32
WrapBeginStructureElement(PDFWriter::StructElement eType
, const OUString
& rAlias
= OUString());
392 sal_Int32
EnsureStructureElement(void const* key
);
393 void InitStructureElement(sal_Int32 id
, PDFWriter::StructElement eType
, const OUString
& rAlias
);
394 void BeginStructureElement(sal_Int32 id
);
396 /** end a logical structure element
398 @see BeginStructureElement
400 void EndStructureElement();
401 /** set the current structure element
404 For different purposes it may be useful to paint a structure element's
405 content discontinuously. In that case an already existing structure element
406 can be appended to by using SetCurrentStructureElement. The
407 referenced structure element becomes the current structure element with
408 all consequences: all following structure elements are appended as children
409 of the current element.
413 the id of the new current structure element, which must be valid
415 void SetCurrentStructureElement( sal_Int32 nElement
);
416 /** get the current structure element id
419 the id of the current structure element
421 sal_Int32
GetCurrentStructureElement() const;
423 /** set a structure attribute on the current structural element
425 SetStructureAttribute sets an attribute of the current structural element to a
426 new value. A consistency check is performed before actually setting the value;
427 if the check fails, the function returns False and the attribute remains
431 denotes what attribute to change
434 the value to set the attribute to
436 void SetStructureAttribute( PDFWriter::StructAttribute eAttr
, PDFWriter::StructAttributeValue eVal
);
437 /** set a structure attribute on the current structural element
439 SetStructureAttributeNumerical sets an attribute of the current structural element
440 to a new numerical value. A consistency check is performed before actually setting
441 the value; if the check fails, the function returns False and the attribute
445 denotes what attribute to change
448 the value to set the attribute to
450 void SetStructureAttributeNumerical( PDFWriter::StructAttribute eAttr
, sal_Int32 nValue
);
451 /** set the bounding box of a structural element
453 SetStructureBoundingBox sets the BBox attribute to a new value. Since the BBox
454 attribute can only be applied to Table, Figure,
455 Form and Formula elements, a call of this function
456 for other element types will be ignored and the BBox attribute not be set.
459 the new bounding box for the structural element
461 void SetStructureBoundingBox( const tools::Rectangle
& rRect
);
463 /** set the annotations that should be referenced as children of the
464 current structural element.
466 void SetStructureAnnotIds(::std::vector
<sal_Int32
> const& rAnnotIds
);
468 /** set the ActualText attribute of a structural element
470 ActualText contains the Unicode text without layout artifacts that is shown by
471 a structural element. For example if a line is ended prematurely with a break in
472 a word and continued on the next line (e.g. "happen-<newline>stance") the
473 corresponding ActualText would contain the unbroken line (e.g. "happenstance").
476 contains the complete logical text the structural element displays.
478 void SetActualText( const OUString
& rText
);
480 /** set the Alt attribute of a structural element
482 Alt is s replacement text describing the contents of a structural element. This
483 is mainly used by accessibility applications; e.g. a screen reader would read
484 the Alt replacement text for an image to a visually impaired user.
487 contains the replacement text for the structural element
489 void SetAlternateText( const OUString
& rText
);
491 /** Sets the transitional effect to be applied when the current page gets shown.
494 the kind of effect to be used; use Regular to disable transitional effects
498 the duration of the transitional effect in milliseconds;
499 set 0 to disable transitional effects
501 void SetPageTransition( PDFWriter::PageTransition eType
, sal_uInt32 nMilliSec
);
503 /** create a new form control
505 This function creates a new form control in the PDF and sets its various
506 properties. Do not pass an actual AnyWidget as rControlType
507 will be cast to the type described by the type member.
510 a descendant of AnyWidget determining the control's properties
512 void CreateControl( const PDFWriter::AnyWidget
& rControlType
);
519 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */