Open robertus83 opened 1 year ago
Hi @robertus83 ,
Seems that fitz
is not a plain-python package, and may need a recipe.
See: https://python-for-android.readthedocs.io/en/latest/recipes/ for further information about recipes. Feel free to join us on Discord if you need some help or guidance.
EDIT: Moved to python-for-android
and marked as feature-request
Not fully related, but this might help someone. You might want to check out pdfplumber
and/or PyPDF2
packages. I originally wanted to use PyMuPDF
for converting PDF to PNG in my Android app and stumbled upon the same issue. Then realized this could also be done with pdfplumber
which is a pure python package. My guess would be the packages share a great deal of features. Also quoting from their github page :
pymupdf is substantially faster than pdfminer.six (and thus also pdfplumber) and can generate and modify PDFs, but the library requires installation of non-Python software (MuPDF). It also does not enable easy access to shape objects (rectangles, lines, etc.), and does not provide table-extraction or visual debugging tools.
Not fully related, but this might help someone. You might want to check out
pdfplumber
and/orPyPDF2
packages. I originally wanted to usePyMuPDF
for converting PDF to PNG in my Android app and stumbled upon the same issue. Then realized this could also be done withpdfplumber
which is a pure python package. My guess would be the packages share a great deal of features. Also quoting from their github page :pymupdf is substantially faster than pdfminer.six (and thus also pdfplumber) and can generate and modify PDFs, but the library requires installation of non-Python software (MuPDF). It also does not enable easy access to shape objects (rectangles, lines, etc.), and does not provide table-extraction or visual debugging tools.
have you succeeded to convert pdf to png in android phone?
@wish-rohitv Yes I have. In the code, I used the pdfplumber's to_image function which converts a pdf page to an image. For Android deployment, you need to do some extra steps to make it work. The to_image
function uses pypdfium2
which is a platform-specific library so you need to include the binaries targeting Android OS into your project manually. The binaries can be found here. Make sure to update the buildozer.spec file so the buildozer is aware of the binaries you include.
@wish-rohitv Yes I have. In the code, I used the pdfplumber's to_image function which converts a pdf page to an image. For Android deployment, you need to do some extra steps to make it work. The
page_to_image
function usespypdfium2
which is a platform-specific library so you need to include the binaries targeting Android OS into your project manually. The binaries can be found here. Make sure to update the buildozer.spec file so the buildozer is aware of the binaries you include.
thank for reply sir, can you explain steps, how to add pydfium2 in code and which one i should pick
@wish-rohitv You don't need to add pypdfium2
in your code, it is already part of the pdfplumber
's library. You just need to use to_image
function to convert a pdf page to an image as shown in this example. For your second question, it depends on what architecture target is set in your buildozer.spec file. By default, the relevant part of the buildozer.spec file should look like this
...
android.archs = arm64-v8a, armeabi-v7a
...
If so, for arm64-v8a CPU you should download pdfium-v8-android-arm64.tgz
and extract libpdfium.so
to [your-project]/libs/android-v8/ directory. After that, uncomment android.add_libs_arm64_v8a = libs/android-v8/*.so
in your buildozer.spec file. For armeabi-v7a CPU, download pdfium-android-arm.tgz, extract the .so file to [your-project]/libs/android/ [your-project]/libs/android-v7/ directory and uncomment android.add_libs_armeabi = libs/android/*.so *android.add_libs_armeabi_v7a = libs/android-v7/.so** in your buildozer.spec.
@wish-rohitv You don't need to add
pypdfium2
in your code, it is already part of thepdfplumber
's library. You just need to useto_image
function to convert a pdf page to an image as shown in this example. For your second question, it depends on what architecture target is set in your buildozer.spec file. By default, the relevant part of the buildozer.spec file should look like this... android.archs = arm64-v8a, armeabi-v7a ...
If so, for arm64-v8a CPU you should download
pdfium-v8-android-arm64.tgz
and extractlibpdfium.so
to [your-project]/libs/android-v8/ directory. After that, uncommentandroid.add_libs_arm64_v8a = libs/android-v8/*.so
in your buildozer.spec file. For armeabi-v7a CPU, downloadpdfium-android-arm.tgz
, extract the.so
file to [your-project]/libs/android/ directory and uncommentandroid.add_libs_arm64_v8a = libs/android/*.so
in your buildozer.spec.
thankyou show much🥰, sorry for being late my laptop was damaged, libpdfium.so
file should be in project directory and android.add_libs_arm64_v8a = libs/android-v8/*.so
be uncommented , isn't it?
@wish-rohitv Yes, make sure libpdfium.so
is placed in the correct directory according to the buildozer.spec. If you will only uncomment the corresponding line, place the libpdfium.so
in [your-project]/libs/android-v8/.
@wish-rohitv In directory where your buildozer.spec
file exists, create libs/android-v8/
directory and place corresponding libpdfium.so
in there.
@wish-rohitv In directory where your
buildozer.spec
file exists, createlibs/android-v8/
directory and place correspondinglibpdfium.so
in there.
You mean like this - [main.py,main.kv, buildozer.spec, libs/android-v8/libpdfium.so]
?
@wish-rohitv Yes.
@wish-rohitv Yes.
Thanks for your valuable assistance😊
@wish-rohitv Include pdfminer.six
module in requirements in buildozer.spec.
@wish-rohitv This one should be fixed by adding charset_normalizer==2.1.1
in requirements in buildozer.spec.
@wish-rohitv This one should be fixed by adding
charset_normalizer==2.1.1
in requirements in buildozer.spec.
Thanks 😊, it additionally required more modules such as `pypdfium2, cryptography, docutilts in buildozer requirements
hey i'm getting error pdfium.so is 64-bit instead of 32-bit i have followed procedure very carefully i have used pdfium-android-arm.tgz for cpu arm 32 bit android in my project please help
@wish-rohitv I would assume you placed incorrect .so
file inside libs/android
directory. Make sure that your 32-bit libpdfium.so
is placed inside libs/android
directory and that you have android.add_libs_armeabi = libs/android/*.so
set in your buildozer.spec
. My original comment from Sep 27 had a mistake, now it has been fixed.
i'm getting again same error
is my steps wrong -
@wish-rohitv Not sure what to tell you. Maybe you could try building apk for arm64-v8a and place the corresponding libpdfium.so
in libs/android-v8/
directory? Unless you have a super old phone, it should be supported.
i don't have super old phone, i tested on android 11, 9, 6 samsung phones 32 bit cpu can you tell me what is pdfium v8
@wish-rohitv Same thing as pdfium, just for different CPU architecture.
actually arm64-v8a doesn't install on my phones
should i put armeabi
instead of armeabi-v7a
?
@wish-rohitv I don't think so. Maybe you need to clean your build after modifying additional libraries. Try using buildozer appclean
command and try to build again your previous tries.
actually I'm using GitHub action because every time building apk while making little changes is very pain full
ok i will do buildozer app clean
thanks for your time sir
@wishrohitv Hi, I was getting the same issue you were facing when I deleted buildozer build files for my app and it took me a while to figure out the issue. Basically, in newer releases of pypdfium2
, the package comes with the built-in libpdfium.so
which is designed for x64 arch and because of that, I'd say buildozer doesn't try to find it in your own provided library inside the libs
directory. To avoid that you need to include the earlier release of pypdfium2
(e.g. 4.20.0 worked for me). So instead of placing pypdfium2
in your requirements in buildozer.spec
, try placing pypfdium2==4.20.0
.
Additionally, I've given you false information on providing your own libraries for armeabi-v7a
. So let me correct myself;
@wish-rohitv You don't need to add
pypdfium2
in your code, it is already part of thepdfplumber
's library. You just need to useto_image
function to convert a pdf page to an image as shown in this example. For your second question, it depends on what architecture target is set in your buildozer.spec file. By default, the relevant part of the buildozer.spec file should look like this... android.archs = arm64-v8a, armeabi-v7a ...
If so, for arm64-v8a CPU you should download
pdfium-v8-android-arm64.tgz
and extractlibpdfium.so
to [your-project]/libs/android-v8/ directory. After that, uncommentandroid.add_libs_arm64_v8a = libs/android-v8/*.so
in your buildozer.spec file. For armeabi-v7a CPU, download pdfium-android-arm.tgz, extract the .so file to[your-project]/libs/android/[your-project]/libs/android-v7/ directory and uncommentandroid.add_libs_armeabi = libs/android/*.so*android.add_libs_armeabi_v7a = libs/android-v7/.so** in your buildozer.spec.
The erroneous comment has been fixed. Also, although I don't think is necessary, you might uncomment android.copy_libs = 1
in your buildozer.spec
. Make sure to always run buildozer appclean
whenever modifying versions of packages, changing architectures and providing/changing your own libraries in buildozer.spec
!
Apologies for the misinformations and misguidance.
@domdrag thanks again for your guide sir, i left the pdfplumer library when it doesn't work for me and then i tried another approach for render pdf on android phone. hope your advice will help another people in future
Versions
Description
I use the fitz / PyMuPDF Library. After deploying on any android devoice I'll get the error:
ImportError: dlopen failed: "/data/data/org.test.myapp/files/app/_python_bundle/site-packages/fitz/_fitz.so" is 64-bit instead of 32-bit
buildozer.spec
Spec file: