From 3eda6d10ec0492b1de6e740c97a22070081d45d2 Mon Sep 17 00:00:00 2001 From: geisserml Date: Wed, 1 Mar 2023 14:54:08 +0100 Subject: [PATCH] Start working on #182 --- setup.py | 4 ++-- setupsrc/pypdfium2_setup/packaging_base.py | 8 +++---- setupsrc/pypdfium2_setup/update_pdfium.py | 4 ++-- src/pypdfium2/__main__.py | 2 +- src/pypdfium2/_helpers/document.py | 25 ++++++++++++++-------- src/pypdfium2/version.py | 5 +++-- 6 files changed, 27 insertions(+), 21 deletions(-) diff --git a/setup.py b/setup.py index dcdfbea7d..59b6ec96d 100644 --- a/setup.py +++ b/setup.py @@ -12,7 +12,7 @@ Host, DataTree, VersionTargetVar, - V8StatusFile, + V8StatusFileName, BinaryTargetVar, BinaryTarget_None, VerStatusFileName, @@ -53,7 +53,7 @@ def install_handler(): else: req_ver = int(req_ver) - had_v8 = (pl_dir / V8StatusFile).exists() + had_v8 = (pl_dir / V8StatusFileName).exists() use_v8 = bool(int( os.environ.get("PDFIUM_USE_V8", 0) )) if curr_ver != req_ver or had_v8 != use_v8: diff --git a/setupsrc/pypdfium2_setup/packaging_base.py b/setupsrc/pypdfium2_setup/packaging_base.py index 6d21ca541..179694e3b 100644 --- a/setupsrc/pypdfium2_setup/packaging_base.py +++ b/setupsrc/pypdfium2_setup/packaging_base.py @@ -18,7 +18,7 @@ BinaryTarget_Auto = "auto" BindingsFileName = "raw.py" VerStatusFileName = ".pdfium_version.txt" -V8StatusFile = ".pdfium_is_v8.txt" +V8StatusFileName = ".pdfium_is_v8.txt" HomeDir = Path.home() SourceTree = Path(__file__).parents[2] DataTree = SourceTree / "data" @@ -255,10 +255,8 @@ def emplace_platfiles(pl_name): ver_changes = dict() ver_changes["V_LIBPDFIUM"] = ver_file.read_text().strip() - if pl_name == PlatformNames.sourcebuild: - ver_changes["V_BUILDNAME"] = "source" - else: - ver_changes["V_BUILDNAME"] = "pdfium-binaries" + ver_changes["V_BUILDNAME"] = "source" if pl_name == PlatformNames.sourcebuild else "pdfium-binaries" + ver_changes["V_PDFIUM_IS_V8"] = (pl_dir / V8StatusFileName).exists() set_versions(ver_changes) clean_platfiles() diff --git a/setupsrc/pypdfium2_setup/update_pdfium.py b/setupsrc/pypdfium2_setup/update_pdfium.py index 481c85582..92dbdf6a3 100755 --- a/setupsrc/pypdfium2_setup/update_pdfium.py +++ b/setupsrc/pypdfium2_setup/update_pdfium.py @@ -18,7 +18,7 @@ Host, DataTree, VerStatusFileName, - V8StatusFile, + V8StatusFileName, ReleaseNames, BinaryPlatforms, ReleaseURL, @@ -60,7 +60,7 @@ def _get_package(pl_name, version, robust, use_v8): raise if use_v8: - (pl_dir / V8StatusFile).touch(exist_ok=True) + (pl_dir / V8StatusFileName).touch(exist_ok=True) return pl_name, fp diff --git a/src/pypdfium2/__main__.py b/src/pypdfium2/__main__.py index 27980fe53..799c6da71 100644 --- a/src/pypdfium2/__main__.py +++ b/src/pypdfium2/__main__.py @@ -42,7 +42,7 @@ def get_parser(): main_parser.add_argument( "--version", "-v", action = "version", - version = f"pypdfium2 {V_PYPDFIUM2} (libpdfium {V_LIBPDFIUM}, {V_BUILDNAME} build)", + version = f"pypdfium2 {V_PYPDFIUM2} (libpdfium {V_LIBPDFIUM}, {V_BUILDNAME} {'v8' if V_PDFIUM_IS_V8 else ''} build)", ) subparsers = main_parser.add_subparsers(dest="subcommand") diff --git a/src/pypdfium2/_helpers/document.py b/src/pypdfium2/_helpers/document.py index d156fd891..40ddae4eb 100644 --- a/src/pypdfium2/_helpers/document.py +++ b/src/pypdfium2/_helpers/document.py @@ -12,6 +12,7 @@ from concurrent.futures import ProcessPoolExecutor import pypdfium2.raw as pdfium_c +from pypdfium2.version import V_PDFIUM_IS_V8 from pypdfium2._helpers.misc import PdfiumError from pypdfium2._helpers.page import PdfPage from pypdfium2._helpers.pageobjects import PdfObject @@ -90,16 +91,10 @@ def __init__( AutoCloseable.__init__(self, self._close_impl, self._data_holder, self._data_closer) self.formenv = None + self.formtype = pdfium_c.FORMTYPE_NONE + self._has_forms = False if may_init_forms: - self.formtype = pdfium_c.FPDF_GetFormType(self) - self._has_forms = self.formtype != pdfium_c.FORMTYPE_NONE # TODO maybe make public? - if self._has_forms: - formconfig = pdfium_c.FPDF_FORMFILLINFO(version=2) - raw = pdfium_c.FPDFDOC_InitFormFillEnvironment(self, formconfig) - self.formenv = PdfFormEnv(raw, formconfig, self) - else: - self.formtype = pdfium_c.FORMTYPE_NONE - self._has_forms = False + self._init_forms() @property @@ -139,6 +134,18 @@ def __delitem__(self, i): self.del_page(i) + def _init_forms(self): + self.formtype = pdfium_c.FPDF_GetFormType(self) + self._has_forms = self.formtype != pdfium_c.FORMTYPE_NONE # TODO make public? + if self._has_forms: + if V_PDFIUM_IS_V8: + # BUG(182): would need a caller-provided form config ... + raise RuntimeError("pypdfium2's helpers do not support forms with V8 enabled binaries yet.") + formconfig = pdfium_c.FPDF_FORMFILLINFO(version=2) + raw = pdfium_c.FPDFDOC_InitFormFillEnvironment(self, formconfig) + self.formenv = PdfFormEnv(raw, formconfig, self) + + @classmethod def new(cls): """ diff --git a/src/pypdfium2/version.py b/src/pypdfium2/version.py index 2e2452bed..277018132 100644 --- a/src/pypdfium2/version.py +++ b/src/pypdfium2/version.py @@ -1,7 +1,7 @@ # SPDX-FileCopyrightText: 2023 geisserml # SPDX-License-Identifier: Apache-2.0 OR BSD-3-Clause -__all__ = ["V_PYPDFIUM2", "V_LIBPDFIUM", "V_BUILDNAME"] +__all__ = ["V_PYPDFIUM2", "V_LIBPDFIUM", "V_BUILDNAME", "V_PDFIUM_IS_V8"] V_MAJOR = 4 V_MINOR = 0 @@ -19,4 +19,5 @@ #: String describing the included PDFium binary's origin (pdfium-binaries, sourcebuild) V_BUILDNAME = "pdfium-binaries" -# TODO add info whether it's a V8 build or not +#: Whether the included PDFium binary was built with V8 support or not +V_PDFIUM_IS_V8 = False