Android Studio中如何提取PDF指定区域的文本?
解决Android中PDFBox提取指定区域文本的Rect兼容性问题
错误信息翻译
不兼容的类型:Rect无法转换为Rectangle2D
直接解决Rect与Rectangle2D的兼容问题
PDFBox的addRegion方法仅支持Java的Rectangle2D类,而Android的Rect是独立实现的矩形类,无法直接传入。只需手动转换坐标即可:
坐标转换代码示例
// 你定义的Android Rect区域 Rect androidRect = new Rect(100, 200, 300, 400); PDPage targetPage = document.getPage(1); float pageHeight = targetPage.getMediaBox().getHeight(); // 转换为PDFBox支持的Rectangle2D.Double // 注意:PDF坐标系以左下角为原点,需反转Y轴 Rectangle2D pdfRegion = new Rectangle2D.Double( androidRect.left, pageHeight - androidRect.bottom, androidRect.width(), androidRect.height() ); // 正常调用addRegion stripper.addRegion("class1", pdfRegion);
完整修正后的PDFBox代码
try { // Android中注意文件路径权限,建议用ContentResolver获取文件流 PDDocument document = PDDocument.load(new File("/sdcard/test.pdf")); PDFTextStripperByArea stripper = new PDFTextStripperByArea(); stripper.setSortByPosition(true); Rect androidRect = new Rect(100, 200, 300, 400); PDPage page = document.getPage(1); float pageHeight = page.getMediaBox().getHeight(); Rectangle2D pdfRegion = new Rectangle2D.Double( androidRect.left, pageHeight - androidRect.bottom, androidRect.width(), androidRect.height() ); stripper.addRegion("class1", pdfRegion); stripper.extractRegions(page); String extractedText = stripper.getTextForRegion("class1"); Log.d("PDF提取结果", extractedText); document.close(); } catch (IOException e) { e.printStackTrace(); }
替代方案:使用Android适配的PDF库
如果觉得PDFBox的适配步骤繁琐,可以选择这些更适合移动端的库:
- iText 7 for Android:官方适配Android的PDF处理库,API简洁,支持区域文本提取。
try { PdfDocument pdfDoc = new PdfDocument(new PdfReader("test.pdf")); PdfPage page = pdfDoc.getPage(2); // iText页码从1开始 PageSize pageSize = page.getPageSize(); // 转换Android Rect到iText的Rectangle(适配PDF坐标系) Rectangle pdfRect = new Rectangle( androidRect.left, pageSize.getHeight() - androidRect.bottom, androidRect.width(), androidRect.height() ); TextExtractionStrategy strategy = new LocationTextExtractionStrategy(); String extractedText = PdfTextExtractor.getTextFromPage(page, strategy, pdfRect); Log.d("iText提取结果", extractedText); pdfDoc.close(); } catch (IOException e) { e.printStackTrace(); } - MuPDF:轻量级高性能PDF库,支持区域文本提取,适合对性能要求高的场景。
内容的提问来源于stack exchange,提问作者dfhng2wwr
相关产品推荐
相关产品推荐

