summaryrefslogtreecommitdiffstats
path: root/qpdf/qpdf.cc
diff options
context:
space:
mode:
Diffstat (limited to 'qpdf/qpdf.cc')
-rw-r--r--qpdf/qpdf.cc36
1 files changed, 36 insertions, 0 deletions
diff --git a/qpdf/qpdf.cc b/qpdf/qpdf.cc
index a0f7f7ea..a5eef425 100644
--- a/qpdf/qpdf.cc
+++ b/qpdf/qpdf.cc
@@ -13,6 +13,7 @@
#include <qpdf/Pl_Discard.hh>
#include <qpdf/Pl_DCT.hh>
#include <qpdf/Pl_Count.hh>
+#include <qpdf/Pl_Flate.hh>
#include <qpdf/PointerHolder.hh>
#include <qpdf/QPDF.hh>
@@ -124,6 +125,9 @@ struct Options
stream_data_mode(qpdf_s_compress),
compress_streams(true),
compress_streams_set(false),
+ recompress_flate(false),
+ recompress_flate_set(false),
+ compression_level(-1),
decode_level(qpdf_dl_generalized),
decode_level_set(false),
normalize_set(false),
@@ -217,6 +221,9 @@ struct Options
qpdf_stream_data_e stream_data_mode;
bool compress_streams;
bool compress_streams_set;
+ bool recompress_flate;
+ bool recompress_flate_set;
+ int compression_level;
qpdf_stream_decode_level_e decode_level;
bool decode_level_set;
bool normalize_set;
@@ -632,6 +639,8 @@ class ArgParser
void argCollate();
void argStreamData(char* parameter);
void argCompressStreams(char* parameter);
+ void argRecompressFlate();
+ void argCompressionLevel(char* parameter);
void argDecodeLevel(char* parameter);
void argNormalizeContent(char* parameter);
void argSuppressRecovery();
@@ -847,6 +856,9 @@ ArgParser::initOptionTable()
&ArgParser::argStreamData, stream_data_choices);
(*t)["compress-streams"] = oe_requiredChoices(
&ArgParser::argCompressStreams, yn);
+ (*t)["recompress-flate"] = oe_bare(&ArgParser::argRecompressFlate);
+ (*t)["compression-level"] = oe_requiredParameter(
+ &ArgParser::argCompressionLevel, "level");
char const* decode_level_choices[] =
{"none", "generalized", "specialized", "all", 0};
(*t)["decode-level"] = oe_requiredChoices(
@@ -1328,6 +1340,9 @@ ArgParser::argHelp()
<< "--stream-data=option controls transformation of stream data (below)\n"
<< "--compress-streams=[yn] controls whether to compress streams on output\n"
<< "--decode-level=option controls how to filter streams from the input\n"
+ << "--recompress-flate recompress streams already compressed with Flate\n"
+ << "--compression-level=n set zlib compression level; most effective with\n"
+ << " --recompress-flate --object-streams=generate\n"
<< "--normalize-content=[yn] enables or disables normalization of content streams\n"
<< "--object-streams=mode controls handing of object streams\n"
<< "--preserve-unreferenced preserve unreferenced objects\n"
@@ -1725,6 +1740,19 @@ ArgParser::argCompressStreams(char* parameter)
}
void
+ArgParser::argRecompressFlate()
+{
+ o.recompress_flate_set = true;
+ o.recompress_flate = true;
+}
+
+void
+ArgParser::argCompressionLevel(char* parameter)
+{
+ o.compression_level = QUtil::string_to_int(parameter);
+}
+
+void
ArgParser::argDecodeLevel(char* parameter)
{
o.decode_level_set = true;
@@ -4889,6 +4917,10 @@ static void set_encryption_options(QPDF& pdf, Options& o, QPDFWriter& w)
static void set_writer_options(QPDF& pdf, Options& o, QPDFWriter& w)
{
+ if (o.compression_level >= 0)
+ {
+ Pl_Flate::setCompressionLevel(o.compression_level);
+ }
if (o.qdf_mode)
{
w.setQDFMode(true);
@@ -4913,6 +4945,10 @@ static void set_writer_options(QPDF& pdf, Options& o, QPDFWriter& w)
{
w.setCompressStreams(o.compress_streams);
}
+ if (o.recompress_flate_set)
+ {
+ w.setRecompressFlate(o.recompress_flate);
+ }
if (o.decode_level_set)
{
w.setDecodeLevel(o.decode_level);