diff --git a/include/qpdf/QPDFJob.hh b/include/qpdf/QPDFJob.hh index 46ec3d5a..12c7bfb7 100644 --- a/include/qpdf/QPDFJob.hh +++ b/include/qpdf/QPDFJob.hh @@ -284,9 +284,8 @@ class QPDFJob QPDF_DLL std::shared_ptr config(); - // QXXXQ set options -- implemented in QPDFJob_options.cc - - // QXXXQ these will not be in the final interface + // Options for helping the qpdf CLI use the correct edit code and + // properly report warnings. QPDF_DLL bool suppressWarnings(); QPDF_DLL @@ -295,7 +294,6 @@ class QPDFJob bool checkRequiresPassword(); QPDF_DLL bool checkIsEncrypted(); - // /QXXXQ // Execute the job QPDF_DLL @@ -320,17 +318,12 @@ class QPDFJob void doIfVerbose( std::function fn); + // Provide a string that is the help information ("schema" for the + // qpdf-specific JSON object) for version 1 of the JSON output. + QPDF_DLL + static std::string json_out_schema_v1(); private: - public: // QXXXQ - QPDF_DLL - static JSON json_schema(std::set* keys = 0); - - private: // QXXXQ - QPDF_DLL - static void parse_object_id( - std::string const& objspec, bool& trailer, int& obj, int& gen); - struct RotationSpec { RotationSpec(int angle = 0, bool relative = false) : @@ -345,7 +338,6 @@ class QPDFJob enum password_mode_e { pm_bytes, pm_hex_bytes, pm_unicode, pm_auto }; - public: // QXXXQ begin public struct UnderOverlay { UnderOverlay(char const* which) : @@ -368,13 +360,10 @@ class QPDFJob std::vector repeat_pagenos; }; - size_t oi_min_width; - size_t oi_min_height; - size_t oi_min_area; - // QXXXQ END-PUBLIC - - private: // Helper functions + static JSON json_schema(std::set* keys = 0); + static void parse_object_id( + std::string const& objspec, bool& trailer, int& obj, int& gen); void parseRotationParameter(std::string const&); std::vector parseNumrange(char const* range, int max); @@ -397,17 +386,19 @@ class QPDFJob std::vector>& page_heap); bool shouldRemoveUnreferencedResources(QPDF& pdf); void handleRotations(QPDF& pdf); + void getUOPagenos(UnderOverlay& uo, + std::map >& pagenos); void handleUnderOverlay(QPDF& pdf); void doUnderOverlayForPage( QPDF& pdf, - QPDFJob::UnderOverlay& uo, + UnderOverlay& uo, std::map >& pagenos, size_t page_idx, std::map& fo, std::vector& pages, QPDFPageObjectHelper& dest_page, bool before); - void validateUnderOverlay(QPDF& pdf, QPDFJob::UnderOverlay* uo); + void validateUnderOverlay(QPDF& pdf, UnderOverlay* uo); void handleTransformations(QPDF& pdf); void addAttachments(QPDF& pdf); void copyAttachments(QPDF& pdf); @@ -556,6 +547,9 @@ class QPDFJob bool externalize_inline_images; bool keep_inline_images; bool remove_page_labels; + size_t oi_min_width; + size_t oi_min_height; + size_t oi_min_area; size_t ii_min_bytes; UnderOverlay underlay; UnderOverlay overlay; diff --git a/libqpdf/QPDFJob.cc b/libqpdf/QPDFJob.cc index 96d0101c..d1706185 100644 --- a/libqpdf/QPDFJob.cc +++ b/libqpdf/QPDFJob.cc @@ -43,7 +43,11 @@ namespace class ImageOptimizer: public QPDFObjectHandle::StreamDataProvider { public: - ImageOptimizer(QPDFJob& o, QPDFObjectHandle& image); + ImageOptimizer(QPDFJob& o, + size_t oi_min_width, + size_t oi_min_height, + size_t oi_min_area, + QPDFObjectHandle& image); virtual ~ImageOptimizer() { } @@ -55,6 +59,9 @@ namespace private: QPDFJob& o; + size_t oi_min_width; + size_t oi_min_height; + size_t oi_min_area; QPDFObjectHandle image; }; @@ -101,8 +108,15 @@ namespace }; } -ImageOptimizer::ImageOptimizer(QPDFJob& o, QPDFObjectHandle& image) : +ImageOptimizer::ImageOptimizer(QPDFJob& o, + size_t oi_min_width, + size_t oi_min_height, + size_t oi_min_area, + QPDFObjectHandle& image) : o(o), + oi_min_width(oi_min_width), + oi_min_height(oi_min_height), + oi_min_area(oi_min_area), image(image) { } @@ -194,9 +208,9 @@ ImageOptimizer::makePipeline(std::string const& description, Pipeline* next) } return result; } - if (((o.oi_min_width > 0) && (w <= o.oi_min_width)) || - ((o.oi_min_height > 0) && (h <= o.oi_min_height)) || - ((o.oi_min_area > 0) && ((w * h) <= o.oi_min_area))) + if (((this->oi_min_width > 0) && (w <= this->oi_min_width)) || + ((this->oi_min_height > 0) && (h <= this->oi_min_height)) || + ((this->oi_min_area > 0) && ((w * h) <= this->oi_min_area))) { QTC::TC("qpdf", "qpdf image optimize too small"); if (! description.empty()) @@ -415,7 +429,10 @@ QPDFJob::Members::Members() : externalize_inline_images(false), keep_inline_images(false), remove_page_labels(false), - ii_min_bytes(1024), // QXXXQ comment with oi_* + oi_min_width(128), // Default values for these + oi_min_height(128), // oi and ii flags are in --help + oi_min_area(16384), // and in the manual. + ii_min_bytes(1024), // underlay("underlay"), overlay("overlay"), under_overlay(0), @@ -427,9 +444,6 @@ QPDFJob::Members::Members() : } QPDFJob::QPDFJob() : - oi_min_width(128), // Default values for these - oi_min_height(128), // oi flags are in --help - oi_min_area(16384), // and in the manual. m(new Members()) { } @@ -1803,6 +1817,12 @@ QPDFJob::json_schema(std::set* keys) return schema; } +std::string +QPDFJob::json_out_schema_v1() +{ + return json_schema().unparse(); +} + void QPDFJob::doJSON(QPDF& pdf) { @@ -2240,8 +2260,9 @@ QPDFJob::doUnderOverlayForPage( } } -static void get_uo_pagenos(QPDFJob::UnderOverlay& uo, - std::map >& pagenos) +void +QPDFJob::getUOPagenos(QPDFJob::UnderOverlay& uo, + std::map >& pagenos) { size_t idx = 0; size_t from_size = uo.from_pagenos.size(); @@ -2272,9 +2293,9 @@ QPDFJob::handleUnderOverlay(QPDF& pdf) return; } std::map > underlay_pagenos; - get_uo_pagenos(m->underlay, underlay_pagenos); + getUOPagenos(m->underlay, underlay_pagenos); std::map > overlay_pagenos; - get_uo_pagenos(m->overlay, overlay_pagenos); + getUOPagenos(m->overlay, overlay_pagenos); std::map underlay_fo; std::map overlay_fo; std::vector upages; @@ -2439,7 +2460,6 @@ QPDFJob::copyAttachments(QPDF& pdf) void QPDFJob::handleTransformations(QPDF& pdf) { - QPDFJob& o = *this; // QXXXQ QPDFPageDocumentHelper dh(pdf); std::shared_ptr afdh; auto make_afdh = [&]() { @@ -2474,7 +2494,9 @@ QPDFJob::handleTransformations(QPDF& pdf) { std::string name = iter2.first; QPDFObjectHandle& image = iter2.second; - ImageOptimizer* io = new ImageOptimizer(o, image); + ImageOptimizer* io = new ImageOptimizer( + *this, m->oi_min_width, m->oi_min_height, + m->oi_min_area, image); PointerHolder sdp(io); if (io->evaluate("image " + name + " on page " + QUtil::int_to_string(pageno))) diff --git a/libqpdf/QPDFJob_argv.cc b/libqpdf/QPDFJob_argv.cc index 7aa01b63..cca3abca 100644 --- a/libqpdf/QPDFJob_argv.cc +++ b/libqpdf/QPDFJob_argv.cc @@ -181,7 +181,7 @@ ArgParser::argJsonHelp() << std::endl << "be null, and others will have values that apply to unencrypted files." << std::endl - << QPDFJob::json_schema().unparse() + << QPDFJob::json_out_schema_v1() << std::endl; } diff --git a/libqpdf/QPDFJob_config.cc b/libqpdf/QPDFJob_config.cc index f8402a64..621d788a 100644 --- a/libqpdf/QPDFJob_config.cc +++ b/libqpdf/QPDFJob_config.cc @@ -338,21 +338,21 @@ QPDFJob::Config::normalizeContent(char const* parameter) QPDFJob::Config& QPDFJob::Config::oiMinArea(char const* parameter) { - o.oi_min_area = QUtil::string_to_uint(parameter); + o.m->oi_min_area = QUtil::string_to_uint(parameter); return *this; } QPDFJob::Config& QPDFJob::Config::oiMinHeight(char const* parameter) { - o.oi_min_height = QUtil::string_to_uint(parameter); + o.m->oi_min_height = QUtil::string_to_uint(parameter); return *this; } QPDFJob::Config& QPDFJob::Config::oiMinWidth(char const* parameter) { - o.oi_min_width = QUtil::string_to_uint(parameter); + o.m->oi_min_width = QUtil::string_to_uint(parameter); return *this; }