You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.09 16:45:33