PDFbox не извлекает регионы на Android

Я пытаюсь извлечь только выделенный текст в документе PDF. Он работает на ПК, но когда я использую его на Android, он терпит неудачу. PDFBox напрямую не работает на Android, поэтому я использую Birdbrain2/PdfBox-Android для Android.

Вот код ПК, который работает

import java.awt.geom.Rectangle2D;
import java.io.File;
import java.util.List;

import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDPage;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
import org.apache.pdfbox.util.PDFTextStripperByArea;

public class ExtractHighlights {
    public static void main(String args[]) {        
        System.out.println(extractHighlights("sample.pdf"));
    }

    public static String extractHighlights(String fileName){
        String extractedText = "";
        try {
            PDDocument pddDocument = PDDocument.load(new File(fileName));
            List allPages = pddDocument.getDocumentCatalog().getAllPages();         
            for (int i = 0; i < allPages.size(); i++) {             
                PDPage page = (PDPage) allPages.get(i);
                List<PDAnnotation> la = page.getAnnotations();
                if (la.size() < 1) {
                    continue;
                }

                for (PDAnnotation pda : la) {
                    PDFTextStripperByArea stripper = new PDFTextStripperByArea();
                    stripper.setSortByPosition(true);

                    PDRectangle rect = pda.getRectangle();
                    float x = rect.getLowerLeftX();
                    float y = rect.getUpperRightY();
                    float width = rect.getWidth();
                    float height = rect.getHeight();
                    int rotation = page.findRotation();
                    if (rotation == 0) {
                        PDRectangle pageSize = page.findMediaBox();
                        y = pageSize.getHeight() - y;
                    }

                    Rectangle2D.Float awtRect = new Rectangle2D.Float(x, y,
                            width, height);
                    stripper.addRegion("0", awtRect);
                    stripper.extractRegions(page);  
                    String highlight = stripper.getTextForRegion("0").trim();
                    if(highlight.length() == 0) continue;
                    extractedText += highlight.substring(0,highlight.length()-2)+" ";
                }               
            }
            pddDocument.close();
            //System.out.println(extractedText);
        } catch (Exception ex) {
            ex.printStackTrace();
        }
        return extractedText;
    }
}

Вот код андроида, который не работает

@Override
        protected String doInBackground(String... strings) {
            String extractedText = "";

            try {
                Log.i("ExtractHighlights","Started");
                PDDocument pddDocument = PDDocument.load(new File(strings[0]));
                PDPageTree allPages = pddDocument.getDocumentCatalog().getPages();
                int totalPages = allPages.getCount();
                int pageNumber = 0;
                for (PDPage page:allPages) {
                    publishProgress(pageNumber++,totalPages);
                    Log.i("ExtractHighlights", "Reading page");
                    List<PDAnnotation> la = page.getAnnotations();
                    if (la.size() < 1) {
                        continue;
                    }

                    for (PDAnnotation pda : la) {
                        Log.i("ExtractHighlights","Annotation found");
                        PDFTextStripperByArea stripper = new PDFTextStripperByArea();
                        stripper.setSortByPosition(true);

                        Log.i("ExtractHighlights","Getting rectangle");
                        PDRectangle rect = pda.getRectangle();
                        float x = rect.getLowerLeftX();
                        float y = rect.getUpperRightY();
                        float width = rect.getWidth();
                        float height = rect.getHeight();

                        RectF region = new RectF(x,y,width,height);
                        stripper.addRegion("0",region);
                        Log.i("ExtractHighlights","Extracting regions");
                        stripper.extractRegions(page);
                        Log.i("ExtractHighlights","Getting text from region");
                        String highlight = stripper.getTextForRegion("0").trim();
                        Log.i("ExtractHighlights",highlight);
                        if(highlight.length() == 0) continue;
                        extractedText += highlight.substring(0,highlight.length()-2)+" ";
                    }
                    Log.i("ExtractHighlights","Page done");
                }
                pddDocument.close();
                Log.i("ExtractHighlights","Document closed");
            } catch (Exception ex) {
                ex.printStackTrace();
            }

            return extractedText;
        }

Также это занимает очень много времени на Android, и Android предполагает, что программа потерпела крах.

Я могу попробовать преобразовать весь PDF в текст, но как я узнаю, какой текст выделен?


person Souradeep Nanda    schedule 07.06.2015    source источник
comment
Существует проблема № 5 PDFTextStripperByArea не удалось извлечь текст (проблемы со шрифтом?). Открыто RainHeart257 7 месяцев назад на Birdbrain2/PdfBox. Вероятно, ваша проблема связана с этим?   -  person mkl    schedule 07.06.2015
comment
Да, это проблема. Не могли бы вы порекомендовать мне какой-нибудь другой API, кроме PDFbox?   -  person Souradeep Nanda    schedule 07.06.2015


Ответы (1)


Как указал @mkl, это известная ошибка. Поэтому я использовал порт PDFBox этого. Это сработало!

person Souradeep Nanda    schedule 07.06.2015
comment
Я рад, что это сработало для вас. Однако этот проект уже год бездействует. Так что следите за Birdbrain2 и попробуйте еще раз через несколько месяцев :-) - person Tilman Hausherr; 11.06.2015