aboutsummaryrefslogtreecommitdiffstats
path: root/libqpdf
diff options
context:
space:
mode:
authorJay Berkenbilt <ejb@ql.org>2009-10-05 02:42:48 +0200
committerJay Berkenbilt <ejb@ql.org>2009-10-05 02:42:48 +0200
commitc2023db265ea35ad7d0ab0cd989f16479bcb798d (patch)
treea4cbc126f6152a185ec10b58f5330c7bfbe5f90a /libqpdf
parentc1e53f148096c329650068694fbde82f018560bf (diff)
downloadqpdf-c2023db265ea35ad7d0ab0cd989f16479bcb798d.tar.zst
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
Diffstat (limited to 'libqpdf')
-rw-r--r--libqpdf/QPDFWriter.cc50
-rw-r--r--libqpdf/QPDF_encryption.cc6
-rw-r--r--libqpdf/qpdf-c.cc20
3 files changed, 64 insertions, 12 deletions
diff --git a/libqpdf/QPDFWriter.cc b/libqpdf/QPDFWriter.cc
index 4191e906..0ede7889 100644
--- a/libqpdf/QPDFWriter.cc
+++ b/libqpdf/QPDFWriter.cc
@@ -100,6 +100,37 @@ QPDFWriter::setQDFMode(bool 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)
{
this->static_id = 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);
@@ -391,6 +397,20 @@ void qpdf_set_linearization(qpdf_data qpdf, QPDF_BOOL 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)
{
QPDF_ERROR_CODE status = QPDF_SUCCESS;