Commit 8d7bb3ff50943fa51ac1d968930bd23071376904

Authored by Jay Berkenbilt
1 parent 40f4b1ef

add methods for getting encryption data

git-svn-id: svn+q:///qpdf/trunk@733 71b93d88-0707-0410-a8cf-f5a4172ac649
Showing 58 changed files with 859 additions and 29 deletions
ChangeLog
1 1 2009-09-27 Jay Berkenbilt <ejb@ql.org>
2 2  
  3 + * Add several methods to query permissions controlled by the
  4 + encryption dictionary. Note that qpdf does not enforce these
  5 + permissions even though it allows the user to query them.
  6 +
3 7 * The function QPDF::getUserPassword returned the user password
4 8 with the required padding as specified by the PDF specification.
5 9 This is seldom useful to users. This function has been replaced
... ...
... ... @@ -12,8 +12,6 @@
12 12 Stefan Heinsen <stefan.heinsen@gmx.de> in August, 2009. He seems
13 13 to like to send encrypted mail. (key 01FCC336)
14 14  
15   - * Translate the encryption dictionary data to human-readable form
16   -
17 15 * Improve the error message generated when processing the broken
18 16 files...ideally we should provide the object number currently being
19 17 read
... ...
include/qpdf/QPDF.hh
... ... @@ -128,6 +128,29 @@ class QPDF
128 128 DLL_EXPORT
129 129 bool isEncrypted() const;
130 130  
  131 + DLL_EXPORT
  132 + bool isEncrypted(int& R, int& P);
  133 +
  134 + // Encryption permissions -- not enforced by QPDF
  135 + DLL_EXPORT
  136 + bool allowAccessibility();
  137 + DLL_EXPORT
  138 + bool allowExtractAll();
  139 + DLL_EXPORT
  140 + bool allowPrintLowRes();
  141 + DLL_EXPORT
  142 + bool allowPrintHighRes();
  143 + DLL_EXPORT
  144 + bool allowModifyAssembly();
  145 + DLL_EXPORT
  146 + bool allowModifyForm();
  147 + DLL_EXPORT
  148 + bool allowModifyAnnotation();
  149 + DLL_EXPORT
  150 + bool allowModifyOther();
  151 + DLL_EXPORT
  152 + bool allowModifyAll();
  153 +
