From 0f54f6c7e45ef18cf4fd4e23042c6a303204be97 Mon Sep 17 00:00:00 2001 From: Vilius Sutkus '89 Date: Thu, 15 Aug 2024 16:47:42 +0300 Subject: [PATCH] Use odr.core built with pdf2htmlEX --- app/CMakeLists.txt | 7 - app/build.gradle | 2 +- app/conanfile.py | 7 +- .../{pdf2htmlEX => }/etc/fonts/local.conf | 0 .../{pdf2htmlEX => }/share/fonts/COPYING | 0 .../{pdf2htmlEX => }/share/fonts/README | 0 .../{pdf2htmlEX => }/share/fonts/d050000l.pfb | Bin .../{pdf2htmlEX => }/share/fonts/s050000l.pfb | Bin app/src/main/cpp/CCharGC.h | 46 -- app/src/main/cpp/pdf2htmlEX.cc | 512 ----------------- .../android/pdf2htmlex/EnvVar.java | 2 +- .../android/pdf2htmlex/FontconfigAndroid.java | 4 +- .../android/pdf2htmlex/NativeConverter.java | 76 --- .../android/pdf2htmlex/pdf2htmlEX.java | 524 ------------------ .../reader/background/LoaderService.java | 2 +- .../reader/background/OdfLoader.java | 32 ++ .../reader/background/PdfLoader.java | 49 +- 17 files changed, 41 insertions(+), 1222 deletions(-) rename app/src/main/assets/{pdf2htmlEX => }/etc/fonts/local.conf (100%) rename app/src/main/assets/{pdf2htmlEX => }/share/fonts/COPYING (100%) rename app/src/main/assets/{pdf2htmlEX => }/share/fonts/README (100%) rename app/src/main/assets/{pdf2htmlEX => }/share/fonts/d050000l.pfb (100%) rename app/src/main/assets/{pdf2htmlEX => }/share/fonts/s050000l.pfb (100%) delete mode 100644 app/src/main/cpp/CCharGC.h delete mode 100644 app/src/main/cpp/pdf2htmlEX.cc delete mode 100644 app/src/main/java/app/opendocument/android/pdf2htmlex/NativeConverter.java delete mode 100644 app/src/main/java/app/opendocument/android/pdf2htmlex/pdf2htmlEX.java diff --git a/app/CMakeLists.txt b/app/CMakeLists.txt index 212feedac4c1..6a9ebff5eee0 100644 --- a/app/CMakeLists.txt +++ b/app/CMakeLists.txt @@ -17,13 +17,6 @@ target_link_libraries(odr-core add_library(envvar SHARED src/main/cpp/EnvVar.c) set_target_properties(envvar PROPERTIES LINKER_LANGUAGE C) -add_library(pdf2htmlEX-android SHARED src/main/cpp/pdf2htmlEX.cc src/main/cpp/CCharGC.h) -find_package(pdf2htmlEX REQUIRED CONFIG) -target_link_libraries(pdf2htmlEX-android - pdf2htmlex::pdf2htmlex - log -) - FILE(MAKE_DIRECTORY "${CMAKE_CURRENT_LIST_DIR}/build/assets") function(copy_assets sourcevar dstsubdir) if(DEFINED "${sourcevar}") diff --git a/app/build.gradle b/app/build.gradle index be00b59023b4..1c9bc663f877 100644 --- a/app/build.gradle +++ b/app/build.gradle @@ -31,7 +31,7 @@ android { externalNativeBuild { cmake { - targets "odr-core", "envvar", "pdf2htmlEX-android" + targets "odr-core", "envvar" arguments( "-DCMAKE_TOOLCHAIN_FILE=build/conan/android_toolchain.cmake", // We can migrate to static STL once all C++ deps are in conan and linked as one .so library diff --git a/app/conanfile.py b/app/conanfile.py index 1bd47ec8d3b5..1c893288770a 100644 --- a/app/conanfile.py +++ b/app/conanfile.py @@ -4,16 +4,15 @@ required_conan_version = ">=2.0.6" -class pdf2htmlEXConan(ConanFile): +class OdrDroidConan(ConanFile): settings = "os", "compiler", "build_type", "arch" - # Remove pdf2htmlex dep once https://github.com/opendocument-app/OpenDocument.core/pull/380 is merged - requires = "odrcore/4.1.1@", "pdf2htmlex/0.18.8.rc1-20240814-git" + requires = "odrcore/4.1.0-pdf2htmlex-20240815-git" def generate(self): deps = CMakeDeps(self) deps.generate() - tc = CMakeToolchain(self) + tc = CMakeToolchain(self) # @TODO: figure out how to use POPPLER_DATA_DIR exported by poppler-data tc.variables["POPPLER_DATA_RES_DIR"] = self.dependencies['poppler-data'].cpp_info.resdirs[0] tc.variables["PDF2HTMLEX_RES_DIR"] = self.dependencies['pdf2htmlex'].cpp_info.resdirs[0] diff --git a/app/src/main/assets/pdf2htmlEX/etc/fonts/local.conf b/app/src/main/assets/etc/fonts/local.conf similarity index 100% rename from app/src/main/assets/pdf2htmlEX/etc/fonts/local.conf rename to app/src/main/assets/etc/fonts/local.conf diff --git a/app/src/main/assets/pdf2htmlEX/share/fonts/COPYING b/app/src/main/assets/share/fonts/COPYING similarity index 100% rename from app/src/main/assets/pdf2htmlEX/share/fonts/COPYING rename to app/src/main/assets/share/fonts/COPYING diff --git a/app/src/main/assets/pdf2htmlEX/share/fonts/README b/app/src/main/assets/share/fonts/README similarity index 100% rename from app/src/main/assets/pdf2htmlEX/share/fonts/README rename to app/src/main/assets/share/fonts/README diff --git a/app/src/main/assets/pdf2htmlEX/share/fonts/d050000l.pfb b/app/src/main/assets/share/fonts/d050000l.pfb similarity index 100% rename from app/src/main/assets/pdf2htmlEX/share/fonts/d050000l.pfb rename to app/src/main/assets/share/fonts/d050000l.pfb diff --git a/app/src/main/assets/pdf2htmlEX/share/fonts/s050000l.pfb b/app/src/main/assets/share/fonts/s050000l.pfb similarity index 100% rename from app/src/main/assets/pdf2htmlEX/share/fonts/s050000l.pfb rename to app/src/main/assets/share/fonts/s050000l.pfb diff --git a/app/src/main/cpp/CCharGC.h b/app/src/main/cpp/CCharGC.h deleted file mode 100644 index 3c39aa90822b..000000000000 --- a/app/src/main/cpp/CCharGC.h +++ /dev/null @@ -1,46 +0,0 @@ -/* - * CCharGC.h - * - * Copyright (c) 2019 ViliusSutkus89.com - * - * CCharGC is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 3 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#ifndef PDF2HTMLEX_ANDROID_CCHARGC_H -#define PDF2HTMLEX_ANDROID_CCHARGC_H - -#include - -class CCharGC { -private: - JNIEnv *env; - jstring input; - const char * cstr; - -public: - CCharGC(JNIEnv *env, jstring input) : env(env), input(input) { - this->cstr = env->GetStringUTFChars(input, nullptr); - } - - const char * c_str() const { - return this->cstr; - } - - bool isEmpty() const { return this->cstr[0] == '\0'; } - - ~CCharGC() { - env->ReleaseStringUTFChars(this->input, this->cstr); - } -}; - -#endif //PDF2HTMLEX_ANDROID_CCHARGC_H diff --git a/app/src/main/cpp/pdf2htmlEX.cc b/app/src/main/cpp/pdf2htmlEX.cc deleted file mode 100644 index b49f6990d63d..000000000000 --- a/app/src/main/cpp/pdf2htmlEX.cc +++ /dev/null @@ -1,512 +0,0 @@ -/* - * pdf2htmlEX.cc - * - * pdf2htmlEX-Android (https://github.com/ViliusSutkus89/pdf2htmlEX-Android) - * Android port of pdf2htmlEX - Convert PDF to HTML without losing text or format. - * - * Copyright (c) 2019, 2022 ViliusSutkus89.com - * - * pdf2htmlEX-Android is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License version 3 as - * published by the Free Software Foundation. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -#include -#include -#include "CCharGC.h" -#include "pdf2htmlEX.h" - -#define retValOK 0 -#define retValError 1 -#define retValEncryptionError 2 -#define retValCopyProtected 3 - -extern "C" -JNIEXPORT jlong JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_createNewConverterObject(JNIEnv *env, jclass, - jstring tmp_dir, - jstring data_dir, - jstring poppler_dir) { - auto * pdf2htmlEX = new pdf2htmlEX::pdf2htmlEX(); - - pdf2htmlEX->setTMPDir(CCharGC(env, tmp_dir).c_str()); - pdf2htmlEX->setDataDir(CCharGC(env, data_dir).c_str()); - pdf2htmlEX->setPopplerDataDir(CCharGC(env, poppler_dir).c_str()); - - pdf2htmlEX->setDebug(true); - - return (jlong) pdf2htmlEX; -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_dealloc(JNIEnv *, jclass, jlong converter) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - delete pdf2htmlEX; -} - -extern "C" -JNIEXPORT jint JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_convert(JNIEnv *, jclass, jlong converter) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - try { - pdf2htmlEX->convert(); - } catch (const pdf2htmlEX::EncryptionPasswordException & e) { - return retValEncryptionError; - } catch (const pdf2htmlEX::DocumentCopyProtectedException & e) { - return retValCopyProtected; - } catch (const pdf2htmlEX::ConversionFailedException & e) { - __android_log_print(ANDROID_LOG_ERROR, "pdf2htmlEX-Android" , "%s", e.what()); - return retValError; - } - return retValOK; -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setInputFile(JNIEnv *env, jclass, jlong converter, - jstring input_file) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setInputFilename(CCharGC(env, input_file).c_str()); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setOutputFilename(JNIEnv *env, jclass, jlong converter, - jstring output_filename) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setOutputFilename(CCharGC(env, output_filename).c_str()); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setOwnerPassword(JNIEnv *env, jclass, jlong converter, - jstring owner_password) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setOwnerPassword(CCharGC(env, owner_password).c_str()); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setUserPassword(JNIEnv *env, jclass, jlong converter, - jstring user_password) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setUserPassword(CCharGC(env, user_password).c_str()); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setProcessOutline(JNIEnv *, jclass, jlong converter, - jboolean process) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setProcessOutline(JNI_TRUE == process); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setDrm(JNIEnv *, jclass, jlong converter, - jboolean enable) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setDRM(JNI_TRUE == enable); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setEmbedFont(JNIEnv *, jclass, jlong converter, - jboolean embed) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setEmbedFont(JNI_TRUE == embed); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setEmbedExternalFont(JNIEnv *, jclass, jlong converter, - jboolean embed) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setEmbedExternalFont(JNI_TRUE == embed); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setProcessAnnotation(JNIEnv *, jclass, jlong converter, - jboolean process) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setProcessAnnotation(JNI_TRUE == process); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setBackgroundImageFormat(JNIEnv *env, jclass, jlong converter, - jstring background_format) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setBackgroundImageFormat(CCharGC(env, background_format).c_str()); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setFirstPage(JNIEnv *, jclass, - jlong converter, - jint first_page) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setFirstPage(first_page); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setLastPage(JNIEnv *, jclass, - jlong converter, - jint last_page) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setLastPage(last_page); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setZoomRatio(JNIEnv *, jclass, - jlong converter, - jdouble zoom_ratio) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setZoomRatio(zoom_ratio); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setFitWidth(JNIEnv *, jclass, - jlong converter, - jdouble fit_width) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setFitWidth(fit_width); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setFitHeight(JNIEnv *, jclass, - jlong converter, - jdouble fit_height) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setFitHeight(fit_height); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setUseCropBox(JNIEnv *, jclass, - jlong converter, - jboolean use_crop_box) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setUseCropBox(JNI_TRUE == use_crop_box); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setDPI(JNIEnv *, jclass, - jlong converter, - jdouble desired_dpi) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setDPI(desired_dpi); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setEmbedCSS(JNIEnv *, jclass, - jlong converter, - jboolean embed_css) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setEmbedCSS(JNI_TRUE == embed_css); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setEmbedImage(JNIEnv *, jclass, - jlong converter, - jboolean embed_image) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setEmbedImage(JNI_TRUE == embed_image); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setEmbedJavascript(JNIEnv *, jclass, - jlong converter, - jboolean embed_javascript) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setEmbedJavascript(JNI_TRUE == embed_javascript); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setEmbedOutline(JNIEnv *, jclass, - jlong converter, - jboolean embed_outline) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setEmbedOutline(JNI_TRUE == embed_outline); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setSplitPages(JNIEnv *, jclass, - jlong converter, - jboolean split_pages) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setSplitPages(JNI_TRUE == split_pages); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setProcessNonText(JNIEnv *, jclass, - jlong converter, - jboolean process_non_text) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setProcessNonText(JNI_TRUE == process_non_text); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setProcessForm(JNIEnv *, jclass, - jlong converter, - jboolean process_form) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setProcessForm(JNI_TRUE == process_form); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setPrinting(JNIEnv *, jclass, - jlong converter, - jboolean printing) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setPrinting(JNI_TRUE == printing); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setFallback(JNIEnv *, jclass, - jlong converter, - jboolean fallback) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setFallback(JNI_TRUE == fallback); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setFontFormat(JNIEnv *env, jclass, - jlong converter, - jstring font_format) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setFontFormat(CCharGC(env, font_format).c_str()); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setDecomposeLigature(JNIEnv *, jclass, - jlong converter, - jboolean decompose_ligature) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setDecomposeLigature(JNI_TRUE == decompose_ligature); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setAutoHint(JNIEnv *, jclass, - jlong converter, - jboolean auto_hint) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setAutoHint(JNI_TRUE == auto_hint); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setStretchNarrowGlyph(JNIEnv *, jclass, - jlong converter, - jboolean stretch_narrow_glyph) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setStretchNarrowGlyph(JNI_TRUE == stretch_narrow_glyph); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setSqueezeWideGlyph(JNIEnv *, jclass, - jlong converter, - jboolean squeeze_wide_glyph) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setSqueezeWideGlyph(JNI_TRUE == squeeze_wide_glyph); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setOverrideFstype(JNIEnv *, jclass, - jlong converter, - jboolean override_fstype) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setOverrideFstype(JNI_TRUE == override_fstype); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setProcessType3(JNIEnv *, jclass, - jlong converter, - jboolean process_type3) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setProcessType3(JNI_TRUE == process_type3); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setHorizontalEpsilon(JNIEnv *, jclass, - jlong converter, - jdouble horizontal_epsilon) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setHorizontalEpsilon(horizontal_epsilon); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setVerticalEpsilon(JNIEnv *, jclass, - jlong converter, - jdouble vertical_epsilon) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setVEpsilon(vertical_epsilon); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setSpaceThreshold(JNIEnv *, jclass, - jlong converter, - jdouble space_threshold) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setSpaceThreshold(space_threshold); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setFontSizeMultiplier(JNIEnv *, jclass, - jlong converter, - jdouble font_size_multiplier) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setFontSizeMultiplier(font_size_multiplier); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setSpaceAsOffset(JNIEnv *, jclass, - jlong converter, - jboolean space_as_offset) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setSpaceAsOffset(JNI_TRUE == space_as_offset); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setToUnicode(JNIEnv *, jclass, - jlong converter, - jint toUnicode) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setToUnicode(toUnicode); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setOptimizeText(JNIEnv *, jclass, - jlong converter, - jboolean optimize_text) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setOptimizeText(JNI_TRUE == optimize_text); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setCorrectTextVisibility(JNIEnv *, jclass, - jlong converter, - jint textVisibilityCorrection) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setCorrectTextVisibility(textVisibilityCorrection); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setCoveredTextDPI(JNIEnv *, jclass, - jlong converter, - jdouble covered_text_dpi) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setCoveredTextDPI(covered_text_dpi); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setSVGNodeCountLimit(JNIEnv *, jclass, - jlong converter, - jint svg_node_count_limit) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setSVGNodeCountLimit(svg_node_count_limit); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setDebug(JNIEnv *, jclass, - jlong converter, - jboolean debug) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setDebug(JNI_TRUE == debug); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setProof(JNIEnv *, jclass, - jlong converter, - jboolean proof) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setProof(JNI_TRUE == proof); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setQuiet(JNIEnv *, jclass, - jlong converter, - jboolean quiet) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setQuiet(JNI_TRUE == quiet); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setDestinationDir(JNIEnv *env, jclass, - jlong converter, - jstring destination_dir) { - - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setDestinationDir(CCharGC(env, destination_dir).c_str()); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setCSSFilename(JNIEnv *env, jclass, - jlong converter, - jstring css_filename) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setCSSFilename(CCharGC(env, css_filename).c_str()); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setPageFilename(JNIEnv *env, jclass, - jlong converter, - jstring page_filename) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setPageFilename(CCharGC(env, page_filename).c_str()); -} - -extern "C" -JNIEXPORT void JNICALL -Java_app_opendocument_android_pdf2htmlex_NativeConverter_setOutlineFilename(JNIEnv *env, jclass, - jlong converter, - jstring outline_filename) { - auto * pdf2htmlEX = (pdf2htmlEX::pdf2htmlEX *) converter; - pdf2htmlEX->setOutlineFilename(CCharGC(env, outline_filename).c_str()); -} diff --git a/app/src/main/java/app/opendocument/android/pdf2htmlex/EnvVar.java b/app/src/main/java/app/opendocument/android/pdf2htmlex/EnvVar.java index 1eb4c129c67b..c060eb389dcd 100644 --- a/app/src/main/java/app/opendocument/android/pdf2htmlex/EnvVar.java +++ b/app/src/main/java/app/opendocument/android/pdf2htmlex/EnvVar.java @@ -1,6 +1,6 @@ package app.opendocument.android.pdf2htmlex; -final class EnvVar { +public final class EnvVar { static { System.loadLibrary("envvar"); } diff --git a/app/src/main/java/app/opendocument/android/pdf2htmlex/FontconfigAndroid.java b/app/src/main/java/app/opendocument/android/pdf2htmlex/FontconfigAndroid.java index 11fed442b477..b0ac58189d5f 100644 --- a/app/src/main/java/app/opendocument/android/pdf2htmlex/FontconfigAndroid.java +++ b/app/src/main/java/app/opendocument/android/pdf2htmlex/FontconfigAndroid.java @@ -11,8 +11,8 @@ import java.io.File; -final class FontconfigAndroid { - static void init(@NonNull AssetManager assetManager, @NonNull File cacheDir, @NonNull File filesDir) { +public final class FontconfigAndroid { + public static void init(@NonNull AssetManager assetManager, @NonNull File cacheDir, @NonNull File filesDir) { File xdgCache = new File(cacheDir, "xdg-cache"); xdgCache.mkdir(); EnvVar.set("XDG_CACHE_HOME", xdgCache.getAbsolutePath()); diff --git a/app/src/main/java/app/opendocument/android/pdf2htmlex/NativeConverter.java b/app/src/main/java/app/opendocument/android/pdf2htmlex/NativeConverter.java deleted file mode 100644 index 30d9b2ca1a5c..000000000000 --- a/app/src/main/java/app/opendocument/android/pdf2htmlex/NativeConverter.java +++ /dev/null @@ -1,76 +0,0 @@ -package app.opendocument.android.pdf2htmlex; - -import java.io.Closeable; -import java.io.File; - -final class NativeConverter implements Closeable { - long mConverter; - - static native long createNewConverterObject(String tmpDir, String dataDir, String popplerDir); - NativeConverter(File tmpDir, File dataDir, File popplerDataDir) { - mConverter = createNewConverterObject( - tmpDir.getAbsolutePath(), - dataDir.getAbsolutePath(), - popplerDataDir.getAbsolutePath() - ); - } - - private static native void dealloc(long converter); - @Override - public void close() { - dealloc(mConverter); - mConverter = 0; - } - - static native int convert(long converter); - static native void setInputFile(long converter, String inputFile); - static native void setOutputFilename(long converter, String outputFilename); - static native void setFirstPage(long converter, int firstPage); - static native void setLastPage(long converter, int lastPage); - static native void setZoomRatio(long converter, double zoomRatio); - static native void setFitWidth(long converter, double fitWidth); - static native void setFitHeight(long converter, double fitHeight); - static native void setUseCropBox(long converter, boolean useCropBox); - static native void setDPI(long converter, double desiredDPI); - static native void setEmbedCSS(long converter, boolean embedCSS); - static native void setEmbedFont(long converter, boolean embed); - static native void setEmbedImage(long converter, boolean embedImage); - static native void setEmbedJavascript(long converter, boolean embedJavascript); - static native void setEmbedOutline(long converter, boolean embedOutline); - static native void setSplitPages(long converter, boolean splitPages); - static native void setDestinationDir(long converter, String destinationDir); - static native void setCSSFilename(long converter, String cssFilename); - static native void setPageFilename(long converter, String pageFilename); - static native void setOutlineFilename(long converter, String outlineFilename); - static native void setProcessNonText(long converter, boolean processNonText); - static native void setProcessOutline(long converter, boolean process); - static native void setProcessAnnotation(long converter, boolean process); - static native void setProcessForm(long converter, boolean processForm); - static native void setPrinting(long converter, boolean printing); - static native void setFallback(long converter, boolean fallback); - static native void setEmbedExternalFont(long converter, boolean embed); - static native void setFontFormat(long converter, String fontFormat); - static native void setDecomposeLigature(long converter, boolean decomposeLigature); - static native void setAutoHint(long converter, boolean autoHint); - static native void setStretchNarrowGlyph(long converter, boolean stretchNarrowGlyph); - static native void setSqueezeWideGlyph(long converter, boolean squeezeWideGlyph); - static native void setOverrideFstype(long converter, boolean overrideFSType); - static native void setProcessType3(long converter, boolean processType3); - static native void setHorizontalEpsilon(long converter, double horizontalEpsilon); - static native void setVerticalEpsilon(long converter, double verticalEpsilon); - static native void setSpaceThreshold(long converter, double spaceThreshold); - static native void setFontSizeMultiplier(long converter, double fontSizeMultiplier); - static native void setSpaceAsOffset(long converter, boolean spaceAsOffset); - static native void setToUnicode(long converter, int toUnicode); - static native void setOptimizeText(long converter, boolean optimizeText); - static native void setCorrectTextVisibility(long converter, int textVisibilityCorrection); - static native void setCoveredTextDPI(long converter, double coveredTextDPI); - static native void setBackgroundImageFormat(long converter, String backgroundImageFormat); - static native void setSVGNodeCountLimit(long converter, int svgNodeCountLimit); - static native void setOwnerPassword(long converter, String ownerPassword); - static native void setUserPassword(long converter, String userPassword); - static native void setDrm(long converter, boolean enable); - static native void setDebug(long converter, boolean debug); - static native void setProof(long converter, boolean proof); - static native void setQuiet(long converter, boolean quiet); -} diff --git a/app/src/main/java/app/opendocument/android/pdf2htmlex/pdf2htmlEX.java b/app/src/main/java/app/opendocument/android/pdf2htmlex/pdf2htmlEX.java deleted file mode 100644 index e7eb81e07973..000000000000 --- a/app/src/main/java/app/opendocument/android/pdf2htmlex/pdf2htmlEX.java +++ /dev/null @@ -1,524 +0,0 @@ -/* - * pdf2htmlEX.java - * - * Copyright (C) 2019, 2020, 2022, 2023, 2024 ViliusSutkus89.com - * - * pdf2htmlEX-Android is free software: you can redistribute it and/or modify - * it under the terms of the GNU General Public License as published by - * the Free Software Foundation, either version 3 of the License, or - * (at your option) any later version. - * - * This program is distributed in the hope that it will be useful, - * but WITHOUT ANY WARRANTY; without even the implied warranty of - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the - * GNU General Public License for more details. - * - * You should have received a copy of the GNU General Public License - * along with this program. If not, see . - */ - -package app.opendocument.android.pdf2htmlex; - -import android.content.Context; - -import androidx.annotation.NonNull; -import androidx.annotation.Nullable; - -import com.getkeepsafe.relinker.ReLinker; -import com.viliussutkus89.android.assetextractor.AssetExtractor; - -import java.io.Closeable; -import java.io.File; -import java.io.FileNotFoundException; -import java.io.IOException; - - -@SuppressWarnings("unused") -public class pdf2htmlEX implements Closeable { - public static class ConversionFailedException extends Exception { - public ConversionFailedException(String errorMessage) { - super(errorMessage); - } - } - - public static class PasswordRequiredException extends ConversionFailedException { - public PasswordRequiredException(String errorMessage) { - super(errorMessage); - } - } - - public static class WrongPasswordException extends ConversionFailedException { - public WrongPasswordException(String errorMessage) { - super(errorMessage); - } - } - - public static class CopyProtectionException extends ConversionFailedException { - public CopyProtectionException(String errorMessage) { - super(errorMessage); - } - } - - private final NativeConverter nc; - - static private final Object s_initSynchronizer = new Object(); - - // subdir of cache dir - private final File mOutputDir; - - // subdir of mOutputDir by default, unless requested otherwise by setDestinationDir() / setOutputHtml() - private File mDestinationDir; - - private String mOutputFilename; - - private File mInputPdf; - - private boolean mUserPasswordEntered; - private boolean mOwnerPasswordEntered; - - public pdf2htmlEX(@NonNull Context ctx) { - ReLinker.recursively().loadLibrary(ctx, "pdf2htmlEX-android"); - - AssetExtractor ae = new AssetExtractor(ctx.getAssets()).setNoOverwrite(); - - File filesDir = new File(ctx.getFilesDir(), "pdf2htmlEX"); - File cacheDir = new File(ctx.getCacheDir(), "pdf2htmlEX"); - - // tmpDir is where pdf2htmlEX (not pdf2htmlEX-Android wrapper) does it's work - File pdf2htmlEX_tmpDir = new File(cacheDir, "pdf2htmlEX-tmp"); - mOutputDir = new File(cacheDir, "output-htmls"); - - File fontforgeHome = new File(cacheDir, "FontforgeHome"); - File envTMPDIR = new File(cacheDir, "envTMPDIR"); - - synchronized (s_initSynchronizer) { - cacheDir.mkdir(); - - // @TODO: https://github.com/ViliusSutkus89/pdf2htmlEX-Android/issues/9 - // pdf2htmlEX_dataDir is where pdf2htmlEX's share folder contents are - File pdf2htmlEX_dataDir = ae.extract(new File(filesDir, "share"), "pdf2htmlEX"); - - // @TODO: https://github.com/ViliusSutkus89/pdf2htmlEX-Android/issues/10 - // Poppler requires encoding data - File poppler_dataDir = ae.extract(new File(filesDir, "share"), "poppler-data"); - - pdf2htmlEX_tmpDir.mkdir(); - mOutputDir.mkdir(); - - fontforgeHome.mkdir(); - EnvVar.set("HOME", fontforgeHome.getAbsolutePath()); - - envTMPDIR.mkdir(); - EnvVar.set("TMPDIR", envTMPDIR.getAbsolutePath()); - - FontconfigAndroid.init(ctx.getAssets(), cacheDir, filesDir); - - EnvVar.set("USER", android.os.Build.MODEL); - - nc = new NativeConverter(pdf2htmlEX_tmpDir, pdf2htmlEX_dataDir, poppler_dataDir); - } - } - - @Override - public void close() { - nc.close(); - } - - private static String generateOutputFilenameWithoutExt(String inputFilename) { - if (inputFilename.endsWith(".pdf")) - return inputFilename.substring(0, inputFilename.length() - 4); - else - return inputFilename; - } - - private static String generateOutputFilename(String inputFilename) { - return generateOutputFilenameWithoutExt(inputFilename) + ".html"; - } - - private static File generateOutputSubDirectory(File outputDir, String inputFilename) { - String outputFilenameNoExt = generateOutputFilenameWithoutExt(inputFilename); - - File outputSubDir = new File(outputDir, outputFilenameNoExt); - for (int i = 2; !outputSubDir.mkdir(); i++) { - outputSubDir = new File(outputDir, outputFilenameNoExt + "-" + i); - } - - return outputSubDir; - } - - public File convert() throws IOException, ConversionFailedException { - File inputPdf = mInputPdf; - if (null == inputPdf) { - throw new ConversionFailedException("No Input PDF given!"); - } else if (!inputPdf.exists()) { - throw new FileNotFoundException(); - } - NativeConverter.setInputFile(nc.mConverter, inputPdf.getAbsolutePath()); - - String outputFilename = mOutputFilename; - File destinationDir = mDestinationDir; - - if (null == outputFilename) - outputFilename = generateOutputFilename(inputPdf.getName()); - - if (null == destinationDir) - destinationDir = generateOutputSubDirectory(mOutputDir, inputPdf.getName()); - - File outputFile = new File(destinationDir, outputFilename); - - NativeConverter.setOutputFilename(nc.mConverter, outputFilename); - NativeConverter.setDestinationDir(nc.mConverter, destinationDir.getAbsolutePath()); - - int retVal = NativeConverter.convert(nc.mConverter); - if (0 == retVal) { - return outputFile; - } - - outputFile.delete(); - if (null == mDestinationDir) { - if (destinationDir.exists() && destinationDir.isDirectory()) { - File[] outputFiles = destinationDir.listFiles(); - if (outputFiles != null) { - for (File i : outputFiles) { - i.delete(); - } - } - destinationDir.delete(); - } - } - - // retVal values defined in pdf2htmlEX.cc - switch (retVal) { - case 2: - if (!mUserPasswordEntered && !mOwnerPasswordEntered) { - throw new PasswordRequiredException("Password is required to decrypt this encrypted document!"); - } else { - throw new WrongPasswordException("Wrong password is supplied to decrypt this encrypted document!"); - } - - case 3: - throw new CopyProtectionException("Document is copy protected!"); - - default: - throw new ConversionFailedException("Return value from pdf2htmlEX: " + retVal); - } - } - - public File convert(@NonNull File inputPDF) throws IOException, ConversionFailedException { - this.setInputPDF(inputPDF); - return this.convert(); - } - - public pdf2htmlEX setInputPDF(@Nullable File inputPDF) { - mInputPdf = inputPDF; - return this; - } - - public pdf2htmlEX setOutputHtml(@Nullable File outputHtml) { - File destinationDir = null; - String filename = null; - if (null != outputHtml) { - destinationDir = outputHtml.getAbsoluteFile().getParentFile(); - filename = outputHtml.getName(); - } - return this.setDestinationDir(destinationDir).setOutputFilename(filename); - } - - public pdf2htmlEX setOutputFilename(@Nullable String outputFilename) { - mOutputFilename = outputFilename; - return this; - } - - public pdf2htmlEX setFirstPage(int firstPage) { - NativeConverter.setFirstPage(nc.mConverter, firstPage); - return this; - } - - public pdf2htmlEX setLastPage(int lastPage) { - NativeConverter.setLastPage(nc.mConverter, lastPage); - return this; - } - - public pdf2htmlEX setZoomRatio(double zoomRatio) { - NativeConverter.setZoomRatio(nc.mConverter, zoomRatio); - return this; - } - - public pdf2htmlEX setFitWidth(double fitWidth) { - NativeConverter.setFitWidth(nc.mConverter, fitWidth); - return this; - } - - public pdf2htmlEX setFitHeight(double fitHeight) { - NativeConverter.setFitHeight(nc.mConverter, fitHeight); - return this; - } - - public pdf2htmlEX setUseCropBox(boolean useCropBox) { - NativeConverter.setUseCropBox(nc.mConverter, useCropBox); - return this; - } - - public pdf2htmlEX setDPI(double desiredDPI) { - NativeConverter.setDPI(nc.mConverter, desiredDPI); - return this; - } - - public pdf2htmlEX setEmbedCSS(boolean embedCSS) { - NativeConverter.setEmbedCSS(nc.mConverter, embedCSS); - return this; - } - - public pdf2htmlEX setEmbedFont(boolean embedFont) { - NativeConverter.setEmbedFont(nc.mConverter, embedFont); - return this; - } - - public pdf2htmlEX setEmbedImage(boolean embedImage) { - NativeConverter.setEmbedImage(nc.mConverter, embedImage); - return this; - } - - public pdf2htmlEX setEmbedJavascript(boolean embedJavascript) { - NativeConverter.setEmbedJavascript(nc.mConverter, embedJavascript); - return this; - } - - public pdf2htmlEX setEmbedOutline(boolean embedOutline) { - NativeConverter.setEmbedOutline(nc.mConverter, embedOutline); - return this; - } - - public pdf2htmlEX setSplitPages(boolean splitPages) { - NativeConverter.setSplitPages(nc.mConverter, splitPages); - return this; - } - - public pdf2htmlEX setDestinationDir(@Nullable File destinationDir) { - mDestinationDir = destinationDir; - return this; - } - - public pdf2htmlEX setCSSFilename(@Nullable String cssFilename) { - NativeConverter.setCSSFilename(nc.mConverter, cssFilename); - return this; - } - - public pdf2htmlEX setPageFilename(@Nullable String pageFilename) { - NativeConverter.setPageFilename(nc.mConverter, pageFilename); - return this; - } - - public pdf2htmlEX setOutlineFilename(@Nullable String outlineFilename) { - NativeConverter.setOutlineFilename(nc.mConverter, outlineFilename); - return this; - } - - public pdf2htmlEX setProcessNonText(boolean processNonText) { - NativeConverter.setProcessNonText(nc.mConverter, processNonText); - return this; - } - - public pdf2htmlEX setProcessOutline(boolean processOutline) { - NativeConverter.setProcessOutline(nc.mConverter, processOutline); - return this; - } - - public pdf2htmlEX setProcessAnnotation(boolean processAnnotation) { - NativeConverter.setProcessAnnotation(nc.mConverter, processAnnotation); - return this; - } - - public pdf2htmlEX setProcessForm(boolean processForm) { - NativeConverter.setProcessForm(nc.mConverter, processForm); - return this; - } - - public pdf2htmlEX setPrinting(boolean printing) { - NativeConverter.setPrinting(nc.mConverter, printing); - return this; - } - - public pdf2htmlEX setFallback(boolean fallback) { - NativeConverter.setFallback(nc.mConverter, fallback); - return this; - } - -// skipped: -// setTmpFileSizeLimit(int tmpFileSizeLimit); - - public pdf2htmlEX setEmbedExternalFont(boolean embedExternalFont) { - NativeConverter.setEmbedExternalFont(nc.mConverter, embedExternalFont); - return this; - } - - public pdf2htmlEX setFontFormat(String fontFormat) { - NativeConverter.setFontFormat(nc.mConverter, fontFormat); - return this; - } - - public pdf2htmlEX setDecomposeLigature(boolean decomposeLigature) { - NativeConverter.setDecomposeLigature(nc.mConverter, decomposeLigature); - return this; - } - - public pdf2htmlEX setAutoHint(boolean autoHint) { - NativeConverter.setAutoHint(nc.mConverter, autoHint); - return this; - } - -// skipped: -// setExternalHintTool(const std::string &externalHintTool); - - public pdf2htmlEX setStretchNarrowGlyph(boolean stretchNarrowGlyph) { - NativeConverter.setStretchNarrowGlyph(nc.mConverter, stretchNarrowGlyph); - return this; - } - - public pdf2htmlEX setSqueezeWideGlyph(boolean squeezeWideGlyph) { - NativeConverter.setSqueezeWideGlyph(nc.mConverter, squeezeWideGlyph); - return this; - } - - //clear the fstype bits in TTF/OTF fonts - public pdf2htmlEX setOverrideFstype(boolean overrideFSType) { - NativeConverter.setOverrideFstype(nc.mConverter, overrideFSType); - return this; - } - - //convert Type 3 fonts for web (experimental) - public pdf2htmlEX setProcessType3(boolean processType3) { - NativeConverter.setProcessType3(nc.mConverter, processType3); - return this; - } - - public pdf2htmlEX setHorizontalEpsilon(double horizontalEpsilon) { - NativeConverter.setHorizontalEpsilon(nc.mConverter, horizontalEpsilon); - return this; - } - - public pdf2htmlEX setVerticalEpsilon(double verticalEpsilon) { - NativeConverter.setVerticalEpsilon(nc.mConverter, verticalEpsilon); - return this; - } - - public pdf2htmlEX setSpaceThreshold(double spaceThreshold) { - NativeConverter.setSpaceThreshold(nc.mConverter, spaceThreshold); - return this; - } - - public pdf2htmlEX setFontSizeMultiplier(double fontSizeMultiplier) { - NativeConverter.setFontSizeMultiplier(nc.mConverter, fontSizeMultiplier); - return this; - } - - public pdf2htmlEX setSpaceAsOffset(boolean spaceAsOffset) { - NativeConverter.setSpaceAsOffset(nc.mConverter, spaceAsOffset); - return this; - } - - public enum ToUnicodeCMapsHandler { - AUTO(0), - FORCE(1), - IGNORE(-1); - - private final int value; - ToUnicodeCMapsHandler(int value) { - this.value = value; - } - int getInt() { - return value; - } - } - // how to handle ToUnicode CMaps - public pdf2htmlEX setToUnicode(ToUnicodeCMapsHandler toUnicode) { - NativeConverter.setToUnicode(nc.mConverter, toUnicode.getInt()); - return this; - } - - // try to reduce the number of HTML elements used for text - public pdf2htmlEX setOptimizeText(boolean optimizeText) { - NativeConverter.setOptimizeText(nc.mConverter, optimizeText); - return this; - } - - public enum TextVisibilityCorrection { - NO(0), - FULL(1), - PARTIAL(2); - - private final int value; - TextVisibilityCorrection(int value) { this.value = value; } - int getInt() { return value; } - } - public pdf2htmlEX setCorrectTextVisibility(TextVisibilityCorrection textVisibilityCorrection) { - NativeConverter.setCorrectTextVisibility(nc.mConverter, textVisibilityCorrection.getInt()); - return this; - } - - public pdf2htmlEX setCoveredTextDPI(double coveredTextDPI) { - NativeConverter.setCoveredTextDPI(nc.mConverter, coveredTextDPI); - return this; - } - - public enum BackgroundImageFormat { - PNG("png"), - JPG("jpg"), - SVG("svg"); - - private final String value; - BackgroundImageFormat(String value) { - this.value = value; - } - @NonNull @Override - public String toString() { - return value; - } - } - public pdf2htmlEX setBackgroundImageFormat(BackgroundImageFormat backgroundImageFormat) { - NativeConverter.setBackgroundImageFormat(nc.mConverter, backgroundImageFormat.toString()); - return this; - } - - // if node count in a svg background image exceeds this limit, - // fall back this page to bitmap background; negative value means no limit - public pdf2htmlEX setSVGNodeCountLimit(int SVGNodeCountLimit) { - NativeConverter.setSVGNodeCountLimit(nc.mConverter, SVGNodeCountLimit); - return this; - } - -// skipped -// setSVGEmbedBitmap(int SVGEmbedBitmap); - - public pdf2htmlEX setOwnerPassword(@Nullable String ownerPassword) { - NativeConverter.setOwnerPassword(nc.mConverter, ownerPassword); - mOwnerPasswordEntered = ownerPassword != null && !ownerPassword.isEmpty(); - return this; - } - - public pdf2htmlEX setUserPassword(@Nullable String userPassword) { - NativeConverter.setUserPassword(nc.mConverter, userPassword); - mUserPasswordEntered = userPassword != null && !userPassword.isEmpty(); - return this; - } - - public pdf2htmlEX setDRM(boolean enableDrm) { - NativeConverter.setDrm(nc.mConverter, enableDrm); - return this; - } - - public pdf2htmlEX setDebug(boolean debug) { - NativeConverter.setDebug(nc.mConverter, debug); - return this; - } - - public pdf2htmlEX setProof(boolean proof) { - NativeConverter.setProof(nc.mConverter, proof); - return this; - } - - public pdf2htmlEX setQuiet(boolean quiet) { - NativeConverter.setQuiet(nc.mConverter, quiet); - return this; - } -} diff --git a/app/src/main/java/at/tomtasche/reader/background/LoaderService.java b/app/src/main/java/at/tomtasche/reader/background/LoaderService.java index 679be70f2835..bc75d8688ebe 100644 --- a/app/src/main/java/at/tomtasche/reader/background/LoaderService.java +++ b/app/src/main/java/at/tomtasche/reader/background/LoaderService.java @@ -131,7 +131,7 @@ public synchronized void loadWithType(FileLoader.LoaderType loaderType, FileLoad loader = ooxmlLoader; break; case PDF: - loader = pdfLoader; + loader = odfLoader; break; case ONLINE: loader = onlineLoader; diff --git a/app/src/main/java/at/tomtasche/reader/background/OdfLoader.java b/app/src/main/java/at/tomtasche/reader/background/OdfLoader.java index e3c931dd2a17..ecad30a6b07c 100644 --- a/app/src/main/java/at/tomtasche/reader/background/OdfLoader.java +++ b/app/src/main/java/at/tomtasche/reader/background/OdfLoader.java @@ -4,8 +4,12 @@ import android.net.Uri; import android.webkit.MimeTypeMap; +import com.viliussutkus89.android.assetextractor.AssetExtractor; + import java.io.File; +import app.opendocument.android.pdf2htmlex.EnvVar; +import app.opendocument.android.pdf2htmlex.FontconfigAndroid; import at.tomtasche.reader.nonfree.ConfigManager; public class OdfLoader extends FileLoader { @@ -28,6 +32,34 @@ public boolean isSupported(Options options) { @Override public void loadSync(Options options) { + if (type == LoaderType.PDF) { + AssetExtractor ae = new AssetExtractor(context.getAssets()).setNoOverwrite(); + + File cacheDir = new File(context.getCacheDir(), "pdf2htmlEX"); + cacheDir.mkdir(); + + File envTMPDIR = new File(cacheDir, "tmp"); + envTMPDIR.mkdir(); + EnvVar.set("TMPDIR", envTMPDIR.getAbsolutePath()); + + File fontforgeHome = new File(cacheDir, "FontforgeHome"); + fontforgeHome.mkdir(); + EnvVar.set("HOME", fontforgeHome.getAbsolutePath()); + + File shareDir = new File(context.getFilesDir(), "share"); + // @TODO: https://github.com/ViliusSutkus89/pdf2htmlEX-Android/issues/9 + File pdf2htmlEX_dataDir = ae.extract(shareDir, "pdf2htmlEX"); + EnvVar.set("PDF2HTMLEX_DATA_DIR", pdf2htmlEX_dataDir.getAbsolutePath()); + + // @TODO: https://github.com/ViliusSutkus89/pdf2htmlEX-Android/issues/10 + File poppler_dataDir = ae.extract(new File(shareDir, "share"), "poppler-data"); + EnvVar.set("POPPLER_DATA_DIR", poppler_dataDir.getAbsolutePath()); + + FontconfigAndroid.init(context.getAssets(), context.getCacheDir(), context.getFilesDir()); + + EnvVar.set("USER", android.os.Build.MODEL); + } + final Result result = new Result(); result.options = options; result.loaderType = type; diff --git a/app/src/main/java/at/tomtasche/reader/background/PdfLoader.java b/app/src/main/java/at/tomtasche/reader/background/PdfLoader.java index 26e7559b9ceb..a5609d18b5ca 100644 --- a/app/src/main/java/at/tomtasche/reader/background/PdfLoader.java +++ b/app/src/main/java/at/tomtasche/reader/background/PdfLoader.java @@ -1,14 +1,7 @@ package at.tomtasche.reader.background; import android.content.Context; -import android.net.Uri; -import android.util.Log; -import app.opendocument.android.pdf2htmlex.pdf2htmlEX; -import com.viliussutkus89.android.wvware.wvWare; - -import java.io.File; -import java.io.InputStream; public class PdfLoader extends FileLoader { @@ -38,46 +31,6 @@ public boolean isSupported(Options options) { @Override public void loadSync(Options options) { - final Result result = new Result(); - result.options = options; - result.loaderType = type; - - try { - File cacheFile = AndroidFileCache.getCacheFile(context, options.cacheUri); - File cacheDirectory = AndroidFileCache.getCacheDirectory(cacheFile); - - pdf2htmlEX pdfConverter = new pdf2htmlEX(context).setInputPDF(cacheFile); - pdfConverter.setProcessOutline(false); - pdfConverter.setBackgroundImageFormat(pdf2htmlEX.BackgroundImageFormat.JPG); - pdfConverter.setDRM(false); - pdfConverter.setProcessAnnotation(true); - if (options.password != null) { - pdfConverter.setOwnerPassword(options.password).setUserPassword(options.password); - pdfConverter.setEmbedExternalFont(false).setEmbedFont(false); - } - - File output = pdfConverter.convert(); - - File htmlFile = new File(cacheDirectory, "pdf.html"); - StreamUtil.copy(output, htmlFile); - - // pdf2htmlEX does not delete output files automatically - output.delete(); - - Uri finalUri = Uri.fromFile(htmlFile); - - options.fileType = "application/pdf"; - - result.partTitles.add(null); - result.partUris.add(finalUri); - - callOnSuccess(result); - } catch (Throwable e) { - if (e instanceof pdf2htmlEX.PasswordRequiredException || e instanceof pdf2htmlEX.WrongPasswordException) { - e = new EncryptedDocumentException(); - } - - callOnError(result, e); - } + // This should not be called } }