Commit b480f7186ffa6a2f4fe3a477c2e95871a64b2169

Authored by Jay Berkenbilt
Committed by GitHub
2 parents 16f46703 b7791566

Merge pull request #928 from m-holger/wr_og

Add new data member QPDFWriter::Members::root_og
include/qpdf/QPDFWriter.hh
@@ -709,70 +709,71 @@ class QPDFWriter @@ -709,70 +709,71 @@ class QPDFWriter
709 Members(Members const&) = delete; 709 Members(Members const&) = delete;
710 710
711 QPDF& pdf; 711 QPDF& pdf;
712 - char const* filename;  
713 - FILE* file;  
714 - bool close_file;  
715 - Pl_Buffer* buffer_pipeline;  
716 - Buffer* output_buffer;  
717 - bool normalize_content_set;  
718 - bool normalize_content;  
719 - bool compress_streams;  
720 - bool compress_streams_set;  
721 - qpdf_stream_decode_level_e stream_decode_level;  
722 - bool stream_decode_level_set;  
723 - bool recompress_flate;  
724 - bool qdf_mode;  
725 - bool preserve_unreferenced_objects;  
726 - bool newline_before_endstream;  
727 - bool static_id;  
728 - bool suppress_original_object_ids;  
729 - bool direct_stream_lengths;  
730 - bool encrypted;  
731 - bool preserve_encryption;  
732 - bool linearized;  
733 - bool pclm;  
734 - qpdf_object_stream_e object_stream_mode; 712 + QPDFObjGen root_og{-1, 0};
  713 + char const* filename{"unspecified"};
  714 + FILE* file{nullptr};
  715 + bool close_file{false};
  716 + Pl_Buffer* buffer_pipeline{nullptr};
  717 + Buffer* output_buffer{nullptr};
  718 + bool normalize_content_set{false};
  719 + bool normalize_content{false};
  720 + bool compress_streams{true};
  721 + bool compress_streams_set{false};
  722 + qpdf_stream_decode_level_e stream_decode_level{qpdf_dl_none};
  723 + bool stream_decode_level_set{false};
  724 + bool recompress_flate{false};
  725 + bool qdf_mode{false};
  726 + bool preserve_unreferenced_objects{false};
  727 + bool newline_before_endstream{false};
  728 + bool static_id{false};
  729 + bool suppress_original_object_ids{false};
  730 + bool direct_stream_lengths{true};
  731 + bool encrypted{false};
  732 + bool preserve_encryption{true};
  733 + bool linearized{false};
  734 + bool pclm{false};
  735 + qpdf_object_stream_e object_stream_mode{qpdf_o_preserve};
735 std::string encryption_key; 736 std::string encryption_key;
736 - bool encrypt_metadata;  
737 - bool encrypt_use_aes; 737 + bool encrypt_metadata{true};
  738 + bool encrypt_use_aes{false};
738 std::map<std::string, std::string> encryption_dictionary; 739 std::map<std::string, std::string> encryption_dictionary;
739 - int encryption_V;  
740 - int encryption_R; 740 + int encryption_V{0};
  741 + int encryption_R{0};
