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; 105 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 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 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 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 312 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 }; 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 } 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); 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 522 PDFExtOutDevData::~PDFExtOutDevData() 523 { 524 delete mpPageSyncData; 525 delete mpGlobalSyncData; 526 } 527 528 const com::sun::star::lang::Locale& PDFExtOutDevData::GetDocumentLocale() const 529 { 530 return maDocLocale; 531 } 532 void PDFExtOutDevData::SetDocumentLocale( const com::sun::star::lang::Locale& rLoc ) 533 { 534 maDocLocale = rLoc; 535 } 536 sal_Int32 PDFExtOutDevData::GetCurrentPageNumber() const 537 { 538 return mnPage; 539 } 540 void PDFExtOutDevData::SetCurrentPageNumber( const sal_Int32 nPage ) 541 { 542 mnPage = nPage; 543 } 544 sal_Bool PDFExtOutDevData::GetIsLosslessCompression() const 545 { 546 return mbUseLosslessCompression; 547 } 548 void PDFExtOutDevData::SetIsLosslessCompression( const sal_Bool bUseLosslessCompression ) 549 { 550 mbUseLosslessCompression = bUseLosslessCompression; 551 } 552 sal_Bool PDFExtOutDevData::GetIsReduceImageResolution() const 553 { 554 return mbReduceImageResolution; 555 } 556 void PDFExtOutDevData::SetIsReduceImageResolution( const sal_Bool bReduceImageResolution ) 557 { 558 mbReduceImageResolution = bReduceImageResolution; 559 } 560 sal_Bool PDFExtOutDevData::GetIsExportNotes() const 561 { 562 return mbExportNotes; 563 } 564 void PDFExtOutDevData::SetIsExportNotes( const sal_Bool bExportNotes ) 565 { 566 mbExportNotes = bExportNotes; 567 } 568 sal_Bool PDFExtOutDevData::GetIsExportNotesPages() const 569 { 570 return mbExportNotesPages; 571 } 572 void PDFExtOutDevData::SetIsExportNotesPages( const sal_Bool bExportNotesPages ) 573 { 574 mbExportNotesPages = bExportNotesPages; 575 } 576 sal_Bool PDFExtOutDevData::GetIsExportTaggedPDF() const 577 { 578 return mbTaggedPDF; 579 } 580 void PDFExtOutDevData::SetIsExportTaggedPDF( const sal_Bool bTaggedPDF ) 581 { 582 mbTaggedPDF = bTaggedPDF; 583 } 584 sal_Bool PDFExtOutDevData::GetIsExportTransitionEffects() const 585 { 586 return mbTransitionEffects; 587 } 588 void PDFExtOutDevData::SetIsExportTransitionEffects( const sal_Bool bTransitionEffects ) 589 { 590 mbTransitionEffects = bTransitionEffects; 591 } 592 sal_Bool PDFExtOutDevData::GetIsExportFormFields() const 593 { 594 return mbExportFormFields; 595 } 596 void PDFExtOutDevData::SetIsExportFormFields( const sal_Bool bExportFomtFields ) 597 { 598 mbExportFormFields = bExportFomtFields; 599 } 600 sal_Int32 PDFExtOutDevData::GetFormsFormat() const 601 { 602 return mnFormsFormat; 603 } 604 void PDFExtOutDevData::SetFormsFormat( const sal_Int32 nFormsFormat ) 605 { 606 mnFormsFormat = nFormsFormat; 607 } 608 sal_Bool PDFExtOutDevData::GetIsExportBookmarks() const 609 { 610 return mbExportBookmarks; 611 } 612 void PDFExtOutDevData::SetIsExportBookmarks( const sal_Bool bExportBookmarks ) 613 { 614 mbExportBookmarks = bExportBookmarks; 615 } 616 std::vector< PDFExtOutDevBookmarkEntry >& PDFExtOutDevData::GetBookmarks() 617 { 618 return maBookmarks; 619 } 620 sal_Bool PDFExtOutDevData::GetIsExportNamedDestinations() const 621 { 622 return mbExportNDests; 623 } 624 void PDFExtOutDevData::SetIsExportNamedDestinations( const sal_Bool bExportNDests ) 625 { 626 mbExportNDests = bExportNDests; 627 } 628 void PDFExtOutDevData::ResetSyncData() 629 { 630 *mpPageSyncData = PageSyncData( mpGlobalSyncData ); 631 } 632 sal_Bool PDFExtOutDevData::PlaySyncPageAct( PDFWriter& rWriter, sal_uInt32& rIdx ) 633 { 634 return mpPageSyncData->PlaySyncPageAct( rWriter, rIdx, *this ); 635 } 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 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 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 } 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 } 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 } 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 } 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 } 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 } 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 } 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 } 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 } 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 } 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 } 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 } 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()) */ 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 } 770 void PDFExtOutDevData::EndStructureElement() 771 { 772 mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::EndStructureElement ); 773 mpGlobalSyncData->mCurrentStructElement = mpGlobalSyncData->mStructParents[ mpGlobalSyncData->mCurrentStructElement ]; 774 } 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 } 787 sal_Int32 PDFExtOutDevData::GetCurrentStructureElement() 788 { 789 return mpGlobalSyncData->mCurrentStructElement; 790 } 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 } 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 } 805 void PDFExtOutDevData::SetStructureBoundingBox( const Rectangle& rRect ) 806 { 807 mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetStructureBoundingBox ); 808 mpPageSyncData->mParaRects.push_back( rRect ); 809 } 810 void PDFExtOutDevData::SetActualText( const String& rText ) 811 { 812 mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetActualText ); 813 mpPageSyncData->mParaOUStrings.push_back( rText ); 814 } 815 void PDFExtOutDevData::SetAlternateText( const String& rText ) 816 { 817 mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::SetAlternateText ); 818 mpPageSyncData->mParaOUStrings.push_back( rText ); 819 } 820 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 829 void PDFExtOutDevData::BeginGroup() 830 { 831 mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::BeginGroup ); 832 } 833 834 void PDFExtOutDevData::EndGroup() 835 { 836 mpPageSyncData->PushAction( mrOutDev, PDFExtOutDevDataSync::EndGroup ); 837 } 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