Commit 84cd53f5af72f8d1da5c6e73ebf7997243bf0b2c

Authored by Jay Berkenbilt
1 parent 9d7eef7c

Make page range optional in --rotate (fixes #211)

ChangeLog
1 2018-06-21 Jay Berkenbilt <ejb@ql.org> 1 2018-06-21 Jay Berkenbilt <ejb@ql.org>
2 2
  3 + * The --rotate option to qpdf no longer requires an explicit page
  4 + range. You can now rotate all pages of a document with
  5 + qpdf --rotate=angle in.pdf out.pdf. Fixes #211.
  6 +
3 * Create examples/pdf-set-form-values.cc to illustrate use of 7 * Create examples/pdf-set-form-values.cc to illustrate use of
4 interactive form helpers. 8 interactive form helpers.
5 9
manual/qpdf-manual.xml
@@ -412,22 +412,26 @@ make @@ -412,22 +412,26 @@ make
412 </listitem> 412 </listitem>
413 </varlistentry> 413 </varlistentry>
414 <varlistentry> 414 <varlistentry>
415 - <term><option>--rotate=[+|-]angle:page-range</option></term> 415 + <term><option>--rotate=[+|-]angle[:page-range]</option></term>
416 <listitem> 416 <listitem>
417 <para> 417 <para>
418 Apply rotation to specified pages. The 418 Apply rotation to specified pages. The
419 <option>page-range</option> portion of the option value has 419 <option>page-range</option> portion of the option value has
420 the same format as page ranges in <xref 420 the same format as page ranges in <xref
421 - linkend="ref.page-selection"/>. The <option>angle</option>  
422 - portion of the parameter may be either 90, 180, or 270. If  
423 - preceded by <option>+</option> or <option>-</option>, the  
424 - angle is added to or subtracted from the specified pages'  
425 - original rotations. Otherwise the pages' rotations are set to  
426 - the exact value. For example, the command <command>qpdf in.pdf  
427 - out.pdf --rotate=+90:2,4,6 --rotate=180:7-8</command> would  
428 - rotate pages 2, 4, and 6 90 degrees clockwise from their  
429 - original rotation and force the rotation of pages 7 through 9  
430 - to 180 degrees regardless of their original rotation. 421 + linkend="ref.page-selection"/>. If the page range is omitted,
  422 + the rotation is applied to all pages. The
  423 + <option>angle</option> portion of the parameter may be either
  424 + 90, 180, or 270. If preceded by <option>+</option> or
  425 + <option>-</option>, the angle is added to or subtracted from
  426 + the specified pages' original rotations. Otherwise the pages'
  427 + rotations are set to the exact value. For example, the command
  428 + <command>qpdf in.pdf out.pdf --rotate=+90:2,4,6
  429 + --rotate=180:7-8</command> would rotate pages 2, 4, and 6 90
  430 + degrees clockwise from their original rotation and force the
  431 + rotation of pages 7 through 9 to 180 degrees regardless of
  432 + their original rotation, and the command <command>qpdf in.pdf
  433 + out.pdf --rotate=180</command> would rotate all pages by 180
  434 + degrees.
431 </para> 435 </para>
432 </listitem> 436 </listitem>
433 </varlistentry> 437 </varlistentry>
qpdf/qpdf.cc
@@ -241,8 +241,9 @@ Basic Options\n\ @@ -241,8 +241,9 @@ Basic Options\n\
241 --decrypt remove any encryption on the file\n\ 241 --decrypt remove any encryption on the file\n\
242 --password-is-hex-key treat primary password option as a hex-encoded key\n\ 242 --password-is-hex-key treat primary password option as a hex-encoded key\n\
243 --pages options -- select specific pages from one or more files\n\ 243 --pages options -- select specific pages from one or more files\n\
244 ---rotate=[+|-]angle:page-range\n\  
245 - rotate each specified page 90, 180, or 270 degrees\n\ 244 +--rotate=[+|-]angle[:page-range]\n\
  245 + rotate each specified page 90, 180, or 270 degrees;\n\
  246 + rotate all pages if no page range is given\n\
246 --split-pages=[n] write each output page to a separate file\n\ 247 --split-pages=[n] write each output page to a separate file\n\
247 \n\ 248 \n\
248 Note that you can use the @filename or @- syntax for any argument at any\n\ 249 Note that you can use the @filename or @- syntax for any argument at any\n\
@@ -1303,25 +1304,33 @@ static void parse_rotation_parameter(Options&amp; o, std::string const&amp; parameter) @@ -1303,25 +1304,33 @@ static void parse_rotation_parameter(Options&amp; o, std::string const&amp; parameter)
1303 if (colon > 0) 1304 if (colon > 0)
1304 { 1305 {
1305 angle_str = parameter.substr(0, colon); 1306 angle_str = parameter.substr(0, colon);
1306 - if (angle_str.length() > 0)  
1307 - {  
1308 - char first = angle_str.at(0);  
1309 - if ((first == '+') || (first == '-'))  
1310 - {  
1311 - relative = ((first == '+') ? 1 : -1);  
1312 - angle_str = angle_str.substr(1);  
1313 - }  
1314 - else if (! QUtil::is_digit(angle_str.at(0)))  
1315 - {  
1316 - angle_str = "";  
1317 - }  
1318 - }  
1319 } 1307 }
1320 if (colon + 1 < parameter.length()) 1308 if (colon + 1 < parameter.length())
1321 { 1309 {
1322 range = parameter.substr(colon + 1); 1310 range = parameter.substr(colon + 1);
1323 } 1311 }
1324 } 1312 }
  1313 + else
  1314 + {
  1315 + angle_str = parameter;
  1316 + }
  1317 + if (angle_str.length() > 0)
  1318 + {
  1319 + char first = angle_str.at(0);
  1320 + if ((first == '+') || (first == '-'))
  1321 + {
  1322 + relative = ((first == '+') ? 1 : -1);
  1323 + angle_str = angle_str.substr(1);
  1324 + }
  1325 + else if (! QUtil::is_digit(angle_str.at(0)))
  1326 + {
  1327 + angle_str = "";
  1328 + }
  1329 + }
  1330 + if (range.empty())
  1331 + {
  1332 + range = "1-z";
  1333 + }