131 154 // Helper function to trim padding from user password. Calling
132 155 // trim_user_password on the result of getPaddedUserPassword gives
133 156 // getTrimmedUserPassword's result.
... ...
include/qpdf/qpdf-c.h
... ... @@ -161,6 +161,25 @@ extern &quot;C&quot; {
161 161 DLL_EXPORT
162 162 QPDF_BOOL qpdf_is_encrypted(qpdf_data qpdf);
163 163  
  164 + DLL_EXPORT
  165 + QPDF_BOOL qpdf_allow_accessibility(qpdf_data qpdf);
  166 + DLL_EXPORT
  167 + QPDF_BOOL qpdf_allow_extract_all(qpdf_data qpdf);
  168 + DLL_EXPORT
  169 + QPDF_BOOL qpdf_allow_print_low_res(qpdf_data qpdf);
  170 + DLL_EXPORT
  171 + QPDF_BOOL qpdf_allow_print_high_res(qpdf_data qpdf);
  172 + DLL_EXPORT
  173 + QPDF_BOOL qpdf_allow_modify_assembly(qpdf_data qpdf);
  174 + DLL_EXPORT
  175 + QPDF_BOOL qpdf_allow_modify_form(qpdf_data qpdf);
  176 + DLL_EXPORT
  177 + QPDF_BOOL qpdf_allow_modify_annotation(qpdf_data qpdf);
  178 + DLL_EXPORT
  179 + QPDF_BOOL qpdf_allow_modify_other(qpdf_data qpdf);
  180 + DLL_EXPORT
  181 + QPDF_BOOL qpdf_allow_modify_all(qpdf_data qpdf);
  182 +
164 183 /* WRITE FUNCTIONS */
165 184  
166 185 /* Set up for writing. No writing is actually performed until the
... ...
libqpdf/QPDF_encryption.cc
... ... @@ -463,3 +463,185 @@ QPDF::isEncrypted() const
463 463 {
464 464 return this->encrypted;
465 465 }
  466 +
  467 +DLL_EXPORT
  468 +bool
  469 +QPDF::isEncrypted(int& R, int& P)
  470 +{
  471 + if (this->encrypted)
  472 + {
  473 + QPDFObjectHandle trailer = getTrailer();
  474 + QPDFObjectHandle encrypt = trailer.getKey("/Encrypt");
  475 + QPDFObjectHandle Pkey = encrypt.getKey("/P");
  476 + QPDFObjectHandle Rkey = encrypt.getKey("/R");
  477 + P = Pkey.getIntValue();
  478 + R = Rkey.getIntValue();
  479 + return true;
  480 + }
  481 + else
  482 + {
  483 + return false;
  484 + }
  485 +}
  486 +
  487 +static bool
  488 +is_bit_set(int P, int bit)
  489 +{
  490 + // Bits in P are numbered from 1 in the spec
  491 + return (P & (1 << (bit - 1)));
  492 +}
  493 +
  494 +DLL_EXPORT
  495 +bool
  496 +QPDF::allowAccessibility()
  497 +{
  498 + int R = 0;
  499 + int P = 0;
  500 + bool status = true;
  501 + if (isEncrypted(R, P))
  502 + {
  503 + if (R < 3)
  504 + {
  505 + status = is_bit_set(P, 5);
  506 + }
  507 + else
  508 + {
  509 + status = is_bit_set(P, 10);
  510 + }
  511 + }
  512 + return status;
  513 +}
  514 +
  515 +DLL_EXPORT
  516 +bool
  517 +QPDF::allowExtractAll()
  518 +{
  519 + int R = 0;
  520 + int P = 0;
  521 + bool status = true;
  522 + if (isEncrypted(R, P))
  523 + {
  524 + status = is_bit_set(P, 5);
  525 + }
  526 + return status;
  527 +}
  528 +
  529 +DLL_EXPORT
  530 +bool
  531 +QPDF::allowPrintLowRes()
  532 +{
  533 + int R = 0;
  534 + int P = 0;
  535 + bool status = true;
  536 + if (isEncrypted(R, P))
  537 + {
  538 + status = is_bit_set(P, 3);
  539 + }
  540 + return status;
  541 +}
  542 +
  543 +DLL_EXPORT
  544 +bool
  545 +QPDF::allowPrintHighRes()
  546 +{
  547 + int R = 0;
  548 + int P = 0;
  549 + bool status = true;
  550 + if (isEncrypted(R, P))
  551 + {
  552 + status = is_bit_set(P, 3);
  553 + if ((R >= 3) && (! is_bit_set(P, 12)))
  554 + {
  555 + status = false;
  556 + }
  557 + }
  558 + return status;
  559 +}
  560 +
  561 +DLL_EXPORT
  562 +bool
  563 +QPDF::allowModifyAssembly()
  564 +{
  565 + int R = 0;
  566 + int P = 0;
  567 + bool status = true;
  568 + if (isEncrypted(R, P))
  569 + {
  570 + if (R < 3)
  571 + {
  572 + status = is_bit_set(P, 4);
  573 + }
  574 + else
  575 + {
  576 + status = is_bit_set(P, 11);
  577 + }
  578 + }
  579 + return status;
  580 +}
  581 +
  582 +DLL_EXPORT
  583 +bool
  584 +QPDF::allowModifyForm()
  585 +{
  586 + int R = 0;
  587 + int P = 0;
  588 + bool status = true;
  589 + if (isEncrypted(R, P))
  590 + {
  591 + if (R < 3)
  592 + {
  593 + status = is_bit_set(P, 6);
  594 + }
  595 + else
  596 + {
  597 + status = is_bit_set(P, 9);
  598 + }
  599 + }
  600 + return status;
  601 +}
  602 +
  603 +DLL_EXPORT
  604 +bool
  605 +QPDF::allowModifyAnnotation()
  606 +{
  607 + int R = 0;
  608 + int P = 0;
  609 + bool status = true;
  610 + if (isEncrypted(R, P))
  611 + {
  612 + status = is_bit_set(P, 6);
  613 + }
  614 + return status;
  615 +}
  616 +
  617 +DLL_EXPORT
  618 +bool
  619 +QPDF::allowModifyOther()
  620 +{
  621 + int R = 0;
  622 + int P = 0;
  623 + bool status = true;
  624 + if (isEncrypted(R, P))
  625 + {
  626 + status = is_bit_set(P, 4);
  627 + }
  628 + return status;
  629 +}
  630 +
  631 +DLL_EXPORT
  632 +bool
  633 +QPDF::allowModifyAll()
  634 +{
  635 + int R = 0;
  636 + int P = 0;
  637 + bool status = true;
  638 + if (isEncrypted(R, P))
  639 + {
  640 + status = (is_bit_set(P, 4) && is_bit_set(P, 6));
  641 + if (R >= 3)
  642 + {
  643 + status = status && (is_bit_set(P, 9) && is_bit_set(P, 11));
  644 + }
  645 + }
  646 + return status;
  647 +}
... ...
libqpdf/qpdf-c.cc
... ... @@ -186,6 +186,69 @@ QPDF_BOOL qpdf_is_encrypted(qpdf_data qpdf)
186 186 }
187 187  
188 188 DLL_EXPORT
  189 +QPDF_BOOL qpdf_allow_accessibility(qpdf_data qpdf)
  190 +{
  191 + QTC::TC("qpdf", "qpdf-c called qpdf_allow_accessibility");
  192 + return qpdf->qpdf->allowAccessibility();
  193 +}
  194 +
  195 +DLL_EXPORT
  196 +QPDF_BOOL qpdf_allow_extract_all(qpdf_data qpdf)
  197 +{
  198 + QTC::TC("qpdf", "qpdf-c called qpdf_allow_extract_all");
  199 + return qpdf->qpdf->allowExtractAll();
  200 +}
  201 +
  202 +DLL_EXPORT
  203 +QPDF_BOOL qpdf_allow_print_low_res(qpdf_data qpdf)
  204 +{
  205 + QTC::TC("qpdf", "qpdf-c called qpdf_allow_print_low_res");
  206 + return qpdf->qpdf->allowPrintLowRes();
  207 +}
  208 +
  209 +DLL_EXPORT
  210 +QPDF_BOOL qpdf_allow_print_high_res(qpdf_data qpdf)
  211 +{
  212 + QTC::TC("qpdf", "qpdf-c called qpdf_allow_print_high_res");
  213 + return qpdf->qpdf->allowPrintHighRes();
  214 +}
  215 +
  216 +DLL_EXPORT
  217 +QPDF_BOOL qpdf_allow_modify_assembly(qpdf_data qpdf)
  218 +{
  219 + QTC::TC("qpdf", "qpdf-c called qpdf_allow_modify_assembly");
  220 + return qpdf->qpdf->allowModifyAssembly();
  221 +}
  222 +
  223 +DLL_EXPORT
  224 +QPDF_BOOL qpdf_allow_modify_form(qpdf_data qpdf)
  225 +{
  226 + QTC::TC("qpdf", "qpdf-c called qpdf_allow_modify_form");
  227 + return qpdf->qpdf->allowModifyForm();
  228 +}
  229 +
  230 +DLL_EXPORT
  231 +QPDF_BOOL qpdf_allow_modify_annotation(qpdf_data qpdf)
  232 +{
  233 + QTC::TC("qpdf", "qpdf-c called qpdf_allow_modify_annotation");
  234 + return qpdf->qpdf->allowModifyAnnotation();
  235 +}
  236 +
  237 +DLL_EXPORT
  238 +QPDF_BOOL qpdf_allow_modify_other(qpdf_data qpdf)
  239 +{
  240 + QTC::TC("qpdf", "qpdf-c called qpdf_allow_modify_other");
  241 + return qpdf->qpdf->allowModifyOther();
  242 +}
  243 +
  244 +DLL_EXPORT
  245 +QPDF_BOOL qpdf_allow_modify_all(qpdf_data qpdf)
  246 +{
  247 + QTC::TC("qpdf", "qpdf-c called qpdf_allow_modify_all");
  248 + return qpdf->qpdf->allowModifyAll();
  249 +}
  250 +
  251 +DLL_EXPORT
189 252 QPDF_ERROR_CODE qpdf_init_write(qpdf_data qpdf, char const* filename)
190 253 {
191 254 QPDF_ERROR_CODE status = QPDF_SUCCESS;
... ...
qpdf/qpdf-ctest.c
... ... @@ -29,6 +29,24 @@ static void test01(char const* infile,
29 29 if (qpdf_is_encrypted(qpdf))
30 30 {
31 31 printf("user password: %s\n", qpdf_get_user_password(qpdf));
  32 + printf("extract for accessibility: %d\n",
  33 + qpdf_allow_accessibility(qpdf));
  34 + printf("extract for any purpose: %d\n",
  35 + qpdf_allow_extract_all(qpdf));
  36 + printf("print low resolution: %d\n",
  37 + qpdf_allow_print_low_res(qpdf));
  38 + printf("print high resolution: %d\n",
  39 + qpdf_allow_print_high_res(qpdf));
  40 + printf("modify document assembly: %d\n",
  41 + qpdf_allow_modify_assembly(qpdf));
  42 + printf("modify forms: %d\n",
  43 + qpdf_allow_modify_form(qpdf));
  44 + printf("modify annotations: %d\n",
  45 + qpdf_allow_modify_annotation(qpdf));
  46 + printf("modify other: %d\n",
  47 + qpdf_allow_modify_other(qpdf));
  48 + printf("modify anything: %d\n",
  49 + qpdf_allow_modify_all(qpdf));
32 50 }
33 51 report_errors();
34 52 }
... ...
qpdf/qpdf.cc
... ... @@ -165,21 +165,44 @@ void usage(std::string const&amp; msg)
165 165 exit(EXIT_ERROR);
166 166 }
167 167  
  168 +static std::string show_bool(bool v)
  169 +{
  170 + return v ? "allowed" : "not allowed";
  171 +}
  172 +
168 173 static void show_encryption(QPDF& pdf)
169 174 {
170 175 // Extract /P from /Encrypt
171   - if (! pdf.isEncrypted())
  176 + int R = 0;
  177 + int P = 0;
  178 + if (! pdf.isEncrypted(R, P))
172 179 {
173 180 std::cout << "File is not encrypted" << std::endl;
174 181 }
175 182 else
176 183 {
177   - QPDFObjectHandle trailer = pdf.getTrailer();
178   - QPDFObjectHandle encrypt = trailer.getKey("/Encrypt");
179   - QPDFObjectHandle P = encrypt.getKey("/P");
180   - std::cout << "P = " << P.getIntValue() << std::endl;
  184 + std::cout << "R = " << R << std::endl;
  185 + std::cout << "P = " << P << std::endl;
181 186 std::string user_password = pdf.getTrimmedUserPassword();
182 187 std::cout << "User password = " << user_password << std::endl;
  188 + std::cout << "extract for accessibility: "
  189 + << show_bool(pdf.allowAccessibility()) << std::endl;
  190 + std::cout << "extract for any purpose: "
  191 + << show_bool(pdf.allowExtractAll()) << std::endl;
  192 + std::cout << "print low resolution: "
  193 + << show_bool(pdf.allowPrintLowRes()) << std::endl;
  194 + std::cout << "print high resolution: "
  195 + << show_bool(pdf.allowPrintHighRes()) << std::endl;
  196 + std::cout << "modify document assembly: "
  197 + << show_bool(pdf.allowModifyAssembly()) << std::endl;
  198 + std::cout << "modify forms: "
  199 + << show_bool(pdf.allowModifyForm()) << std::endl;
  200 + std::cout << "modify annotations: "
  201 + << show_bool(pdf.allowModifyAnnotation()) << std::endl;
  202 + std::cout << "modify other: "
  203 + << show_bool(pdf.allowModifyOther()) << std::endl;
  204 + std::cout << "modify anything: "
  205 + << show_bool(pdf.allowModifyAll()) << std::endl;
183 206 }
184 207 }
185 208  
... ...
qpdf/qpdf.testcov
... ... @@ -144,3 +144,12 @@ qpdf-c called qpdf_set_r2_encryption_parameters 0
144 144 qpdf-c called qpdf_set_r3_encryption_parameters 0
145 145 qpdf-c called qpdf_set_linearization 0
146 146 qpdf-c called qpdf_write 3
  147 +qpdf-c called qpdf_allow_accessibility 0
  148 +qpdf-c called qpdf_allow_extract_all 0
  149 +qpdf-c called qpdf_allow_print_low_res 0
  150 +qpdf-c called qpdf_allow_print_high_res 0
  151 +qpdf-c called qpdf_allow_modify_assembly 0
  152 +qpdf-c called qpdf_allow_modify_form 0
  153 +qpdf-c called qpdf_allow_modify_annotation 0
  154 +qpdf-c called qpdf_allow_modify_other 0
  155 +qpdf-c called qpdf_allow_modify_all 0
... ...
qpdf/qtest/qpdf.test
... ... @@ -683,33 +683,48 @@ $td-&gt;notify(&quot;--- Encryption Tests ---&quot;);
683 683 # resulting files were saved and manually checked with Acrobat 5.0 to
684 684 # ensure that the security settings were as intended.
685 685  
686   -# Values: basename, password, encryption flags, /P Encrypt key.
  686 +# Values: basename, password, encryption flags, /P Encrypt key,
  687 +# extract-for-accessibility, extract-for-any-purpose,
  688 +# print-low-res, print-high-res, modify-assembly, modify-forms,
  689 +# modify-annotate, modify-other, modify-all
687 690 my @encrypted_files =
688 691 (['base', ''],
689 692 ['R3,V2', '',
690   - '-accessibility=n -extract=n -print=full -modify=all', -532],
  693 + '-accessibility=n -extract=n -print=full -modify=all', -532,
  694 + 0, 0, 1, 1, 1, 1, 1, 1, 1],
691 695 ['R3,V2,U=view', 'view',
692   - '-accessibility=y -extract=n -print=none -modify=none', -3392],
  696 + '-accessibility=y -extract=n -print=none -modify=none', -3392,
  697 + 1, 0, 0, 0, 0, 0, 0, 0, 0],
693 698 ['R3,V2,O=master', 'master',
694   - '-accessibility=n -extract=y -print=none -modify=annotate', -2576],
  699 + '-accessibility=n -extract=y -print=none -modify=annotate', -2576,
  700 + 0, 1, 0, 0, 1, 1, 1, 0, 0],
695 701 ['R3,V2,O=master', '',
696   - '-accessibility=n -extract=n -print=none -modify=form', -2624],
  702 + '-accessibility=n -extract=n -print=none -modify=form', -2624,
  703 + 0, 0, 0, 0, 1, 1, 0, 0, 0],
697 704 ['R3,V2,U=view,O=master', 'view',
698   - '-accessibility=n -extract=n -print=none -modify=assembly', -2880],
  705 + '-accessibility=n -extract=n -print=none -modify=assembly', -2880,
  706 + 0, 0, 0, 0, 1, 0, 0, 0, 0],
699 707 ['R3,V2,U=view,O=master', 'master',
700   - '-accessibility=n -print=low', -2564],
  708 + '-accessibility=n -print=low', -2564,
  709 + 0, 1, 1, 0, 1, 1, 1, 1, 1],
701 710 ['R2,V1', '',
702   - '-print=n -modify=n -extract=n -annotate=n', -64],
  711 + '-print=n -modify=n -extract=n -annotate=n', -64,
  712 + 0, 0, 0, 0, 0, 0, 0, 0, 0],
703 713 ['R2,V1,U=view', 'view',
704   - '-print=y -modify=n -extract=n -annotate=n', -60],
  714 + '-print=y -modify=n -extract=n -annotate=n', -60,
  715 + 0, 0, 1, 1, 0, 0, 0, 0, 0],
705 716 ['R2,V1,O=master', 'master',
706   - '-print=n -modify=y -extract=n -annotate=n', -56],
  717 + '-print=n -modify=y -extract=n -annotate=n', -56,
  718 + 0, 0, 0, 0, 1, 0, 0, 1, 0],
707 719 ['R2,V1,O=master', '',
708   - '-print=n -modify=n -extract=y -annotate=n', -48],
  720 + '-print=n -modify=n -extract=y -annotate=n', -48,
  721 + 1, 1, 0, 0, 0, 0, 0, 0, 0],
709 722 ['R2,V1,U=view,O=master', 'view',
710   - '-print=n -modify=n -extract=n -annotate=y', -32],
  723 + '-print=n -modify=n -extract=n -annotate=y', -32,
  724 + 0, 0, 0, 0, 0, 1, 1, 0, 0],
711 725 ['R2,V1,U=view,O=master', 'master',
712   - '', -4],
  726 + '', -4,
  727 + 1, 1, 1, 1, 1, 1, 1, 1, 1],
713 728 ['long-password', 'asdf asdf asdf asdf asdf asdf qwer'],
714 729 ['long-password', 'asdf asdf asdf asdf asdf asdf qw']);
715 730  
... ... @@ -732,7 +747,23 @@ $td-&gt;runtest(&quot;recheck encrypted file&quot;,
732 747  
733 748 foreach my $d (@encrypted_files)
734 749 {
735   - my ($file, $pass, $xeflags, $P) = @$d;
  750 + my ($file, $pass, $xeflags, $P,
  751 + $accessible, $extract, $printlow, $printhigh,
  752 + $modifyassembly, $modifyform, $modifyannot,
  753 + $modifyother, $modifyall) = @$d;
  754 +
  755 + my $f = sub { $_[0] ? "allowed" : "not allowed" };
  756 + my $enc_details =
  757 + "extract for accessibility: " . &$f($accessible) . "\n" .
  758 + "extract for any purpose: " . &$f($extract) . "\n" .
  759 + "print low resolution: " . &$f($printlow) . "\n" .
  760 + "print high resolution: " . &$f($printhigh) . "\n" .
  761 + "modify document assembly: " . &$f($modifyassembly) . "\n" .
  762 + "modify forms: " . &$f($modifyform) . "\n" .
  763 + "modify annotations: " . &$f($modifyannot) . "\n" .
  764 + "modify other: " . &$f($modifyother) . "\n" .
  765 + "modify anything: " . &$f($modifyall) . "\n";
  766 +
736 767 # Test writing to stdout
737 768 $td->runtest("decrypt $file",
738 769 {$td->COMMAND =>
... ... @@ -776,8 +807,9 @@ foreach my $d (@encrypted_files)
776 807 {$td->COMMAND =>
777 808 "qpdf --show-encryption --password=\"$pass\"" .
778 809 " $file.enc2"},
779   - {$td->STRING => "P = $P\nUser password = $upass\n",
780   - $td->EXIT_STATUS => 0},
  810 + {$td->STRING => "R = $R\nP = $P\n" .
  811 + "User password = $upass\n$enc_details",
  812 + $td->EXIT_STATUS => 0},
781 813 $td->NORMALIZE_NEWLINES);
782 814 $td->runtest("decrypt again",
783 815 {$td->COMMAND =>
... ... @@ -799,8 +831,9 @@ foreach my $d (@encrypted_files)
799 831 {$td->COMMAND =>
800 832 "qpdf --show-encryption --password=\"$pass\"" .
801 833 " $file.enc4"},
802   - {$td->STRING => "P = $P\nUser password = $upass\n",
803   - $td->EXIT_STATUS => 0},
  834 + {$td->STRING => "R = $R\nP = $P\n" .
  835 + "User password = $upass\n$enc_details",
  836 + $td->EXIT_STATUS => 0},
804 837 $td->NORMALIZE_NEWLINES);
805 838 }
806 839 }
... ... @@ -828,8 +861,9 @@ $td-&gt;runtest(&quot;linearize encrypted file&quot;,
828 861 {$td->STRING => "",
829 862 $td->EXIT_STATUS => 0});
830 863 $td->runtest("check encryption",
831   - {$td->COMMAND => "qpdf --show-encryption a.pdf"},
832   - {$td->STRING => "P = -60\nUser password = \n",
  864 + {$td->COMMAND => "qpdf --show-encryption a.pdf",
  865 + $td->FILTER => "grep -v allowed"},
  866 + {$td->STRING => "R = 2\nP = -60\nUser password = \n",
833 867 $td->EXIT_STATUS => 0},
834 868 $td->NORMALIZE_NEWLINES);
835 869 $td->runtest("check linearization",
... ... @@ -844,8 +878,9 @@ $td-&gt;runtest(&quot;linearize and encrypt file&quot;,
844 878 {$td->STRING => "",
845 879 $td->EXIT_STATUS => 0});
846 880 $td->runtest("check encryption",
847   - {$td->COMMAND => "qpdf --show-encryption --password=owner a.pdf"},
848   - {$td->STRING => "P = -4\nUser password = user\n",
  881 + {$td->COMMAND => "qpdf --show-encryption --password=owner a.pdf",
  882 + $td->FILTER => "grep -v allowed"},
  883 + {$td->STRING => "R = 3\nP = -4\nUser password = user\n",
849 884 $td->EXIT_STATUS => 0},
850 885 $td->NORMALIZE_NEWLINES);
851 886 $td->runtest("check linearization",
... ...
qpdf/qtest/qpdf/U25A0.10-ogen.c-check
... ... @@ -2,3 +2,12 @@ version: 1.5
2 2 linearized: 0
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/U25A0.10-ogen.check
1 1 checking a.pdf
2 2 PDF Version: 1.5
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is not linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/U25A0.10.c-check
... ... @@ -2,3 +2,12 @@ version: 1.4
2 2 linearized: 0
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/U25A0.10.check
1 1 checking a.pdf
2 2 PDF Version: 1.4
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is not linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/U25A0.11-ogen.c-check
... ... @@ -2,3 +2,12 @@ version: 1.5
2 2 linearized: 1
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/U25A0.11-ogen.check
1 1 checking a.pdf
2 2 PDF Version: 1.5
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/U25A0.11.c-check
... ... @@ -2,3 +2,12 @@ version: 1.4
2 2 linearized: 1
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/U25A0.11.check
1 1 checking a.pdf
2 2 PDF Version: 1.4
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/U25A0.12-ogen.c-check
... ... @@ -2,3 +2,12 @@ version: 1.5
2 2 linearized: 0
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 0
  6 +extract for any purpose: 0
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 0
  10 +modify forms: 0
  11 +modify annotations: 0
  12 +modify other: 0
  13 +modify anything: 0
... ...
qpdf/qtest/qpdf/U25A0.12-ogen.check
1 1 checking a.pdf
2 2 PDF Version: 1.5
  3 +R = 2
3 4 P = -60
4 5 User password =
  6 +extract for accessibility: not allowed
  7 +extract for any purpose: not allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: not allowed
  11 +modify forms: not allowed
  12 +modify annotations: not allowed
  13 +modify other: not allowed
  14 +modify anything: not allowed
5 15 File is not linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/U25A0.12.c-check
... ... @@ -2,3 +2,12 @@ version: 1.3
2 2 linearized: 0
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 0
  6 +extract for any purpose: 0
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 0
  10 +modify forms: 0
  11 +modify annotations: 0
  12 +modify other: 0
  13 +modify anything: 0
... ...
qpdf/qtest/qpdf/U25A0.12.check
1 1 checking a.pdf
2 2 PDF Version: 1.3
  3 +R = 2
3 4 P = -60
4 5 User password =
  6 +extract for accessibility: not allowed
  7 +extract for any purpose: not allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: not allowed
  11 +modify forms: not allowed
  12 +modify annotations: not allowed
  13 +modify other: not allowed
  14 +modify anything: not allowed
5 15 File is not linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/U25A0.9-ogen.c-check
... ... @@ -2,3 +2,12 @@ version: 1.5
2 2 linearized: 1
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 0
  6 +extract for any purpose: 0
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 0
  10 +modify forms: 0
  11 +modify annotations: 0
  12 +modify other: 0
  13 +modify anything: 0
... ...
qpdf/qtest/qpdf/U25A0.9-ogen.check
1 1 checking a.pdf
2 2 PDF Version: 1.5
  3 +R = 2
3 4 P = -60
4 5 User password =
  6 +extract for accessibility: not allowed
  7 +extract for any purpose: not allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: not allowed
  11 +modify forms: not allowed
  12 +modify annotations: not allowed
  13 +modify other: not allowed
  14 +modify anything: not allowed
5 15 File is linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/U25A0.9.c-check
... ... @@ -2,3 +2,12 @@ version: 1.3
2 2 linearized: 1
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 0
  6 +extract for any purpose: 0
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 0
  10 +modify forms: 0
  11 +modify annotations: 0
  12 +modify other: 0
  13 +modify anything: 0
... ...
qpdf/qtest/qpdf/U25A0.9.check
1 1 checking a.pdf
2 2 PDF Version: 1.3
  3 +R = 2
3 4 P = -60
4 5 User password =
  6 +extract for accessibility: not allowed
  7 +extract for any purpose: not allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: not allowed
  11 +modify forms: not allowed
  12 +modify annotations: not allowed
  13 +modify other: not allowed
  14 +modify anything: not allowed
5 15 File is linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/hybrid-xref.10-ogen.c-check
... ... @@ -2,3 +2,12 @@ version: 1.5
2 2 linearized: 0
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/hybrid-xref.10-ogen.check
1 1 checking a.pdf
2 2 PDF Version: 1.5
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is not linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/hybrid-xref.10.c-check
... ... @@ -2,3 +2,12 @@ version: 1.5
2 2 linearized: 0
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/hybrid-xref.10.check
1 1 checking a.pdf
2 2 PDF Version: 1.5
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is not linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/hybrid-xref.11-ogen.c-check
... ... @@ -2,3 +2,12 @@ version: 1.5
2 2 linearized: 1
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/hybrid-xref.11-ogen.check
1 1 checking a.pdf
2 2 PDF Version: 1.5
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/hybrid-xref.11.c-check
... ... @@ -2,3 +2,12 @@ version: 1.5
2 2 linearized: 1
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/hybrid-xref.11.check
1 1 checking a.pdf
2 2 PDF Version: 1.5
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/inline-images.10-ogen.c-check
... ... @@ -2,3 +2,12 @@ version: 1.5
2 2 linearized: 0
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/inline-images.10-ogen.check
1 1 checking a.pdf
2 2 PDF Version: 1.5
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is not linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/inline-images.10.c-check
... ... @@ -2,3 +2,12 @@ version: 1.4
2 2 linearized: 0
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/inline-images.10.check
1 1 checking a.pdf
2 2 PDF Version: 1.4
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is not linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/inline-images.11-ogen.c-check
... ... @@ -2,3 +2,12 @@ version: 1.5
2 2 linearized: 1
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/inline-images.11-ogen.check
1 1 checking a.pdf
2 2 PDF Version: 1.5
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/inline-images.11.c-check
... ... @@ -2,3 +2,12 @@ version: 1.4
2 2 linearized: 1
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/inline-images.11.check
1 1 checking a.pdf
2 2 PDF Version: 1.4
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/lin-special.10-ogen.c-check
... ... @@ -2,3 +2,12 @@ version: 1.5
2 2 linearized: 0
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/lin-special.10-ogen.check
1 1 checking a.pdf
2 2 PDF Version: 1.5
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is not linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/lin-special.10.c-check
... ... @@ -2,3 +2,12 @@ version: 1.4
2 2 linearized: 0
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/lin-special.10.check
1 1 checking a.pdf
2 2 PDF Version: 1.4
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is not linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/lin-special.11-ogen.c-check
... ... @@ -2,3 +2,12 @@ version: 1.5
2 2 linearized: 1
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/lin-special.11-ogen.check
1 1 checking a.pdf
2 2 PDF Version: 1.5
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/lin-special.11.c-check
... ... @@ -2,3 +2,12 @@ version: 1.4
2 2 linearized: 1
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/lin-special.11.check
1 1 checking a.pdf
2 2 PDF Version: 1.4
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/object-stream.10-ogen.c-check
... ... @@ -2,3 +2,12 @@ version: 1.5
2 2 linearized: 0
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/object-stream.10-ogen.check
1 1 checking a.pdf
2 2 PDF Version: 1.5
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is not linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/object-stream.10.c-check
... ... @@ -2,3 +2,12 @@ version: 1.5
2 2 linearized: 0
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/object-stream.10.check
1 1 checking a.pdf
2 2 PDF Version: 1.5
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is not linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/object-stream.11-ogen.c-check
... ... @@ -2,3 +2,12 @@ version: 1.5
2 2 linearized: 1
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/object-stream.11-ogen.check
1 1 checking a.pdf
2 2 PDF Version: 1.5
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is linearized
6 16 No errors found
... ...
qpdf/qtest/qpdf/object-stream.11.c-check
... ... @@ -2,3 +2,12 @@ version: 1.5
2 2 linearized: 1
3 3 encrypted: 1
4 4 user password:
  5 +extract for accessibility: 1
  6 +extract for any purpose: 1
  7 +print low resolution: 1
  8 +print high resolution: 1
  9 +modify document assembly: 1
  10 +modify forms: 1
  11 +modify annotations: 1
  12 +modify other: 1
  13 +modify anything: 1
... ...
qpdf/qtest/qpdf/object-stream.11.check
1 1 checking a.pdf
2 2 PDF Version: 1.5
  3 +R = 3
3 4 P = -4
4 5 User password =
  6 +extract for accessibility: allowed
  7 +extract for any purpose: allowed
  8 +print low resolution: allowed
  9 +print high resolution: allowed
  10 +modify document assembly: allowed
  11 +modify forms: allowed
  12 +modify annotations: allowed
  13 +modify other: allowed
  14 +modify anything: allowed
5 15 File is linearized
6 16 No errors found
... ...