当我尝试从sdcard读取pdf文件并从中提取文本时,没有任何反应。 没有错误,没有警告,通知也没有结果文件。 我将源文件和结果都存储在设备sdcard的根文件夹中。 你能帮我解决这个问题吗? 这是我的代码:
package com.example.androidtest;
import java.io.File;
...
public class MainActivity extends Activity {
private Button button;
public static final String TIMETABLE = "doc.pdf"; // The original PDF that will be parsed.
public static final String RESULT = "timetable.txt"; // The text file received after scan.
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
processSource();
}
public void processSource() {
button = (Button) this.findViewById(R.id.button_add);
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View v) {
try {
new MainActivity().extractText(TIMETABLE, RESULT);
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
});
}
public void extractText(String pdf, String doc) throws IOException {
File sdcard = Environment.getExternalStorageDirectory(); // Load file timetable.txt from device's sdcard
File file = new File(sdcard, pdf);
File text = new File(sdcard, doc); // Save the result file in device's sdcard
InputStream is;
try {
is = new FileInputStream(file);
PdfReader reader = new PdfReader(is); // Call the source file
PrintWriter out = new PrintWriter(new FileOutputStream(text));
Rectangle rect = new Rectangle(0, 0, 600, 900); // Define the rectangle to extract text within it
RenderFilter filter = new RegionTextRenderFilter(rect);
TextExtractionStrategy strategy = new FilteredTextRenderListener(new LocationTextExtractionStrategy(), filter);
out.println(PdfTextExtractor.getTextFromPage(reader, 1, strategy));
out.flush();
out.close();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
} // Call the source file
}
}
以下是我在AVD上测试它时在控制台选项卡中显示的内容(我希望它可以提供帮助):
[2013-11-23 03:03:29 - AndroidTest] Android发布! [2013-11-23 03:03:29 - AndroidTest] adb正常运行。 [2013-11-23 03:03:29 - AndroidTest]执行com.example.androidtest.MainActivity>活动启动 [2013-11-23 03:03:29 - AndroidTest]自动目标模式:使用>兼容的AVD'Tab'启动新的模拟器 [2013-11-23 03:03:29 - AndroidTest]使用虚拟设备'Tab'启动新的模拟器 [2013-11-23 03:03:29 - AndroidTest]新模拟器发现:emulator-5554 [2013-11-23 03:03:29 - AndroidTest]等待HOME('android.process.acore')被>启动... [2013-11-23 03:03:57 - AndroidTest] HOME正在关注设备'emulator-5554' [2013-11-23 03:03:57 - AndroidTest]将AndroidTest.apk上传到设备'emulator-5554' [2013-11-23 03:04:06 - AndroidTest]安装AndroidTest.apk ... [2013-11-23 03:04:29 - AndroidTest]成功! [2013-11-23 03:04:29 - AndroidTest]在设备模拟器-5554上开始活动> com.example.androidtest.MainActivity [2013-11-23 03:04:30 - AndroidTest] ActivityManager:开始:Intent> {act = android.intent.action.MAIN cat = [android.intent.category.LAUNCHER]> cmp = com.example。 androidtest / .MainActivity}
谢谢你的时间!
答案 0 :(得分:0)
您正在使用过滤器来限制从以下位置提取文字的区域:
Rectangle rect = new Rectangle(0, 0, 600, 900);
// Define the rectangle to extract text within it
RenderFilter filter = new RegionTextRenderFilter(rect);
PDF页面的左下角不需要(0, 0)
。它可以在坐标系中的任何位置。因此A4页面可以是(0, 0, 595, 842)
,但也可以是(1000, 2000, 1595, 2842)
。
您尝试从中提取文本的PDF可能包含在您用于过滤器的(0, 0, 600, 900)
矩形之外的页面。这意味着过滤器不与页面相交,因此不会提取文本。