Android PDFium 编译

一、PDFium 简介

Pdfium是一个由Google开发的开源PDF渲染库,可以用来显示、处理PDF文档。它是Google Chrome浏览器中用于处理PDF文档的核心引擎。该库不只限于Chrome浏览器使用,其他开发者也可在自己的项目中使用Pdfium库。Pdfium提供了丰富的特性,如文本提取、搜索、注解、表单填充等,且性能高、稳定性好、兼容性强,被许多第三方项目所使用。

二、编译环境

1. Docker unbuntu 22.04
2. Dockerfile
Dockerfile 复制代码
FROM ubuntu:22.04

RUN apt-get update
RUN apt-get install -y  build-essential git subversion pkg-config python3 libtool cmake glib2.0-dev libatspi2.0-dev wget nano

RUN mkdir /pdfium_build
WORKDIR /pdfium_build
RUN git clone https://chromium.googlesource.com/chromium/tools/depot_tools.git
ENV PATH=/pdfium_build/depot_tools:${PATH}
RUN gclient config --unmanaged https://pdfium.googlesource.com/pdfium.git@9eec95782c4ecdae50cd8c8e9f88d3f8941db1cd
RUN echo "target_os = [ 'android' ]" >> .gclient
RUN gclient sync
# 可根据需要指定不同版本
RUN mv pdfium.git\@9eec95782c4ecdae50cd8c8e9f88d3f8941db1cd/ pdfium

# working dir
WORKDIR /app
3. build.sh
bash 复制代码
#!/bin/bash

DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" >/dev/null 2>&1 && pwd )"

set -e

build() {
  local ARCH="$1"
  shift
  local OUT="$DIR/../libpdfsdk/jniLibs/$ARCH/libpdfsdk.so"
  local OUT_UNSTRIPPED="$DIR/../libpdfsdk/jniLibs/$ARCH/libpdfsdk_unstripped.so"
  [ -e "$OUT" ] && return
  echo "building $OUT"
  gn gen out --args="target_os=\"android\" pdf_bundle_freetype=true pdf_is_standalone=false is_component_build=false pdf_enable_xfa=false pdf_enable_v8=false is_debug=false is_official_build=true $*"
  ninja -C out pdfsdk
  mkdir -p $(dirname "$OUT") && cp out/libpdfsdk.so "$OUT" && cp out/lib.unstripped/libpdfsdk.so "$OUT_UNSTRIPPED"
}

build armeabi-v7a target_cpu=\"arm\" arm_version=7
build arm64-v8a target_cpu=\"arm64\"
build x86 target_cpu=\"x86\"
build x86_64 target_cpu=\"x64\"

mkdir -p "$DIR"/../libpdfsdk/jniLibs/include/ && cp "$DIR"/public/*.h "$DIR"/../libpdfsdk/jniLibs/include/

三、编译步骤

1. mkdir pdf & cd pdf
2. 将 build.sh 放入 pdf 目录
3. 将 Dockerfile 放入 pdf/docker 目录下
4. 创建docker image
bash 复制代码
docker build -t pdfium-android -f ./docker
5. 运行docker并进入bash
bash 复制代码
docker run -v ${PWD}:/app -it pdfium-android /bin/bash
6. 在docker的bash中进入目录
cd /pdfium_build/pdfium/
7. 编辑BUILD.gn

python 复制代码
config("pdfium_common_config") {
  cflags = []
  cflags_cc = []
  ldflags = []
  include_dirs = [ "." ]
  defines = [
  ]

改为

python 复制代码
config("pdfium_common_config") {
  cflags = [ "-fvisibility=default" ]
  cflags_cc = []
  ldflags = []
  include_dirs = [ "." ]
  defines = [
     "PNG_PREFIX",
     "PNG_USE_READ_MACROS",
     "FPDFSDK_EXPORTS"
  ]

找到 component("pdfium") 节,在这节之后添加

python 复制代码
shared_library("pdfsdk") {
  deps = [":pdfium"]
  if (target_os == "android") {
    configs -= [ "//build/config/android:hide_all_but_jni_onload" ]
  }
}
8. 修改 build_overrides/build.gni

将以下三行注释掉

python 复制代码
if (current_cpu == "arm") {
  arm_use_neon = true
}

变为

python 复制代码
#if (current_cpu == "arm") {
#  arm_use_neon = true
#}
9. 将build.sh拷贝至此
bash 复制代码
copy /app/build.sh .
10. 运行build.sh
11. 完成后结果会输出在
bash 复制代码
/pdfium_build/libpdfsdk
12. 将结果copy到app目录。这样就可以在宿主机使用了。
bash 复制代码
cp -r /pdfium_build/libpdfsdk /app

See Also

https://github.com/benjinus/android-support-pdfium
https://github.com/benjinus/android-support-pdfium

相关推荐
王老师青少年编程3 小时前
gesp(C++五级)(14)洛谷:B4071:[GESP202412 五级] 武器强化
开发语言·c++·算法·gesp·csp·信奥赛
DogDaoDao3 小时前
leetcode 面试经典 150 题:有效的括号
c++·算法·leetcode·面试··stack·有效的括号
水瓶丫头站住4 小时前
安卓APP如何适配不同的手机分辨率
android·智能手机
一只小bit4 小时前
C++之初识模版
开发语言·c++
xvch4 小时前
Kotlin 2.1.0 入门教程(五)
android·kotlin
CodeClimb5 小时前
【华为OD-E卷 - 第k个排列 100分(python、java、c++、js、c)】
java·javascript·c++·python·华为od
apz_end6 小时前
埃氏算法C++实现: 快速输出质数( 素数 )
开发语言·c++·算法·埃氏算法
仟濹6 小时前
【贪心算法】洛谷P1106 - 删数问题
c语言·c++·算法·贪心算法
北顾南栀倾寒7 小时前
[Qt]系统相关-网络编程-TCP、UDP、HTTP协议
开发语言·网络·c++·qt·tcp/ip·http·udp
张登杰踩7 小时前
如何用Python将pdf文件转化为高清图片
pdf