aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
-rw-r--r--cSpell.json4
-rw-r--r--job.sums4
-rw-r--r--libqpdf/JSON.cc11
-rw-r--r--libqpdf/JSONHandler.cc10
-rw-r--r--libqpdf/qpdf/auto_job_help.hh71
-rw-r--r--libtests/json.cc2
-rw-r--r--libtests/json_handler.cc1
-rw-r--r--libtests/libtests.testcov2
-rw-r--r--manual/cli.rst219
-rw-r--r--qpdf/test_driver.cc1
10 files changed, 175 insertions, 150 deletions
diff --git a/cSpell.json b/cSpell.json
index 144f394e..aacb3051 100644
--- a/cSpell.json
+++ b/cSpell.json
@@ -11,7 +11,6 @@
"afdh",
"afdhph",
"ageneration",
- "agogo",
"aitems",
"annots",
"aobjid",
@@ -64,6 +63,7 @@
"coldwind",
"colorspace",
"conftest",
+ "copiable",
"cout",
"cphe",
"cppflags",
@@ -71,6 +71,7 @@
"cregex",
"crnl",
"csoe",
+ "cstr",
"cxxflags",
"cygwin",
"dctdecode",
@@ -354,6 +355,7 @@
"qpdfsystemerror",
"qpdftokenizer",
"qpdftypes",
+ "qpdfusage",
"qpdfwriter",
"qpdfx",
"qpdfxrefentry",
diff --git a/job.sums b/job.sums
index 1a1ed40f..05c7344f 100644
--- a/job.sums
+++ b/job.sums
@@ -8,8 +8,8 @@ include/qpdf/auto_job_c_pages.hh 931840b329a36ca0e41401190e04537b47f2867671a6643
include/qpdf/auto_job_c_uo.hh 0585b7de459fa479d9e51a45fa92de0ff6dee748efc9ec1cedd0dde6cee1ad50
job.yml 1590fd16fd17ed40db9aa56b6713c844cfd61b3a6d0441a3ccd122b7371c68e9
libqpdf/qpdf/auto_job_decl.hh 9f79396ec459f191be4c5fe34cf88c265cf47355a1a945fa39169d1c94cf04f6
-libqpdf/qpdf/auto_job_help.hh 30dd97f36c6cd748fc53fcb8d864140e32274437ffdf12f609ed04150ad61858
+libqpdf/qpdf/auto_job_help.hh 7155be7c3212afb9d5033dfacd3456768931bb6e837a2079d2332cd5bdafa087
libqpdf/qpdf/auto_job_init.hh 3b6323189480a7d782563c9d2b5bc29b8dcd19c6dcc89840b207e38cb503d3f1
libqpdf/qpdf/auto_job_schema.hh 1c3b4b5488270f8d200ed345573e3a241f15baff6fb7e97ec3d044103b2546d9
manual/_ext/qpdf.py e9ac9d6c70642a3d29281ee5ad92ae2422dee8be9306fb8a0bc9dba0ed5e28f3
-manual/cli.rst 1cf74ad0956e51e919287f9dc93574764510856f562333a195775407551958a2
+manual/cli.rst 5fd018a6b34cd1b42a278f7b9afef709b72f082a65a563e8d2d3e10ce8ebe31a
diff --git a/libqpdf/JSON.cc b/libqpdf/JSON.cc
index f70145a7..58476ff8 100644
--- a/libqpdf/JSON.cc
+++ b/libqpdf/JSON.cc
@@ -880,6 +880,7 @@ void JSONParser::getToken()
break;
case ls_backslash:
+ /* cSpell: ignore bfnrt */
if (strchr("\\\"bfnrt", *p))
{
lex_state = ls_string;
@@ -972,7 +973,7 @@ JSONParser::handleToken()
}
// Git string value
- std::string svalue;
+ std::string s_value;
if (lex_state == ls_string)
{
// Token includes the quotation marks
@@ -980,7 +981,7 @@ JSONParser::handleToken()
{
throw std::logic_error("JSON string length < 2");
}
- svalue = decode_string(value);
+ s_value = decode_string(value);
}
// Based on the lexical state and value, figure out whether we are
// looking at an item or a delimiter. It will always be exactly
@@ -1057,7 +1058,7 @@ JSONParser::handleToken()
break;
case ls_string:
- item = new JSON(JSON::makeString(svalue));
+ item = new JSON(JSON::makeString(s_value));
break;
case ls_backslash:
@@ -1223,7 +1224,7 @@ JSONParser::handleToken()
{
case ps_dict_begin:
case ps_dict_after_comma:
- this->dict_key = svalue;
+ this->dict_key = s_value;
item = nullptr;
next_state = ps_dict_after_key;
break;
@@ -1297,7 +1298,7 @@ JSONParser::parse(std::string const& s)
}
if (parser_state != ps_done)
{
- QTC::TC("libtests", "JSON parse preature EOF");
+ QTC::TC("libtests", "JSON parse premature EOF");
throw std::runtime_error("JSON: premature end of input");
}
return stack.back();
diff --git a/libqpdf/JSONHandler.cc b/libqpdf/JSONHandler.cc
index 1d374e6a..28e97218 100644
--- a/libqpdf/JSONHandler.cc
+++ b/libqpdf/JSONHandler.cc
@@ -88,20 +88,20 @@ JSONHandler::handle(std::string const& path, JSON j)
}
bool handled = false;
bool bvalue = false;
- std::string svalue;
+ std::string s_value;
if (this->m->h.null_handler && j.isNull())
{
this->m->h.null_handler(path);
handled = true;
}
- if (this->m->h.string_handler && j.getString(svalue))
+ if (this->m->h.string_handler && j.getString(s_value))
{
- this->m->h.string_handler(path, svalue);
+ this->m->h.string_handler(path, s_value);
handled = true;
}
- if (this->m->h.number_handler && j.getNumber(svalue))
+ if (this->m->h.number_handler && j.getNumber(s_value))
{
- this->m->h.number_handler(path, svalue);
+ this->m->h.number_handler(path, s_value);
handled = true;
}
if (this->m->h.bool_handler && j.getBool(bvalue))
diff --git a/libqpdf/qpdf/auto_job_help.hh b/libqpdf/qpdf/auto_job_help.hh
index b50025e4..62991284 100644
--- a/libqpdf/qpdf/auto_job_help.hh
+++ b/libqpdf/qpdf/auto_job_help.hh
@@ -328,9 +328,11 @@ ap.addOptionHelp("--underlay", "modification", "begin underlay options", R"(--un
Underlay pages from another file on the output.
Run qpdf --help=overlay-underlay for details.
)");
-ap.addOptionHelp("--flatten-rotation", "modification", "remove rotation from page dictionary", R"(Rotate a page using content commands instead of page-level
-metadata. This can be useful if a broken PDF viewer fails to
-properly consider page rotation metadata.
+ap.addOptionHelp("--flatten-rotation", "modification", "remove rotation from page dictionary", R"(For each page that is rotated using the /Rotate key in the
+page's dictionary, remove the /Rotate key and implement the
+identical rotation semantics by modifying the page's contents.
+This can be useful if a broken PDF viewer fails to properly
+consider page rotation metadata.
)");
ap.addOptionHelp("--flatten-annotations", "modification", "push annotations into content", R"(--flatten-annotations=parameter
@@ -360,8 +362,6 @@ options:
--oi-min-height
--oi-min-area
--keep-inline-images
-
-The --verbose flag is useful with this option.
)");
ap.addOptionHelp("--oi-min-width", "modification", "minimum width for --optimize-images", R"(--oi-min-width=width
@@ -616,35 +616,25 @@ for help with the page range syntax.
ap.addHelpTopic("attachments", "work with embedded files", R"(It is possible to list, add, or delete embedded files (also known
as attachments) and to copy attachments from other files. See help
on individual options for details. Run qpdf --help=add-attachment
-for additional details about adding attachments.
-)");
-ap.addOptionHelp("--list-attachments", "attachments", "list embedded files", R"(Show the key and stream number for each embedded file. Combine
-with --verbose for more detailed information.
+for additional details about adding attachments. See also
+--help=--list-attachments and --help=--show-attachment.
)");
-ap.addOptionHelp("--show-attachment", "attachments", "export an embedded file", R"(--show-attachment=key
-
-Write the contents of the specified attachment to standard
-output as binary data. Get the key with --list-attachments.
-)");
-ap.addOptionHelp("--add-attachment", "attachments", "start add attachment options", R"(--add-attachment file options --
+ap.addOptionHelp("--add-attachment", "attachments", "start add attachment options", R"(--add-attachment file [options] --
The --add-attachment flag and its options may be repeated to add
multiple attachments. Run qpdf --help=add-attachment for details.
)");
-ap.addOptionHelp("--remove-attachment", "attachments", "remove an embedded file", R"(--remove-attachment=key
-
-Remove an embedded file using its key. Get the key with
---list-attachments.
-)");
-}
-static void add_help_6(QPDFArgParser& ap)
-{
-ap.addOptionHelp("--copy-attachments-from", "attachments", "start copy attachment options", R"(--copy-attachments-from file options --
+ap.addOptionHelp("--copy-attachments-from", "attachments", "start copy attachment options", R"(--copy-attachments-from file [options] --
The --copy-attachments-from flag and its options may be repeated
to copy attachments from multiple files. Run
qpdf --help=copy-attachments for details.
)");
+ap.addOptionHelp("--remove-attachment", "attachments", "remove an embedded file", R"(--remove-attachment=key
+
+Remove an embedded file using its key. Get the key with
+--list-attachments.
+)");
ap.addHelpTopic("pdf-dates", "PDF date format", R"(When a date is required, the date should conform to the PDF date
format specification, which is "D:yyyymmddhhmmssz" where "z" is
either literally upper case "Z" for UTC or a timezone offset in
@@ -657,21 +647,24 @@ Examples:
- D:20210207161528-05'00' February 7, 2021 at 4:15:28 p.m.
- D:20210207211528Z February 7, 2021 at 21:15:28 UTC
)");
+}
+static void add_help_6(QPDFArgParser& ap)
+{
ap.addHelpTopic("add-attachment", "attach (embed) files", R"(The options listed below appear between --add-attachment and its
terminating "--".
)");
ap.addOptionHelp("--key", "add-attachment", "specify attachment key", R"(--key=key
Specify the key to use for the attachment in the embedded files
-table. It defaults to the last element of the attached file's
-filename.
+table. It defaults to the last element (basename) of the
+attached file's filename.
)");
ap.addOptionHelp("--filename", "add-attachment", "set attachment's displayed filename", R"(--filename=name
Specify the filename to be used for the attachment. This is what
is usually displayed to the user and is the name most graphical
PDF viewers will use when saving a file. It defaults to the last
-element of the attached file's filename.
+element (basename) of the attached file's filename.
)");
ap.addOptionHelp("--creationdate", "add-attachment", "set attachment's creation date", R"(--creationdate=date
@@ -712,7 +705,7 @@ duplicate attachment keys. This affects the key only, not the
file name.
)");
ap.addHelpTopic("inspection", "inspect PDF files", R"(These options provide tools for inspecting PDF files. When any of
-the options in this section are specified, no output file should be
+the options in this section are specified, no output file may be
given.
)");
ap.addOptionHelp("--is-encrypted", "inspection", "silently test whether a file is encrypted", R"(Silently exit with a code indicating the file's encryption status:
@@ -743,15 +736,12 @@ user password if the owner password is given and the file was
encrypted using older encryption formats that allow user
password recovery.
)");
-ap.addOptionHelp("--show-encryption-key", "inspection", "show key with --show-encryption", R"(When used with --show-encryption, causes the underlying
-encryption key to be displayed.
+ap.addOptionHelp("--show-encryption-key", "inspection", "show key with --show-encryption", R"(When used with --show-encryption or --check, causes the
+underlying encryption key to be displayed.
)");
ap.addOptionHelp("--check-linearization", "inspection", "check linearization tables", R"(Check to see whether a file is linearized and, if so, whether
the linearization hint tables are correct.
)");
-}
-static void add_help_7(QPDFArgParser& ap)
-{
ap.addOptionHelp("--show-linearization", "inspection", "show linearization hint tables", R"(Check and display all data in the linearization hint tables.
)");
ap.addOptionHelp("--show-xref", "inspection", "show cross reference data", R"(Show the contents of the cross-reference table or stream (object
@@ -759,7 +749,10 @@ locations in the file) in a human-readable form. This is
especially useful for files with cross-reference streams, which
are stored in a binary format.
)");
-ap.addOptionHelp("--show-object", "inspection", "show contents of an object", R"(--show-object=trailer|obj[,gen]
+}
+static void add_help_7(QPDFArgParser& ap)
+{
+ap.addOptionHelp("--show-object", "inspection", "show contents of an object", R"(--show-object={trailer|obj[,gen]}
Show the contents of the given object. This is especially useful
for inspecting objects that are inside of object streams (also
@@ -784,6 +777,14 @@ object and for each content stream associated with the page.
ap.addOptionHelp("--with-images", "inspection", "include image details with --show-pages", R"(When used with --show-pages, also shows the object and
generation numbers for the image objects on each page.
)");
+ap.addOptionHelp("--list-attachments", "inspection", "list embedded files", R"(Show the key and stream number for each embedded file. Combine
+with --verbose for more detailed information.
+)");
+ap.addOptionHelp("--show-attachment", "inspection", "export an embedded file", R"(--show-attachment=key
+
+Write the contents of the specified attachment to standard
+output as binary data. Get the key with --list-attachments.
+)");
ap.addHelpTopic("json", "JSON output for PDF information", R"(Show information about the PDF file in JSON format. Please see the
JSON chapter in the qpdf manual for details.
)");
@@ -798,7 +799,7 @@ This option is repeatable. If given, only the specified
top-level keys will be included in the JSON output. Otherwise,
all keys will be included.
)");
-ap.addOptionHelp("--json-object", "json", "restrict which objects are in JSON", R"(--json-object=trailer|obj[,gen]
+ap.addOptionHelp("--json-object", "json", "restrict which objects are in JSON", R"(--json-object={trailer|obj[,gen]}
This option is repeatable. If given, only specified objects will
be shown in the "objects" key of the JSON output. Otherwise, all
diff --git a/libtests/json.cc b/libtests/json.cc
index 754c2b3e..c37af0e8 100644
--- a/libtests/json.cc
+++ b/libtests/json.cc
@@ -29,6 +29,7 @@ static void test_main()
assert(jstr2.getString(value));
assert(value == "a\tb");
assert(! jstr2.getNumber(value));
+ /* cSpell: ignore jbool xavalue dvalue xdvalue */
JSON jint = JSON::makeInt(16059);
JSON jdouble = JSON::makeReal(3.14159);
JSON jexp = JSON::makeNumber("2.1e5");
@@ -128,6 +129,7 @@ static void check_schema(JSON& obj, JSON& schema, unsigned long flags,
static void test_schema()
{
+ /* cSpell: ignore ptional ebra */
JSON schema = JSON::parse(R"(
{
"one": {
diff --git a/libtests/json_handler.cc b/libtests/json_handler.cc
index c1af238f..618395d5 100644
--- a/libtests/json_handler.cc
+++ b/libtests/json_handler.cc
@@ -99,6 +99,7 @@ static void test_all()
{
std::cout << "-- all --" << std::endl;
auto h = make_all_handler();
+ /* cSpell: ignore phour */
JSON j = JSON::parse(R"({
"one": "potato",
"two": 3.14,
diff --git a/libtests/libtests.testcov b/libtests/libtests.testcov
index 444f15bb..3e4d63d0 100644
--- a/libtests/libtests.testcov
+++ b/libtests/libtests.testcov
@@ -70,7 +70,7 @@ JSON parse unexpected } 0
JSON parse unexpected ] 0
JSON parse unexpected : 0
JSON parse unexpected , 0
-JSON parse preature EOF 0
+JSON parse premature EOF 0
JSON parse null character 0
JSON parse bad character 0
JSON parse point after e 0
diff --git a/manual/cli.rst b/manual/cli.rst
index 1c283598..2a5d66db 100644
--- a/manual/cli.rst
+++ b/manual/cli.rst
@@ -109,9 +109,10 @@ Password-protected files may be opened by specifying a password with
:qpdf:ref:`--password`.
All options other than help options (see :ref:`help-options`) require
-an input file. If inspection options (see :ref:`inspection-options`)
-or help options are given, an output file must not be given. Otherwise,
-an output file is required.
+an input file. If inspection or JSON options (see
+:ref:`inspection-options` and :ref:`json-options`) or help options are
+given, an output file must not be given. Otherwise, an output file is
+required.
If :samp:`@filename` appears as a word anywhere in the command-line,
it will be read line by line, and each line will be treated as a
@@ -246,9 +247,9 @@ Shell Completion
You can enable bash completion with :command:`eval $(qpdf
--completion-bash)` and zsh completion with :command:`eval $(qpdf
--completion-zsh)`. If :command:`qpdf` is not in your path, you should
-invoke it above with an absolute path. If you invoke it with a
-relative path, it will warn you, and the completion won't work if
-you're in a different directory.
+use an absolute path to qpdf in the above invocation. If you invoke it
+with a relative path, it will warn you, and the completion won't work
+if you're in a different directory.
:command:`qpdf` will use ``argv[0]`` to figure out where its
executable is. This may produce unwanted results in some cases,
@@ -1439,9 +1440,11 @@ Related Options
.. help: remove rotation from page dictionary
- Rotate a page using content commands instead of page-level
- metadata. This can be useful if a broken PDF viewer fails to
- properly consider page rotation metadata.
+ For each page that is rotated using the /Rotate key in the
+ page's dictionary, remove the /Rotate key and implement the
+ identical rotation semantics by modifying the page's contents.
+ This can be useful if a broken PDF viewer fails to properly
+ consider page rotation metadata.
For each page that is rotated using the ``/Rotate`` key in the
page's dictionary, remove the ``/Rotate`` key and implement the
@@ -1564,7 +1567,7 @@ Related Options
If a file contains interactive form fields and indicates that the
appearances are out of date with the values of the form, this flag
will regenerate appearances, subject to a few limitations. Note
- that there is not usually a reason to do this, but it can be
+ that there is usually no reason to do this, but it can be
necessary before using the :qpdf:ref:`--flatten-annotations`
option. Here is a summary of the limitations.
@@ -1614,8 +1617,6 @@ Related Options
--oi-min-area
--keep-inline-images
- The --verbose flag is useful with this option.
-
This flag causes qpdf to recompress all images that are not
compressed with DCT (JPEG) using DCT compression as long as doing
so decreases the size in bytes of the image data and the image does
@@ -1661,9 +1662,8 @@ Related Options
Prevent inline images from being considered by --optimize-images.
- Prevent inline images from being included in image optimization.
- This option has no effect when :qpdf:ref:`--optimize-images` is not
- specified.
+ Prevent inline images from being included in image optimization
+ done by :qpdf:ref:`--optimize-images`.
.. qpdf:option:: --remove-page-labels
@@ -1901,12 +1901,12 @@ Related Options
encryption.
Enable/disable extraction of text for accessibility to visually
- impaired users. The qpdf library disregards this field when AES is used
- with 128-bit encryption or when 256-bit encryption is used. You
- should never disable accessibility unless you are explicitly doing
- so for creating test files. The PDF spec says that conforming
- readers should disregard this permission and always allow
- accessibility.
+ impaired users. The default is to be fully permissive. The qpdf
+ library disregards this field when AES is used with 128-bit
+ encryption or when 256-bit encryption is used. You should never
+ disable accessibility unless you are explicitly doing so for
+ creating test files. The PDF spec says that conforming readers
+ should disregard this permission and always allow accessibility.
This option is not available with 40-bit encryption.
@@ -1920,10 +1920,10 @@ Related Options
unless --modify-other=n or --modify=none is also specified.
Enable/disable modifying annotations including making comments and
- filling in form fields. For 128-bit and 256-bit encryption, this
- also enables editing, creating, and deleting form fields unless
- :samp:`--modify-other=n` or :samp:`--modify=none` is also
- specified.
+ filling in form fields. The default is to be fully permissive. For
+ 128-bit and 256-bit encryption, this also enables editing,
+ creating, and deleting form fields unless :samp:`--modify-other=n`
+ or :samp:`--modify=none` is also specified.
.. qpdf:option:: --assemble=[yn]
@@ -1933,7 +1933,7 @@ Related Options
pages). This option is not available with 40-bit encryption.
Enable/disable document assembly (rotation and reordering of
- pages).
+ pages). The default is to be fully permissive.
This option is not available with 40-bit encryption.
@@ -1945,7 +1945,7 @@ Related Options
accessibility.
Enable/disable text/graphic extraction for purposes other than
- accessibility.
+ accessibility. The default is to be fully permissive.
.. qpdf:option:: --form=[yn]
@@ -1956,7 +1956,8 @@ Related Options
available with 40-bit encryption.
Enable/disable whether filling form fields is allowed even if
- modification of annotations is disabled.
+ modification of annotations is disabled. The default is to be fully
+ permissive.
This option is not available with 40-bit encryption.
@@ -1972,7 +1973,8 @@ Related Options
Enable/disable modifications not controlled by
:qpdf:ref:`--assemble`, :qpdf:ref:`--annotate`, or
:qpdf:ref:`--form`. ``--modify-other=n`` is implied by any of the
- other :qpdf:ref:`--modify` options except for ``--modify=all``.
+ other :qpdf:ref:`--modify` options except for ``--modify=all``. The
+ default is to be fully permissive.
This option is not available with 40-bit encryption.
@@ -1995,7 +1997,8 @@ Related Options
none: --modify-other=n --annotate=n --form=n --assemble=n
For 40-bit files, :samp:`{modify-opt}` may only be ``y`` or ``n``
- and controls all aspects of document modification.
+ and controls all aspects of document modification. The default is
+ to be fully permissive.
For 128-bit and 256-bit encryption, :samp:`{modify-opt}` values
allow enabling and disabling levels of restriction in a manner
@@ -2058,10 +2061,11 @@ Related Options
low: allow low-resolution printing only
full: allow full printing (the default)
- Control what kind of printing is allowed. For 40-bit encryption,
- :samp:`{print-opt}` may only be ``y`` or ``n`` and enables or disables all
- printing. For 128-bit and 256-bit encryption, :samp:`{print-opt}`
- may have the following values:
+ Control what kind of printing is allowed. The default is to be
+ fully permissive. For 40-bit encryption, :samp:`{print-opt}` may
+ only be ``y`` or ``n`` and enables or disables all printing. For
+ 128-bit and 256-bit encryption, :samp:`{print-opt}` may have the
+ following values:
.. list-table:: :samp:`{print-opt}` Values
:widths: 10 80
@@ -2118,9 +2122,9 @@ Related Options
created in this way are insecure since they can be opened without a
password, and restrictions will not be enforced. Users would
ordinarily never want to create such files. If you are using qpdf
- to intentionally created strange files for testing (a definite
- valid use of qpdf!), this option allows you to create such insecure
- files. This option is only available with 256-bit encryption.
+ to intentionally created strange files for testing (a valid use of
+ qpdf!), this option allows you to create such insecure files. This
+ option is only available with 256-bit encryption.
See :ref:`pdf-passwords` for a more technical discussion of this
issue.
@@ -2262,7 +2266,7 @@ Examples
qpdf --empty --pages a.pdf b.pdf --password=x z-1 c.pdf 3,6
-- Scan a document with printing on both sides by scanning the fronts
+- Scan a document with double-sided printing by scanning the fronts
into :file:`odd.pdf` and the backs into :file:`even.pdf`. Collate
the results into :file:`all.pdf`. This takes the first page of
:file:`odd.pdf`, the first page of :file:`even.pdf`, the second page
@@ -2462,7 +2466,8 @@ output. The ``--overlay`` and ``--underlay`` options work the same
way, except underlay pages are drawn underneath the page to which they
are applied, possibly obscured by the original page, and overlay files
are drawn on top of the page to which they are applied, possibly
-obscuring the page. You can combine overlay and underlay.
+obscuring the page. You can combine overlay and underlay, but you can
+only specify each option at most one time.
The default behavior of overlay and underlay is that pages are taken
from the overlay/underlay file in sequence and applied to
@@ -2495,8 +2500,14 @@ and the ``--`` option. The following options are supported:
Specify a page range that indicates which pages in the
overlay/underlay file will be used for overlay or underlay. If not
-specified, all pages will be used. This can be left empty by omitting
-:samp:`{page-range}` if :qpdf:ref:`--repeat` is used.
+specified, all pages will be used. The "from" pages are used until
+they are exhausted, after which any pages specified with
+:qpdf:ref:`--repeat` are used. If you are using the
+:qpdf:ref:`--repeat` option, you can use ``--from=`` to provide an
+empty set of "from" pages.
+
+This Can be left empty by omitting
+:samp:`{page-range}`
.. qpdf:option:: --repeat=page-range
@@ -2549,40 +2560,17 @@ Embedded Files/Attachments
It is possible to list, add, or delete embedded files (also known
as attachments) and to copy attachments from other files. See help
on individual options for details. Run qpdf --help=add-attachment
- for additional details about adding attachments.
+ for additional details about adding attachments. See also
+ --help=--list-attachments and --help=--show-attachment.
It is possible to list, add, or delete embedded files (also known as
-attachments) and to copy attachments from other files.
+attachments) and to copy attachments from other files. See also
+:qpdf:ref:`--list-attachments` and :qpdf:ref:`--show-attachment`.
Related Options
~~~~~~~~~~~~~~~
-.. qpdf:option:: --list-attachments
-
- .. help: list embedded files
-
- Show the key and stream number for each embedded file. Combine
- with --verbose for more detailed information.
-
- Show the *key* and stream number for each embedded file. With
- :qpdf:ref:`--verbose`, additional information, including preferred
- file name, description, dates, and more are also displayed. The key
- is usually but not always equal to the file name and is needed by
- some of the other options.
-
-.. qpdf:option:: --show-attachment=key
-
- .. help: export an embedded file
-
- Write the contents of the specified attachment to standard
- output as binary data. Get the key with --list-attachments.
-
- Write the contents of the specified attachment to standard output
- as binary data. The key should match one of the keys shown by
- :qpdf:ref:`--list-attachments`. If this option is given more than
- once, only the last attachment will be shown.
-
-.. qpdf:option:: --add-attachment file options --
+.. qpdf:option:: --add-attachment file [options] --
.. help: start add attachment options
@@ -2596,6 +2584,21 @@ Related Options
add multiple attachments. Please see :ref:`add-attachment` for
additional details.
+.. qpdf:option:: --copy-attachments-from file [options] --
+
+ .. help: start copy attachment options
+
+ The --copy-attachments-from flag and its options may be repeated
+ to copy attachments from multiple files. Run
+ qpdf --help=copy-attachments for details.
+
+ This flag starts copy attachment options, which are used to copy
+ attachments from other files.
+
+ The ``--copy-attachments-from`` flag and its options may be
+ repeated to copy attachments from multiple files. Please see
+ :ref:`copy-attachments` for additional details.
+
.. qpdf:option:: --remove-attachment=key
.. help: remove an embedded file
@@ -2612,21 +2615,6 @@ Related Options
the attachment key. This option may be repeated to remove multiple
attachments.
-.. qpdf:option:: --copy-attachments-from file options --
-
- .. help: start copy attachment options
-
- The --copy-attachments-from flag and its options may be repeated
- to copy attachments from multiple files. Run
- qpdf --help=copy-attachments for details.
-
- This flag starts copy attachment options, which are used to copy
- attachments from other files.
-
- The ``--copy-attachments-from`` flag and its options may be
- repeated to copy attachments from multiple files. Please see
- :ref:`copy-attachments` for additional details.
-
.. _pdf-dates:
PDF Date Format
@@ -2682,12 +2670,13 @@ These options are valid between :qpdf:ref:`--add-attachment` and ``--``.
.. help: specify attachment key
Specify the key to use for the attachment in the embedded files
- table. It defaults to the last element of the attached file's
- filename.
+ table. It defaults to the last element (basename) of the
+ attached file's filename.
Specify the key to use for the attachment in the embedded files
table. It defaults to the last element of the attached file's
- filename.
+ filename. For example, if you say ``--add-attachment
+ /home/user/image.png``, the default key will be just ``image.png``.
.. qpdf:option:: --filename=name
@@ -2696,12 +2685,14 @@ These options are valid between :qpdf:ref:`--add-attachment` and ``--``.
Specify the filename to be used for the attachment. This is what
is usually displayed to the user and is the name most graphical
PDF viewers will use when saving a file. It defaults to the last
- element of the attached file's filename.
+ element (basename) of the attached file's filename.
Specify the filename to be used for the attachment. This is what is
usually displayed to the user and is the name most graphical PDF
viewers will use when saving a file. It defaults to the last
- element of the attached file's filename.
+ element of the attached file's filename. For example, if you say
+ ``--add-attachment /home/user/image.png``, the default key will be
+ just ``image.png``.
.. qpdf:option:: --creationdate=date
@@ -2807,11 +2798,11 @@ PDF Inspection
.. help-topic inspection: inspect PDF files
These options provide tools for inspecting PDF files. When any of
- the options in this section are specified, no output file should be
+ the options in this section are specified, no output file may be
given.
These options provide tools for inspecting PDF files. When any of the
-options in this section are specified, no output file should be given.
+options in this section are specified, no output file may be given.
Related Options
~~~~~~~~~~~~~~~
@@ -2898,12 +2889,12 @@ Related Options
If a password is supplied with :qpdf:ref:`--password`, that
password is used to open the file just as with any normal
invocation of :command:`qpdf`. That means that using this option
- with :qpdf:ref:`--password` option can be used to check the
- correctness of the password. In that case, an exit status of ``3``
- means the file works with the supplied password. This option is
- mutually exclusive with :qpdf:ref:`--is-encrypted`. Both this
- option and :qpdf:ref:`--is-encrypted` exit with status ``2`` for
- non-encrypted files.
+ with :qpdf:ref:`--password` can be used to check the correctness of
+ the password. In that case, an exit status of ``3`` means the file
+ works with the supplied password. This option is mutually exclusive
+ with :qpdf:ref:`--is-encrypted`. Both this option and
+ :qpdf:ref:`--is-encrypted` exit with status ``2`` for non-encrypted
+ files.
.. qpdf:option:: --check
@@ -2962,8 +2953,8 @@ Related Options
.. help: show key with --show-encryption
- When used with --show-encryption, causes the underlying
- encryption key to be displayed.
+ When used with --show-encryption or --check, causes the
+ underlying encryption key to be displayed.
When encryption information is being displayed, as when
:qpdf:ref:`--check` or :qpdf:ref:`--show-encryption` is given, display the
@@ -3016,7 +3007,7 @@ Related Options
reconstruction is performed, this option will show the information
in the reconstructed table.
-.. qpdf:option:: --show-object=trailer|obj[,gen]
+.. qpdf:option:: --show-object={trailer|obj[,gen]}
.. help: show contents of an object
@@ -3103,6 +3094,32 @@ Related Options
When used with :qpdf:ref:`--show-pages`, also shows the object and
generation numbers for the image objects on each page.
+.. qpdf:option:: --list-attachments
+
+ .. help: list embedded files
+
+ Show the key and stream number for each embedded file. Combine
+ with --verbose for more detailed information.
+
+ Show the *key* and stream number for each embedded file. With
+ :qpdf:ref:`--verbose`, additional information, including preferred
+ file name, description, dates, and more are also displayed. The key
+ is usually but not always equal to the file name and is needed by
+ some of the other options. See also :ref:`attachments`.
+
+.. qpdf:option:: --show-attachment=key
+
+ .. help: export an embedded file
+
+ Write the contents of the specified attachment to standard
+ output as binary data. Get the key with --list-attachments.
+
+ Write the contents of the specified attachment to standard output
+ as binary data. The key should match one of the keys shown by
+ :qpdf:ref:`--list-attachments`. If this option is given more than
+ once, only the last attachment will be shown. See also
+ :ref:`attachments`.
+
.. _json-options:
JSON Options
@@ -3149,7 +3166,7 @@ Related Options
keys will be included in the JSON output. Otherwise, all keys will
be included.
-.. qpdf:option:: --json-object=trailer|obj[,gen]
+.. qpdf:option:: --json-object={trailer|obj[,gen]}
.. help: restrict which objects are in JSON
diff --git a/qpdf/test_driver.cc b/qpdf/test_driver.cc
index 0e5b47af..65b2038c 100644
--- a/qpdf/test_driver.cc
+++ b/qpdf/test_driver.cc
@@ -3128,6 +3128,7 @@ static void test_82(QPDF& pdf, char const* arg2)
assert(stream.isStreamOfType("/ObjStm"));
assert(! stream.isStreamOfType("/Test"));
assert(! pdf.getObjectByID(2,0).isStreamOfType("/Pages"));
+ /* cSpell: ignore Blaah Blaaah Blaaaah */
auto array = QPDFObjectHandle::parse("[/Blah /Blaah /Blaaah]");
assert(array.isOrHasName("/Blah"));
assert(array.isOrHasName("/Blaaah"));