1325 bool range_valid = false; 1334 bool range_valid = false;
1326 try 1335 try
1327 { 1336 {
qpdf/qtest/qpdf.test
@@ -1124,7 +1124,7 @@ foreach my $d (@sp_cases) @@ -1124,7 +1124,7 @@ foreach my $d (@sp_cases)
1124 show_ntests(); 1124 show_ntests();
1125 # ---------- 1125 # ----------
1126 $td->notify("--- Rotate Pages ---"); 1126 $td->notify("--- Rotate Pages ---");
1127 -$n_tests += 2; 1127 +$n_tests += 4;
1128 # Do absolute, positive, and negative on ranges that include 1128 # Do absolute, positive, and negative on ranges that include
1129 # inherited and non-inherited. 1129 # inherited and non-inherited.
1130 # Pages 11-15 inherit /Rotate 90 1130 # Pages 11-15 inherit /Rotate 90
@@ -1141,6 +1141,14 @@ $td-&gt;runtest(&quot;check output&quot;, @@ -1141,6 +1141,14 @@ $td-&gt;runtest(&quot;check output&quot;,
1141 {$td->FILE => "a.pdf"}, 1141 {$td->FILE => "a.pdf"},
1142 {$td->FILE => "rotated.pdf"}); 1142 {$td->FILE => "rotated.pdf"});
1143 1143
  1144 +$td->runtest("rotate all pages",
  1145 + {$td->COMMAND =>
  1146 + "qpdf --static-id --rotate=180 minimal.pdf a.pdf"},
  1147 + {$td->STRING => "", $td->EXIT_STATUS => 0});
  1148 +$td->runtest("check output",
  1149 + {$td->FILE => "a.pdf"},
  1150 + {$td->FILE => "minimal-rotated.pdf"});
  1151 +
1144 show_ntests(); 1152 show_ntests();
1145 # ---------- 1153 # ----------
1146 $td->notify("--- Numeric range parsing tests ---"); 1154 $td->notify("--- Numeric range parsing tests ---");
qpdf/qtest/qpdf/minimal-rotated.pdf 0 → 100644
No preview for this file type