2
1
mirror of https://github.com/qpdf/qpdf.git synced 2024-12-22 10:58:58 +00:00

QPDFJob: convert pages

This commit is contained in:
Jay Berkenbilt 2022-01-25 19:01:10 -05:00
parent 9373881cca
commit 41c5af8f26
7 changed files with 88 additions and 32 deletions

View File

@ -32,17 +32,6 @@ def write_file(filename):
os.rename(tmpfile, filename) os.rename(tmpfile, filename)
# QXXXQ
# These need manual handlers.
complex = set([
'add-attachment',
'copy-attachments-from',
'encrypt',
'overlay',
'pages',
'underlay',
])
# QXXXQ # QXXXQ
# These are trivial but not in main and so need a different config # These are trivial but not in main and so need a different config
# object. Some are in more than one table. # object. Some are in more than one table.
@ -466,8 +455,8 @@ class Main:
for i, [kind, v] in flags.items(): for i, [kind, v] in flags.items():
self.options_without_help.add(f'--{i}') self.options_without_help.add(f'--{i}')
add_jdata(i, table_prefix or table) add_jdata(i, table_prefix or table)
# QXXXQ complex, not_yet # QXXXQ not_yet
if i in complex or i in not_yet or config is None: if i in not_yet or config is None or i in o.get('manual', []):
identifier = self.to_identifier(i, arg_prefix, False) identifier = self.to_identifier(i, arg_prefix, False)
self.handle_flag(i, identifier, kind, v) self.handle_flag(i, identifier, kind, v)
else: else:
@ -581,7 +570,7 @@ class Main:
['choices', 'options', 'no-json', 'json'])) ['choices', 'options', 'no-json', 'json']))
for o in data['options']: for o in data['options']:
self.check_keys('top', o, set( self.check_keys('top', o, set(
['table', 'prefix', 'config', 'bare', 'positional', ['table', 'prefix', 'config', 'manual', 'bare', 'positional',
'optional_parameter', 'required_parameter', 'optional_parameter', 'required_parameter',
'required_choices', 'optional_choices', 'from_table'])) 'required_choices', 'optional_choices', 'from_table']))

View File

