features:(pdf protect): open and lock and unlock done
This commit is contained in:
@@ -221,6 +221,57 @@ PYBIND11_MODULE(pdfengine, m) {
|
||||
m.def("engine_has_skia", &pdfengine::engineHasSkia,
|
||||
"Check if the engine was built with Skia support");
|
||||
|
||||
m.def(
|
||||
"protect_pdf",
|
||||
[](const py::bytes& input_bytes,
|
||||
const std::string& user_password,
|
||||
const std::string& owner_password,
|
||||
const py::dict& perms_dict) {
|
||||
if (user_password.empty()) {
|
||||
throw py::value_error("User password cannot be empty");
|
||||
}
|
||||
|
||||
std::string_view sv = input_bytes;
|
||||
std::vector<uint8_t> data(sv.begin(), sv.end());
|
||||
|
||||
pdfengine::qpdf_layer::PdfEncryptionOptions opts;
|
||||
opts.userPassword = user_password;
|
||||
opts.ownerPassword = owner_password.empty() ? user_password : owner_password;
|
||||
|
||||
auto get_bool = [&](const char* key, bool dflt) {
|
||||
if (perms_dict.contains(key) && !perms_dict[key].is_none()) {
|
||||
try { return perms_dict[key].cast<bool>(); } catch (...) {}
|
||||
}
|
||||
return dflt;
|
||||
};
|
||||
|
||||
opts.allowPrint = get_bool("canPrint", true);
|
||||
opts.allowPrintHighRes = get_bool("canPrintHighRes", true);
|
||||
opts.allowModify = get_bool("canModify", true);
|
||||
opts.allowCopy = get_bool("canCopy", true);
|
||||
opts.allowAnnotate = get_bool("canAnnotate", true);
|
||||
opts.allowFillForms = get_bool("canFillForms", true);
|
||||
opts.allowAccessibility = get_bool("canExtractForAccessibility", true);
|
||||
opts.allowAssemble = get_bool("canAssemble", true);
|
||||
opts.keyLengthBits = 256;
|
||||
|
||||
pdfengine::qpdf_layer::QpdfWriter writer;
|
||||
auto res = writer.encryptPdf(data, opts);
|
||||
|
||||
if (!res.has_value()) {
|
||||
throw std::runtime_error("Encryption failed");
|
||||
}
|
||||
|
||||
const auto& out_bytes = res.value();
|
||||
return py::bytes(reinterpret_cast<const char*>(out_bytes.data()), out_bytes.size());
|
||||
},
|
||||
py::arg("input_bytes"),
|
||||
py::arg("user_password"),
|
||||
py::arg("owner_password") = "",
|
||||
py::arg("permissions") = py::dict(),
|
||||
"Encrypt raw PDF bytes with AES-256 and custom permissions"
|
||||
);
|
||||
|
||||
py::class_<pdfengine::Point2D>(m, "Point2D")
|
||||
.def(py::init<double, double>(), py::arg("x") = 0.0, py::arg("y") = 0.0)
|
||||
.def_readwrite("x", &pdfengine::Point2D::x)
|
||||
|
||||
Reference in New Issue
Block a user