【问题标题】:Android iText text extractionAndroid iText 文本提取
【发布时间】:2026-01-04 23:45:02
【问题描述】:

伙计们,我在 android 中运行时遇到问题,但在 java 中运行时没有问题。

 public void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.activity_main);   
    tv = (TextView) findViewById(R.id.txtview);
    Button bt = (Button) findViewById(R.id.button1);
    am = this.getAssets();
    bt.setOnClickListener(new OnClickListener() {
        public void onClick(View v) {
            // do something when the button is clicked
            try {
                parsePdf("android.resource://com.example.panalyzer_v1/raw/resume.pdf","android.resource://com.example.panalyzer_v1/raw/resume.txt");
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
          }
      }
    );
}

public void parsePdf(String pdf, String txt) throws IOException {
    PdfReader reader = new PdfReader(pdf);
    PrintWriter out = new PrintWriter(new FileOutputStream(txt));
    for (int i = 1; i <= reader.getNumberOfPages(); i++) {
        out.println(PdfTextExtractor.getTextFromPage(reader, i));
    }
    out.flush();
    out.close();
}

此代码将提取 PDF 中的整个文本并将其传输到文本文件中,但我不知道 Android 是否可以做到这一点。 我认为我的问题是文件路径:parsePdf("assets/Resume.pdf","assets/Resume.txt"); 我无法让它工作。

我已更改路径,但错误未解决。我调试了一下,还是报错:

10-22 20:16:13.850: E/AndroidRuntime(657): FATAL EXCEPTION: main
10-22 20:16:13.850: E/AndroidRuntime(657): java.lang.RuntimeException: Unable to start activity ComponentInfo{com.example.panalyzerdemo/com.example.panalyzerdemo.MainActivity}: java.lang.NullPointerException
10-22 20:16:13.850: E/AndroidRuntime(657):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2663)
10-22 20:16:13.850: E/AndroidRuntime(657):  at android.app.ActivityThread.handleLaunchActivity(ActivityThread.java:2679)
10-22 20:16:13.850: E/AndroidRuntime(657):  at android.app.ActivityThread.access$2300(ActivityThread.java:125)
10-22 20:16:13.850: E/AndroidRuntime(657):  at android.app.ActivityThread$H.handleMessage(ActivityThread.java:2033)
10-22 20:16:13.850: E/AndroidRuntime(657):  at android.os.Handler.dispatchMessage(Handler.java:99)
10-22 20:16:13.850: E/AndroidRuntime(657):  at android.os.Looper.loop(Looper.java:123)
10-22 20:16:13.850: E/AndroidRuntime(657):  at android.app.ActivityThread.main(ActivityThread.java:4627)
10-22 20:16:13.850: E/AndroidRuntime(657):  at java.lang.reflect.Method.invokeNative(Native Method)
10-22 20:16:13.850: E/AndroidRuntime(657):  at java.lang.reflect.Method.invoke(Method.java:521)
10-22 20:16:13.850: E/AndroidRuntime(657):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:868)
10-22 20:16:13.850: E/AndroidRuntime(657):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:626)
10-22 20:16:13.850: E/AndroidRuntime(657):  at dalvik.system.NativeStart.main(Native Method)
10-22 20:16:13.850: E/AndroidRuntime(657): Caused by: java.lang.NullPointerException
10-22 20:16:13.850: E/AndroidRuntime(657):  at com.example.panalyzerdemo.MainActivity.onCreate(MainActivity.java:36)
10-22 20:16:13.850: E/AndroidRuntime(657):  at android.app.Instrumentation.callActivityOnCreate(Instrumentation.java:1047)
10-22 20:16:13.850: E/AndroidRuntime(657):  at android.app.ActivityThread.performLaunchActivity(ActivityThread.java:2627)
10-22 20:16:13.850: E/AndroidRuntime(657):  ... 11 more
10-22 20:16:16.831: I/Process(657): Sending signal. PID: 657 SIG: 9

我知道问题所在,它是PdfReader reader = new PdfReader(pdf);。我是不是走错路了?

PS:在调试方面我是新手。如果是错误的调试报告,请纠正我。

谢谢。

【问题讨论】:

    标签: java android pdf itext path-finding


    【解决方案1】:

    要在 Android 中打开资产文件,您应该使用 getAssets().open("Resume.txt")

    【讨论】:

      【解决方案2】:

      您可以尝试 3 种解决方案。

      1. 不是将文件放在资产文件夹中,而是放在 res 下的原始文件夹中。并使用以下路径来引用它。 "android.resource://[your_package_name]/raw/Resume.pdf"

      2. 资产文件夹路径应该这样给出 file:///android_asset/Resume.pdf

      3. 不要将文件放在assets文件夹中,而是将其放在SD卡中,SD卡根路径可以这样获取 Environment.getExternalStorageDirectory();

      【讨论】:

      • 感谢您的回复。我将尝试 1 和 2,因为 3 在从目录访问文件的桌面中是否相同?
      • 对于3,上面提到的函数会给你SD卡的根路径。然后您需要根据文件在 SD 卡中的存储位置附加文件的相对路径。抱歉,我无法理解从桌面访问的问题?
      • 顺便说一句,这对 1 parsePdf("android.resource://com.example.panalyzer_v1/raw/resume.pdf","android.resource://com.example.panalyzer_v1/raw/resume.txt"); 是否正确?
      • 是的,如果 com.example.panalyzer_v1 是您的应用程序包名称,这似乎是正确的。
      • 谢谢。我正在谈论的问题是,如果存储是像台式计算机一样的内部存储,我应该使用Environment.getExternalStorageDirectory();
      【解决方案3】:

      啊是的!我解决了。而不是使用我使用的文件路径:

      reader = new PdfReader(getResources().openRawResource(R.raw.resume));

      【讨论】:

      • 太好了,另一种访问资源的方式:)