1 /**************************************************************
2 *
3 * Licensed to the Apache Software Foundation (ASF) under one
4 * or more contributor license agreements. See the NOTICE file
5 * distributed with this work for additional information
6 * regarding copyright ownership. The ASF licenses this file
7 * to you under the Apache License, Version 2.0 (the
8 * "License"); you may not use this file except in compliance
9 * with the License. You may obtain a copy of the License at
10 *
11 * http://www.apache.org/licenses/LICENSE-2.0
12 *
13 * Unless required by applicable law or agreed to in writing,
14 * software distributed under the License is distributed on an
15 * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
16 * KIND, either express or implied. See the License for the
17 * specific language governing permissions and limitations
18 * under the License.
19 *
20 *************************************************************/
21
22
23
24 // MARKER(update_precomp.py): autogen include statement, do not remove
25 #include "precompiled_vcl.hxx"
26 #include "vcl/pdfextoutdevdata.hxx"
27 #include "vcl/graph.hxx"
28 #include "vcl/outdev.hxx"
29 #include "vcl/gfxlink.hxx"
30 #include "vcl/dllapi.h"
31 #include "basegfx/polygon/b2dpolygon.hxx"
32 #include "basegfx/polygon/b2dpolygontools.hxx"
33
34
35 #include <boost/shared_ptr.hpp>
36 #include <set>
37 #include <map>
38
39 namespace vcl
40 {
41 struct SAL_DLLPRIVATE PDFExtOutDevDataSync
42 {
43 enum Action{ CreateNamedDest,
44 CreateDest,
45 CreateLink,
46 SetLinkDest,
47 SetLinkURL,
48 RegisterDest,
49 CreateOutlineItem,
50 SetOutlineItemParent,
51 SetOutlineItemText,
52 SetOutlineItemDest,
53 CreateNote,
54 SetAutoAdvanceTime,
55 SetPageTransition,
56
57 BeginStructureElement,
58 EndStructureElement,
59 SetCurrentStructureElement,
60 SetStructureAttribute,
61 SetStructureAttributeNumerical,
62 SetStructureBoundingBox,
63 SetActualText,
64 SetAlternateText,
65 CreateControl,
66 BeginGroup,
67 EndGroup,
68 EndGroupGfxLink
69 };
70
71 sal_uInt32 nIdx;
72 Action eAct;
73 };
74
75 struct SAL_DLLPRIVATE PDFLinkDestination
76 {
77 Rectangle mRect;
78 MapMode mMapMode;
79 sal_Int32 mPageNr;
80 PDFWriter::DestAreaType mAreaType;
81 };
82
83 struct SAL_DLLPRIVATE GlobalSyncData
84 {
85 std::deque< PDFExtOutDevDataSync::Action > mActions;
86 std::deque< MapMode > mParaMapModes;
87 std::deque< Rectangle > mParaRects;
88 std::deque< sal_Int32 > mParaInts;
89 std::deque< sal_uInt32 > mParauInts;
90 std::deque< rtl::OUString > mParaOUStrings;
91 std::deque< PDFWriter::DestAreaType > mParaDestAreaTypes;
92 std::deque< PDFNote > mParaPDFNotes;
93 std::deque< PDFWriter::PageTransition > mParaPageTransitions;
94 ::std::map< sal_Int32, PDFLinkDestination > mFutureDestinations;
95
96 sal_Int32 GetMappedId();
97 sal_Int32 GetMappedStructId( sal_Int32 );
98
99 sal_Int32 mCurId;
100 std::vector< sal_Int32 > mParaIds;
101 std::vector< sal_Int32 > mStructIdMap;
102
103 sal_Int32 mCurrentStructElement;
104 std::vector< sal_Int32 > mStructParents;
GlobalSyncDatavcl::GlobalSyncData105 GlobalSyncData() :
106 mCurId ( 0 ),
107 mCurrentStructElement( 0 )
108 {
109 mStructParents.push_back( 0 );
110 mStructIdMap.push_back( 0 );
111 }
112 void PlayGlobalActions( PDFWriter& rWriter );
113 };
114
GetMappedId()115 sal_Int32 GlobalSyncData::GetMappedId()
116 {
117 sal_Int32 nLinkId = mParaInts.front();
118 mParaInts.pop_front();
119
120 /* negative values are intentionally passed as invalid IDs
121 * e.g. to create a new top level outline item
122 */
123 if( nLinkId >= 0 )
124 {
125 if ( (sal_uInt32)nLinkId < mParaIds.size() )
126 nLinkId = mParaIds[ nLinkId ];
127 else
128 nLinkId = -1;
129
130 DBG_ASSERT( nLinkId >= 0, "unmapped id in GlobalSyncData" );
131 }
132
133 return nLinkId;
134 }
135
GetMappedStructId(sal_Int32 nStructId)136 sal_Int32 GlobalSyncData::GetMappedStructId( sal_Int32 nStructId )
137 {
138 if ( (sal_uInt32)nStructId < mStructIdMap.size() )
139 nStructId = mStructIdMap[ nStructId ];
140 else
141 nStructId = -1;
142
143 DBG_ASSERT( nStructId >= 0, "unmapped structure id in GlobalSyncData" );
144
145 return nStructId;
146 }
147
PlayGlobalActions(PDFWriter & rWriter)148 void GlobalSyncData::PlayGlobalActions( PDFWriter& rWriter )
149 {
150 std::deque< PDFExtOutDevDataSync::Action >::iterator aIter( mActions.begin() );
151 std::deque< PDFExtOutDevDataSync::Action >::iterator aEnd( mActions.end() );
152 while( aIter != aEnd )
153 {
154 switch( *aIter )
155 {
156 case PDFExtOutDevDataSync::CreateNamedDest : //i56629
157 {
158 rWriter.Push( PUSH_MAPMODE );
159 rWriter.SetMapMode( mParaMapModes.front() );
160 mParaMapModes.pop_front();
161 mParaIds.push_back( rWriter.CreateNamedDest( mParaOUStrings.front(), mParaRects.front(), mParaInts.front(), mParaDestAreaTypes.front() ) );
162 mParaOUStrings.pop_front();
163 mParaRects.pop_front();
164 mParaInts.pop_front();
165 mParaDestAreaTypes.pop_front();
166 rWriter.Pop();
167 }
168 break;
169 case PDFExtOutDevDataSync::CreateDest :
170 {
171 rWriter.Push( PUSH_MAPMODE );
172 rWriter.SetMapMode( mParaMapModes.front() );
173 mParaMapModes.pop_front();
174 mParaIds.push_back( rWriter.CreateDest( mParaRects.front(), mParaInts.front(), mParaDestAreaTypes.front() ) );
175 mParaRects.pop_front();
176 mParaInts.pop_front();
177 mParaDestAreaTypes.pop_front();
178 rWriter.Pop();
179 }
180 break;
181 case PDFExtOutDevDataSync::CreateLink :
182 {
183 rWriter.Push( PUSH_MAPMODE );
184 rWriter.SetMapMode( mParaMapModes.front() );
185 mParaMapModes.pop_front();
186 mParaIds.push_back( rWriter.CreateLink( mParaRects.front(), mParaInts.front() ) );
187 // resolve LinkAnnotation structural attribute
188 rWriter.SetLinkPropertyID( mParaIds.back(), sal_Int32(mParaIds.size()-1) );
189 mParaRects.pop_front();
190 mParaInts.pop_front();
191 rWriter.Pop();
192 }
193 break;
194 case PDFExtOutDevDataSync::SetLinkDest :
195 {
196 sal_Int32 nLinkId = GetMappedId();
197 sal_Int32 nDestId = GetMappedId();
198 rWriter.SetLinkDest( nLinkId, nDestId );
199 }
200 break;
201 case PDFExtOutDevDataSync::SetLinkURL :
202 {
203 sal_Int32 nLinkId = GetMappedId();
204 rWriter.SetLinkURL( nLinkId, mParaOUStrings.front() );
205 mParaOUStrings.pop_front();
206 }
207 break;
208 case PDFExtOutDevDataSync::RegisterDest :
209 {
210 const sal_Int32 nDestId = mParaInts.front();
211 mParaInts.pop_front();
212 OSL_ENSURE( mFutureDestinations.find( nDestId ) != mFutureDestinations.end(),
213 "GlobalSyncData::PlayGlobalActions: DescribeRegisteredRequest has not been called for that destination!" );
214
215 PDFLinkDestination& rDest = mFutureDestinations[ nDestId ];
216
217 rWriter.Push( PUSH_MAPMODE );
218 rWriter.SetMapMode( rDest.mMapMode );
219 mParaIds.push_back( rWriter.RegisterDestReference( nDestId, rDest.mRect, rDest.mPageNr, rDest.mAreaType ) );
220 rWriter.Pop();
221 }
222 break;
223 case PDFExtOutDevDataSync::CreateOutlineItem :
224 {
225 sal_Int32 nParent = GetMappedId();
226 sal_Int32 nLinkId = GetMappedId();
227 mParaIds.push_back( rWriter.CreateOutlineItem( nParent, mParaOUStrings.front(), nLinkId ) );
228 mParaOUStrings.pop_front();
229 }
230 break;
231 case PDFExtOutDevDataSync::SetOutlineItemParent :
232 {
233 sal_Int32 nItem = GetMappedId();
234 sal_Int32 nNewParent = GetMappedId();
235 rWriter.SetOutlineItemParent( nItem, nNewParent );
236 }
237 break;
238 case PDFExtOutDevDataSync::SetOutlineItemText :
239 {
240 sal_Int32 nItem = GetMappedId();
241 rWriter.SetOutlineItemText( nItem, mParaOUStrings.front() );
242 mParaOUStrings.pop_front();
243 }
244 break;
245 case PDFExtOutDevDataSync::SetOutlineItemDest :
246 {
247 sal_Int32 nItem = GetMappedId();
248 sal_Int32 nDestId = GetMappedId();
249 rWriter.SetOutlineItemDest( nItem, nDestId );
250 }
251 break;
252 case PDFExtOutDevDataSync::CreateNote :
253 {
254 rWriter.Push( PUSH_MAPMODE );
255 rWriter.SetMapMode( mParaMapModes.front() );
256 rWriter.CreateNote( mParaRects.front(), mParaPDFNotes.front(), mParaInts.front() );
257 mParaMapModes.pop_front();
258 mParaRects.pop_front();
259 mParaPDFNotes.pop_front();
260 mParaInts.pop_front();
261 }
262 break;
263 case PDFExtOutDevDataSync::SetAutoAdvanceTime :
264 {
265 rWriter.SetAutoAdvanceTime( mParauInts.front(), mParaInts.front() );
266 mParauInts.pop_front();
267 mParaInts.pop_front();
268 }
269 break;
270 case PDFExtOutDevDataSync::SetPageTransition :
271 {
272 rWriter.SetPageTransition( mParaPageTransitions.front(), mParauInts.front(), mParaInts.front() );
273 mParaPageTransitions.pop_front();
274 mParauInts.pop_front();
275 mParaInts.pop_front();
276 }
277 break;
278 case PDFExtOutDevDataSync::BeginStructureElement:
279 case PDFExtOutDevDataSync::EndStructureElement:
280 case PDFExtOutDevDataSync::SetCurrentStructureElement:
281 case PDFExtOutDevDataSync::SetStructureAttribute:
282 case PDFExtOutDevDataSync::SetStructureAttributeNumerical:
283 case PDFExtOutDevDataSync::SetStructureBoundingBox:
284 case PDFExtOutDevDataSync::SetActualText:
285 case PDFExtOutDevDataSync::SetAlternateText:
286 case PDFExtOutDevDataSync::CreateControl:
287 case PDFExtOutDevDataSync::BeginGroup:
288 case PDFExtOutDevDataSync::EndGroup:
289 case PDFExtOutDevDataSync::EndGroupGfxLink:
290 break;
291 }
292 aIter++;
293 }
294 }
295
296 struct PageSyncData
297 {
298 std::deque< PDFExtOutDevDataSync > mActions;
299 std::deque< Rectangle > mParaRects;
300 std::deque< sal_Int32 > mParaInts;
301 std::deque< rtl::OUString > mParaOUStrings;
302 std::deque< PDFWriter::StructElement > mParaStructElements;
303 std::deque< PDFWriter::StructAttribute > mParaStructAttributes;
304 std::deque< PDFWriter::StructAttributeValue > mParaStructAttributeValues;
305 std::deque< Graphic > mGraphics;
306 std::deque< ::boost::shared_ptr< PDFWriter::AnyWidget > >
307 mControls;
308 GlobalSyncData* mpGlobalData;
309
310 sal_Bool mbGroupIgnoreGDIMtfActions;
311
PageSyncDatavcl::PageSyncData312 PageSyncData( GlobalSyncData* pGlobal ) : mbGroupIgnoreGDIMtfActions ( sal_False ) { mpGlobalData = pGlobal; }
313
314 void PushAction( const OutputDevice& rOutDev, const PDFExtOutDevDataSync::Action eAct );
315 sal_Bool PlaySyncPageAct( PDFWriter& rWriter, sal_uInt32& rCurGDIMtfAction, const PDFExtOutDevData& rOutDevData );
316 };
PushAction(const OutputDevice & rOutDev,const PDFExtOutDevDataSync::Action eAct)317 void PageSyncData::PushAction( const OutputDevice& rOutDev, const PDFExtOutDevDataSync::Action eAct )
318 {
319 GDIMetaFile* pMtf = rOutDev.GetConnectMetaFile();
320 DBG_ASSERT( pMtf, "PageSyncData::PushAction -> no ConnectMetaFile !!!" );
321
322 PDFExtOutDevDataSync aSync;
323 aSync.eAct = eAct;
324 if ( pMtf )
325 aSync.nIdx = pMtf->GetActionCount();
326 else
327 aSync.nIdx = 0x7fffffff; // sync not possible
328 mActions.push_back( aSync );
329 }
PlaySyncPageAct(PDFWriter & rWriter,sal_uInt32 & rCurGDIMtfAction,const PDFExtOutDevData & rOutDevData)330 sal_Bool PageSyncData::PlaySyncPageAct( PDFWriter& rWriter, sal_uInt32& rCurGDIMtfAction, const PDFExtOutDevData& rOutDevData )
331 {
332 sal_Bool bRet = sal_False;
333 if ( mActions.size() && ( mActions.front().nIdx == rCurGDIMtfAction ) )
334 {
335 bRet = sal_True;
336 PDFExtOutDevDataSync aDataSync = mActions.front();
337 mActions.pop_front();
338 switch( aDataSync.eAct )
339 {
340 case PDFExtOutDevDataSync::BeginStructureElement :
341 {
342 sal_Int32 nNewEl = rWriter.BeginStructureElement( mParaStructElements.front(), mParaOUStrings.front() ) ;
343 mParaStructElements.pop_front();
344 mParaOUStrings.pop_front();
345 mpGlobalData->mStructIdMap.push_back( nNewEl );
346 }
347 break;
348 case PDFExtOutDevDataSync::EndStructureElement :
349 {
350 rWriter.EndStructureElement();
351 }
352 break;
353 case PDFExtOutDevDataSync::SetCurrentStructureElement:
354 {
355 rWriter.SetCurrentStructureElement( mpGlobalData->GetMappedStructId( mParaInts.front() ) );
356 mParaInts.pop_front();
357 }
358 break;
359 case PDFExtOutDevDataSync::SetStructureAttribute :
360 {
361 rWriter.SetStructureAttribute( mParaStructAttributes.front(), mParaStructAttributeValues.front() );
362 mParaStructAttributeValues.pop_front();
363 mParaStructAttributes.pop_front();
364 }
365 break;
366 case PDFExtOutDevDataSync::SetStructureAttributeNumerical :
367 {
368 rWriter.SetStructureAttributeNumerical( mParaStructAttributes.front(), mParaInts.front() );
369 mParaStructAttributes.pop_front();
370 mParaInts.pop_front();
371 }
372 break;
373 case PDFExtOutDevDataSync::SetStructureBoundingBox :
374 {
375 rWriter.SetStructureBoundingBox( mParaRects.front() );
376 mParaRects.pop_front();
377 }
378 break;
379 case PDFExtOutDevDataSync::SetActualText :
380 {
381 rWriter.SetActualText( mParaOUStrings.front() );
382 mParaOUStrings.pop_front();
383 }
384 break;
385 case PDFExtOutDevDataSync::SetAlternateText :
386 {
387 rWriter.SetAlternateText( mParaOUStrings.front() );
388 mParaOUStrings.pop_front();
389 }
390 break;
391 case PDFExtOutDevDataSync::CreateControl:
392 {
393 ::boost::shared_ptr< PDFWriter::AnyWidget > pControl( mControls.front() );
394 DBG_ASSERT( pControl.get(), "PageSyncData::PlaySyncPageAct: invalid widget!" );
395 if ( pControl.get() )
396 rWriter.CreateControl( *pControl );
397 mControls.pop_front();
398 }
399 break;
400 case PDFExtOutDevDataSync::BeginGroup :
401 {
402 /* first determining if this BeginGroup is starting a GfxLink,
403 by searching for a EndGroup or a EndGroupGfxLink */
404 mbGroupIgnoreGDIMtfActions = sal_False;
405 std::deque< PDFExtOutDevDataSync >::iterator aBeg = mActions.begin();
406 std::deque< PDFExtOutDevDataSync >::iterator aEnd = mActions.end();
407 while ( aBeg != aEnd )
408 {
409 if ( aBeg->eAct == PDFExtOutDevDataSync::EndGroup )
410 {
411 break;
412 }
413 else if ( aBeg->eAct == PDFExtOutDevDataSync::EndGroupGfxLink )
414 {
415 if ( rOutDevData.GetIsLosslessCompression() && !rOutDevData.GetIsReduceImageResolution() )
416 {
417 Graphic& rGraphic = mGraphics.front();
418 if ( rGraphic.IsLink() && rGraphic.GetLink().GetType() == GFX_LINK_TYPE_NATIVE_JPG )
419 {
420 mbGroupIgnoreGDIMtfActions = sal_True;
421 }
422 }
423 break;
424 }
425 aBeg++;
426 }
427 }
428 break;
429 case PDFExtOutDevDataSync::EndGroup :
430 {
431 mbGroupIgnoreGDIMtfActions = sal_False;
432 }
433 break;
434 case PDFExtOutDevDataSync::EndGroupGfxLink :
435 {
436 sal_Int32 nTransparency;
437 Rectangle aOutputRect, aVisibleOutputRect;
438 Graphic aGraphic( mGraphics.front() );
439
440 mGraphics.pop_front();
441 nTransparency = mParaInts.front();
442 mParaInts.pop_front();
443 aOutputRect = mParaRects.front();
444 mParaRects.pop_front();
445 aVisibleOutputRect = mParaRects.front();
446 mParaRects.pop_front();
447
448 if ( mbGroupIgnoreGDIMtfActions )
449 {
450 sal_Bool bClippingNeeded = ( aOutputRect != aVisibleOutputRect ) && !aVisibleOutputRect.IsEmpty();
451
452 GfxLink aGfxLink( aGraphic.GetLink() );
453 if ( aGfxLink.GetType() == GFX_LINK_TYPE_NATIVE_JPG )
454 {
455 if ( bClippingNeeded )
456 {
457 rWriter.Push();
458 basegfx::B2DPolyPolygon aRect( basegfx::tools::createPolygonFromRect(
459 basegfx::B2DRectangle( aVisibleOutputRect.Left(), aVisibleOutputRect.Top(),
460 aVisibleOutputRect.Right(), aVisibleOutputRect.Bottom() ) ) );
461 rWriter.SetClipRegion( aRect);
462 }
463 Bitmap aMask;
464 SvMemoryStream aTmp;
465 const sal_uInt8* pData = aGfxLink.GetData();
466 sal_uInt32 nBytes = aGfxLink.GetDataSize();
467 if( pData && nBytes )
468 {
469 aTmp.Write( pData, nBytes );
470 rWriter.DrawJPGBitmap( aTmp, aGraphic.GetBitmap().GetBitCount() > 8, aGraphic.GetSizePixel(), aOutputRect, aMask );
471 }
472
473 if ( bClippingNeeded )
474 rWriter.Pop();
475 }
476 mbGroupIgnoreGDIMtfActions = sal_False;
477 }
478 }
479 break;
480 case PDFExtOutDevDataSync::CreateNamedDest:
481 case PDFExtOutDevDataSync::CreateDest:
482 case PDFExtOutDevDataSync::CreateLink:
483 case PDFExtOutDevDataSync::SetLinkDest:
484 case PDFExtOutDevDataSync::SetLinkURL:
485 case PDFExtOutDevDataSync::RegisterDest:
486 case PDFExtOutDevDataSync::CreateOutlineItem:
487 case PDFExtOutDevDataSync::SetOutlineItemParent:
488 case PDFExtOutDevDataSync::SetOutlineItemText:
489 case PDFExtOutDevDataSync::SetOutlineItemDest:
490 case PDFExtOutDevDataSync::CreateNote:
491 case PDFExtOutDevDataSync::SetAutoAdvanceTime:
492 case PDFExtOutDevDataSync::SetPageTransition:
493 break;
494 }
495 }
496 else if ( mbGroupIgnoreGDIMtfActions )
497 {
498 rCurGDIMtfAction++;
499 bRet = sal_True;
500 }
501 return bRet;
502 }
503
504 TYPEINIT1(PDFExtOutDevData,ExtOutDevData);
PDFExtOutDevData(const OutputDevice & rOutDev)505 PDFExtOutDevData::PDFExtOutDevData( const OutputDevice& rOutDev ) :
506 mrOutDev ( rOutDev ),
507 mbTaggedPDF ( sal_False ),
508 mbExportNotes ( sal_True ),
509 mbExportNotesPages ( sal_False ),
510 mbTransitionEffects ( sal_True ),
511 mbUseLosslessCompression( sal_True ),
512 mbReduceImageResolution ( sal_False ),
513 mbExportNDests ( sal_False ),
514 mnFormsFormat ( 0 ),
515 mnPage ( -1 ),
516 mpPageSyncData ( NULL ),
517 mpGlobalSyncData ( new GlobalSyncData() )
518 {
519 mpPageSyncData = new PageSyncData( mpGlobalSyncData );
520 }
521
~PDFExtOutDevData()522 PDFExtOutDevData::~PDFExtOutDevData()
523 {
524 delete mpPageSyncData;
525 delete mpGlobalSyncData;
526 }
527
GetDocumentLocale() const528 const com::sun::star::lang::Locale& PDFExtOutDevData::GetDocumentLocale() const
529 {
530 return maDocLocale;
531 }
SetDocumentLocale(const com::sun::star::lang::Locale & rLoc)532 void PDFExtOutDevData::SetDocumentLocale( const com::sun::star::lang::Locale& rLoc )
533 {
534 maDocLocale = rLoc;
535 }
GetCurrentPageNumber() const536 sal_Int32 PDFExtOutDevData::GetCurrentPageNumber() const
537 {
538 return mnPage;
539 }
SetCurrentPageNumber(const sal_Int32 nPage)540 void PDFExtOutDevData::SetCurrentPageNumber( const sal_Int32 nPage )
541 {
542 mnPage = nPage;
543 }
GetIsLosslessCompression() const544 sal_Bool PDFExtOutDevData::GetIsLosslessCompression() const
545 {
546 return mbUseLosslessCompression;
547 }
SetIsLosslessCompression(const sal_Bool bUseLosslessCompression)548 void PDFExtOutDevData::SetIsLosslessCompression( const sal_Bool bUseLosslessCompression )
549 {
550 mbUseLosslessCompression = bUseLosslessCompression;
551 }
GetIsReduceImageResolution() const552 sal_Bool PDFExtOutDevData::GetIsReduceImageResolution() const
553 {
554 return mbReduceImageResolution;
555 }
SetIsReduceImageResolution(const sal_Bool bReduceImageResolution)556 void PDFExtOutDevData::SetIsReduceImageResolution( const sal_Bool bReduceImageResolution )
557 {
558 mbReduceImageResolution = bReduceImageResolution;
559 }
GetIsExportNotes() const560 sal_Bool PDFExtOutDevData::GetIsExportNotes() const
561 {
562 return mbExportNotes;
563 }
SetIsExportNotes(const sal_Bool bExportNotes)564 void PDFExtOutDevData::SetIsExportNotes( const sal_Bool bExportNotes )
565 {
566 mbExportNotes = bExportNotes;
567 }
GetIsExportNotesPages() const568 sal_Bool PDFExtOutDevData::GetIsExportNotesPages() const
569 {
570 return mbExportNotesPages;
571 }
SetIsExportNotesPages(const sal_Bool bExportNotesPages)572 void PDFExtOutDevData::SetIsExportNotesPages( const sal_Bool bExportNotesPages )
573 {
574 mbExportNotesPages = bExportNotesPages;
575 }
GetIsExportTaggedPDF() const576 sal_Bool PDFExtOutDevData::GetIsExportTaggedPDF() const
577 {
578 return mbTaggedPDF;
579 }
SetIsExportTaggedPDF(const sal_Bool bTaggedPDF)580 void PDFExtOutDevData::SetIsExportTaggedPDF( const sal_Bool bTaggedPDF )
581 {
582 mbTaggedPDF = bTaggedPDF;
583 }
GetIsExportTransitionEffects() const584 sal_Bool PDFExtOutDevData::GetIsExportTransitionEffects() const
585 {
586 return mbTransitionEffects;
587 }
SetIsExportTransitionEffects(const sal_Bool bTransitionEffects)588 void PDFExtOutDevData::SetIsExportTransitionEffects( const sal_Bool bTransitionEffects )
589 {
590 mbTransitionEffects = bTransitionEffects;
591 }
GetIsExportFormFields() const592 sal_Bool PDFExtOutDevData::GetIsExportFormFields() const
593 {
594 return mbExportFormFields;
595 }
SetIsExportFormFields(const sal_Bool bExportFomtFields)596 void PDFExtOutDevData::SetIsExportFormFields( const sal_Bool bExportFomtFields )
597 {
598 mbExportFormFields = bExportFomtFields;
599 }
GetFormsFormat() const600 sal_Int32 PDFExtOutDevData::GetFormsFormat() const
601 {
602 return mnFormsFormat;
603 }
SetFormsFormat(const sal_Int32 nFormsFormat)604 void PDFExtOutDevData::SetFormsFormat( const sal_Int32 nFormsFormat )
605 {
606 mnFormsFormat = nFormsFormat;
607 }
GetIsExportBookmarks() const608 sal_Bool PDFExtOutDevData::GetIsExportBookmarks() const
609 {
610 return mbExportBookmarks;
611 }
SetIsExportBookmarks(const sal_Bool bExportBookmarks)612 void PDFExtOutDevData::SetIsExportBookmarks( const sal_Bool bExportBookmarks )
613 {
614 mbExportBookmarks = bExportBookmarks;
615 }
GetBookmarks()616 std::vector< PDFExtOutDevBookmarkEntry >& PDFExtOutDevData::GetBookmarks()
617 {
618 return maBookmarks;
619 }
GetIsExportNamedDestinations() const620 sal_Bool PDFExtOutDevData::GetIsExportNamedDestinations() const
621 {
622 return mbExportNDests;
623 }
SetIsExportNamedDestinations(const sal_Bool bExportNDests)624 void PDFExtOutDevData::SetIsExportNamedDestinations( const sal_Bool bExportNDests )
625 {
626 mbExportNDests = bExportNDests;
627 }
ResetSyncData()628 void PDFExtOutDevData::ResetSyncData()
629 {
630 *mpPageSyncData = PageSyncData( mpGlobalSyncData );
631 }
PlaySyncPageAct(PDFWriter & rWriter,sal_uInt32 & rIdx)632 sal_Bool PDFExtOutDevData::PlaySyncPageAct( PDFWriter& rWriter, sal_uInt32& rIdx )
633 {
634 return mpPageSyncData->PlaySyncPageAct( rWriter, rIdx, *this );
635 }
PlayGlobalActions(PDFWriter & rWriter)636 void PDFExtOutDevData::PlayGlobalActions( PDFWriter& rWriter )
637 {
638 mpGlobalSyncData->PlayGlobalActions( rWriter );
639 }
640
641 /* global actions, syncronisation to the recorded metafile isn't needed,
642 all actions will be played after the last page was recorded
643 */
644 //--->i56629
CreateNamedDest(const String & sDestName,const Rectangle & rRect,sal_Int32 nPageNr,PDFWriter::DestAreaType eType)645 sal_Int32 PDFExtOutDevData::CreateNamedDest(const String& sDestName, const Rectangle& rRect, sal_Int32 nPageNr, PDFWriter::DestAreaType eType )
646 {
647 mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::CreateNamedDest );
648 mpGlobalSyncData->mParaOUStrings.push_back( sDestName );
649 mpGlobalSyncData->mParaRects.push_back( rRect );
650 mpGlobalSyncData->mParaMapModes.push_back( mrOutDev.GetMapMode() );
651 mpGlobalSyncData->mParaInts.push_back( nPageNr == -1 ? mnPage : nPageNr );
652 mpGlobalSyncData->mParaDestAreaTypes.push_back( eType );
653
654 return mpGlobalSyncData->mCurId++;
655 }
656 //<---i56629
RegisterDest()657 sal_Int32 PDFExtOutDevData::RegisterDest()
658 {
659 const sal_Int32 nLinkDestID = mpGlobalSyncData->mCurId++;
660 mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::RegisterDest );
661 mpGlobalSyncData->mParaInts.push_back( nLinkDestID );
662
663 return nLinkDestID;
664 }
DescribeRegisteredDest(sal_Int32 nDestId,const Rectangle & rRect,sal_Int32 nPageNr,PDFWriter::DestAreaType eType)665 void PDFExtOutDevData::DescribeRegisteredDest( sal_Int32 nDestId, const Rectangle& rRect, sal_Int32 nPageNr, PDFWriter::DestAreaType eType )
666 {
667 OSL_PRECOND( nDestId != -1, "PDFExtOutDevData::DescribeRegisteredDest: invalid destination Id!" );
668 PDFLinkDestination aLinkDestination;
669 aLinkDestination.mRect = rRect;
670 aLinkDestination.mMapMode = mrOutDev.GetMapMode();
671 aLinkDestination.mPageNr = nPageNr == -1 ? mnPage : nPageNr;
672 aLinkDestination.mAreaType = eType;
673 mpGlobalSyncData->mFutureDestinations[ nDestId ] = aLinkDestination;
674 }
CreateDest(const Rectangle & rRect,sal_Int32 nPageNr,PDFWriter::DestAreaType eType)675 sal_Int32 PDFExtOutDevData::CreateDest( const Rectangle& rRect, sal_Int32 nPageNr, PDFWriter::DestAreaType eType )
676 {
677 mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::CreateDest );
678 mpGlobalSyncData->mParaRects.push_back( rRect );
679 mpGlobalSyncData->mParaMapModes.push_back( mrOutDev.GetMapMode() );
680 mpGlobalSyncData->mParaInts.push_back( nPageNr == -1 ? mnPage : nPageNr );
681 mpGlobalSyncData->mParaDestAreaTypes.push_back( eType );
682 return mpGlobalSyncData->mCurId++;
683 }
CreateLink(const Rectangle & rRect,sal_Int32 nPageNr)684 sal_Int32 PDFExtOutDevData::CreateLink( const Rectangle& rRect, sal_Int32 nPageNr )
685 {
686 mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::CreateLink );
687 mpGlobalSyncData->mParaRects.push_back( rRect );
688 mpGlobalSyncData->mParaMapModes.push_back( mrOutDev.GetMapMode() );
689 mpGlobalSyncData->mParaInts.push_back( nPageNr == -1 ? mnPage : nPageNr );
690 return mpGlobalSyncData->mCurId++;
691 }
SetLinkDest(sal_Int32 nLinkId,sal_Int32 nDestId)692 sal_Int32 PDFExtOutDevData::SetLinkDest( sal_Int32 nLinkId, sal_Int32 nDestId )
693 {
694 mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetLinkDest );
695 mpGlobalSyncData->mParaInts.push_back( nLinkId );
696 mpGlobalSyncData->mParaInts.push_back( nDestId );
697 return 0;
698 }
SetLinkURL(sal_Int32 nLinkId,const rtl::OUString & rURL)699 sal_Int32 PDFExtOutDevData::SetLinkURL( sal_Int32 nLinkId, const rtl::OUString& rURL )
700 {
701 mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetLinkURL );
702 mpGlobalSyncData->mParaInts.push_back( nLinkId );
703 mpGlobalSyncData->mParaOUStrings.push_back( rURL );
704 return 0;
705 }
CreateOutlineItem(sal_Int32 nParent,const rtl::OUString & rText,sal_Int32 nDestID)706 sal_Int32 PDFExtOutDevData::CreateOutlineItem( sal_Int32 nParent, const rtl::OUString& rText, sal_Int32 nDestID )
707 {
708 mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::CreateOutlineItem );
709 mpGlobalSyncData->mParaInts.push_back( nParent );
710 mpGlobalSyncData->mParaOUStrings.push_back( rText );
711 mpGlobalSyncData->mParaInts.push_back( nDestID );
712 return mpGlobalSyncData->mCurId++;
713 }
SetOutlineItemParent(sal_Int32 nItem,sal_Int32 nNewParent)714 sal_Int32 PDFExtOutDevData::SetOutlineItemParent( sal_Int32 nItem, sal_Int32 nNewParent )
715 {
716 mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetOutlineItemParent );
717 mpGlobalSyncData->mParaInts.push_back( nItem );
718 mpGlobalSyncData->mParaInts.push_back( nNewParent );
719 return 0;
720 }
SetOutlineItemText(sal_Int32 nItem,const rtl::OUString & rText)721 sal_Int32 PDFExtOutDevData::SetOutlineItemText( sal_Int32 nItem, const rtl::OUString& rText )
722 {
723 mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetOutlineItemText );
724 mpGlobalSyncData->mParaInts.push_back( nItem );
725 mpGlobalSyncData->mParaOUStrings.push_back( rText );
726 return 0;
727 }
SetOutlineItemDest(sal_Int32 nItem,sal_Int32 nDestID)728 sal_Int32 PDFExtOutDevData::SetOutlineItemDest( sal_Int32 nItem, sal_Int32 nDestID )
729 {
730 mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetOutlineItemDest );
731 mpGlobalSyncData->mParaInts.push_back( nItem );
732 mpGlobalSyncData->mParaInts.push_back( nDestID );
733 return 0;
734 }
CreateNote(const Rectangle & rRect,const PDFNote & rNote,sal_Int32 nPageNr)735 void PDFExtOutDevData::CreateNote( const Rectangle& rRect, const PDFNote& rNote, sal_Int32 nPageNr )
736 {
737 mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::CreateNote );
738 mpGlobalSyncData->mParaRects.push_back( rRect );
739 mpGlobalSyncData->mParaMapModes.push_back( mrOutDev.GetMapMode() );
740 mpGlobalSyncData->mParaPDFNotes.push_back( rNote );
741 mpGlobalSyncData->mParaInts.push_back( nPageNr == -1 ? mnPage : nPageNr );
742 }
SetAutoAdvanceTime(sal_uInt32 nSeconds,sal_Int32 nPageNr)743 void PDFExtOutDevData::SetAutoAdvanceTime( sal_uInt32 nSeconds, sal_Int32 nPageNr )
744 {
745 mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetAutoAdvanceTime );
746 mpGlobalSyncData->mParauInts.push_back( nSeconds );
747 mpGlobalSyncData->mParaInts.push_back( nPageNr == -1 ? mnPage : nPageNr );
748 }
SetPageTransition(PDFWriter::PageTransition eType,sal_uInt32 nMilliSec,sal_Int32 nPageNr)749 void PDFExtOutDevData::SetPageTransition( PDFWriter::PageTransition eType, sal_uInt32 nMilliSec, sal_Int32 nPageNr )
750 {
751 mpGlobalSyncData->mActions.push_back( PDFExtOutDevDataSync::SetPageTransition );
752 mpGlobalSyncData->mParaPageTransitions.push_back( eType );
753 mpGlobalSyncData->mParauInts.push_back( nMilliSec );
754 mpGlobalSyncData->mParaInts.push_back( nPageNr == -1 ? mnPage : nPageNr );
755 }
756
757 /* local (page), actions have to be played synchroniously to the actions of
758 of the recorded metafile (created by each xRenderable->render()) */
BeginStructureElement(PDFWriter::StructElement eType,const rtl::OUString & rAlias)759 sal_Int32 PDFExtOutDevData::BeginStructureElement( PDFWriter::StructElement eType, const rtl::OUString& rAlias )
760 {
761 mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::BeginStructureElement );
762 mpPageSyncData->mParaStructElements.push_back( eType );
763 mpPageSyncData->mParaOUStrings.push_back( rAlias );
764 // need a global id
765 sal_Int32 nNewId = mpGlobalSyncData->mStructParents.size();
766 mpGlobalSyncData->mStructParents.push_back( mpGlobalSyncData->mCurrentStructElement );
767 mpGlobalSyncData->mCurrentStructElement = nNewId;
768 return nNewId;
769 }
EndStructureElement()770 void PDFExtOutDevData::EndStructureElement()
771 {
772 mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::EndStructureElement );
773 mpGlobalSyncData->mCurrentStructElement = mpGlobalSyncData->mStructParents[ mpGlobalSyncData->mCurrentStructElement ];
774 }
SetCurrentStructureElement(sal_Int32 nStructId)775 bool PDFExtOutDevData::SetCurrentStructureElement( sal_Int32 nStructId )
776 {
777 bool bSuccess = false;
778 if( sal_uInt32(nStructId) < mpGlobalSyncData->mStructParents.size() )
779 {
780 mpGlobalSyncData->mCurrentStructElement = nStructId;
781 mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetCurrentStructureElement );
782 mpPageSyncData->mParaInts.push_back( nStructId );
783 bSuccess = true;
784 }
785 return bSuccess;
786 }
GetCurrentStructureElement()787 sal_Int32 PDFExtOutDevData::GetCurrentStructureElement()
788 {
789 return mpGlobalSyncData->mCurrentStructElement;
790 }
SetStructureAttribute(PDFWriter::StructAttribute eAttr,PDFWriter::StructAttributeValue eVal)791 bool PDFExtOutDevData::SetStructureAttribute( PDFWriter::StructAttribute eAttr, PDFWriter::StructAttributeValue eVal )
792 {
793 mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetStructureAttribute );
794 mpPageSyncData->mParaStructAttributes.push_back( eAttr );
795 mpPageSyncData->mParaStructAttributeValues.push_back( eVal );
796 return true;
797 }
SetStructureAttributeNumerical(PDFWriter::StructAttribute eAttr,sal_Int32 nValue)798 bool PDFExtOutDevData::SetStructureAttributeNumerical( PDFWriter::StructAttribute eAttr, sal_Int32 nValue )
799 {
800 mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetStructureAttributeNumerical );
801 mpPageSyncData->mParaStructAttributes.push_back( eAttr );
802 mpPageSyncData->mParaInts.push_back( nValue );
803 return true;
804 }
SetStructureBoundingBox(const Rectangle & rRect)805 void PDFExtOutDevData::SetStructureBoundingBox( const Rectangle& rRect )
806 {
807 mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetStructureBoundingBox );
808 mpPageSyncData->mParaRects.push_back( rRect );
809 }
SetActualText(const String & rText)810 void PDFExtOutDevData::SetActualText( const String& rText )
811 {
812 mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetActualText );
813 mpPageSyncData->mParaOUStrings.push_back( rText );
814 }
SetAlternateText(const String & rText)815 void PDFExtOutDevData::SetAlternateText( const String& rText )
816 {
817 mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetAlternateText );
818 mpPageSyncData->mParaOUStrings.push_back( rText );
819 }
820
CreateControl(const PDFWriter::AnyWidget & rControlType,sal_Int32)821 void PDFExtOutDevData::CreateControl( const PDFWriter::AnyWidget& rControlType, sal_Int32 /*nPageNr*/ )
822 {
823 mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::CreateControl );
824
825 ::boost::shared_ptr< PDFWriter::AnyWidget > pClone( rControlType.Clone() );
826 mpPageSyncData->mControls.push_back( pClone );
827 }
828
BeginGroup()829 void PDFExtOutDevData::BeginGroup()
830 {
831 mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::BeginGroup );
832 }
833
EndGroup()834 void PDFExtOutDevData::EndGroup()
835 {
836 mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::EndGroup );
837 }
EndGroup(const Graphic & rGraphic,sal_uInt8 nTransparency,const Rectangle & rOutputRect,const Rectangle & rVisibleOutputRect)838 void PDFExtOutDevData::EndGroup( const Graphic& rGraphic,
839 sal_uInt8 nTransparency,
840 const Rectangle& rOutputRect,
841 const Rectangle& rVisibleOutputRect )
842 {
843 mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::EndGroupGfxLink );
844 mpPageSyncData->mGraphics.push_back( rGraphic );
845 mpPageSyncData->mParaInts.push_back( nTransparency );
846 mpPageSyncData->mParaRects.push_back( rOutputRect );
847 mpPageSyncData->mParaRects.push_back( rVisibleOutputRect );
848 }
849
850 }
851