741 742
742 std::string id1; // for /ID key of 743 std::string id1; // for /ID key of
743 std::string id2; // trailer dictionary 744 std::string id2; // trailer dictionary
744 std::string final_pdf_version; 745 std::string final_pdf_version;
745 - int final_extension_level; 746 + int final_extension_level{0};
746 std::string min_pdf_version; 747 std::string min_pdf_version;
747 - int min_extension_level; 748 + int min_extension_level{0};
748 std::string forced_pdf_version; 749 std::string forced_pdf_version;
749 - int forced_extension_level; 750 + int forced_extension_level{0};
750 std::string extra_header_text; 751 std::string extra_header_text;
751 - int encryption_dict_objid; 752 + int encryption_dict_objid{0};
752 std::string cur_data_key; 753 std::string cur_data_key;
753 std::list<std::shared_ptr<Pipeline>> to_delete; 754 std::list<std::shared_ptr<Pipeline>> to_delete;
754 - Pl_Count* pipeline; 755 + Pl_Count* pipeline{nullptr};
755 std::vector<QPDFObjectHandle> object_queue; 756 std::vector<QPDFObjectHandle> object_queue;
756 size_t object_queue_front{0}; 757 size_t object_queue_front{0};
757 std::map<QPDFObjGen, int> obj_renumber; 758 std::map<QPDFObjGen, int> obj_renumber;
758 std::map<int, QPDFXRefEntry> xref; 759 std::map<int, QPDFXRefEntry> xref;
759 std::map<int, qpdf_offset_t> lengths; 760 std::map<int, qpdf_offset_t> lengths;
760 - int next_objid;  
761 - int cur_stream_length_id;  
762 - size_t cur_stream_length;  
763 - bool added_newline;  
764 - int max_ostream_index; 761 + int next_objid{1};
  762 + int cur_stream_length_id{0};
  763 + size_t cur_stream_length{0};
  764 + bool added_newline{false};
  765 + int max_ostream_index{0};
765 std::set<QPDFObjGen> normalized_streams; 766 std::set<QPDFObjGen> normalized_streams;
766 std::map<QPDFObjGen, int> page_object_to_seq; 767 std::map<QPDFObjGen, int> page_object_to_seq;
767 std::map<QPDFObjGen, int> contents_to_page_seq; 768 std::map<QPDFObjGen, int> contents_to_page_seq;
768 std::map<QPDFObjGen, int> object_to_object_stream; 769 std::map<QPDFObjGen, int> object_to_object_stream;
769 std::map<int, std::set<QPDFObjGen>> object_stream_to_objects; 770 std::map<int, std::set<QPDFObjGen>> object_stream_to_objects;
770 std::list<Pipeline*> pipeline_stack; 771 std::list<Pipeline*> pipeline_stack;
771 - unsigned long long next_stack_id;  
772 - bool deterministic_id;  
773 - Pl_MD5* md5_pipeline; 772 + unsigned long long next_stack_id{0};
  773 + bool deterministic_id{false};
  774 + Pl_MD5* md5_pipeline{nullptr};
774 std::string deterministic_id_data; 775 std::string deterministic_id_data;
775 - bool did_write_setup; 776 + bool did_write_setup{false};
776 777
777 // For linearization only 778 // For linearization only
778 std::string lin_pass1_filename; 779 std::string lin_pass1_filename;
@@ -781,9 +782,9 @@ class QPDFWriter @@ -781,9 +782,9 @@ class QPDFWriter
781 782
782 // For progress reporting 783 // For progress reporting
783 std::shared_ptr<ProgressReporter> progress_reporter; 784 std::shared_ptr<ProgressReporter> progress_reporter;
784 - int events_expected;  
785 - int events_seen;  
786 - int next_progress_report; 785 + int events_expected{0};
  786 + int events_seen{0};
  787 + int next_progress_report{0};
