| 436 | } |
| 437 | |
| 438 | SimplePDFModule::~SimplePDFModule() |
| 439 | { |
| 440 | std::ofstream fout( filename.c_str(), std::ios::app|std::ios::binary ); |
| 441 | |
| 442 | //---------------------------------------- |
| 443 | // PageTree |
| 444 | //---------------------------------------- |
| 445 | std::stringstream strPageTree; |
| 446 | strPageTree << "3 0 obj\n" |
| 447 | << "<<\n" |
| 448 | << " /Kids ["; |
| 449 | |
| 450 | for(int i = 0; i < page; i++) |
| 451 | strPageTree << ((i == 0)? "": " ") << page_obj_offset+i*2 << " 0 R"; |
| 452 | |
| 453 | strPageTree << "]\n" |
| 454 | << " /Type /Pages\n" |
| 455 | << " /Count " << page << "\n" |
| 456 | << ">>\n" |
| 457 | << "endobj\n"; |
| 458 | |
| 459 | fout << strPageTree.str(); |
| 460 | |
| 461 | std::list<int>::iterator itr = xref.begin(); // obj 1 (DocumentInfo) |
| 462 | itr++; // obj 2 (DocumentCatalog) |
| 463 | itr++; // obj 3 (FontEH at present) |
| 464 | itr = xref.insert( itr, byte_offset ); // byte_offset is inserted before itr (FontEH) |
| 465 | // and itr indicates byte_offset |
| 466 | |
| 467 | byte_offset += strPageTree.str().length(); |
| 468 | |
| 469 | //---------------------------------------- |
| 470 | // /PageMode \in { /UseNone (default), /UseOutlines, /UseThumbs, /FullScreen, /UseOC, /UseAttachements } |
| 471 | //---------------------------------------- |
| 472 | std::stringstream strPageMode; |
| 473 | strPageMode << "4 0 obj\n" |
| 474 | << " " << (outline.empty()? "/UseNone\n": "/UseOutlines\n") |
| 475 | << "endobj\n"; |
| 476 | |
| 477 | fout << strPageMode.str(); |
| 478 | |
| 479 | itr++; // obj 3 (FontEH at present) |
| 480 | itr = xref.insert( itr, byte_offset ); // byte_offset is inserted before itr (FontEH) |
| 481 | // and itr indicates byte_offset |
| 482 | byte_offset += strPageMode.str().length(); |
| 483 | |
| 484 | //---------------------------------------- |
| 485 | // Outlines |
| 486 | //---------------------------------------- |
| 487 | std::stringstream strOutlines; |
| 488 | strOutlines << "5 0 obj\n" |
| 489 | << "<<\n" |
| 490 | << " /Type /Outlines\n" |
| 491 | << " /Count " << 1+outline.size() << "\n" // 1 : Document Title |
| 492 | << " /First 6 0 R\n" |
| 493 | << " /Last 6 0 R\n" |
| 494 | << ">>\n" |
| 495 | << "endobj\n"; |