diff --git a/ChangeLog b/ChangeLog index 944d80b4..6ab197fc 100644 --- a/ChangeLog +++ b/ChangeLog @@ -1,5 +1,12 @@ 2019-04-20 Jay Berkenbilt + * Add parameter --remove-page-labels to remove page labels from + output. In qpdf 8.3.0, the behavior changed so that page labels + were preserved when merging and splitting files. Some users were + relying on the fact that if you ran qpdf --empty --pages ... all + page labels were dropped. This option makes it possible to get + that behavior if it is explicitly desired. Fixes #317. + * Add parameter --keep-files-open-threshold to override the maximum number of files that qpdf will allow to be kept open at once. Fixes #288. diff --git a/manual/qpdf-manual.xml b/manual/qpdf-manual.xml index 669fd42e..dac5f00d 100644 --- a/manual/qpdf-manual.xml +++ b/manual/qpdf-manual.xml @@ -1797,9 +1797,6 @@ outfile.pdf - - - @@ -1834,6 +1831,14 @@ outfile.pdf + + + + + Remove page labels from the output file. + + + diff --git a/qpdf/qpdf.cc b/qpdf/qpdf.cc index 3d80abac..495816c3 100644 --- a/qpdf/qpdf.cc +++ b/qpdf/qpdf.cc @@ -164,6 +164,7 @@ struct Options optimize_images(false), externalize_inline_images(false), keep_inline_images(false), + remove_page_labels(false), 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. @@ -261,6 +262,7 @@ struct Options bool optimize_images; 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; @@ -670,6 +672,7 @@ class ArgParser void argOptimizeImages(); void argExternalizeInlineImages(); void argKeepInlineImages(); + void argRemovePageLabels(); void argOiMinWidth(char* parameter); void argOiMinHeight(char* parameter); void argOiMinArea(char* parameter); @@ -911,6 +914,7 @@ ArgParser::initOptionTable() (*t)["externalize-inline-images"] = oe_bare(&ArgParser::argExternalizeInlineImages); (*t)["keep-inline-images"] = oe_bare(&ArgParser::argKeepInlineImages); + (*t)["remove-page-labels"] = oe_bare(&ArgParser::argRemovePageLabels); (*t)["oi-min-width"] = oe_requiredParameter( &ArgParser::argOiMinWidth, "minimum-width"); (*t)["oi-min-height"] = oe_requiredParameter( @@ -1335,6 +1339,7 @@ ArgParser::argHelp() << "--ii-min-bytes=bytes specify minimum size of inline images to be\n" << " converted to regular images\n" << "--keep-inline-images exclude inline images from image optimization\n" + << "--remove-page-labels remove any page labels present in the output file\n" << "--qdf turns on \"QDF mode\" (below)\n" << "--linearize-pass1=file write intermediate pass of linearized file\n" << " for debugging\n" @@ -2012,6 +2017,12 @@ ArgParser::argKeepInlineImages() o.keep_inline_images = true; } +void +ArgParser::argRemovePageLabels() +{ + o.remove_page_labels = true; +} + void ArgParser::argOiMinWidth(char* parameter) { @@ -4335,6 +4346,10 @@ static void handle_transformations(QPDF& pdf, Options& o) (*iter).coalesceContentStreams(); } } + if (o.remove_page_labels) + { + pdf.getRoot().removeKey("/PageLabels"); + } } static void handle_page_specs(QPDF& pdf, Options& o) diff --git a/qpdf/qtest/qpdf.test b/qpdf/qtest/qpdf.test index d01ac3af..6ee0ecfe 100644 --- a/qpdf/qtest/qpdf.test +++ b/qpdf/qtest/qpdf.test @@ -1877,7 +1877,7 @@ foreach my $f (qw(page_api_2 direct-pages)) show_ntests(); # ---------- $td->notify("--- Merging and Splitting ---"); -$n_tests += 22; +$n_tests += 24; # Select pages from the same file multiple times including selecting # twice from an encrypted file and specifying the password only the @@ -1944,6 +1944,18 @@ $td->runtest("merge with multiple labels", $td->runtest("check output", {$td->FILE => "a.pdf"}, {$td->FILE => "merge-multiple-labels.pdf"}); +$td->runtest("remove labels", + {$td->COMMAND => + "qpdf --empty a.pdf" . + " --remove-page-labels" . + " --pages 11-pages-with-labels.pdf 8-11" . + " minimal.pdf " . + " page-labels-and-outlines.pdf 17-19 --" . + " --static-id"}, + {$td->STRING => "", $td->EXIT_STATUS => 0}); +$td->runtest("check output", + {$td->FILE => "a.pdf"}, + {$td->FILE => "remove-labels.pdf"}); $td->runtest("split with shared resources", {$td->COMMAND => diff --git a/qpdf/qtest/qpdf/remove-labels.pdf b/qpdf/qtest/qpdf/remove-labels.pdf new file mode 100644 index 00000000..838f4cbb Binary files /dev/null and b/qpdf/qtest/qpdf/remove-labels.pdf differ