2

我有一个使用 pdf2Image 的自定义 python 脚本,我试图在安卓手机上运行。我试过这两种方法

  1. 使用可以在 android 上运行 python 脚本的 android 应用程序。
  2. 创建一个 android 应用程序并集成我的 python 代码(使用chaquopy)。

但在这两种情况下,我都得到

W/System.err: com.chaquo.python.PyException: PDFInfoNotInstalledError: Unable to get page count. Is poppler installed and in PATH?

我的脚本在 ubuntu 终端上无缝运行(使用python <scriptFileName.py>)但是当我尝试在 android 上执行时,它给了我上述问题

我的麻烦是我无法理解如何安装 poppler,或者将其添加到 android 中的 PATH 中。

以下是将 PDF 转换为 JPEG 图像的脚本(模块名称 = pdf2Img.py):

from pdf2image import convert_from_bytes
import sys
import os
import shutil
import io

def extractImagesFromPdf(fileContents):

    BASE_DIR = 'in_pdfs'
    EXTENSION = '.pdf'
    OUT_DIR = 'images'
    IMG_EXT = '.jpg'
    sep = "/"

    if not os.path.exists(getDirectoryPath(BASE_DIR)):
        os.mkdir(getDirectoryPath(BASE_DIR))

    pages = convert_from_bytes(fileContents)

    if os.path.exists(getDirectoryPath(OUT_DIR)):
        shutil.rmtree(getDirectoryPath(OUT_DIR))
        os.mkdir(getDirectoryPath(OUT_DIR))

    page_num = 1
    for page in pages:
        page.save(getDirectoryPath(OUT_DIR) + sep + str(page_num) + IMG_EXT, 'JPEG')
        page_num = page_num + 1

def getDirectoryPath(dir):
    base_path = os.path.dirname(__file__)
    return base_path + "/" + dir

这就是我调用它的方式

public class MainActivity extends AppCompatActivity {

    private static final int PICK_PDF_FILE = 2;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }

    public void selectAndUploadFile(View view) {
        Intent intent= new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("application/pdf");

        startActivityForResult(intent, PICK_PDF_FILE);
    }

    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent resultData) {
        super.onActivityResult(requestCode, resultCode, resultData);
        if (requestCode == PICK_PDF_FILE
                && resultCode == Activity.RESULT_OK) {
            Uri inPDF = null;
            if (resultData != null) {
                inPDF = resultData.getData();
                Log.i("SelectAndUpload", "onActivityResult: " + inPDF);

                if (!Python.isStarted()) {
                    Python.start(new AndroidPlatform(MainActivity.this));
                }

                Python py = Python.getInstance();
                PyObject module = py.getModule("pdf2Img");

                try {
                    InputStream iStream =   getContentResolver().openInputStream(inPDF);
                    byte[] inputData = getBytes(iStream);
                    PyObject result = module.callAttr("extractImagesFromPDF", inputData);

                } catch (Exception e) {
                    Log.i("Ex", "Exception!!!");
                    e.printStackTrace();
                    Toast.makeText(this, e.getMessage(), Toast.LENGTH_LONG).show();
                }

            }
        }
    }

    public byte[] getBytes(InputStream inputStream) throws IOException {
        ByteArrayOutputStream byteBuffer = new ByteArrayOutputStream();
        int bufferSize = 1024;
        byte[] buffer = new byte[bufferSize];

        int len = 0;
        while ((len = inputStream.read(buffer)) != -1) {
            byteBuffer.write(buffer, 0, len);
        }
        return byteBuffer.toByteArray();
    }
}

错误即将到来

    pages = convert_from_path(BASE_DIR + sep + fileName + EXTENSION)

几个参考:

  1. Chaquopy 入门文档
  2. 将 uri 转换为 byte[]
  3. pdf2Image(python库)参考文档
4

0 回答 0