@ -135,6 +135,17 @@ class QPDFJob
bool replace; bool replace;
}; };
struct PageSpec
{
PageSpec(std::string const& filename,
char const* password,
std::string const& range);
std::string filename;
std::shared_ptr<char> password;
std::string range;
};
public: public:
class Config; class Config;
@ -172,6 +183,24 @@ class QPDFJob
CopyAttachmentFrom caf; CopyAttachmentFrom caf;
}; };
class PagesConfig
{
friend class QPDFJob;
friend class Config;
public:
PagesConfig& pageSpec(std::string const& filename,
char const* password,
std::string const& range);
# include <qpdf/auto_job_c_pages.hh>
private:
PagesConfig(Config&);
PagesConfig(PagesConfig const&) = delete;
Config& config;
};
// Configuration is performed by calling methods XXX QXXXQ document // Configuration is performed by calling methods XXX QXXXQ document
class Config class Config
{ {
@ -180,6 +209,7 @@ class QPDFJob
QPDF_DLL QPDF_DLL
std::shared_ptr<CopyAttConfig> copyAttachmentsFrom(); std::shared_ptr<CopyAttConfig> copyAttachmentsFrom();
std::shared_ptr<AttConfig> addAttachment(); std::shared_ptr<AttConfig> addAttachment();
std::shared_ptr<PagesConfig> pages();
# include <qpdf/auto_job_c_main.hh> # include <qpdf/auto_job_c_main.hh>
@ -243,17 +273,6 @@ class QPDFJob
static void parse_object_id( static void parse_object_id(
std::string const& objspec, bool& trailer, int& obj, int& gen); std::string const& objspec, bool& trailer, int& obj, int& gen);
struct PageSpec
{
PageSpec(std::string const& filename,
char const* password,
std::string const& range);
std::string filename;
std::shared_ptr<char> password;
std::string range;
};
struct RotationSpec struct RotationSpec
{ {
RotationSpec(int angle = 0, bool relative = false) : RotationSpec(int angle = 0, bool relative = false) :

View File

@ -0,0 +1,6 @@
//
// This file is automatically generated by generate_auto_job.
// Edits will be automatically overwritten if the build is
// run in maintainer mode.
//
QPDF_DLL Config& end();

View File

@ -1,9 +1,10 @@
# Generated by generate_auto_job # Generated by generate_auto_job
generate_auto_job d9f75a50dd4e503ede676bad54f80f856de096da7f3ad0e4594b0d09a6e1215d generate_auto_job 66e43cdb4ae166d020be19fcc6f8e9f0445c4de6a5395ff5aff511b89763c4e1
include/qpdf/auto_job_c_att.hh ecc3f8f711b486b491e811176362a90c022eb225ff12157df3a10ca021be87b1 include/qpdf/auto_job_c_att.hh ecc3f8f711b486b491e811176362a90c022eb225ff12157df3a10ca021be87b1
include/qpdf/auto_job_c_copy_att.hh caffae3d1faf2cd92a07ba77da638cce31da3e074a047918834195c0f3ed508a include/qpdf/auto_job_c_copy_att.hh caffae3d1faf2cd92a07ba77da638cce31da3e074a047918834195c0f3ed508a
include/qpdf/auto_job_c_main.hh 5fdd9c85aa295a3caec467b9607fe82c874cd3aaeb7806b9d18074f7b96fd085 include/qpdf/auto_job_c_main.hh 5fdd9c85aa295a3caec467b9607fe82c874cd3aaeb7806b9d18074f7b96fd085
job.yml e649f7dbb3748584f338b330043336ce4a4d51a34b00b42caa89dcfbc7bdcb84 include/qpdf/auto_job_c_pages.hh 79ee6e52a36fedfd0e6ca60bd926bc25a3e975ab6fa984a7e798a48791e8ba86
job.yml 4cd60df0caa74b68cc39352910a8381c3411248bc3edef69f9d16d75e807f451
libqpdf/qpdf/auto_job_decl.hh 38f7462e34fea7d46d5e5519ac1742be6e57ea6f66c47b37d5425f3a2b9ca536 libqpdf/qpdf/auto_job_decl.hh 38f7462e34fea7d46d5e5519ac1742be6e57ea6f66c47b37d5425f3a2b9ca536
libqpdf/qpdf/auto_job_help.hh 383eea80e2c185ef5295fc126246457a7ceeffea759fdb90bb2e6727532ea538 libqpdf/qpdf/auto_job_help.hh 383eea80e2c185ef5295fc126246457a7ceeffea759fdb90bb2e6727532ea538
libqpdf/qpdf/auto_job_init.hh b49d839078d84398142f8f14bdae8a71f44fbff13cdf7b350b84ef2410aaa6a3 libqpdf/qpdf/auto_job_init.hh b49d839078d84398142f8f14bdae8a71f44fbff13cdf7b350b84ef2410aaa6a3

10
job.yml
View File

@ -61,6 +61,13 @@ options:
- job-json-help - job-json-help
- table: main - table: main
config: c_main config: c_main
manual:
- add-attachment
- copy-attachments-from
- encrypt
- overlay
- pages
- underlay
positional: true positional: true
bare: bare:
- add-attachment - add-attachment
@ -148,8 +155,11 @@ options:
remove-unreferenced-resources: remove_unref remove-unreferenced-resources: remove_unref
stream-data: stream_data stream-data: stream_data
- table: pages - table: pages
config: c_pages
prefix: Pages prefix: Pages
positional: true positional: true
manual:
- password
required_parameter: required_parameter:
password: password password: password
- table: encryption - table: encryption

View File

@ -46,6 +46,7 @@ namespace
std::shared_ptr<QPDFJob::Config> c_main; std::shared_ptr<QPDFJob::Config> c_main;
std::shared_ptr<QPDFJob::CopyAttConfig> c_copy_att; std::shared_ptr<QPDFJob::CopyAttConfig> c_copy_att;
std::shared_ptr<QPDFJob::AttConfig> c_att; std::shared_ptr<QPDFJob::AttConfig> c_att;
std::shared_ptr<QPDFJob::PagesConfig> c_pages;
std::vector<char*> accumulated_args; // points to member in ap std::vector<char*> accumulated_args; // points to member in ap
char* pages_password; char* pages_password;
}; };
@ -310,6 +311,7 @@ ArgParser::argPages()
usage("the --pages may only be specified one time"); usage("the --pages may only be specified one time");
} }
this->accumulated_args.clear(); this->accumulated_args.clear();
this->c_pages = c_main->pages();
this->ap.selectOptionTable(O_PAGES); this->ap.selectOptionTable(O_PAGES);
} }
@ -402,7 +404,7 @@ ArgParser::argPagesPositional(char* arg)
{ {
range = "1-z"; range = "1-z";
} }
o.page_specs.push_back(QPDFJob::PageSpec(file, this->pages_password, range)); this->c_pages->pageSpec(file, this->pages_password, range);
this->accumulated_args.clear(); this->accumulated_args.clear();
this->pages_password = nullptr; this->pages_password = nullptr;
if (next_file != nullptr) if (next_file != nullptr)
@ -415,10 +417,8 @@ void
ArgParser::argEndPages() ArgParser::argEndPages()
{ {
argPagesPositional(nullptr); argPagesPositional(nullptr);
if (o.page_specs.empty()) c_pages->end();
{ c_pages = nullptr;
usage("--pages: no page specifications given");
}
} }
void void

View File

@ -657,3 +657,34 @@ QPDFJob::AttConfig::end()
this->config.o.attachments_to_add.push_back(this->att); this->config.o.attachments_to_add.push_back(this->att);
return this->config; return this->config;
} }
QPDFJob::PagesConfig::PagesConfig(Config& c) :
config(c)
{
}
std::shared_ptr<QPDFJob::PagesConfig>
QPDFJob::Config::pages()
{
return std::shared_ptr<PagesConfig>(new PagesConfig(*this));
}
QPDFJob::Config&
QPDFJob::PagesConfig::end()
{
if (this->config.o.page_specs.empty())
{
throw QPDFJob::ConfigError("--pages: no page specifications given");
}
return this->config;
}
QPDFJob::PagesConfig&
QPDFJob::PagesConfig::pageSpec(std::string const& filename,
char const* password,
std::string const& range)
{
this->config.o.page_specs.push_back(
QPDFJob::PageSpec(filename, password, range));
return *this;
}