Commit e1271361c59085fc68d75e37faae99f4e595b73e
1 parent
0a3057dc
Add documentation for features since 8.3.0
Showing
2 changed files
with
460 additions
and
18 deletions
include/qpdf/QPDFWriter.hh
| ... | ... | @@ -343,6 +343,16 @@ class QPDFWriter |
| 343 | 343 | // setting R4 parameters pushes the version to at least 1.5, or if |
| 344 | 344 | // AES is used, 1.6, and setting R5 or R6 parameters pushes the |
| 345 | 345 | // version to at least 1.7 with extension level 3. |
| 346 | + // | |
| 347 | + // Note about Unicode passwords: the PDF specification requires | |
| 348 | + // passwords to be encoded with PDF Doc encoding for R <= 4 and | |
| 349 | + // UTF-8 for R >= 5. In all cases, these methods take strings of | |
| 350 | + // bytes as passwords. It is up to the caller to ensure that | |
| 351 | + // passwords are properly encoded. The qpdf command-line tool | |
| 352 | + // tries to do this, as discussed in the manual. If you are doing | |
| 353 | + // this from your own application, QUtil contains many transcoding | |
| 354 | + // functions that could be useful to you, most notably | |
| 355 | + // utf8_to_pdf_doc. | |
| 346 | 356 | QPDF_DLL |
| 347 | 357 | void setR3EncryptionParameters( |
| 348 | 358 | char const* user_password, char const* owner_password, | ... | ... |
manual/qpdf-manual.xml
| ... | ... | @@ -535,6 +535,83 @@ make |
| 535 | 535 | </listitem> |
| 536 | 536 | </varlistentry> |
| 537 | 537 | <varlistentry> |
| 538 | + <term><option>--suppress-password-recovery</option></term> | |
| 539 | + <listitem> | |
| 540 | + <para> | |
| 541 | + Ordinarily, qpdf attempts to automatically compensate for | |
| 542 | + passwords specified in the wrong character encoding. This | |
| 543 | + option suppresses that behavior. Under normal conditions, | |
| 544 | + there are no reasons to use this option. See <xref | |
| 545 | + linkend="ref.unicode-passwords"/> for a discussion | |
| 546 | + </para> | |
| 547 | + </listitem> | |
| 548 | + </varlistentry> | |
| 549 | + <varlistentry> | |
| 550 | + <term><option>--password-mode=<replaceable>mode</replaceable></option></term> | |
| 551 | + <listitem> | |
| 552 | + <para> | |
| 553 | + This option can be used to fine-tune how qpdf interprets | |
| 554 | + Unicode (non-ASCII) password strings passed on the command | |
| 555 | + line. With the exception of the <option>hex-bytes</option> | |
| 556 | + mode, these only apply to passwords provided when encrypting | |
| 557 | + files. The <option>hex-bytes</option> mode also applies to | |
| 558 | + passwords specified for reading files. For additional | |
| 559 | + discussion of the supported password modes and when you might | |
| 560 | + want to use them, see <xref linkend="ref.unicode-passwords"/>. | |
| 561 | + The following modes are supported: | |
| 562 | + <itemizedlist> | |
| 563 | + <listitem> | |
| 564 | + <para> | |
| 565 | + <option>auto</option>: Automatically determine whether the | |
| 566 | + specified password is a properly encoded Unicode (UTF-8) | |
| 567 | + string, and transcode it as required by the PDF spec based | |
| 568 | + on the type encryption being applied. On Windows starting | |
| 569 | + with version 8.4.0, and on almost all other modern | |
| 570 | + platforms, incoming passwords will be properly encoded in | |
| 571 | + UTF-8, so this is almost always what you want. | |
| 572 | + </para> | |
| 573 | + </listitem> | |
| 574 | + <listitem> | |
| 575 | + <para> | |
| 576 | + <option>unicode</option>: Tells qpdf that the incoming | |
| 577 | + password is UTF-8, overriding whatever its automatic | |
| 578 | + detection determines. The only difference between this mode | |
| 579 | + and <option>auto</option> is that qpdf will fail with an | |
| 580 | + error message if the password is not valid UTF-8 instead of | |
| 581 | + falling back to <option>bytes</option> mode with a warning. | |
| 582 | + </para> | |
| 583 | + </listitem> | |
| 584 | + <listitem> | |
| 585 | + <para> | |
| 586 | + <option>bytes</option>: Interpret the password as a literal | |
| 587 | + byte string. For non-Windows platforms, this is what | |
| 588 | + versions of qpdf prior to 8.4.0 did. For Windows platforms, | |
| 589 | + there is no way to specify strings of binary data on the | |
| 590 | + command line directly, but you can use the | |
| 591 | + <option>@filename</option> option to do it, in which case | |
| 592 | + this option forces qpdf to respect the string of bytes as | |
| 593 | + provided. This option will allow you to encrypt PDF files | |
| 594 | + with passwords that will not be usable by other readers. | |
| 595 | + </para> | |
| 596 | + </listitem> | |
| 597 | + <listitem> | |
| 598 | + <para> | |
| 599 | + <option>hex-bytes</option>: Interpret the password as a | |
| 600 | + hex-encoded string. This provides a way to pass binary data | |
| 601 | + as a password on all platforms including Windows. As with | |
| 602 | + <option>bytes</option>, this option may allow creation of | |
| 603 | + files that can't be opened by other readers. This mode | |
| 604 | + affects qpdf's interpretation of passwords specified for | |
| 605 | + decrypting files as well as for encrypting them. It makes | |
| 606 | + it possible to specify strings that are encoded in some | |
| 607 | + manner other than the system's default encoding. | |
| 608 | + </para> | |
| 609 | + </listitem> | |
| 610 | + </itemizedlist> | |
| 611 | + </para> | |
| 612 | + </listitem> | |
| 613 | + </varlistentry> | |
| 614 | + <varlistentry> | |
| 538 | 615 | <term><option>--rotate=[+|-]angle[:page-range]</option></term> |
| 539 | 616 | <listitem> |
| 540 | 617 | <para> |
| ... | ... | @@ -699,22 +776,17 @@ make |
| 699 | 776 | producers. |
| 700 | 777 | </para> |
| 701 | 778 | <para> |
| 702 | - In all cases where qpdf allows specification of a password, care | |
| 703 | - must be taken if the password contains characters that fall | |
| 704 | - outside of the 7-bit US-ASCII character range to ensure that the | |
| 705 | - exact correct byte sequence is provided. It is possible that a | |
| 706 | - future version of qpdf may handle this more gracefully. For | |
| 707 | - example, if a password was encrypted using a password that was | |
| 708 | - encoded in ISO-8859-1 and your terminal is configured to use | |
| 709 | - UTF-8, the password you supply may not work properly. There are | |
| 710 | - various approaches to handling this. For example, if you are | |
| 711 | - using Linux and have the iconv executable installed, you could | |
| 712 | - pass <option>--password=`echo <replaceable>password</replaceable> | |
| 713 | - | iconv -t iso-8859-1`</option> to qpdf where | |
| 714 | - <replaceable>password</replaceable> is a password specified in | |
| 715 | - your terminal's locale. A detailed discussion of this is out of | |
| 716 | - scope for this manual, but just be aware of this issue if you have | |
| 717 | - trouble with a password that contains 8-bit characters. | |
| 779 | + Prior to 8.4.0, in the case of passwords that contain characters | |
| 780 | + that fall outside of 7-bit US-ASCII, qpdf left the burden of | |
| 781 | + supplying properly encoded encryption and decryption passwords to | |
| 782 | + the user. Starting in qpdf 8.4.0, qpdf does this automatically in | |
| 783 | + most cases. For an in-depth discussion, please see <xref | |
| 784 | + linkend="ref.unicode-passwords"/>. Previous versions of this | |
| 785 | + manual described workarounds using the <command>iconv</command> | |
| 786 | + command. Such workarounds are no longer required or recommended | |
| 787 | + with qpdf 8.4.0. However, for backward compatibility, qpdf | |
| 788 | + attempts to detect those workarounds and do the right thing in | |
| 789 | + most cases. | |
| 718 | 790 | </para> |
| 719 | 791 | </sect1> |
| 720 | 792 | <sect1 id="ref.encryption-options"> |
| ... | ... | @@ -2024,6 +2096,121 @@ outfile.pdf</option> |
| 2024 | 2096 | content stream, in which case it will produce unusable results. |
| 2025 | 2097 | </para> |
| 2026 | 2098 | </sect1> |
| 2099 | + <sect1 id="ref.unicode-passwords"> | |
| 2100 | + <title>Unicode Passwords</title> | |
| 2101 | + <para> | |
| 2102 | + At the library API level, all methods that perform encryption and | |
| 2103 | + decryption interpret passwords as strings of bytes. It is up to | |
| 2104 | + the caller to ensure that they are appropriately encoded. Starting | |
| 2105 | + with qpdf version 8.4.0, qpdf will attempt to make this easier for | |
| 2106 | + you when interact with qpdf via its command line interface. The | |
| 2107 | + PDF specification requires passwords used to encrypt files with | |
| 2108 | + 40-bit or 128-bit encryption to be encoded with PDF Doc encoding. | |
| 2109 | + This encoding is a single-byte encoding that supports ISO-Latin-1 | |
| 2110 | + and a handful of other commonly used characters. It has a large | |
| 2111 | + overlap with Windows ANSI but is not exactly the same. There is | |
| 2112 | + generally not a way to provide PDF Doc encoded strings on the | |
| 2113 | + command line. As such, qpdf versions prior to 8.4.0 would often | |
| 2114 | + create PDF files that couldn't be opened with other software when | |
| 2115 | + given a password with non-ASCII characters to encrypt a file with | |
| 2116 | + 40-bit or 128-bit encryption. Starting with qpdf 8.4.0, qpdf | |
| 2117 | + recognizes the encoding of the parameter and transcodes it as | |
| 2118 | + needed. The rest of this section provides the details about | |
| 2119 | + exactly how qpdf behaves. Most users will not need to know this | |
| 2120 | + information, but it might be useful if you have been working | |
| 2121 | + around qpdf's old behavior or if you are using qpdf to generate | |
| 2122 | + encrypted files for testing other PDF software. | |
| 2123 | + </para> | |
| 2124 | + <para> | |
| 2125 | + A note about Windows: when qpdf builds, it attempts to determine | |
| 2126 | + what it has to do to use <function>wmain</function> instead of | |
| 2127 | + <function>main</function> on Windows. The | |
| 2128 | + <function>wmain</function> function is an alternative entry point | |
| 2129 | + that receives all arguments as UTF-16-encoded strings. When qpdf | |
| 2130 | + starts up this way, it converts all the strings to UTF-8 encoding | |
| 2131 | + and then invokes the regular main. This means that, as far as qpdf | |
| 2132 | + is concerned, it receives its command-line arguments with UTF-8 | |
| 2133 | + encoding, just as it would in any modern Linux or UNIX | |
| 2134 | + environment. | |
| 2135 | + </para> | |
| 2136 | + <para> | |
| 2137 | + If a file is being encrypted with 40-bit or 128-bit encryption and | |
| 2138 | + the supplied password is not a valid UTF-8 string, qpdf will fall | |
| 2139 | + back to the behavior of interpreting the password as a string of | |
| 2140 | + bytes. If you have old scripts that encrypt files by passing the | |
| 2141 | + output of <command>iconv</command> to qpdf, you no longer need to | |
| 2142 | + do that, but if you do, qpdf should still work. The only exception | |
| 2143 | + would be for the extremely unlikely case of a password that is | |
| 2144 | + encoded with a single-byte encoding but also happens to be valid | |
| 2145 | + UTF-8. Such a password would contain strings of even numbers of | |
| 2146 | + characters that alternate between accented letters and symbols. In | |
| 2147 | + the extremely unlikely event that you are intentionally using such | |
| 2148 | + passwords and qpdf is thwarting you by interpreting them as UTF-8, | |
| 2149 | + you can use <option>--password-mode=bytes</option> to suppress | |
| 2150 | + qpdf's automatic behavior. | |
| 2151 | + </para> | |
| 2152 | + <para> | |
| 2153 | + The <option>--password-mode</option> option, as described earlier | |
| 2154 | + in this chapter, can be used to change qpdf's interpretation of | |
| 2155 | + supplied passwords. There are very few reasons to use this option. | |
| 2156 | + One would be the unlikely case described in the previous paragraph | |
| 2157 | + in which the supplied password happens to be valid UTF-8 but isn't | |
| 2158 | + supposed to be UTF-8. Your best bet would be just to provide the | |
| 2159 | + password as a valid UTF-8 string, but you could also use | |
| 2160 | + <option>--password-mode=bytes</option>. Another reason to use | |
| 2161 | + <option>--password-mode=bytes</option> would be to intentionally | |
| 2162 | + generate PDF files encrypted with passwords that are not properly | |
| 2163 | + encoded. The qpdf test suite does this to generate invalid files | |
| 2164 | + for the purpose of testing its password recovery capability. If | |
| 2165 | + you were trying to create intentionally incorrect files for a | |
| 2166 | + similar purposes, the <option>bytes</option> password mode can | |
| 2167 | + enable you to do this. | |
| 2168 | + </para> | |
| 2169 | + <para> | |
| 2170 | + When qpdf attempts to decrypt a file with a password that contains | |
| 2171 | + non-ASCII characters, it will generate a list of alternative | |
| 2172 | + passwords by attempting to interpret the password as each of a | |
| 2173 | + handful of different coding systems and then transcode them to the | |
| 2174 | + required format. This helps to compensate for the supplied | |
| 2175 | + password being given in the wrong coding system, such as would | |
| 2176 | + happen if you used the <command>iconv</command> workaround that | |
| 2177 | + was previously needed. It also generates passwords by doing the | |
| 2178 | + reverse operation: translating from correct in incorrect encoding | |
| 2179 | + of the password. This would enable qpdf to decrypt files using | |
| 2180 | + passwords that were improperly encoded by whatever software | |
| 2181 | + encrypted the files, including older versions of qpdf invoked | |
| 2182 | + without properly encoded passwords. The combination of these two | |
| 2183 | + recovery methods should make qpdf transparently open most | |
| 2184 | + encrypted files with the password supplied correctly but in the | |
| 2185 | + wrong coding system. There are no real downsides to this behavior, | |
| 2186 | + but if you don't want qpdf to do this, you can use the | |
| 2187 | + <option>--suppress-password-recovery</option> option. One reason | |
| 2188 | + to do that is to ensure that you know the exact password that was | |
| 2189 | + used to encrypt the file. | |
| 2190 | + </para> | |
| 2191 | + <para> | |
| 2192 | + With these changes, qpdf now generates compliant passwords in most | |
| 2193 | + cases. There are still some exceptions. In particular, the PDF | |
| 2194 | + specification directs compliant writers to normalize Unicode | |
| 2195 | + passwords and to perform certain transformations on passwords with | |
| 2196 | + bidirectional text. Implementing this functionality requires using | |
| 2197 | + a real Unicode library like ICU. If a client application that uses | |
| 2198 | + qpdf wants to do this, the qpdf library will accept the resulting | |
| 2199 | + passwords, but qpdf will not perform these transformations itself. | |
| 2200 | + It is possible that this will be addressed in a future version of | |
| 2201 | + qpdf. The <classname>QPDFWriter</classname> methods that enable | |
| 2202 | + encryption on the output file accept passwords as strings of | |
| 2203 | + bytes. | |
| 2204 | + </para> | |
| 2205 | + <para> | |
| 2206 | + Please note that the <option>--password-is-hex-key</option> option | |
| 2207 | + is unrelated to all this. This flag bypasses the normal process of | |
| 2208 | + going from password to encryption string entirely, allowing the | |
| 2209 | + raw encryption key to be specified directly. This is useful for | |
| 2210 | + forensic purposes or for brute-force recovery of files with | |
| 2211 | + unknown passwords. | |
| 2212 | + </para> | |
| 2213 | + </sect1> | |
| 2027 | 2214 | </chapter> |
| 2028 | 2215 | <chapter id="ref.qdf"> |
| 2029 | 2216 | <title>QDF Mode</title> |
| ... | ... | @@ -3975,6 +4162,253 @@ print "\n"; |
| 3975 | 4162 | </para> |
| 3976 | 4163 | <variablelist> |
| 3977 | 4164 | <varlistentry> |
| 4165 | + <term>8.4.0: XXX, 2019</term> | |
| 4166 | + <listitem> | |
| 4167 | + <itemizedlist> | |
| 4168 | + <listitem> | |
| 4169 | + <para> | |
| 4170 | + Command-line Enhancements | |
| 4171 | + </para> | |
| 4172 | + <itemizedlist> | |
| 4173 | + <listitem> | |
| 4174 | + <para> | |
| 4175 | + <emphasis>Non-compatible CLI change:</emphasis> The qpdf | |
| 4176 | + command-line tool interprets passwords given at the | |
| 4177 | + command-line differently from previous releases when the | |
| 4178 | + passwords contain non-ASCII characters. In some cases, the | |
| 4179 | + behavior differs from previous releases. For a discussion of | |
| 4180 | + the current behavior, please see <xref | |
| 4181 | + linkend="ref.unicode-passwords"/>. The incompatibilities are | |
| 4182 | + as follows: | |
| 4183 | + <itemizedlist> | |
| 4184 | + <listitem> | |
| 4185 | + <para> | |
| 4186 | + On Windows, qpdf now receives all command-line options as | |
| 4187 | + Unicode strings if it can figure out the appropriate | |
| 4188 | + compile/link options. This is enabled at least for MSVC | |
| 4189 | + and mingw builds. That means that if non-ASCII strings | |
| 4190 | + are passed to the qpdf CLI in Windows, qpdf will now | |
| 4191 | + correctly receive them. In the past, they would have | |
| 4192 | + either been encoded as Windows code page 1252 (also known | |
| 4193 | + as “Windows ANSI” or as something | |
| 4194 | + unintelligble. In almost all cases, qpdf is able to | |
| 4195 | + properly interpret Unicode arguments now, whereas in the | |
| 4196 | + past, it would almost never interpret them properly. The | |
| 4197 | + result is that non-ASCII passwords given to the qpdf CLI | |
| 4198 | + on Windows now have a much greater chance of creating PDF | |
| 4199 | + files that can be opened by a variety of readers. In the | |
| 4200 | + past, usually files encrypted from the Windows CLI using | |
| 4201 | + non-ASCII passwords would not be readable by most | |
| 4202 | + viewers. Note that the current version of qpdf is able to | |
| 4203 | + decrypt files that it previously created using the | |
| 4204 | + previously supplied password. | |
| 4205 | + </para> | |
| 4206 | + </listitem> | |
| 4207 | + <listitem> | |
| 4208 | + <para> | |
| 4209 | + The PDF specification requires passwords to be encoded as | |
| 4210 | + UTF-8 for 256-bit encryption and with PDF Doc encoding | |
| 4211 | + for 40-bit or 128-bit encryption. Older versions of qpdf | |
| 4212 | + left it up to the user to provide passwords with the | |
| 4213 | + correct encoding. The qpdf CLI now detects when a | |
| 4214 | + password is given with UTF-8 encoding and automatically | |
| 4215 | + transcodes it to what the PDF spec requires. While this | |
| 4216 | + is almost always the correct behavior, it is possible to | |
| 4217 | + override the behavior if there is some reason to do so. | |
| 4218 | + This is discussed in more depth in <xref | |
| 4219 | + linkend="ref.unicode-passwords"/>. | |
| 4220 | + </para> | |
| 4221 | + </listitem> | |
| 4222 | + </itemizedlist> | |
| 4223 | + </para> | |
| 4224 | + </listitem> | |
| 4225 | + <listitem> | |
| 4226 | + <para> | |
| 4227 | + When opening an encrypted file with a password, if the | |
| 4228 | + specified password doesn't work and the password contains | |
| 4229 | + any non-ASCII characters, qpdf will try a number of | |
| 4230 | + alternative passwords to try to compensate for possible | |
| 4231 | + character encoding errors. This behavior can be suppressed | |
| 4232 | + with the <option>--suppress-password-recovery</option> | |
| 4233 | + option. See <xref linkend="ref.unicode-passwords"/> for a | |
| 4234 | + full discussion. | |
| 4235 | + </para> | |
| 4236 | + </listitem> | |
| 4237 | + <listitem> | |
| 4238 | + <para> | |
| 4239 | + Add the <option>--password-mode</option> option to fine-tune | |
| 4240 | + how qpdf interprets password arguments, especially when they | |
| 4241 | + contain non-ASCII characters. See <xref | |
| 4242 | + linkend="ref.unicode-passwords"/> for more information. | |
| 4243 | + </para> | |
| 4244 | + </listitem> | |
| 4245 | + <listitem> | |
| 4246 | + <para> | |
| 4247 | + In the <option>--pages</option> option, it is now possible | |
| 4248 | + to copy the same page more than once from the same file | |
| 4249 | + without using the previous workaround of specifying two | |
| 4250 | + different paths to the same file. | |
| 4251 | + </para> | |
| 4252 | + </listitem> | |
| 4253 | + <listitem> | |
| 4254 | + <para> | |
| 4255 | + In the <option>--pages</option> option, allow use of | |
| 4256 | + “.” as a shortcut for the primary input file. | |
| 4257 | + That way, you can do <command>qpdf in.pdf --pages . 1-2 -- | |
| 4258 | + out.pdf</command> instead of having to repeat | |
| 4259 | + <filename>in.pdf</filename> in the command. | |
| 4260 | + </para> | |
| 4261 | + </listitem> | |
| 4262 | + <listitem> | |
| 4263 | + <para> | |
| 4264 | + When encrypting with 128-bit and 256-bit encryption, new | |
| 4265 | + encryption options <option>--assemble</option>, | |
| 4266 | + <option>--annotate</option>, <option>--form</option>, and | |
| 4267 | + <option>--modify-other</option> allow more fine-grained | |
| 4268 | + granluarity in configuring options. Before, the | |
| 4269 | + <option>--modify</option> option only configured certain | |
| 4270 | + predefined groups of permissions. | |
| 4271 | + </para> | |
| 4272 | + </listitem> | |
| 4273 | + </itemizedlist> | |
| 4274 | + </listitem> | |
| 4275 | + <listitem> | |
| 4276 | + <para> | |
| 4277 | + Bug Fixes and Enhancements | |
| 4278 | + </para> | |
| 4279 | + <itemizedlist> | |
| 4280 | + <listitem> | |
| 4281 | + <para> | |
| 4282 | + <emphasis>Potential data-loss bug:</emphasis> Versions of | |
| 4283 | + qpdf between 8.1.0 and 8.3.0 had a bug that could cause page | |
| 4284 | + splitting and merging operations to drop some font or image | |
| 4285 | + resources if the PDF file's internal structure shared these | |
| 4286 | + resource lists across pages and if some but not all of the | |
| 4287 | + pages in the output did not reference all the fonts and | |
| 4288 | + images. Using the | |
| 4289 | + <option>--preserve-unreferenced-resources</option> option | |
| 4290 | + would work around the incorrect behavior. This bug was the | |
| 4291 | + result of a typo in the code and a deficiency in the test | |
| 4292 | + suite. The case that triggered the error was known, just not | |
| 4293 | + handled properly. This case is now exercised in qpdf's test | |
| 4294 | + suite and properly handled. | |
| 4295 | + </para> | |
| 4296 | + </listitem> | |
| 4297 | + </itemizedlist> | |
| 4298 | + </listitem> | |
| 4299 | + <listitem> | |
| 4300 | + <para> | |
| 4301 | + Library Enhancements | |
| 4302 | + </para> | |
| 4303 | + <itemizedlist> | |
| 4304 | + <listitem> | |
| 4305 | + <para> | |
| 4306 | + Add method | |
| 4307 | + <function>QUtil::possible_repaired_encodings()</function> to | |
| 4308 | + generate a list of strings that represent other ways the | |
| 4309 | + given string could have been encoded. This is the method the | |
| 4310 | + QPDF CLI uses to generate the strings it tries when | |
| 4311 | + recovering incorrectly encoded Unicode passwords. | |
| 4312 | + </para> | |
| 4313 | + </listitem> | |
| 4314 | + <listitem> | |
| 4315 | + <para> | |
| 4316 | + Add new versions of | |
| 4317 | + <function>QPDFWriter::setR{3,4,5,6}EncryptionParameters</function> | |
| 4318 | + that allow more granular setting of permissions bits. See | |
| 4319 | + <filename>QPDFWriter.hh</filename> for details. | |
| 4320 | + </para> | |
| 4321 | + </listitem> | |
| 4322 | + <listitem> | |
| 4323 | + <para> | |
| 4324 | + Add new versions of the transcoders from UTF-8 to | |
| 4325 | + single-byte coding systems in <classname>QUtil</classname> | |
| 4326 | + that report success or failure rather than just substituting | |
| 4327 | + a specified unknown character. | |
| 4328 | + </para> | |
| 4329 | + </listitem> | |
| 4330 | + <listitem> | |
| 4331 | + <para> | |
| 4332 | + Add method <function>QUtil::analyze_encoding()</function> to | |
| 4333 | + determine whether a string has high-bit characters and is | |
| 4334 | + appears to be UTF-16 or valid UTF-8 encoding. | |
| 4335 | + </para> | |
| 4336 | + </listitem> | |
| 4337 | + <listitem> | |
| 4338 | + <para> | |
| 4339 | + Add new method | |
| 4340 | + <function>QPDFPageObjectHelper::shallowCopyPage()</function> | |
| 4341 | + to copy a new page that is a “shallow copy” of a | |
| 4342 | + page. The resulting object is an indirect object ready to be | |
| 4343 | + passed to | |
| 4344 | + <function>QPDFPageDocumentHelper::addPage()</function> for | |
| 4345 | + either the original <classname>QPDF</classname> object or a | |
| 4346 | + different one. This is what the <command>qpdf</command> | |
| 4347 | + command-line tool uses to copy the same page multiple times | |
| 4348 | + from the same file during splitting and merging operations. | |
| 4349 | + </para> | |
| 4350 | + </listitem> | |
| 4351 | + <listitem> | |
| 4352 | + <para> | |
| 4353 | + Add method <function>QPDF::getUniqueId()</function>, which | |
| 4354 | + returns a unique identifier for the given QPDF object. The | |
| 4355 | + identifier will be unique across the life of the | |
| 4356 | + application. The returned value can be safely used as a map | |
| 4357 | + key. | |
| 4358 | + </para> | |
| 4359 | + </listitem> | |
| 4360 | + <listitem> | |
| 4361 | + <para> | |
| 4362 | + Add method <function>QPDF::setImmediateCopyFrom</function>. | |
| 4363 | + This further enhances qpdf's ability to allow a | |
| 4364 | + <classname>QPDF</classname> object from which objects are | |
| 4365 | + being copied to go out of scope before the destination | |
| 4366 | + object is written. If you call this method on a | |
| 4367 | + <classname>QPDF</classname> instances, objects copied | |
| 4368 | + <emphasis>from</emphasis> this instance will be copied | |
| 4369 | + immediately instead of lazily. This option uses more memory | |
| 4370 | + but allows the source object to go out of scope before the | |
| 4371 | + destination object is written in all cases. See comments in | |
| 4372 | + <filename>QPDF.hh</filename> for details. | |
| 4373 | + </para> | |
| 4374 | + </listitem> | |
| 4375 | + </itemizedlist> | |
| 4376 | + </listitem> | |
| 4377 | + <listitem> | |
| 4378 | + <para> | |
| 4379 | + Build Improvements | |
| 4380 | + </para> | |
| 4381 | + <itemizedlist> | |
| 4382 | + <listitem> | |
| 4383 | + <para> | |
| 4384 | + Add new configure option | |
| 4385 | + <option>--enable-avoid-windows-handle</option>, which causes | |
| 4386 | + the preprocessor symbol | |
| 4387 | + <literal>AVOID_WINDOWS_HANDLE</literal> to be defined. When | |
| 4388 | + defined, qpdf will avoid referencing the Windows | |
| 4389 | + <classname>HANDLE</classname> type, which is disallowed with | |
| 4390 | + certain versions of the Windows SDK. | |
| 4391 | + </para> | |
| 4392 | + </listitem> | |
| 4393 | + <listitem> | |
| 4394 | + <para> | |
| 4395 | + For Windows builds, attempt to determine what options, if | |
| 4396 | + any, have to be passed to the compiler and linker to enable | |
| 4397 | + use of <function>wmain</function>. This causes the | |
| 4398 | + preprocessor symbol <literal>WINDOWS_WMAIN</literal> to be | |
| 4399 | + defined. If you do your own builds with other compilers, you | |
| 4400 | + can define this symbol to cause <function>wmain</function> | |
| 4401 | + to be used. This is needed to allow the Windows | |
| 4402 | + <command>qpdf</command> command to receive Unicode | |
| 4403 | + command-line options. | |
| 4404 | + </para> | |
| 4405 | + </listitem> | |
| 4406 | + </itemizedlist> | |
| 4407 | + </listitem> | |
| 4408 | + </itemizedlist> | |
| 4409 | + </listitem> | |
| 4410 | + </varlistentry> | |
| 4411 | + <varlistentry> | |
| 3978 | 4412 | <term>8.3.0: January 7, 2019</term> |
| 3979 | 4413 | <listitem> |
| 3980 | 4414 | <itemizedlist> |
| ... | ... | @@ -5079,8 +5513,6 @@ print "\n"; |
| 5079 | 5513 | </itemizedlist> |
| 5080 | 5514 | </listitem> |
| 5081 | 5515 | </varlistentry> |
| 5082 | - </variablelist> | |
| 5083 | - <variablelist> | |
| 5084 | 5516 | <varlistentry> |
| 5085 | 5517 | <term>6.0.0: November 10, 2015</term> |
| 5086 | 5518 | <listitem> | ... | ... |