aboutsummaryrefslogtreecommitdiffstats
path: root/include/qpdf/QPDFWriter.hh
diff options
context:
space:
mode:
Diffstat (limited to 'include/qpdf/QPDFWriter.hh')
-rw-r--r--include/qpdf/QPDFWriter.hh455
1 files changed, 186 insertions, 269 deletions
diff --git a/include/qpdf/QPDFWriter.hh b/include/qpdf/QPDFWriter.hh
index d14d907f..34720119 100644
--- a/include/qpdf/QPDFWriter.hh
+++ b/include/qpdf/QPDFWriter.hh
@@ -2,26 +2,22 @@
//
// This file is part of qpdf.
//
-// Licensed under the Apache License, Version 2.0 (the "License");
-// you may not use this file except in compliance with the License.
-// You may obtain a copy of the License at
+// Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except
+// in compliance with the License. You may obtain a copy of the License at
//
// http://www.apache.org/licenses/LICENSE-2.0
//
-// Unless required by applicable law or agreed to in writing, software
-// distributed under the License is distributed on an "AS IS" BASIS,
-// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
-// See the License for the specific language governing permissions and
-// limitations under the License.
+// Unless required by applicable law or agreed to in writing, software distributed under the License
+// is distributed on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express
+// or implied. See the License for the specific language governing permissions and limitations under
+// the License.
//
-// Versions of qpdf prior to version 7 were released under the terms
-// of version 2.0 of the Artistic License. At your option, you may
-// continue to consider qpdf to be licensed under those terms. Please
-// see the manual for additional information.
+// Versions of qpdf prior to version 7 were released under the terms of version 2.0 of the Artistic
+// License. At your option, you may continue to consider qpdf to be licensed under those terms.
+// Please see the manual for additional information.
-// This class implements a simple writer for saving QPDF objects to
-// new PDF files. See comments through the header file for additional
-// details.
+// This class implements a simple writer for saving QPDF objects to new PDF files. See comments
+// through the header file for additional details.
#ifndef QPDFWRITER_HH
#define QPDFWRITER_HH
@@ -57,21 +53,19 @@ class Pl_MD5;
class QPDFWriter
{
public:
- // Construct a QPDFWriter object without specifying output. You
- // must call one of the output setting routines defined below.
+ // Construct a QPDFWriter object without specifying output. You must call one of the output
+ // setting routines defined below.
QPDF_DLL
QPDFWriter(QPDF& pdf);
- // Create a QPDFWriter object that writes its output to a file or
- // to stdout. This is equivalent to using the previous
- // constructor and then calling setOutputFilename(). See
+ // Create a QPDFWriter object that writes its output to a file or to stdout. This is equivalent
+ // to using the previous constructor and then calling setOutputFilename(). See
// setOutputFilename() for details.
QPDF_DLL
QPDFWriter(QPDF& pdf, char const* filename);
- // Create a QPDFWriter object that writes its output to an already
- // open FILE*. This is equivalent to calling the first
- // constructor and then calling setOutputFile(). See
+ // Create a QPDFWriter object that writes its output to an already open FILE*. This is
+ // equivalent to calling the first constructor and then calling setOutputFile(). See
// setOutputFile() for details.
QPDF_DLL
QPDFWriter(QPDF& pdf, char const* description, FILE* file, bool close_file);
@@ -85,15 +79,13 @@ class QPDFWriter
QPDF_DLL
virtual ~ProgressReporter();
- // This method is called with a value from 0 to 100 to
- // indicate approximate progress through the write process.
- // See registerProgressReporter.
+ // This method is called with a value from 0 to 100 to indicate approximate progress through
+ // the write process. See registerProgressReporter.
virtual void reportProgress(int) = 0;
};
- // This is a progress reporter that takes a function. It is used
- // by the C APIs, but it is available if you want to just register
- // a C function as a handler.
+ // This is a progress reporter that takes a function. It is used by the C APIs, but it is
+ // available if you want to just register a C function as a handler.
class QPDF_DLL_CLASS FunctionProgressReporter: public ProgressReporter
{
public:
@@ -108,39 +100,31 @@ class QPDFWriter
std::function<void(int)> handler;
};
- // Setting Output. Output may be set only one time. If you don't
- // use the filename version of the QPDFWriter constructor, you
- // must call exactly one of these methods.
+ // Setting Output. Output may be set only one time. If you don't use the filename version of
+ // the QPDFWriter constructor, you must call exactly one of these methods.
- // Passing null as filename means write to stdout. QPDFWriter
- // will create a zero-length output file upon construction. If
- // write fails, the empty or partially written file will not be
- // deleted. This is by design: sometimes the partial file may be
- // useful for tracking down problems. If your application doesn't
- // want the partially written file to be left behind, you should
- // delete it the eventual call to write fails.
+ // Passing nullptr as filename means write to stdout. QPDFWriter will create a zero-length
+ // output file upon construction. If write fails, the empty or partially written file will not
+ // be deleted. This is by design: sometimes the partial file may be useful for tracking down
+ // problems. If your application doesn't want the partially written file to be left behind, you
+ // should delete it if the eventual call to write fails.
QPDF_DLL
void setOutputFilename(char const* filename);
- // Write to the given FILE*, which must be opened by the caller.
- // If close_file is true, QPDFWriter will close the file.
- // Otherwise, the caller must close the file. The file does not
- // need to be seekable; it will be written to in a single pass.
- // It must be open in binary mode.
+ // Write to the given FILE*, which must be opened by the caller. If close_file is true,
+ // QPDFWriter will close the file. Otherwise, the caller must close the file. The file does not
+ // need to be seekable; it will be written to in a single pass. It must be open in binary mode.
QPDF_DLL
void setOutputFile(char const* description, FILE* file, bool close_file);
- // Indicate that QPDFWriter should create a memory buffer to
- // contain the final PDF file. Obtain the memory by calling
- // getBuffer().
+ // Indicate that QPDFWriter should create a memory buffer to contain the final PDF file. Obtain
+ // the memory by calling getBuffer().
QPDF_DLL
void setOutputMemory();
- // Return the buffer object containing the PDF file. If
- // setOutputMemory() has been called, this method may be called
- // exactly one time after write() has returned. The caller is
- // responsible for deleting the buffer when done. See also
- // getBufferSharedPointer().
+ // Return the buffer object containing the PDF file. If setOutputMemory() has been called, this
+ // method may be called exactly one time after write() has returned. The caller is responsible
+ // for deleting the buffer when done. See also getBufferSharedPointer().
QPDF_DLL
Buffer* getBuffer();
@@ -148,33 +132,27 @@ class QPDFWriter
QPDF_DLL
std::shared_ptr<Buffer> getBufferSharedPointer();
- // Supply your own pipeline object. Output will be written to
- // this pipeline, and QPDFWriter will call finish() on the
- // pipeline. It is the caller's responsibility to manage the
- // memory for the pipeline. The pipeline is never deleted by
- // QPDFWriter, which makes it possible for you to call additional
- // methods on the pipeline after the writing is finished.
+ // Supply your own pipeline object. Output will be written to this pipeline, and QPDFWriter
+ // will call finish() on the pipeline. It is the caller's responsibility to manage the memory
+ // for the pipeline. The pipeline is never deleted by QPDFWriter, which makes it possible for
+ // you to call additional methods on the pipeline after the writing is finished.
QPDF_DLL
void setOutputPipeline(Pipeline*);
// Setting Parameters
- // Set the value of object stream mode. In disable mode, we never
- // generate any object streams. In preserve mode, we preserve
- // object stream structure from the original file. In generate
- // mode, we generate our own object streams. In all cases, we
- // generate a conventional cross-reference table if there are no
- // object streams and a cross-reference stream if there are object
- // streams. The default is o_preserve.
+ // Set the value of object stream mode. In disable mode, we never generate any object streams.
+ // In preserve mode, we preserve object stream structure from the original file. In generate
+ // mode, we generate our own object streams. In all cases, we generate a conventional
+ // cross-reference table if there are no object streams and a cross-reference stream if there
+ // are object streams. The default is o_preserve.
QPDF_DLL
void setObjectStreamMode(qpdf_object_stream_e);
- // Set value of stream data mode. This is an older interface.
- // Instead of using this, prefer setCompressStreams() and
- // setDecodeLevel(). This method is retained for compatibility,
- // but it does not cover the full range of available
- // configurations. The mapping between this and the new methods is
- // as follows:
+ // Set value of stream data mode. This is an older interface. Instead of using this, prefer
+ // setCompressStreams() and setDecodeLevel(). This method is retained for compatibility, but it
+ // does not cover the full range of available configurations. The mapping between this and the
+ // new methods is as follows:
//
// qpdf_s_uncompress:
// setCompressStreams(false)
@@ -190,205 +168,161 @@ class QPDFWriter
QPDF_DLL
void setStreamDataMode(qpdf_stream_data_e);
- // If true, compress any uncompressed streams when writing them.
- // Metadata streams are a special case and are not compressed even
- // if this is true. This is true by default for QPDFWriter. If you
- // want QPDFWriter to leave uncompressed streams uncompressed,
- // pass false to this method.
+ // If true, compress any uncompressed streams when writing them. Metadata streams are a special
+ // case and are not compressed even if this is true. This is true by default for QPDFWriter. If
+ // you want QPDFWriter to leave uncompressed streams uncompressed, pass false to this method.
QPDF_DLL
void setCompressStreams(bool);
- // When QPDFWriter encounters streams, this parameter controls the
- // behavior with respect to attempting to apply any filters to the
- // streams when copying to the output. The decode levels are as
- // follows:
+ // When QPDFWriter encounters streams, this parameter controls the behavior with respect to
+ // attempting to apply any filters to the streams when copying to the output. The decode levels
+ // are as follows:
//
- // qpdf_dl_none: Do not attempt to apply any filters. Streams
- // remain as they appear in the original file. Note that
- // uncompressed streams may still be compressed on output. You can
+ // qpdf_dl_none: Do not attempt to apply any filters. Streams remain as they appear in the
+ // original file. Note that uncompressed streams may still be compressed on output. You can
// disable that by calling setCompressStreams(false).
//
- // qpdf_dl_generalized: This is the default. QPDFWriter will apply
- // LZWDecode, ASCII85Decode, ASCIIHexDecode, and FlateDecode
- // filters on the input. When combined with
- // setCompressStreams(true), which the default, the effect of this
- // is that streams filtered with these older and less efficient
- // filters will be recompressed with the Flate filter. By default,
- // as a special case, if a stream is already compressed with
- // FlateDecode and setCompressStreams is enabled, the original
- // compressed data will be preserved. This behavior can be
- // overridden by calling setRecompressFlate(true).
+ // qpdf_dl_generalized: This is the default. QPDFWriter will apply LZWDecode, ASCII85Decode,
+ // ASCIIHexDecode, and FlateDecode filters on the input. When combined with
+ // setCompressStreams(true), which is the default, the effect of this is that streams filtered
+ // with these older and less efficient filters will be recompressed with the Flate filter. By
+ // default, as a special case, if a stream is already compressed with FlateDecode and
+ // setCompressStreams is enabled, the original compressed data will be preserved. This behavior
+ // can be overridden by calling setRecompressFlate(true).
//
- // qpdf_dl_specialized: In addition to uncompressing the
- // generalized compression formats, supported non-lossy
- // compression will also be decoded. At present, this includes
- // the RunLengthDecode filter.
+ // qpdf_dl_specialized: In addition to uncompressing the generalized compression formats,
+ // supported non-lossy compression will also be decoded. At present, this includes the
+ // RunLengthDecode filter.
//
- // qpdf_dl_all: In addition to generalized and non-lossy
- // specialized filters, supported lossy compression filters will
- // be applied. At present, this includes DCTDecode (JPEG)
- // compression. Note that compressing the resulting data with
- // DCTDecode again will accumulate loss, so avoid multiple
- // compression and decompression cycles. This is mostly useful for
- // retrieving image data.
+ // qpdf_dl_all: In addition to generalized and non-lossy specialized filters, supported lossy
+ // compression filters will be applied. At present, this includes DCTDecode (JPEG) compression.
+ // Note that compressing the resulting data with DCTDecode again will accumulate loss, so avoid
+ // multiple compression and decompression cycles. This is mostly useful for retrieving image
+ // data.
QPDF_DLL
void setDecodeLevel(qpdf_stream_decode_level_e);
- // By default, when both the input and output contents of a stream
- // are compressed with Flate, qpdf does not uncompress and
- // recompress the stream. Passing true here causes it to do so.
- // This can be useful if recompressing all streams with a higher
- // compression level, which can be set by calling the static
- // method Pl_Flate::setCompressionLevel.
+ // By default, when both the input and output contents of a stream are compressed with Flate,
+ // qpdf does not uncompress and recompress the stream. Passing true here causes it to do so.
+ // This can be useful if recompressing all streams with a higher compression level, which can be
+ // set by calling the static method Pl_Flate::setCompressionLevel.
QPDF_DLL
void setRecompressFlate(bool);
- // Set value of content stream normalization. The default is
- // "false". If true, we attempt to normalize newlines inside of
- // content streams. Some constructs such as inline images may
- // thwart our efforts. There may be some cases where this can
- // damage the content stream. This flag should be used only for
- // debugging and experimenting with PDF content streams. Never
- // use it for production files.
+ // Set value of content stream normalization. The default is "false". If true, we attempt to
+ // normalize newlines inside of content streams. Some constructs such as inline images may
+ // thwart our efforts. There may be some cases where this can damage the content stream. This
+ // flag should be used only for debugging and experimenting with PDF content streams. Never use
+ // it for production files.
QPDF_DLL
void setContentNormalization(bool);
- // Set QDF mode. QDF mode causes special "pretty printing" of
- // PDF objects, adds comments for easier perusing of files.
- // Resulting PDF files can be edited in a text editor and then run
- // through fix-qdf to update cross reference tables and stream
- // lengths.
+ // Set QDF mode. QDF mode causes special "pretty printing" of PDF objects, adds comments for
+ // easier perusing of files. Resulting PDF files can be edited in a text editor and then run
+ // through fix-qdf to update cross reference tables and stream lengths.
QPDF_DLL
void setQDFMode(bool);
- // Preserve unreferenced objects. The default behavior is to
- // discard any object that is not visited during a traversal of
- // the object structure from the trailer.
+ // Preserve unreferenced objects. The default behavior is to discard any object that is not
+ // visited during a traversal of the object structure from the trailer.
QPDF_DLL
void setPreserveUnreferencedObjects(bool);
- // Always write a newline before the endstream keyword. This helps
- // with PDF/A compliance, though it is not sufficient for it.
+ // Always write a newline before the endstream keyword. This helps with PDF/A compliance, though
+ // it is not sufficient for it.
QPDF_DLL
void setNewlineBeforeEndstream(bool);
- // Set the minimum PDF version. If the PDF version of the input
- // file (or previously set minimum version) is less than the
- // version passed to this method, the PDF version of the output
- // file will be set to this value. If the original PDF file's
- // version or previously set minimum version is already this
- // version or later, the original file's version will be used.
- // QPDFWriter automatically sets the minimum version to 1.4 when
- // R3 encryption parameters are used, and to 1.5 when object
- // streams are used.
+ // Set the minimum PDF version. If the PDF version of the input file (or previously set minimum
+ // version) is less than the version passed to this method, the PDF version of the output file
+ // will be set to this value. If the original PDF file's version or previously set minimum
+ // version is already this version or later, the original file's version will be used.
+ // QPDFWriter automatically sets the minimum version to 1.4 when R3 encryption parameters are
+ // used, and to 1.5 when object streams are used.
QPDF_DLL
void setMinimumPDFVersion(std::string const&, int extension_level = 0);
QPDF_DLL
void setMinimumPDFVersion(PDFVersion const&);
- // Force the PDF version of the output file to be a given version.
- // Use of this function may create PDF files that will not work
- // properly with older PDF viewers. When a PDF version is set
- // using this function, qpdf will use this version even if the
- // file contains features that are not supported in that version
- // of PDF. In other words, you should only use this function if
- // you are sure the PDF file in question has no features of newer
- // versions of PDF or if you are willing to create files that old
- // viewers may try to open but not be able to properly interpret.
- // If any encryption has been applied to the document either
- // explicitly or by preserving the encryption of the source
- // document, forcing the PDF version to a value too low to support
- // that type of encryption will explicitly disable decryption.
- // Additionally, forcing to a version below 1.5 will disable
- // object streams.
+ // Force the PDF version of the output file to be a given version. Use of this function may
+ // create PDF files that will not work properly with older PDF viewers. When a PDF version is
+ // set using this function, qpdf will use this version even if the file contains features that
+ // are not supported in that version of PDF. In other words, you should only use this function
+ // if you are sure the PDF file in question has no features of newer versions of PDF or if you
+ // are willing to create files that old viewers may try to open but not be able to properly
+ // interpret. If any encryption has been applied to the document either explicitly or by
+ // preserving the encryption of the source document, forcing the PDF version to a value too low
+ // to support that type of encryption will explicitly disable decryption. Additionally, forcing
+ // to a version below 1.5 will disable object streams.
QPDF_DLL
void forcePDFVersion(std::string const&, int extension_level = 0);
- // Provide additional text to insert in the PDF file somewhere
- // near the beginning of the file. This can be used to add
- // comments to the beginning of a PDF file, for example, if those
- // comments are to be consumed by some other application. No
- // checks are performed to ensure that the text inserted here is
- // valid PDF. If you want to insert multiline comments, you will
- // need to include \n in the string yourself and start each line
- // with %. An extra newline will be appended if one is not
- // already present at the end of your text.
+ // Provide additional text to insert in the PDF file somewhere near the beginning of the file.
+ // This can be used to add comments to the beginning of a PDF file, for example, if those
+ // comments are to be consumed by some other application. No checks are performed to ensure
+ // that the text inserted here is valid PDF. If you want to insert multiline comments, you will
+ // need to include \n in the string yourself and start each line with %. An extra newline will
+ // be appended if one is not already present at the end of your text.
QPDF_DLL
void setExtraHeaderText(std::string const&);
- // Causes a deterministic /ID value to be generated. When this is
- // set, the current time and output file name are not used as part
- // of /ID generation. Instead, a digest of all significant parts
- // of the output file's contents is included in the /ID
- // calculation. Use of a deterministic /ID can be handy when it is
- // desirable for a repeat of the same qpdf operation on the same
- // inputs being written to the same outputs with the same
- // parameters to generate exactly the same results. This feature
- // is incompatible with encrypted files because, for encrypted
- // files, the /ID is generated before any part of the file is
- // written since it is an input to the encryption process.
+ // Causes a deterministic /ID value to be generated. When this is set, the current time and
+ // output file name are not used as part of /ID generation. Instead, a digest of all significant
+ // parts of the output file's contents is included in the /ID calculation. Use of a
+ // deterministic /ID can be handy when it is desirable for a repeat of the same qpdf operation
+ // on the same inputs being written to the same outputs with the same parameters to generate
+ // exactly the same results. This feature is incompatible with encrypted files because, for
+ // encrypted files, the /ID is generated before any part of the file is written since it is an
+ // input to the encryption process.
QPDF_DLL
void setDeterministicID(bool);
- // Cause a static /ID value to be generated. Use only in test
- // suites. See also setDeterministicID.
+ // Cause a static /ID value to be generated. Use only in test suites. See also
+ // setDeterministicID.
QPDF_DLL
void setStaticID(bool);
- // Use a fixed initialization vector for AES-CBC encryption. This
- // is not secure. It should be used only in test suites for
- // creating predictable encrypted output.
+ // Use a fixed initialization vector for AES-CBC encryption. This is not secure. It should be
+ // used only in test suites for creating predictable encrypted output.
QPDF_DLL
void setStaticAesIV(bool);
- // Suppress inclusion of comments indicating original object IDs
- // when writing QDF files. This can also be useful for testing,
- // particularly when using comparison of two qdf files to
+ // Suppress inclusion of comments indicating original object IDs when writing QDF files. This
+ // can also be useful for testing, particularly when using comparison of two qdf files to
// determine whether two PDF files have identical content.
QPDF_DLL
void setSuppressOriginalObjectIDs(bool);
- // Preserve encryption. The default is true unless prefilering,
- // content normalization, or qdf mode has been selected in which
- // case encryption is never preserved. Encryption is also not
+ // Preserve encryption. The default is true unless prefilering, content normalization, or qdf
+ // mode has been selected in which case encryption is never preserved. Encryption is also not
// preserved if we explicitly set encryption parameters.
QPDF_DLL
void setPreserveEncryption(bool);
- // Copy encryption parameters from another QPDF object. If you
- // want to copy encryption from the object you are writing, call
- // setPreserveEncryption(true) instead.
+ // Copy encryption parameters from another QPDF object. If you want to copy encryption from the
+ // object you are writing, call setPreserveEncryption(true) instead.
QPDF_DLL
void copyEncryptionParameters(QPDF&);
- // Set up for encrypted output. User and owner password both must
- // be specified. Either or both may be the empty string. Note
- // that qpdf does not apply any special treatment to the empty
- // string, which makes it possible to create encrypted files with
- // empty owner passwords and non-empty user passwords or with the
- // same password for both user and owner. Some PDF reading
- // products don't handle such files very well. Enabling
- // encryption disables stream prefiltering and content
- // normalization. Note that setting R2 encryption parameters sets
- // the PDF version to at least 1.3, setting R3 encryption
- // parameters pushes the PDF version number to at least 1.4,
- // setting R4 parameters pushes the version to at least 1.5, or if
- // AES is used, 1.6, and setting R5 or R6 parameters pushes the
- // version to at least 1.7 with extension level 3.
+ // Set up for encrypted output. User and owner password both must be specified. Either or both
+ // may be the empty string. Note that qpdf does not apply any special treatment to the empty
+ // string, which makes it possible to create encrypted files with empty owner passwords and
+ // non-empty user passwords or with the same password for both user and owner. Some PDF reading
+ // products don't handle such files very well. Enabling encryption disables stream prefiltering
+ // and content normalization. Note that setting R2 encryption parameters sets the PDF version
+ // to at least 1.3, setting R3 encryption parameters pushes the PDF version number to at
+ // least 1.4, setting R4 parameters pushes the version to at least 1.5, or if AES is used, 1.6,
+ // and setting R5 or R6 parameters pushes the version to at least 1.7 with extension level 3.
//
- // Note about Unicode passwords: the PDF specification requires
- // passwords to be encoded with PDF Doc encoding for R <= 4 and
- // UTF-8 for R >= 5. In all cases, these methods take strings of
- // bytes as passwords. It is up to the caller to ensure that
- // passwords are properly encoded. The qpdf command-line tool
- // tries to do this, as discussed in the manual. If you are doing
- // this from your own application, QUtil contains many transcoding
- // functions that could be useful to you, most notably
- // utf8_to_pdf_doc.
-
- // R2 uses RC4, which is a weak cryptographic algorithm. Don't use
- // it unless you have to. See "Weak Cryptography" in the manual.
- // This encryption format is deprecated in the PDF 2.0
+ // Note about Unicode passwords: the PDF specification requires passwords to be encoded with PDF
+ // Doc encoding for R <= 4 and UTF-8 for R >= 5. In all cases, these methods take strings of
+ // bytes as passwords. It is up to the caller to ensure that passwords are properly encoded. The
+ // qpdf command-line tool tries to do this, as discussed in the manual. If you are doing this
+ // from your own application, QUtil contains many transcoding functions that could be useful to
+ // you, most notably utf8_to_pdf_doc.
+
+ // R2 uses RC4, which is a weak cryptographic algorithm. Don't use it unless you have to. See
+ // "Weak Cryptography" in the manual. This encryption format is deprecated in the PDF 2.0
// specification.
QPDF_DLL
void setR2EncryptionParametersInsecure(
@@ -398,9 +332,8 @@ class QPDFWriter
bool allow_modify,
bool allow_extract,
bool allow_annotate);
- // R3 uses RC4, which is a weak cryptographic algorithm. Don't use
- // it unless you have to. See "Weak Cryptography" in the manual.
- // This encryption format is deprecated in the PDF 2.0
+ // R3 uses RC4, which is a weak cryptographic algorithm. Don't use it unless you have to. See
+ // "Weak Cryptography" in the manual. This encryption format is deprecated in the PDF 2.0
// specification.
QPDF_DLL
void setR3EncryptionParametersInsecure(
@@ -413,11 +346,10 @@ class QPDFWriter
bool allow_form_filling,
bool allow_modify_other,
qpdf_r3_print_e print);
- // When use_aes=false, this call enables R4 with RC4, which is a
- // weak cryptographic algorithm. Even with use_aes=true, the
- // overall encryption scheme is weak. Don't use it unless you have
- // to. See "Weak Cryptography" in the manual. This encryption
- // format is deprecated in the PDF 2.0 specification.
+ // When use_aes=false, this call enables R4 with RC4, which is a weak cryptographic algorithm.
+ // Even with use_aes=true, the overall encryption scheme is weak. Don't use it unless you have
+ // to. See "Weak Cryptography" in the manual. This encryption format is deprecated in the
+ // PDF 2.0 specification.
QPDF_DLL
void setR4EncryptionParametersInsecure(
char const* user_password,
@@ -431,9 +363,8 @@ class QPDFWriter
qpdf_r3_print_e print,
bool encrypt_metadata,
bool use_aes);
- // R5 is deprecated. Do not use it for production use. Writing
- // R5 is supported by qpdf primarily to generate test files for
- // applications that may need to test R5 support.
+ // R5 is deprecated. Do not use it for production use. Writing R5 is supported by qpdf
+ // primarily to generate test files for applications that may need to test R5 support.
QPDF_DLL
void setR5EncryptionParameters(
char const* user_password,
@@ -446,8 +377,7 @@ class QPDFWriter
bool allow_modify_other,
qpdf_r3_print_e print,
bool encrypt_metadata);
- // This is the only password-based encryption format supported by
- // the PDF specification.
+ // This is the only password-based encryption format supported by the PDF specification.
QPDF_DLL
void setR6EncryptionParameters(
char const* user_password,
@@ -461,57 +391,49 @@ class QPDFWriter
qpdf_r3_print_e print,
bool encrypt_metadata_aes);
- // Create linearized output. Disables qdf mode, content
- // normalization, and stream prefiltering.
+ // Create linearized output. Disables qdf mode, content normalization, and stream prefiltering.
QPDF_DLL
void setLinearization(bool);
- // For debugging QPDF: provide the name of a file to write pass1
- // of linearization to. The only reason to use this is to debug
- // QPDF. To linearize, QPDF writes out the file in two passes.
- // Usually the first pass is discarded, but lots of computations
- // are made in pass 1. If a linearized file comes out wrong, it
- // can be helpful to look at the first pass.
+ // For debugging QPDF: provide the name of a file to write pass1 of linearization to. The only
+ // reason to use this is to debug QPDF. To linearize, QPDF writes out the file in two passes.
+ // Usually the first pass is discarded, but lots of computations are made in pass 1. If a
+ // linearized file comes out wrong, it can be helpful to look at the first pass.
QPDF_DLL
void setLinearizationPass1Filename(std::string const&);
- // Create PCLm output. This is only useful for clients that know
- // how to create PCLm files. If a file is structured exactly as
- // PCLm requires, this call will tell QPDFWriter to write the PCLm
- // header, create certain unreferenced streams required by the
- // standard, and write the objects in the required order. Calling
- // this on an ordinary PDF serves no purpose. There is no
+ // Create PCLm output. This is only useful for clients that know how to create PCLm files. If a
+ // file is structured exactly as PCLm requires, this call will tell QPDFWriter to write the PCLm
+ // header, create certain unreferenced streams required by the standard, and write the objects
+ // in the required order. Calling this on an ordinary PDF serves no purpose. There is no
// command-line argument that causes this method to be called.
QPDF_DLL
void setPCLm(bool);
- // If you want to be notified of progress, derive a class from
- // ProgressReporter and override the reportProgress method.
+ // If you want to be notified of progress, derive a class from ProgressReporter and override the
+ // reportProgress method.
QPDF_DLL
void registerProgressReporter(std::shared_ptr<ProgressReporter>);
- // Return the PDF version that will be written into the header.
- // Calling this method does all the preparation for writing, so it
- // is an error to call any methods that may cause a change to the
- // version. Adding new objects to the original file after calling
- // this may also cause problems. It is safe to update existing
- // objects or stream contents after calling this method, e.g., to
+ // Return the PDF version that will be written into the header. Calling this method does all the
+ // preparation for writing, so it is an error to call any methods that may cause a change to the
+ // version. Adding new objects to the original file after calling this may also cause problems.
+ // It is safe to update existing objects or stream contents after calling this method, e.g., to
// include the final version number in metadata.
QPDF_DLL
std::string getFinalVersion();
- // Write the final file. There is no expectation of being able to
- // call write() more than once.
+ // Write the final file. There is no expectation of being able to call write() more than once.
QPDF_DLL
void write();
- // Return renumbered ObjGen that was written into the final file.
- // This method can be used after calling write().
+ // Return renumbered ObjGen that was written into the final file. This method can be used after
+ // calling write().
QPDF_DLL
QPDFObjGen getRenumberedObjGen(QPDFObjGen);
- // Return XRef entry that was written into the final file.
- // This method can be used after calling write().
+ // Return XRef entry that was written into the final file. This method can be used after calling
+ // write().
QPDF_DLL
std::map<QPDFObjGen, QPDFXRefEntry> getWrittenXRefTable();
@@ -525,15 +447,12 @@ class QPDFWriter
enum trailer_e { t_normal, t_lin_first, t_lin_second };
- // An reference to a PipelinePopper instance is passed into
- // activatePipelineStack. When the PipelinePopper goes out of
- // scope, the pipeline stack is popped. PipelinePopper's
- // destructor calls finish on the current pipeline and pops the
- // pipeline stack until the top of stack is a previous active top
- // of stack, and restores the pipeline to that point. It deletes
- // any pipelines that it pops. If the bp argument is non-null and
- // any of the stack items are of type Pl_Buffer, the buffer is
- // retrieved.
+ // An reference to a PipelinePopper instance is passed into activatePipelineStack. When the
+ // PipelinePopper goes out of scope, the pipeline stack is popped. PipelinePopper's destructor
+ // calls finish on the current pipeline and pops the pipeline stack until the top of stack is a
+ // previous active top of stack, and restores the pipeline to that point. It deletes any
+ // pipelines that it pops. If the bp argument is non-null and any of the stack items are of type
+ // Pl_Buffer, the buffer is retrieved.
class PipelinePopper
{
friend class QPDFWriter;
@@ -672,10 +591,9 @@ class QPDFWriter
int linearization_pass);
size_t calculateXrefStreamPadding(qpdf_offset_t xref_bytes);
- // When filtering subsections, push additional pipelines to the
- // stack. When ready to switch, activate the pipeline stack. When
- // the passed in PipelinePopper goes out of scope, the stack is
- // popped.
+ // When filtering subsections, push additional pipelines to the stack. When ready to switch,
+ // activate the pipeline stack. When the passed in PipelinePopper goes out of scope, the stack
+ // is popped.
Pipeline* pushPipeline(Pipeline*);
void activatePipelineStack(PipelinePopper&);
void initializePipelineStack(Pipeline*);
@@ -779,9 +697,8 @@ class QPDFWriter
int next_progress_report{0};
};
- // Keep all member variables inside the Members object, which we
- // dynamically allocate. This makes it possible to add new private
- // members without breaking binary compatibility.
+ // Keep all member variables inside the Members object, which we dynamically allocate. This
+ // makes it possible to add new private members without breaking binary compatibility.
std::shared_ptr<Members> m;
};