From c2023db265ea35ad7d0ab0cd989f16479bcb798d Mon Sep 17 00:00:00 2001 From: Jay Berkenbilt Date: Mon, 5 Oct 2009 00:42:48 +0000 Subject: Implement changes suggested by Zarko and our subsequent conversations: - Add a way to set the minimum PDF version - Add a way to force the PDF version - Have isEncrypted return true if an /Encrypt dictionary exists even when we can't read the file - Allow qpdf_init_write to be called multiple times - Update some comments in headers git-svn-id: svn+q:///qpdf/trunk@748 71b93d88-0707-0410-a8cf-f5a4172ac649 --- libqpdf/QPDFWriter.cc | 50 ++++++++++++++++++++++++++++++++++++---------- libqpdf/QPDF_encryption.cc | 6 +++++- libqpdf/qpdf-c.cc | 20 +++++++++++++++++++ 3 files changed, 64 insertions(+), 12 deletions(-) (limited to 'libqpdf') diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc index 4191e906..0ede7889 100644 --- a/libqpdf/QPDFWriter.cc +++ b/libqpdf/QPDFWriter.cc @@ -99,6 +99,37 @@ QPDFWriter::setQDFMode(bool val) this->qdf_mode = val; } +void +QPDFWriter::setMinimumPDFVersion(std::string const& version) +{ + bool set_version = false; + if (this->min_pdf_version.empty()) + { + set_version = true; + } + else + { + float v = atof(version.c_str()); + float mv = atof(this->min_pdf_version.c_str()); + if (v > mv) + { + QTC::TC("qpdf", "QPDFWriter increasing minimum version"); + set_version = true; + } + } + + if (set_version) + { + this->min_pdf_version = version; + } +} + +void +QPDFWriter::forcePDFVersion(std::string const& version) +{ + this->forced_pdf_version = version; +} + void QPDFWriter::setStaticID(bool val) { @@ -147,7 +178,7 @@ QPDFWriter::setR2EncryptionParameters( clear.insert(6); } - this->min_pdf_version = "1.3"; + setMinimumPDFVersion("1.3"); setEncryptionParameters(user_password, owner_password, 1, 2, 5, clear); } @@ -221,7 +252,7 @@ QPDFWriter::setR3EncryptionParameters( // no default so gcc warns for missing cases } - this->min_pdf_version = "1.4"; + setMinimumPDFVersion("1.4"); setEncryptionParameters(user_password, owner_password, 2, 3, 16, clear); } @@ -1361,7 +1392,7 @@ QPDFWriter::write() if (! this->object_stream_to_objects.empty()) { - this->min_pdf_version = "1.5"; + setMinimumPDFVersion("1.5"); } generateID(); @@ -1417,15 +1448,12 @@ QPDFWriter::writeEncryptionDictionary() void QPDFWriter::writeHeader() { - std::string version = pdf.getPDFVersion(); - if (! this->min_pdf_version.empty()) + setMinimumPDFVersion(pdf.getPDFVersion()); + std::string version = this->min_pdf_version; + if (! this->forced_pdf_version.empty()) { - float ov = atof(version.c_str()); - float mv = atof(this->min_pdf_version.c_str()); - if (mv > ov) - { - version = this->min_pdf_version; - } + QTC::TC("qpdf", "QPDFWriter using forced PDF version"); + version = this->forced_pdf_version; } writeString("%PDF-"); diff --git a/libqpdf/QPDF_encryption.cc b/libqpdf/QPDF_encryption.cc index 5d061dfd..075ab22a 100644 --- a/libqpdf/QPDF_encryption.cc +++ b/libqpdf/QPDF_encryption.cc @@ -289,6 +289,11 @@ QPDF::initializeEncryption() return; } + // Go ahead and set this->encryption here. That way, isEncrypted + // will return true even if there were errors reading the + // encryption dictionary. + this->encrypted = true; + QPDFObjectHandle id_obj = this->trailer.getKey("/ID"); if (! (id_obj.isArray() && (id_obj.getArrayNItems() == 2) && @@ -377,7 +382,6 @@ QPDF::initializeEncryption() throw QPDFExc(this->file.getName() + ": invalid password"); } - this->encrypted = true; this->encryption_key = compute_encryption_key(this->user_password, data); } diff --git a/libqpdf/qpdf-c.cc b/libqpdf/qpdf-c.cc index 9e2d0cbf..966d3dbb 100644 --- a/libqpdf/qpdf-c.cc +++ b/libqpdf/qpdf-c.cc @@ -252,6 +252,12 @@ DLL_EXPORT QPDF_ERROR_CODE qpdf_init_write(qpdf_data qpdf, char const* filename) { QPDF_ERROR_CODE status = QPDF_SUCCESS; + if (qpdf->qpdf_writer) + { + QTC::TC("qpdf", "qpdf-c called qpdf_init_write multiple times"); + delete qpdf->qpdf_writer; + qpdf->qpdf_writer = 0; + } try { qpdf->qpdf_writer = new QPDFWriter(*(qpdf->qpdf), filename); @@ -390,6 +396,20 @@ void qpdf_set_linearization(qpdf_data qpdf, QPDF_BOOL value) qpdf->qpdf_writer->setLinearization(value); } +DLL_EXPORT +void qpdf_set_minimum_pdf_version(qpdf_data qpdf, char const* version) +{ + QTC::TC("qpdf", "qpdf-c called qpdf_set_minimum_pdf_version"); + qpdf->qpdf_writer->setMinimumPDFVersion(version); +} + +DLL_EXPORT +void qpdf_force_pdf_version(qpdf_data qpdf, char const* version) +{ + QTC::TC("qpdf", "qpdf-c called qpdf_force_pdf_version"); + qpdf->qpdf_writer->forcePDFVersion(version); +} + DLL_EXPORT QPDF_ERROR_CODE qpdf_write(qpdf_data qpdf) { -- cgit v1.2.3-54-g00ecf