Как да направя PDF текст избираем с помощта на Apache PDFBox?

Опитвам се да направя текст избираем в приложение за четене на PDF, създадено на JavaFX. Имам PDF файлове, които съдържат екранни снимки с текст и OCR слой. Така че имам нужда текстът да може да се избира като в обикновения зрител. Настроих да получавам изображение от страницата и сега се опитвам да разбера как да маркирам текст.

Опитах следното:

    InputStream is = this.getClass().getResourceAsStream(currentPdf);
    Image convertedImage;
    try {
        PDDocument document = PDDocument.load(is);
        List<PDPage> list = document.getDocumentCatalog().getAllPages();
        PDPage page = list.get(pageNum);
        List annotations = page.getAnnotations();
        PDAnnotationTextMarkup markup = new PDAnnotationTextMarkup(PDAnnotationTextMarkup.SUB_TYPE_HIGHLIGHT);
        markup.setRectangle(new PDRectangle(600, 600));
        markup.setQuadPoints(new float[]{100, 100, 200, 100, 100, 500, 200, 500});
        annotations.add(markup);
        page.setAnnotations(annotations);
        BufferedImage image = page.convertToImage(BufferedImage.TYPE_INT_RGB, 128);
        convertedImage = SwingFXUtils.toFXImage(image, null);
        document.close();
        imageView.setImage(convertedImage);
    } catch (Exception e) {
        throw new RuntimeException(e);
    }

но това води до изображение без никакви акценти.

Също така се опитах да намеря информация при препълване на стека или други ресурси, но не намерих нищо.

Бих оценил примерен Java код, който позволява маркиране на текст с мишка.


person Poliakoff    schedule 16.01.2016    source източник
comment
Моля, качете PDF файла.   -  person Tilman Hausherr    schedule 17.01.2016
comment
Ето примера bit.ly/1OWKAa1   -  person Poliakoff    schedule 17.01.2016
comment
Хубавото е, че наистина има текст. В PDFBox 2.0 има инструмента DrawPrintTextLocations.java, моля, опитайте този. Въпросът ви е неясен, искате ли програма за преглед с функция за маркиране на текст или искате да маркирате неща и след това да запазите PDF?   -  person Tilman Hausherr    schedule 17.01.2016
comment
@TilmanHausherr Със сигурност зрител с функция за маркиране на текст: „Имам нужда текстът да може да се избира като при обикновен зрител“. В примерния код се опитвам да направя някакъв работещ избор на текст по време на изпълнение, за да го обвия по-късно в манипулатор на събития с щракване на мишката, който ще предаде координатите на избраната област към метода, който извършва избор. Благодаря, ще го проверя.   -  person Poliakoff    schedule 17.01.2016
comment
По същество рисувате PDF файла към растерно изображение (така че губите цялата информация кои пиксели са текст и кои не) и показвате това изображение. Следователно трябва да кажете на javafx къде е текстът.   -  person mkl    schedule 17.01.2016
comment
@Polyakoff също погледнете примера ExtractTextByArea.java, това ще ви даде текста от избрана област.   -  person Tilman Hausherr    schedule 17.01.2016


Отговори (1)


Използвах ICEpdf и направих следното:

question.getSelectedBounds()
                .stream()
                .map(Shape::getBounds)
                .forEach(bounds -> {
                    SquareAnnotation squareAnnotation = (SquareAnnotation)
                            AnnotationFactory.buildAnnotation(
                                    pdfController.getPageTree().getLibrary(),
                                    Annotation.SUBTYPE_SQUARE,
                                    bounds);
                    squareAnnotation.setFillColor(true);
                    squareAnnotation.setFillColor(new Color(255, 250, 57, 120));
                    squareAnnotation.setRectangle(bounds);
                    squareAnnotation.setBBox(bounds);
                    squareAnnotation.resetAppearanceStream(null);
                    AbstractAnnotationComponent annotationComponent = AnnotationComponentFactory
                            .buildAnnotationComponent(squareAnnotation, pdfController.getDocumentViewController(),
                                    pageViewComponent, pdfController.getDocumentViewController().getDocumentViewModel());
                    pageViewComponent.addAnnotation(annotationComponent);
                });
person Poliakoff    schedule 22.01.2020