787 }; 788 };
788 789
789 // Keep all member variables inside the Members object, which we 790 // Keep all member variables inside the Members object, which we
libqpdf/QPDFWriter.cc
@@ -52,50 +52,9 @@ QPDFWriter::FunctionProgressReporter::reportProgress(int progress) @@ -52,50 +52,9 @@ QPDFWriter::FunctionProgressReporter::reportProgress(int progress)
52 52
53 QPDFWriter::Members::Members(QPDF& pdf) : 53 QPDFWriter::Members::Members(QPDF& pdf) :
54 pdf(pdf), 54 pdf(pdf),
55 - filename("unspecified"),  
56 - file(nullptr),  
57 - close_file(false),  
58 - buffer_pipeline(nullptr),  
59 - output_buffer(nullptr),  
60 - normalize_content_set(false),  
61 - normalize_content(false),  
62 - compress_streams(true),  
63 - compress_streams_set(false),  
64 - stream_decode_level(qpdf_dl_none),  
65 - stream_decode_level_set(false),  
66 - recompress_flate(false),  
67 - qdf_mode(false),  
68 - preserve_unreferenced_objects(false),  
69 - newline_before_endstream(false),  
70 - static_id(false),  
71 - suppress_original_object_ids(false),  
72 - direct_stream_lengths(true),  
73 - encrypted(false),  
74 - preserve_encryption(true),  
75 - linearized(false),  
76 - pclm(false),  
77 - object_stream_mode(qpdf_o_preserve),  
78 - encrypt_metadata(true),  
79 - encrypt_use_aes(false),  
80 - encryption_V(0),  
81 - encryption_R(0),  
82 - final_extension_level(0),  
83 - min_extension_level(0),  
84 - forced_extension_level(0),  
85 - encryption_dict_objid(0),  
86 - pipeline(nullptr),  
87 - next_objid(1),  
88 - cur_stream_length_id(0),  
89 - cur_stream_length(0),  
90 - added_newline(false),  
91 - max_ostream_index(0),  
92 - next_stack_id(0),  
93 - deterministic_id(false),  
94 - md5_pipeline(nullptr),  
95 - did_write_setup(false),  
96 - events_expected(0),  
97 - events_seen(0),  
98 - next_progress_report(0) 55 + root_og(
  56 + pdf.getRoot().getObjGen().isIndirect() ? pdf.getRoot().getObjGen()
  57 + : QPDFObjGen(-1, 0))
99 { 58 {
100 } 59 }
101 60
@@ -1534,14 +1493,12 @@ QPDFWriter::unparseObject( @@ -1534,14 +1493,12 @@ QPDFWriter::unparseObject(
1534 // is direct through the ADBE dictionary, so we can modify in 1493 // is direct through the ADBE dictionary, so we can modify in
1535 // place. 1494 // place.
1536 1495
1537 - bool is_root = false; 1496 + const bool is_root = (old_og == m->root_og);
1538 bool have_extensions_other = false; 1497 bool have_extensions_other = false;
1539 bool have_extensions_adbe = false; 1498 bool have_extensions_adbe = false;
1540 1499
1541 QPDFObjectHandle extensions; 1500 QPDFObjectHandle extensions;
1542 - if ((old_og.getObj() != 0) &&  
1543 - (old_og == this->m->pdf.getRoot().getObjGen())) {  
1544 - is_root = true; 1501 + if (is_root) {
1545 if (object.hasKey("/Extensions") && 1502 if (object.hasKey("/Extensions") &&
1546 object.getKey("/Extensions").isDictionary()) { 1503 object.getKey("/Extensions").isDictionary()) {
1547 extensions = object.getKey("/Extensions"); 1504 extensions = object.getKey("/Extensions");
@@ -2396,10 +2353,9 @@ QPDFWriter::doWriteSetup() @@ -2396,10 +2353,9 @@ QPDFWriter::doWriteSetup()
2396 // 8.0.0 has a bug that prevents it from being able to handle 2353 // 8.0.0 has a bug that prevents it from being able to handle
2397 // encrypted files with compressed document catalogs, so we 2354 // encrypted files with compressed document catalogs, so we
2398 // disable them in that case as well. 2355 // disable them in that case as well.
2399 - QPDFObjGen og = this->m->pdf.getRoot().getObjGen();  
2400 - if (this->m->object_to_object_stream.count(og)) { 2356 + if (m->object_to_object_stream.count(m->root_og)) {
2401 QTC::TC("qpdf", "QPDFWriter uncompressing root"); 2357 QTC::TC("qpdf", "QPDFWriter uncompressing root");
2402 - this->m->object_to_object_stream.erase(og); 2358 + this->m->object_to_object_stream.erase(m->root_og);
2403 } 2359 }
2404 } 2360 }
2405 2361