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