diff options
Diffstat (limited to 'include')
-rw-r--r-- | include/qpdf/Constants.h | 7 | ||||
-rw-r--r-- | include/qpdf/QPDFJob.hh | 307 |
2 files changed, 314 insertions, 0 deletions
diff --git a/include/qpdf/Constants.h b/include/qpdf/Constants.h index fab6e370..9e9e8eae 100644 --- a/include/qpdf/Constants.h +++ b/include/qpdf/Constants.h @@ -176,4 +176,11 @@ enum pdf_annotation_flag_e an_locked_contents = 1 << 9 }; +/* Encryption/password status for QPDFJob */ +enum qpdf_encryption_status_e +{ + qpdf_es_encrypted = 1 << 0, + qpdf_es_password_incorrect = 1 << 1 +}; + #endif /* QPDFCONSTANTS_H */ diff --git a/include/qpdf/QPDFJob.hh b/include/qpdf/QPDFJob.hh new file mode 100644 index 00000000..03b6aa21 --- /dev/null +++ b/include/qpdf/QPDFJob.hh @@ -0,0 +1,307 @@ +// Copyright (c) 2005-2021 Jay Berkenbilt +// +// 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 +// +// 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. +// +// 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. + +#ifndef QPDFJOB_HH +#define QPDFJOB_HH + +#include <qpdf/DLL.h> +#include <qpdf/PointerHolder.hh> +#include <qpdf/QPDF.hh> +#include <qpdf/Constants.h> + +#include <string> +#include <list> +#include <vector> +#include <set> +#include <map> +#include <iostream> + +class QPDFWriter; + +class QPDFJob +{ + public: + QPDF_DLL + QPDFJob(); + + QPDF_DLL + void setOutputStreams(std::ostream* out_stream, std::ostream* err_stream); + + QPDF_DLL + void run(); + + QPDF_DLL + bool hasWarnings(); + + QPDF_DLL + bool createsOutput(); + + QPDF_DLL + bool suppressWarnings(); + + QPDF_DLL + bool checkRequiresPassword(); + + QPDF_DLL + bool checkIsEncrypted(); + + + // Return value is bitwise OR of values from qpdf_encryption_status_e + QPDF_DLL + unsigned long getEncryptionStatus(); + + // QXXXQ From here to END-PUBLIC should all be private + public: + + QPDF_DLL + static JSON json_schema(std::set<std::string>* keys = 0); + QPDF_DLL + static void parse_object_id( + std::string const& objspec, bool& trailer, int& obj, int& gen); + + struct PageSpec + { + PageSpec(std::string const& filename, + char const* password, + char const* range) : + filename(filename), + password(password), + range(range) + { + } + + std::string filename; + char const* password; + char const* range; + }; + + struct RotationSpec + { + RotationSpec(int angle = 0, bool relative = false) : + angle(angle), + relative(relative) + { + } + + int angle; + bool relative; + }; + + enum password_mode_e { pm_bytes, pm_hex_bytes, pm_unicode, pm_auto }; + + struct UnderOverlay + { + UnderOverlay(char const* which) : + which(which), + filename(0), + password(0), + to_nr("1-z"), + from_nr("1-z"), + repeat_nr("") + { + } + + std::string which; + char const* filename; + char const* password; + char const* to_nr; + char const* from_nr; + char const* repeat_nr; + PointerHolder<QPDF> pdf; + std::vector<int> to_pagenos; + std::vector<int> from_pagenos; + std::vector<int> repeat_pagenos; + }; + + struct AddAttachment + { + AddAttachment() : + replace(false) + { + } + + std::string path; + std::string key; + std::string filename; + std::string creationdate; + std::string moddate; + std::string mimetype; + std::string description; + bool replace; + }; + + struct CopyAttachmentFrom + { + std::string path; + std::string password; + std::string prefix; + }; + + PointerHolder<QPDF> processFile( + char const* filename, char const* password); + void validateUnderOverlay(QPDF& pdf, QPDFJob::UnderOverlay* uo); + void handleUnderOverlay(QPDF& pdf); + void copyAttachments(QPDF& pdf); + void handleTransformations(QPDF& pdf); + void addAttachments(QPDF& pdf); + void setWriterOptions(QPDF& pdf, QPDFWriter& w); + void doSplitPages(QPDF& pdf, bool& warnings); + void writeOutfile(QPDF& pdf); + + enum remove_unref_e { re_auto, re_yes, re_no }; + + char const* password; + std::shared_ptr<char> password_alloc; + bool linearize; + bool decrypt; + int split_pages; + bool verbose; + bool progress; + bool suppress_warnings; + bool copy_encryption; + char const* encryption_file; + char const* encryption_file_password; + bool encrypt; + bool password_is_hex_key; + bool suppress_password_recovery; + password_mode_e password_mode; + bool allow_insecure; + bool allow_weak_crypto; + std::string user_password; + std::string owner_password; + int keylen; + bool r2_print; + bool r2_modify; + bool r2_extract; + bool r2_annotate; + bool r3_accessibility; + bool r3_extract; + bool r3_assemble; + bool r3_annotate_and_form; + bool r3_form_filling; + bool r3_modify_other; + qpdf_r3_print_e r3_print; + bool force_V4; + bool force_R5; + bool cleartext_metadata; + bool use_aes; + bool stream_data_set; + qpdf_stream_data_e stream_data_mode; + bool compress_streams; + bool compress_streams_set; + bool recompress_flate; + bool recompress_flate_set; + int compression_level; + qpdf_stream_decode_level_e decode_level; + bool decode_level_set; + bool normalize_set; + bool normalize; + bool suppress_recovery; + bool object_stream_set; + qpdf_object_stream_e object_stream_mode; + bool ignore_xref_streams; + bool qdf_mode; + bool preserve_unreferenced_objects; + remove_unref_e remove_unreferenced_page_resources; + bool keep_files_open; + bool keep_files_open_set; + size_t keep_files_open_threshold; + bool newline_before_endstream; + std::string linearize_pass1; + bool coalesce_contents; + bool flatten_annotations; + int flatten_annotations_required; + int flatten_annotations_forbidden; + bool generate_appearances; + std::string min_version; + std::string force_version; + bool show_npages; + bool deterministic_id; + bool static_id; + bool static_aes_iv; + bool suppress_original_object_id; + bool show_encryption; + bool show_encryption_key; + bool check_linearization; + bool show_linearization; + bool show_xref; + bool show_trailer; + int show_obj; + int show_gen; + bool show_raw_stream_data; + bool show_filtered_stream_data; + bool show_pages; + bool show_page_images; + size_t collate; + bool flatten_rotation; + bool list_attachments; + std::string attachment_to_show; + std::list<std::string> attachments_to_remove; + std::list<AddAttachment> attachments_to_add; + std::list<CopyAttachmentFrom> attachments_to_copy; + bool json; + std::set<std::string> json_keys; + std::set<std::string> json_objects; + bool check; + bool optimize_images; + bool externalize_inline_images; + bool keep_inline_images; + bool remove_page_labels; + size_t oi_min_width; + size_t oi_min_height; + size_t oi_min_area; + size_t ii_min_bytes; + UnderOverlay underlay; + UnderOverlay overlay; + UnderOverlay* under_overlay; + std::vector<PageSpec> page_specs; + std::map<std::string, RotationSpec> rotations; + bool require_outfile; + bool replace_input; + bool check_is_encrypted; + bool check_requires_password; + char const* infilename; + char const* outfilename; + // QXXXQ END-PUBLIC + + private: + class Members + { + friend class QPDFJob; + + public: + QPDF_DLL + ~Members() = default; + + private: + Members(); + Members(Members const&) = delete; + + bool warnings; + bool creates_output; + std::ostream* out_stream; + std::ostream* err_stream; + unsigned long encryption_status; + }; + PointerHolder<Members> m; +}; + +#endif // QPDFOBJECT_HH |