Version 6.4.0.0.beta1, tag libreoffice-6.4.0.0.beta1
[LibreOffice.git] / vcl / source / gdi / pdfwriter_impl.hxx
blob7e07d9e0d4721dc148a1f296b5b7f13bba123526
1 /* -*- Mode: C++; tab-width: 4; indent-tabs-mode: nil; c-basic-offset: 4 -*- */
2 /*
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 .
19 #ifndef INCLUDED_VCL_SOURCE_GDI_PDFWRITER_IMPL_HXX
20 #define INCLUDED_VCL_SOURCE_GDI_PDFWRITER_IMPL_HXX
22 #include <map>
23 #include <list>
24 #include <unordered_map>
25 #include <memory>
26 #include <vector>
28 #include <com/sun/star/lang/Locale.hpp>
29 #include <com/sun/star/util/XURLTransformer.hpp>
30 #include <com/sun/star/uno/Sequence.h>
31 #include <osl/file.hxx>
32 #include <rtl/cipher.h>
33 #include <rtl/strbuf.hxx>
34 #include <rtl/ustring.hxx>
35 #include <tools/gen.hxx>
36 #include <vcl/bitmapex.hxx>
37 #include <vcl/gradient.hxx>
38 #include <vcl/graphictools.hxx>
39 #include <vcl/hatch.hxx>
40 #include <vcl/virdev.hxx>
41 #include <vcl/pdfwriter.hxx>
42 #include <vcl/wall.hxx>
43 #include <o3tl/typed_flags_set.hxx>
44 #include <comphelper/hash.hxx>
45 #include <tools/stream.hxx>
47 #include <outdata.hxx>
48 #include "pdffontcache.hxx"
49 #include "pdfbuildin_fonts.hxx"
51 class StyleSettings;
52 class FontSelectPattern;
53 class FontSubsetInfo;
54 class ZCodec;
55 class EncHashTransporter;
56 struct BitStreamState;
57 class PhysicalFontFace;
58 class SvStream;
59 class SvMemoryStream;
61 // the maximum password length
62 #define ENCRYPTED_PWD_SIZE 32
63 #define MD5_DIGEST_SIZE 16
64 #define SECUR_40BIT_KEY 5
65 // security 128 bit
66 #define SECUR_128BIT_KEY 16
67 // maximum length of MD5 digest input, in step 2 of algorithm 3.1
68 // PDF spec ver. 1.4: see there for details
69 #define MAXIMUM_RC4_KEY_LENGTH (SECUR_128BIT_KEY+3+2)
71 enum class GraphicsStateUpdateFlags {
72 Font = 0x0001,
73 MapMode = 0x0002,
74 LineColor = 0x0004,
75 FillColor = 0x0008,
76 ClipRegion = 0x0040,
77 LayoutMode = 0x0100,
78 TransparentPercent = 0x0200,
79 DigitLanguage = 0x0400,
80 All = 0x077f
82 namespace o3tl {
83 template<> struct typed_flags<GraphicsStateUpdateFlags> : is_typed_flags<GraphicsStateUpdateFlags, 0x077f> {};
86 namespace vcl
89 class PDFStreamIf;
90 class Matrix3;
92 namespace filter
94 class PDFObjectElement;
97 class PDFWriterImpl : public VirtualDevice
99 friend class PDFStreamIf;
101 public:
102 enum ResourceKind { ResXObject, ResExtGState, ResShading, ResPattern };
103 typedef std::map< OString, sal_Int32 > ResourceMap;
104 struct ResourceDict
106 // note: handle fonts globally for performance
107 ResourceMap m_aXObjects;
108 ResourceMap m_aExtGStates;
109 ResourceMap m_aShadings;
110 ResourceMap m_aPatterns;
112 void append( OStringBuffer&, sal_Int32 nFontDictObject );
115 struct PDFPage
117 VclPtr<PDFWriterImpl> m_pWriter;
118 double const m_nPageWidth; // in inch/72
119 double const m_nPageHeight; // in inch/72
120 PDFWriter::Orientation const m_eOrientation;
121 sal_Int32 m_nPageObject;
122 std::vector<sal_Int32> m_aStreamObjects;
123 sal_Int32 m_nStreamLengthObject;
124 sal_uInt64 m_nBeginStreamPos;
125 std::vector<sal_Int32> m_aAnnotations;
126 std::vector<sal_Int32> m_aMCIDParents;
127 PDFWriter::PageTransition m_eTransition;
128 sal_uInt32 m_nTransTime;
130 PDFPage( PDFWriterImpl* pWriter, double nPageWidth, double nPageHeight, PDFWriter::Orientation eOrientation );
131 ~PDFPage();
133 void beginStream();
134 void endStream();
135 bool emit( sal_Int32 nParentPage );
137 // converts point from ref device coordinates to
138 // page coordinates and appends the point to the buffer
139 // if pOutPoint is set it will be updated to the emitted point
140 // (in PDF map mode, that is 10th of point)
141 void appendPoint( const Point& rPoint, OStringBuffer& rBuffer ) const;
142 // appends a B2DPoint without further transformation
143 void appendPixelPoint( const basegfx::B2DPoint& rPoint, OStringBuffer& rBuffer ) const;
144 // appends a rectangle
145 void appendRect( const tools::Rectangle& rRect, OStringBuffer& rBuffer ) const;
146 // converts a rectangle to 10th points page space
147 void convertRect( tools::Rectangle& rRect ) const;
148 // appends a polygon optionally closing it
149 void appendPolygon( const tools::Polygon& rPoly, OStringBuffer& rBuffer, bool bClose = true ) const;
150 // appends a polygon optionally closing it
151 void appendPolygon( const basegfx::B2DPolygon& rPoly, OStringBuffer& rBuffer ) const;
152 // appends a polypolygon optionally closing the subpaths
153 void appendPolyPolygon( const tools::PolyPolygon& rPolyPoly, OStringBuffer& rBuffer ) const;
154 // appends a polypolygon optionally closing the subpaths
155 void appendPolyPolygon( const basegfx::B2DPolyPolygon& rPolyPoly, OStringBuffer& rBuffer ) const;
156 // converts a length (either vertical or horizontal; this
157 // can be important if the source MapMode is not
158 // symmetrical) to page length and appends it to the buffer
159 // if pOutLength is set it will be updated to the emitted length
160 // (in PDF map mode, that is 10th of point)
161 void appendMappedLength( sal_Int32 nLength, OStringBuffer& rBuffer, bool bVertical = true, sal_Int32* pOutLength = nullptr ) const;
162 // the same for double values
163 void appendMappedLength( double fLength, OStringBuffer& rBuffer, bool bVertical = true, sal_Int32 nPrecision = 5 ) const;
164 // appends LineInfo
165 // returns false if too many dash array entry were created for
166 // the implementation limits of some PDF readers
167 bool appendLineInfo( const LineInfo& rInfo, OStringBuffer& rBuffer ) const;
168 // appends a horizontal waveline with vertical offset (helper for drawWaveLine)
169 void appendWaveLine( sal_Int32 nLength, sal_Int32 nYOffset, sal_Int32 nDelta, OStringBuffer& rBuffer ) const;
171 double getHeight() const { return m_nPageHeight ? m_nPageHeight : PDFWriterImpl::g_nInheritedPageHeight; }
174 friend struct PDFPage;
176 struct BitmapID
178 Size m_aPixelSize;
179 sal_Int32 m_nSize;
180 BitmapChecksum m_nChecksum;
181 BitmapChecksum m_nMaskChecksum;
183 BitmapID() : m_nSize( 0 ), m_nChecksum( 0 ), m_nMaskChecksum( 0 ) {}
185 bool operator==( const BitmapID& rComp ) const
187 return (m_aPixelSize == rComp.m_aPixelSize &&
188 m_nSize == rComp.m_nSize &&
189 m_nChecksum == rComp.m_nChecksum &&
190 m_nMaskChecksum == rComp.m_nMaskChecksum );
194 /// Contains information to emit a reference XObject.
195 struct ReferenceXObjectEmit
197 /// ID of the Form XObject, if any.
198 sal_Int32 m_nFormObject;
199 /// ID of the vector/embedded object, if m_nFormObject is used.
200 sal_Int32 m_nEmbeddedObject;
201 /// ID of the bitmap object, if m_nFormObject is used.
202 sal_Int32 m_nBitmapObject;
203 /// Size of the bitmap replacement, in pixels.
204 Size m_aPixelSize;
205 /// PDF data from the graphic object, if not writing a reference XObject.
206 std::vector<sal_Int8> m_aPDFData;
208 ReferenceXObjectEmit()
209 : m_nFormObject(0),
210 m_nEmbeddedObject(0),
211 m_nBitmapObject(0)
215 /// Returns the ID one should use when referring to this bitmap.
216 sal_Int32 getObject() const;
219 struct BitmapEmit
221 BitmapID m_aID;
222 BitmapEx m_aBitmap;
223 sal_Int32 m_nObject;
224 ReferenceXObjectEmit m_aReferenceXObject;
226 BitmapEmit()
227 : m_nObject(0)
232 struct JPGEmit
234 BitmapID m_aID;
235 std::unique_ptr<SvMemoryStream>
236 m_pStream;
237 Bitmap m_aMask;
238 sal_Int32 m_nObject;
239 bool m_bTrueColor;
240 ReferenceXObjectEmit m_aReferenceXObject;
242 JPGEmit()
243 : m_nObject(0)
244 , m_bTrueColor(false)
249 struct GradientEmit
251 Gradient m_aGradient;
252 Size m_aSize;
253 sal_Int32 m_nObject;
256 // for tilings (drawWallpaper, begin/endPattern)
257 struct TilingEmit
259 sal_Int32 m_nObject;
260 tools::Rectangle m_aRectangle;
261 Size m_aCellSize;
262 SvtGraphicFill::Transform m_aTransform;
263 ResourceDict m_aResources;
264 std::unique_ptr<SvMemoryStream> m_pTilingStream;
266 TilingEmit()
267 : m_nObject( 0 )
271 // for transparency group XObjects
272 struct TransparencyEmit
274 sal_Int32 m_nObject;
275 sal_Int32 m_nExtGStateObject;
276 double m_fAlpha;
277 tools::Rectangle m_aBoundRect;
278 std::unique_ptr<SvMemoryStream> m_pContentStream;
279 std::unique_ptr<SvMemoryStream> m_pSoftMaskStream;
281 TransparencyEmit()
282 : m_nObject( 0 ),
283 m_nExtGStateObject( -1 ),
284 m_fAlpha( 0.0 )
288 // font subsets
289 class GlyphEmit
291 // performance: actually this should probably a vector;
292 std::vector<sal_Ucs> m_CodeUnits;
293 sal_uInt8 m_nSubsetGlyphID;
295 public:
296 GlyphEmit() : m_nSubsetGlyphID(0)
300 void setGlyphId( sal_uInt8 i_nId ) { m_nSubsetGlyphID = i_nId; }
301 sal_uInt8 getGlyphId() const { return m_nSubsetGlyphID; }
303 void addCode( sal_Ucs i_cCode )
305 m_CodeUnits.push_back(i_cCode);
307 sal_Int32 countCodes() const { return m_CodeUnits.size(); }
308 const std::vector<sal_Ucs>& codes() const { return m_CodeUnits; }
309 sal_Ucs getCode( sal_Int32 i_nIndex ) const
311 sal_Ucs nRet = 0;
312 if (static_cast<size_t>(i_nIndex) < m_CodeUnits.size())
313 nRet = m_CodeUnits[i_nIndex];
314 return nRet;
317 typedef std::map< sal_GlyphId, GlyphEmit > FontEmitMapping;
318 struct FontEmit
320 sal_Int32 m_nFontID;
321 FontEmitMapping m_aMapping;
323 explicit FontEmit( sal_Int32 nID ) : m_nFontID( nID ) {}
325 struct Glyph
327 sal_Int32 m_nFontID;
328 sal_uInt8 m_nSubsetGlyphID;
330 typedef std::map< sal_GlyphId, Glyph > FontMapping;
331 struct FontSubset
333 std::vector< FontEmit > m_aSubsets;
334 FontMapping m_aMapping;
336 typedef std::map< const PhysicalFontFace*, FontSubset > FontSubsetData;
337 struct EmbedFont
339 sal_Int32 m_nNormalFontID;
341 EmbedFont() : m_nNormalFontID( 0 ) {}
343 typedef std::map< const PhysicalFontFace*, EmbedFont > FontEmbedData;
345 struct PDFDest
347 sal_Int32 m_nPage;
348 PDFWriter::DestAreaType m_eType;
349 tools::Rectangle m_aRect;
352 //--->i56629
353 struct PDFNamedDest
355 OUString m_aDestName;
356 sal_Int32 m_nPage;
357 PDFWriter::DestAreaType m_eType;
358 tools::Rectangle m_aRect;
361 struct PDFOutlineEntry
363 sal_Int32 m_nObject;
364 sal_Int32 m_nParentObject;
365 sal_Int32 m_nNextObject;
366 sal_Int32 m_nPrevObject;
367 std::vector< sal_Int32 > m_aChildren;
368 OUString m_aTitle;
369 sal_Int32 m_nDestID;
371 PDFOutlineEntry()
372 : m_nObject( 0 ),
373 m_nParentObject( 0 ),
374 m_nNextObject( 0 ),
375 m_nPrevObject( 0 ),
376 m_nDestID( -1 )
380 struct PDFAnnotation
382 sal_Int32 m_nObject;
383 tools::Rectangle m_aRect;
384 sal_Int32 m_nPage;
386 PDFAnnotation()
387 : m_nObject( -1 ),
388 m_nPage( -1 )
392 struct PDFLink : public PDFAnnotation
394 sal_Int32 m_nDest; // set to -1 for URL, to a dest else
395 OUString m_aURL;
396 sal_Int32 m_nStructParent; // struct parent entry
398 PDFLink()
399 : m_nDest( -1 ),
400 m_nStructParent( -1 )
404 /// A PDF Screen annotation.
405 struct PDFScreen : public PDFAnnotation
407 /// Linked video.
408 OUString m_aURL;
409 /// Embedded video.
410 OUString m_aTempFileURL;
411 /// ID of the EmbeddedFile object.
412 sal_Int32 m_nTempFileObject;
414 PDFScreen()
415 : m_nTempFileObject(0)
420 /// A PDF embedded file.
421 struct PDFEmbeddedFile
423 /// ID of the file.
424 sal_Int32 m_nObject;
425 /// Contents of the file.
426 std::shared_ptr<std::vector<sal_Int8>> m_pData;
428 PDFEmbeddedFile()
429 : m_nObject(0)
434 struct PDFNoteEntry : public PDFAnnotation
436 PDFNote m_aContents;
438 PDFNoteEntry()
442 typedef std::unordered_map< OString, SvMemoryStream* > PDFAppearanceStreams;
443 typedef std::unordered_map< OString, PDFAppearanceStreams > PDFAppearanceMap;
445 struct PDFWidget : public PDFAnnotation
447 PDFWriter::WidgetType m_eType;
448 OString m_aName;
449 OUString m_aDescription;
450 OUString m_aText;
451 DrawTextFlags m_nTextStyle;
452 OUString m_aValue;
453 OString m_aDAString;
454 OString m_aDRDict;
455 OString m_aMKDict;
456 OString m_aMKDictCAString; // i12626, added to be able to encrypt the /CA text string
457 // since the object number is not known at the moment
458 // of filling m_aMKDict, the string will be encrypted when emitted.
459 // the /CA string MUST BE the last added to m_aMKDict
460 // see code for details
461 sal_Int32 m_nFlags;
462 sal_Int32 m_nParent; // if not 0, parent's object number
463 std::vector<sal_Int32> m_aKids; // widget children, contains object numbers
464 std::vector<sal_Int32> m_aKidsIndex; // widget children, contains index to m_aWidgets
465 OUString m_aOnValue;
466 sal_Int32 m_nTabOrder; // lowest number gets first in tab order
467 sal_Int32 m_nRadioGroup;
468 sal_Int32 m_nMaxLen;
469 bool m_bSubmit;
470 bool m_bSubmitGet;
471 sal_Int32 m_nDest;
472 std::vector<OUString> m_aListEntries;
473 std::vector<sal_Int32> m_aSelectedEntries;
474 PDFAppearanceMap m_aAppearances;
475 PDFWidget()
476 : m_eType( PDFWriter::PushButton ),
477 m_nTextStyle( DrawTextFlags::NONE ),
478 m_nFlags( 0 ),
479 m_nParent( 0 ),
480 m_nTabOrder( 0 ),
481 m_nRadioGroup( -1 ),
482 m_nMaxLen( 0 ),
483 m_bSubmit( false ),
484 m_bSubmitGet( false ),
485 m_nDest( -1 )
489 struct PDFStructureAttribute
491 PDFWriter::StructAttributeValue eValue;
492 sal_Int32 nValue;
494 PDFStructureAttribute()
495 : eValue( PDFWriter::Invalid ),
496 nValue( 0 )
499 explicit PDFStructureAttribute( PDFWriter::StructAttributeValue eVal )
500 : eValue( eVal ),
501 nValue( 0 )
504 explicit PDFStructureAttribute( sal_Int32 nVal )
505 : eValue( PDFWriter::Invalid ),
506 nValue( nVal )
510 struct PDFStructureElementKid // for Kids entries
512 sal_Int32 const nObject; // an object number if nMCID is -1,
513 // else the page object relevant to MCID
514 sal_Int32 const nMCID; // an MCID if >= 0
516 explicit PDFStructureElementKid( sal_Int32 nObj ) : nObject( nObj ), nMCID( -1 ) {}
517 PDFStructureElementKid( sal_Int32 MCID, sal_Int32 nPage ) : nObject( nPage ), nMCID( MCID ) {}
520 struct PDFStructureElement
522 sal_Int32 m_nObject;
523 PDFWriter::StructElement m_eType;
524 OString m_aAlias;
525 sal_Int32 m_nOwnElement; // index into structure vector
526 sal_Int32 m_nParentElement; // index into structure vector
527 sal_Int32 m_nFirstPageObject;
528 bool m_bOpenMCSeq;
529 std::list< sal_Int32 > m_aChildren; // indexes into structure vector
530 std::list< PDFStructureElementKid > m_aKids;
531 std::map<PDFWriter::StructAttribute, PDFStructureAttribute >
532 m_aAttributes;
533 tools::Rectangle m_aBBox;
534 OUString m_aActualText;
535 OUString m_aAltText;
536 css::lang::Locale m_aLocale;
538 // m_aContents contains the element's marked content sequence
539 // as pairs of (page nr, MCID)
541 PDFStructureElement()
542 : m_nObject( 0 ),
543 m_eType( PDFWriter::NonStructElement ),
544 m_nOwnElement( -1 ),
545 m_nParentElement( -1 ),
546 m_nFirstPageObject( 0 ),
547 m_bOpenMCSeq( false )
553 struct PDFAddStream
555 OUString m_aMimeType;
556 PDFOutputStream* m_pStream;
557 sal_Int32 m_nStreamObject;
558 bool m_bCompress;
560 PDFAddStream() : m_pStream( nullptr ), m_nStreamObject( 0 ), m_bCompress( true ) {}
563 // helper structure for drawLayout and friends
564 struct PDFGlyph
566 Point const m_aPos;
567 const GlyphItem* m_pGlyph;
568 sal_Int32 const m_nNativeWidth;
569 sal_Int32 const m_nMappedFontId;
570 sal_uInt8 const m_nMappedGlyphId;
571 int const m_nCharPos;
573 PDFGlyph( const Point& rPos,
574 const GlyphItem* pGlyph,
575 sal_Int32 nNativeWidth,
576 sal_Int32 nFontId,
577 sal_uInt8 nMappedGlyphId,
578 int nCharPos )
579 : m_aPos( rPos ), m_pGlyph(pGlyph), m_nNativeWidth( nNativeWidth ),
580 m_nMappedFontId( nFontId ), m_nMappedGlyphId( nMappedGlyphId ),
581 m_nCharPos(nCharPos)
585 static const sal_Char* getStructureTag( PDFWriter::StructElement );
586 static const sal_Char* getAttributeTag( PDFWriter::StructAttribute eAtr );
587 static const sal_Char* getAttributeValueTag( PDFWriter::StructAttributeValue eVal );
589 // returns true if compression was done
590 // else false
591 static bool compressStream( SvMemoryStream* );
593 static void convertLineInfoToExtLineInfo( const LineInfo& rIn, PDFWriter::ExtLineInfo& rOut );
595 protected:
596 void ImplClearFontData(bool bNewFontLists) override;
597 void ImplRefreshFontData(bool bNewFontLists) override;
598 vcl::Region ClipToDeviceBounds(vcl::Region aRegion) const override;
599 void DrawHatchLine_DrawLine(const Point& rStartPoint, const Point& rEndPoint) override;
601 private:
602 MapMode m_aMapMode; // PDFWriterImpl scaled units
603 std::vector< PDFPage > m_aPages;
604 /* maps object numbers to file offsets (needed for xref) */
605 std::vector< sal_uInt64 > m_aObjects;
606 /* contains Bitmaps until they are written to the
607 * file stream as XObjects*/
608 std::list< BitmapEmit > m_aBitmaps;
609 /* contains JPG streams until written to file */
610 std::vector<JPGEmit> m_aJPGs;
611 /*--->i56629 contains all named destinations ever set during the PDF creation,
612 destination id is always the destination's position in this vector
614 std::vector<PDFNamedDest> m_aNamedDests;
615 /* contains all dests ever set during the PDF creation,
616 dest id is always the dest's position in this vector
618 std::vector<PDFDest> m_aDests;
619 /** contains destinations accessible via a public Id, instead of being linked to by an ordinary link
621 ::std::map< sal_Int32, sal_Int32 > m_aDestinationIdTranslation;
622 /* contains all links ever set during PDF creation,
623 link id is always the link's position in this vector
625 std::vector<PDFLink> m_aLinks;
626 /// Contains all screen annotations.
627 std::vector<PDFScreen> m_aScreens;
628 /// Contains embedded files.
629 std::vector<PDFEmbeddedFile> m_aEmbeddedFiles;
630 /* makes correctly encoded for export to PDF URLS
632 css::uno::Reference< css::util::XURLTransformer > m_xTrans;
633 /* maps arbitrary link ids for structure attributes to real link ids
634 (for setLinkPropertyId)
636 std::map<sal_Int32, sal_Int32> m_aLinkPropertyMap;
637 /* contains all outline items,
638 object 0 is the outline root
640 std::vector<PDFOutlineEntry> m_aOutline;
641 /* contains all notes set during PDF creation
643 std::vector<PDFNoteEntry> m_aNotes;
644 /* the root of the structure tree
646 std::vector<PDFStructureElement> m_aStructure;
647 /* current object in the structure hierarchy
649 sal_Int32 m_nCurrentStructElement;
650 /* structure parent tree */
651 std::vector< OString > m_aStructParentTree;
652 /* emit structure marks currently (aka. NonStructElement or not)
654 bool m_bEmitStructure;
655 /* role map of struct tree root */
656 std::unordered_map< OString, OString >
657 m_aRoleMap;
659 /* contains all widgets used in the PDF
661 std::vector<PDFWidget> m_aWidgets;
662 /* maps radio group id to index of radio group control in m_aWidgets */
663 std::map< sal_Int32, sal_Int32 > m_aRadioGroupWidgets;
664 /* unordered_map for field names, used to ensure unique field names */
665 std::unordered_map< OString, sal_Int32 > m_aFieldNameMap;
667 /* contains Bitmaps for gradient functions until they are written
668 * to the file stream */
669 std::list< GradientEmit > m_aGradients;
670 /* contains bitmap tiling patterns */
671 std::vector< TilingEmit > m_aTilings;
672 std::list< TransparencyEmit > m_aTransparentObjects;
673 /* contains all font subsets in use */
674 FontSubsetData m_aSubsets;
675 FontEmbedData m_aSystemFonts;
676 sal_Int32 m_nNextFID;
677 PDFFontCache m_aFontCache;
679 static constexpr sal_Int32 g_nInheritedPageWidth = 595; // default A4 in inch/72
680 static constexpr sal_Int32 g_nInheritedPageHeight = 842; // default A4 in inch/72
681 sal_Int32 m_nCurrentPage;
683 sal_Int32 m_nCatalogObject;
684 // object number of the main signature dictionary
685 sal_Int32 m_nSignatureObject;
686 sal_Int64 m_nSignatureContentOffset;
687 sal_Int64 m_nSignatureLastByteRangeNoOffset;
688 sal_Int32 m_nResourceDict;
689 ResourceDict m_aGlobalResourceDict;
690 sal_Int32 m_nFontDictObject;
691 std::map< sal_Int32, sal_Int32 > m_aBuildinFontToObjectMap;
693 PDFWriter::PDFWriterContext m_aContext;
694 osl::File m_aFile;
695 bool m_bOpen;
697 /* output redirection; e.g. to accumulate content streams for
698 XObjects
700 struct StreamRedirect
702 SvStream* m_pStream;
703 MapMode m_aMapMode;
704 tools::Rectangle m_aTargetRect;
705 ResourceDict m_aResourceDict;
707 std::list< StreamRedirect > m_aOutputStreams;
709 // graphics state
710 struct GraphicsState
712 vcl::Font m_aFont;
713 MapMode m_aMapMode;
714 Color m_aLineColor;
715 Color m_aFillColor;
716 Color m_aTextLineColor;
717 Color m_aOverlineColor;
718 basegfx::B2DPolyPolygon m_aClipRegion;
719 bool m_bClipRegion;
720 ComplexTextLayoutFlags m_nLayoutMode;
721 LanguageType m_aDigitLanguage;
722 PushFlags m_nFlags;
723 GraphicsStateUpdateFlags m_nUpdateFlags;
725 GraphicsState() :
726 m_aLineColor( COL_TRANSPARENT ),
727 m_aFillColor( COL_TRANSPARENT ),
728 m_aTextLineColor( COL_TRANSPARENT ),
729 m_aOverlineColor( COL_TRANSPARENT ),
730 m_bClipRegion( false ),
731 m_nLayoutMode( ComplexTextLayoutFlags::Default ),
732 m_aDigitLanguage( 0 ),
733 m_nFlags( PushFlags::ALL ),
734 m_nUpdateFlags( GraphicsStateUpdateFlags::All )
737 std::list< GraphicsState > m_aGraphicsStack;
738 GraphicsState m_aCurrentPDFState;
740 std::unique_ptr<ZCodec> m_pCodec;
741 std::unique_ptr<SvMemoryStream> m_pMemStream;
743 std::vector< PDFAddStream > m_aAdditionalStreams;
744 std::set< PDFWriter::ErrorCode > m_aErrors;
746 ::comphelper::Hash m_DocDigest;
749 variables for PDF security
750 i12626
752 /* used to cipher the stream data and for password management */
753 rtlCipher m_aCipher;
754 /* pad string used for password in Standard security handler */
755 static const sal_uInt8 s_nPadString[ENCRYPTED_PWD_SIZE];
757 /* the encryption key, formed with the user password according to algorithm 3.2, maximum length is 16 bytes + 3 + 2
758 for 128 bit security */
759 sal_Int32 m_nKeyLength; // key length, 16 or 5
760 sal_Int32 m_nRC4KeyLength; // key length, 16 or 10, to be input to the algorithm 3.1
762 /* set to true if the following stream must be encrypted, used inside writeBuffer() */
763 bool m_bEncryptThisStream;
765 /* the numerical value of the access permissions, according to PDF spec, must be signed */
766 sal_Int32 m_nAccessPermissions;
767 /* string to hold the PDF creation date */
768 OString m_aCreationDateString;
769 /* string to hold the PDF creation date, for PDF/A metadata */
770 OString m_aCreationMetaDateString;
771 /* the buffer where the data are encrypted, dynamically allocated */
772 std::vector<sal_uInt8> m_vEncryptionBuffer;
774 /* this function implements part of the PDF spec algorithm 3.1 in encryption, the rest (the actual encryption) is in PDFWriterImpl::writeBuffer */
775 void checkAndEnableStreamEncryption( sal_Int32 nObject );
777 void disableStreamEncryption() { m_bEncryptThisStream = false; };
779 /* */
780 void enableStringEncryption( sal_Int32 nObject );
782 // test if the encryption is active, if yes than encrypt the unicode string and add to the OStringBuffer parameter
783 void appendUnicodeTextStringEncrypt( const OUString& rInString, const sal_Int32 nInObjectNumber, OStringBuffer& rOutBuffer );
785 void appendLiteralStringEncrypt( const OUString& rInString, const sal_Int32 nInObjectNumber, OStringBuffer& rOutBuffer, rtl_TextEncoding nEnc = RTL_TEXTENCODING_ASCII_US );
786 void appendLiteralStringEncrypt( const OString& rInString, const sal_Int32 nInObjectNumber, OStringBuffer& rOutBuffer );
787 void appendLiteralStringEncrypt( OStringBuffer const & rInString, const sal_Int32 nInObjectNumber, OStringBuffer& rOutBuffer );
789 /* creates fonts and subsets that will be emitted later */
790 void registerGlyph(const GlyphItem* pGlyph, const PhysicalFontFace* pFont, const std::vector<sal_Ucs>& rCodeUnits, sal_uInt8& nMappedGlyph, sal_Int32& nMappedFontObject);
792 /* emits a text object according to the passed layout */
793 /* TODO: remove rText as soon as SalLayout will change so that rText is not necessary anymore */
794 void drawVerticalGlyphs( const std::vector<PDFGlyph>& rGlyphs, OStringBuffer& rLine, const Point& rAlignOffset, const Matrix3& rRotScale, double fAngle, double fXScale, double fSkew, sal_Int32 nFontHeight );
795 void drawHorizontalGlyphs( const std::vector<PDFGlyph>& rGlyphs, OStringBuffer& rLine, const Point& rAlignOffset, bool bFirst, double fAngle, double fXScale, double fSkew, sal_Int32 nFontHeight, sal_Int32 nPixelFontHeight );
796 void drawLayout( SalLayout& rLayout, const OUString& rText, bool bTextLines );
797 void drawRelief( SalLayout& rLayout, const OUString& rText, bool bTextLines );
798 void drawShadow( SalLayout& rLayout, const OUString& rText, bool bTextLines );
800 enum Mode { DEFAULT, NOWRITE };
802 /* writes differences between graphics stack and current real PDF
803 * state to the file
805 void updateGraphicsState(Mode mode = DEFAULT);
807 /* writes a transparency group object */
808 void writeTransparentObject( TransparencyEmit& rObject );
810 /* writes an XObject of type image, may create
811 a second for the mask
813 bool writeBitmapObject( BitmapEmit& rObject, bool bMask = false );
815 void writeJPG( JPGEmit& rEmit );
816 /// Writes the form XObject proxy for the image.
817 void writeReferenceXObject(ReferenceXObjectEmit& rEmit);
818 /// Copies resources of a given kind from an external page to the output,
819 /// returning what has to be included in the new resource dictionary.
820 OString copyExternalResources(filter::PDFObjectElement& rPage, const OString& rKind, std::map<sal_Int32, sal_Int32>& rCopiedResources);
821 /// Copies a single resource from an external document, returns the new
822 /// object ID in our document.
823 sal_Int32 copyExternalResource(SvMemoryStream& rDocBuffer, filter::PDFObjectElement& rObject, std::map<sal_Int32, sal_Int32>& rCopiedResources);
825 /* tries to find the bitmap by its id and returns its emit data if exists,
826 else creates a new emit data block */
827 const BitmapEmit& createBitmapEmit( const BitmapEx& rBitmapEx, const Graphic& rGraphic );
829 /* writes the Do operation inside the content stream */
830 void drawBitmap( const Point& rDestPt, const Size& rDestSize, const BitmapEmit& rBitmap, const Color& rFillColor );
831 /* write the function object for a Gradient */
832 bool writeGradientFunction( GradientEmit const & rObject );
833 /* creates a GradientEmit and returns its object number */
834 sal_Int32 createGradient( const Gradient& rGradient, const Size& rSize );
836 /* writes all tilings */
837 bool emitTilings();
838 /* writes all gradient patterns */
839 bool emitGradients();
840 /* writes a builtin font object and returns its objectid (or 0 in case of failure ) */
841 sal_Int32 emitBuildinFont( const pdf::BuildinFontFace*, sal_Int32 nObject );
842 /* writes a type1 system font object and returns its mapping from font ids to object ids (or 0 in case of failure ) */
843 std::map< sal_Int32, sal_Int32 > emitSystemFont( const PhysicalFontFace*, EmbedFont const & );
844 /* writes a font descriptor and returns its object id (or 0) */
845 sal_Int32 emitFontDescriptor( const PhysicalFontFace*, FontSubsetInfo const &, sal_Int32 nSubsetID, sal_Int32 nStream );
846 /* writes a ToUnicode cmap, returns the corresponding stream object */
847 sal_Int32 createToUnicodeCMap( sal_uInt8 const * pEncoding, const sal_Ucs* pCodeUnits, const sal_Int32* pCodeUnitsPerGlyph,
848 const sal_Int32* pEncToUnicodeIndex, int nGlyphs );
850 /* get resource dict object number */
851 sal_Int32 getResourceDictObj()
853 if( m_nResourceDict <= 0 )
854 m_nResourceDict = createObject();
855 return m_nResourceDict;
857 /* get the font dict object */
858 sal_Int32 getFontDictObject()
860 if( m_nFontDictObject <= 0 )
861 m_nFontDictObject = createObject();
862 return m_nFontDictObject;
864 /* push resource into current (redirected) resource dict */
865 void pushResource( ResourceKind eKind, const OString& rResource, sal_Int32 nObject );
867 void appendBuildinFontsToDict( OStringBuffer& rDict ) const;
868 /* writes the font dictionary and emits all font objects
869 * returns object id of font directory (or 0 on error)
871 bool emitFonts();
872 /* writes the Resource dictionary;
873 * returns dict object id (or 0 on error)
875 sal_Int32 emitResources();
876 // appends a dest
877 bool appendDest( sal_Int32 nDestID, OStringBuffer& rBuffer );
878 // write all links
879 bool emitLinkAnnotations();
880 /// Write all screen annotations.
881 bool emitScreenAnnotations();
882 // write all notes
883 bool emitNoteAnnotations();
884 // write the appearance streams of a widget
885 bool emitAppearances( PDFWidget& rWidget, OStringBuffer& rAnnotDict );
886 // clean up radio button "On" values
887 void ensureUniqueRadioOnValues();
888 // write all widgets
889 bool emitWidgetAnnotations();
890 // writes all annotation objects
891 bool emitAnnotations();
892 /// Writes embedded files.
893 bool emitEmbeddedFiles();
894 //write the named destination stuff
895 sal_Int32 emitNamedDestinations();//i56629
896 // writes outline dict and tree
897 sal_Int32 emitOutline();
898 // puts the attribute objects of a structure element into the returned string,
899 // helper for emitStructure
900 OString emitStructureAttributes( PDFStructureElement& rEle );
901 //--->i94258
902 // the maximum array elements allowed for PDF array object
903 static const sal_uInt32 ncMaxPDFArraySize = 8191;
904 //check if internal dummy container are needed in the structure elements
905 void addInternalStructureContainer( PDFStructureElement& rEle );
906 //<---i94258
907 // writes document structure
908 sal_Int32 emitStructure( PDFStructureElement& rEle );
909 // writes structure parent tree
910 sal_Int32 emitStructParentTree( sal_Int32 nTreeObject );
911 // writes page tree and catalog
912 bool emitCatalog();
913 // writes signature dictionary object
914 bool emitSignature();
915 // creates a PKCS7 object using the ByteRange and overwrite /Contents
916 // of the signature dictionary
917 bool finalizeSignature();
918 // writes xref and trailer
919 bool emitTrailer();
920 // emit additional streams collected; also create there object numbers
921 bool emitAdditionalStreams();
922 // emits info dict (if applicable)
923 sal_Int32 emitInfoDict( );
925 // acrobat reader 5 and 6 use the order of the annotations
926 // as their tab order; since PDF1.5 one can make the
927 // tab order explicit by using the structure tree
928 void sortWidgets();
930 // updates the count numbers of outline items
931 sal_Int32 updateOutlineItemCount( std::vector< sal_Int32 >& rCounts,
932 sal_Int32 nItemLevel,
933 sal_Int32 nCurrentItemId );
934 // default appearances for widgets
935 sal_Int32 findRadioGroupWidget( const PDFWriter::RadioButtonWidget& rRadio );
936 Font replaceFont( const Font& rControlFont, const Font& rAppSetFont );
937 sal_Int32 getBestBuildinFont( const Font& rFont );
938 sal_Int32 getSystemFont( const Font& i_rFont );
940 // used for edit and listbox
941 Font drawFieldBorder( PDFWidget&, const PDFWriter::AnyWidget&, const StyleSettings& );
943 void createDefaultPushButtonAppearance( PDFWidget&, const PDFWriter::PushButtonWidget& rWidget );
944 void createDefaultCheckBoxAppearance( PDFWidget&, const PDFWriter::CheckBoxWidget& rWidget );
945 void createDefaultRadioButtonAppearance( PDFWidget&, const PDFWriter::RadioButtonWidget& rWidget );
946 void createDefaultEditAppearance( PDFWidget&, const PDFWriter::EditWidget& rWidget );
947 void createDefaultListBoxAppearance( PDFWidget&, const PDFWriter::ListBoxWidget& rWidget );
949 /* ensure proper escapement and uniqueness of field names */
950 void createWidgetFieldName( sal_Int32 i_nWidgetsIndex, const PDFWriter::AnyWidget& i_rInWidget );
951 /* adds an entry to m_aObjects and returns its index+1,
952 * sets the offset to ~0
954 sal_Int32 createObject();
955 /* sets the offset of object n to the current position of output file+1
957 bool updateObject( sal_Int32 n );
959 bool writeBuffer( const void* pBuffer, sal_uInt64 nBytes );
960 void beginCompression();
961 void endCompression();
962 void beginRedirect( SvStream* pStream, const tools::Rectangle& );
963 SvStream* endRedirect();
965 void endPage();
967 void beginStructureElementMCSeq();
968 void endStructureElementMCSeq();
969 /** checks whether a non struct element lies in the ancestor hierarchy
970 of the current structure element
972 @returns
973 true if no NonStructElement was found in ancestor path and tagged
974 PDF output is enabled
975 false else
977 bool checkEmitStructure();
979 /* draws an emphasis mark */
980 void drawEmphasisMark( long nX, long nY, const tools::PolyPolygon& rPolyPoly, bool bPolyLine, const tools::Rectangle& rRect1, const tools::Rectangle& rRect2 );
982 /* true if PDF/A-1a or PDF/A-1b is output */
983 bool m_bIsPDF_A1;
984 /* true if PDF/A-2a is output */
985 bool m_bIsPDF_A2;
986 PDFWriter& m_rOuterFace;
989 i12626
990 methods for PDF security
992 pad a password according algorithm 3.2, step 1 */
993 static void padPassword( const OUString& i_rPassword, sal_uInt8* o_pPaddedPW );
994 /* algorithm 3.2: compute an encryption key */
995 static bool computeEncryptionKey( EncHashTransporter*,
996 vcl::PDFWriter::PDFEncryptionProperties& io_rProperties,
997 sal_Int32 i_nAccessPermissions
999 /* algorithm 3.3: computing the encryption dictionary'ss owner password value ( /O ) */
1000 static bool computeODictionaryValue( const sal_uInt8* i_pPaddedOwnerPassword, const sal_uInt8* i_pPaddedUserPassword,
1001 std::vector< sal_uInt8 >& io_rOValue,
1002 sal_Int32 i_nKeyLength
1004 /* algorithm 3.4 or 3.5: computing the encryption dictionary's user password value ( /U ) revision 2 or 3 of the standard security handler */
1005 static bool computeUDictionaryValue( EncHashTransporter* i_pTransporter,
1006 vcl::PDFWriter::PDFEncryptionProperties& io_rProperties,
1007 sal_Int32 i_nKeyLength,
1008 sal_Int32 i_nAccessPermissions
1011 static void computeDocumentIdentifier( std::vector< sal_uInt8 >& o_rIdentifier,
1012 const vcl::PDFWriter::PDFDocInfo& i_rDocInfo,
1013 const OString& i_rCString1,
1014 OString& o_rCString2
1016 static sal_Int32 computeAccessPermissions( const vcl::PDFWriter::PDFEncryptionProperties& i_rProperties,
1017 sal_Int32& o_rKeyLength, sal_Int32& o_rRC4KeyLength );
1018 void setupDocInfo();
1019 bool prepareEncryption( const css::uno::Reference< css::beans::XMaterialHolder >& );
1021 // helper for playMetafile
1022 void implWriteGradient( const tools::PolyPolygon& rPolyPoly, const Gradient& rGradient,
1023 VirtualDevice* pDummyVDev, const vcl::PDFWriter::PlayMetafileContext& );
1024 void implWriteBitmapEx( const Point& rPoint, const Size& rSize, const BitmapEx& rBitmapEx, const Graphic& i_pGraphic,
1025 VirtualDevice const * pDummyVDev, const vcl::PDFWriter::PlayMetafileContext& );
1027 // helpers for CCITT 1bit bitmap stream
1028 void putG4Bits( sal_uInt32 i_nLength, sal_uInt32 i_nCode, BitStreamState& io_rState );
1029 void putG4Span( long i_nSpan, bool i_bWhitePixel, BitStreamState& io_rState );
1030 void writeG4Stream( BitmapReadAccess const * i_pBitmap );
1032 // color helper functions
1033 void appendStrokingColor( const Color& rColor, OStringBuffer& rBuffer );
1034 void appendNonStrokingColor( const Color& rColor, OStringBuffer& rBuffer );
1035 public:
1036 PDFWriterImpl( const PDFWriter::PDFWriterContext& rContext, const css::uno::Reference< css::beans::XMaterialHolder >&, PDFWriter& );
1037 ~PDFWriterImpl() override;
1038 void dispose() override;
1040 static css::uno::Reference< css::beans::XMaterialHolder >
1041 initEncryption( const OUString& i_rOwnerPassword,
1042 const OUString& i_rUserPassword );
1044 /* document structure */
1045 void newPage( double nPageWidth , double nPageHeight, PDFWriter::Orientation eOrientation );
1046 bool emit();
1047 const std::set< PDFWriter::ErrorCode > & getErrors() const { return m_aErrors;}
1048 void insertError( PDFWriter::ErrorCode eErr ) { m_aErrors.insert( eErr ); }
1049 void playMetafile( const GDIMetaFile&, vcl::PDFExtOutDevData*, const vcl::PDFWriter::PlayMetafileContext&, VirtualDevice* pDummyDev = nullptr );
1051 Size getCurPageSize() const
1053 Size aSize;
1054 if( m_nCurrentPage >= 0 && m_nCurrentPage < static_cast<sal_Int32>(m_aPages.size()) )
1055 aSize = Size( m_aPages[ m_nCurrentPage ].m_nPageWidth, m_aPages[ m_nCurrentPage ].m_nPageHeight );
1056 return aSize;
1059 PDFWriter::PDFVersion getVersion() const { return m_aContext.Version; }
1061 void setDocumentLocale( const css::lang::Locale& rLoc )
1062 { m_aContext.DocumentLocale = rLoc; }
1064 /* graphics state */
1065 void push( PushFlags nFlags );
1066 void pop();
1068 void setFont( const Font& rFont );
1070 void setMapMode( const MapMode& rMapMode );
1072 const MapMode& getMapMode() { return m_aGraphicsStack.front().m_aMapMode; }
1074 void setLineColor( const Color& rColor )
1076 m_aGraphicsStack.front().m_aLineColor = ImplIsColorTransparent(rColor) ? COL_TRANSPARENT : rColor;
1077 m_aGraphicsStack.front().m_nUpdateFlags |= GraphicsStateUpdateFlags::LineColor;
1080 void setFillColor( const Color& rColor )
1082 m_aGraphicsStack.front().m_aFillColor = ImplIsColorTransparent(rColor) ? COL_TRANSPARENT : rColor;
1083 m_aGraphicsStack.front().m_nUpdateFlags |= GraphicsStateUpdateFlags::FillColor;
1086 void setTextLineColor()
1088 m_aGraphicsStack.front().m_aTextLineColor = COL_TRANSPARENT;
1091 void setTextLineColor( const Color& rColor )
1093 m_aGraphicsStack.front().m_aTextLineColor = rColor;
1096 void setOverlineColor()
1098 m_aGraphicsStack.front().m_aOverlineColor = COL_TRANSPARENT;
1101 void setOverlineColor( const Color& rColor )
1103 m_aGraphicsStack.front().m_aOverlineColor = rColor;
1106 void setTextFillColor( const Color& rColor )
1108 m_aGraphicsStack.front().m_aFont.SetFillColor( rColor );
1109 m_aGraphicsStack.front().m_aFont.SetTransparent( ImplIsColorTransparent( rColor ) );
1110 m_aGraphicsStack.front().m_nUpdateFlags |= GraphicsStateUpdateFlags::Font;
1112 void setTextFillColor()
1114 m_aGraphicsStack.front().m_aFont.SetFillColor( COL_TRANSPARENT );
1115 m_aGraphicsStack.front().m_aFont.SetTransparent( true );
1116 m_aGraphicsStack.front().m_nUpdateFlags |= GraphicsStateUpdateFlags::Font;
1118 void setTextColor( const Color& rColor )
1120 m_aGraphicsStack.front().m_aFont.SetColor( rColor );
1121 m_aGraphicsStack.front().m_nUpdateFlags |= GraphicsStateUpdateFlags::Font;
1124 void clearClipRegion()
1126 m_aGraphicsStack.front().m_aClipRegion.clear();
1127 m_aGraphicsStack.front().m_bClipRegion = false;
1128 m_aGraphicsStack.front().m_nUpdateFlags |= GraphicsStateUpdateFlags::ClipRegion;
1131 void setClipRegion( const basegfx::B2DPolyPolygon& rRegion );
1133 void moveClipRegion( sal_Int32 nX, sal_Int32 nY );
1135 void intersectClipRegion( const tools::Rectangle& rRect );
1137 void intersectClipRegion( const basegfx::B2DPolyPolygon& rRegion );
1139 void setLayoutMode( ComplexTextLayoutFlags nLayoutMode )
1141 m_aGraphicsStack.front().m_nLayoutMode = nLayoutMode;
1142 m_aGraphicsStack.front().m_nUpdateFlags |= GraphicsStateUpdateFlags::LayoutMode;
1145 void setDigitLanguage( LanguageType eLang )
1147 m_aGraphicsStack.front().m_aDigitLanguage = eLang;
1148 m_aGraphicsStack.front().m_nUpdateFlags |= GraphicsStateUpdateFlags::DigitLanguage;
1151 void setTextAlign( TextAlign eAlign )
1153 m_aGraphicsStack.front().m_aFont.SetAlignment( eAlign );
1154 m_aGraphicsStack.front().m_nUpdateFlags |= GraphicsStateUpdateFlags::Font;
1157 /* actual drawing functions */
1158 void drawText( const Point& rPos, const OUString& rText, sal_Int32 nIndex, sal_Int32 nLen, bool bTextLines = true );
1159 void drawTextArray( const Point& rPos, const OUString& rText, const long* pDXArray, sal_Int32 nIndex, sal_Int32 nLen );
1160 void drawStretchText( const Point& rPos, sal_uLong nWidth, const OUString& rText,
1161 sal_Int32 nIndex, sal_Int32 nLen );
1162 void drawText( const tools::Rectangle& rRect, const OUString& rOrigStr, DrawTextFlags nStyle );
1163 void drawTextLine( const Point& rPos, long nWidth, FontStrikeout eStrikeout, FontLineStyle eUnderline, FontLineStyle eOverline, bool bUnderlineAbove );
1164 void drawWaveTextLine( OStringBuffer& aLine, long nWidth, FontLineStyle eTextLine, Color aColor, bool bIsAbove );
1165 void drawStraightTextLine( OStringBuffer& aLine, long nWidth, FontLineStyle eTextLine, Color aColor, bool bIsAbove );
1166 void drawStrikeoutLine( OStringBuffer& aLine, long nWidth, FontStrikeout eStrikeout, Color aColor );
1167 void drawStrikeoutChar( const Point& rPos, long nWidth, FontStrikeout eStrikeout );
1169 void drawLine( const Point& rStart, const Point& rStop );
1170 void drawLine( const Point& rStart, const Point& rStop, const LineInfo& rInfo );
1171 void drawPolygon( const tools::Polygon& rPoly );
1172 void drawPolyPolygon( const tools::PolyPolygon& rPolyPoly );
1173 void drawPolyLine( const tools::Polygon& rPoly );
1174 void drawPolyLine( const tools::Polygon& rPoly, const LineInfo& rInfo );
1175 void drawPolyLine( const tools::Polygon& rPoly, const PDFWriter::ExtLineInfo& rInfo );
1177 void drawPixel( const Point& rPt, const Color& rColor );
1179 void drawRectangle( const tools::Rectangle& rRect );
1180 void drawRectangle( const tools::Rectangle& rRect, sal_uInt32 nHorzRound, sal_uInt32 nVertRound );
1181 void drawEllipse( const tools::Rectangle& rRect );
1182 void drawArc( const tools::Rectangle& rRect, const Point& rStart, const Point& rStop, bool bWithPie, bool bWidthChord );
1184 void drawBitmap( const Point& rDestPoint, const Size& rDestSize, const Bitmap& rBitmap, const Graphic& rGraphic );
1185 void drawBitmap( const Point& rDestPoint, const Size& rDestSize, const BitmapEx& rBitmap );
1186 void drawJPGBitmap( SvStream& rDCTData, bool bIsTrueColor, const Size& rSizePixel, const tools::Rectangle& rTargetArea, const Bitmap& rMask, const Graphic& rGraphic );
1187 /// Stores the original PDF data from rGraphic as an embedded file.
1188 void createEmbeddedFile(const Graphic& rGraphic, ReferenceXObjectEmit& rEmit, sal_Int32 nBitmapObject);
1190 void drawGradient( const tools::Rectangle& rRect, const Gradient& rGradient );
1191 void drawHatch( const tools::PolyPolygon& rPolyPoly, const Hatch& rHatch );
1192 void drawWallpaper( const tools::Rectangle& rRect, const Wallpaper& rWall );
1193 void drawTransparent( const tools::PolyPolygon& rPolyPoly, sal_uInt32 nTransparentPercent );
1194 void beginTransparencyGroup();
1195 void endTransparencyGroup( const tools::Rectangle& rBoundingBox, sal_uInt32 nTransparentPercent );
1197 void emitComment( const char* pComment );
1199 //--->i56629 named destinations
1200 sal_Int32 createNamedDest( const OUString& sDestName, const tools::Rectangle& rRect, sal_Int32 nPageNr, PDFWriter::DestAreaType eType );
1202 //--->i59651
1203 //emits output intent
1204 sal_Int32 emitOutputIntent();
1206 //emits the document metadata
1207 sal_Int32 emitDocumentMetadata();
1209 // links
1210 sal_Int32 createLink( const tools::Rectangle& rRect, sal_Int32 nPageNr );
1211 sal_Int32 createDest( const tools::Rectangle& rRect, sal_Int32 nPageNr, PDFWriter::DestAreaType eType );
1212 sal_Int32 registerDestReference( sal_Int32 nDestId, const tools::Rectangle& rRect, sal_Int32 nPageNr, PDFWriter::DestAreaType eType );
1213 void setLinkDest( sal_Int32 nLinkId, sal_Int32 nDestId );
1214 void setLinkURL( sal_Int32 nLinkId, const OUString& rURL );
1215 void setLinkPropertyId( sal_Int32 nLinkId, sal_Int32 nPropertyId );
1217 // screens
1218 sal_Int32 createScreen(const tools::Rectangle& rRect, sal_Int32 nPageNr);
1219 void setScreenURL(sal_Int32 nScreenId, const OUString& rURL);
1220 void setScreenStream(sal_Int32 nScreenId, const OUString& rURL);
1222 // outline
1223 sal_Int32 createOutlineItem( sal_Int32 nParent, const OUString& rText, sal_Int32 nDestID );
1224 void setOutlineItemParent( sal_Int32 nItem, sal_Int32 nNewParent );
1225 void setOutlineItemText( sal_Int32 nItem, const OUString& rText );
1226 void setOutlineItemDest( sal_Int32 nItem, sal_Int32 nDestID );
1228 // notes
1229 void createNote( const tools::Rectangle& rRect, const PDFNote& rNote, sal_Int32 nPageNr );
1230 // structure elements
1231 sal_Int32 beginStructureElement( PDFWriter::StructElement eType, const OUString& rAlias );
1232 void endStructureElement();
1233 bool setCurrentStructureElement( sal_Int32 nElement );
1234 bool setStructureAttribute( enum PDFWriter::StructAttribute eAttr, enum PDFWriter::StructAttributeValue eVal );
1235 bool setStructureAttributeNumerical( enum PDFWriter::StructAttribute eAttr, sal_Int32 nValue );
1236 void setStructureBoundingBox( const tools::Rectangle& rRect );
1237 void setActualText( const OUString& rText );
1238 void setAlternateText( const OUString& rText );
1240 // transitional effects
1241 void setPageTransition( PDFWriter::PageTransition eType, sal_uInt32 nMilliSec, sal_Int32 nPageNr );
1243 // controls
1244 sal_Int32 createControl( const PDFWriter::AnyWidget& rControl, sal_Int32 nPageNr = -1 );
1246 // additional streams
1247 void addStream( const OUString& rMimeType, PDFOutputStream* pStream );
1249 // helper: eventually begin marked content sequence and
1250 // emit a comment in debug case
1251 void MARK( const char* pString );
1254 } // namespace vcl
1256 #endif //_VCL_PDFEXPORT_HXX
1258 /* vim:set shiftwidth=4 softtabstop=4 expandtab: */