Search in sources :

Example 1 with PDThreadBead

use of org.apache.pdfbox.pdmodel.interactive.pagenavigation.PDThreadBead in project pdfbox by apache.

the class PDFTextStripper method fillBeadRectangles.

private void fillBeadRectangles(PDPage page) {
    beadRectangles = new ArrayList<>();
    for (PDThreadBead bead : page.getThreadBeads()) {
        if (bead == null) {
            // can't skip, because of null entry handling in processTextPosition()
            beadRectangles.add(null);
            continue;
        }
        PDRectangle rect = bead.getRectangle();
        // bead rectangle is in PDF coordinates (y=0 is bottom),
        // glyphs are in image coordinates (y=0 is top),
        // so we must flip
        PDRectangle mediaBox = page.getMediaBox();
        float upperRightY = mediaBox.getUpperRightY() - rect.getLowerLeftY();
        float lowerLeftY = mediaBox.getUpperRightY() - rect.getUpperRightY();
        rect.setLowerLeftY(lowerLeftY);
        rect.setUpperRightY(upperRightY);
        // adjust for cropbox
        PDRectangle cropBox = page.getCropBox();
        if (Float.compare(cropBox.getLowerLeftX(), 0) != 0 || Float.compare(cropBox.getLowerLeftY(), 0) != 0) {
            rect.setLowerLeftX(rect.getLowerLeftX() - cropBox.getLowerLeftX());
            rect.setLowerLeftY(rect.getLowerLeftY() - cropBox.getLowerLeftY());
            rect.setUpperRightX(rect.getUpperRightX() - cropBox.getLowerLeftX());
            rect.setUpperRightY(rect.getUpperRightY() - cropBox.getLowerLeftY());
        }
        beadRectangles.add(rect);
    }
}
Also used : PDRectangle(org.apache.pdfbox.pdmodel.common.PDRectangle) PDThreadBead(org.apache.pdfbox.pdmodel.interactive.pagenavigation.PDThreadBead)

Example 2 with PDThreadBead

use of org.apache.pdfbox.pdmodel.interactive.pagenavigation.PDThreadBead in project pdfbox by apache.

the class DrawPrintTextLocations method stripPage.

private void stripPage(int page) throws IOException {
    PDFRenderer pdfRenderer = new PDFRenderer(document);
    image = pdfRenderer.renderImage(page, SCALE);
    PDPage pdPage = document.getPage(page);
    PDRectangle cropBox = pdPage.getCropBox();
    // flip y-axis
    flipAT = new AffineTransform();
    flipAT.translate(0, pdPage.getBBox().getHeight());
    flipAT.scale(1, -1);
    // page may be rotated
    rotateAT = new AffineTransform();
    int rotation = pdPage.getRotation();
    if (rotation != 0) {
        PDRectangle mediaBox = pdPage.getMediaBox();
        switch(rotation) {
            case 90:
                rotateAT.translate(mediaBox.getHeight(), 0);
                break;
            case 270:
                rotateAT.translate(0, mediaBox.getWidth());
                break;
            case 180:
                rotateAT.translate(mediaBox.getWidth(), mediaBox.getHeight());
                break;
            default:
                break;
        }
        rotateAT.rotate(Math.toRadians(rotation));
    }
    // cropbox
    transAT = AffineTransform.getTranslateInstance(-cropBox.getLowerLeftX(), cropBox.getLowerLeftY());
    g2d = image.createGraphics();
    g2d.setStroke(new BasicStroke(0.1f));
    g2d.scale(SCALE, SCALE);
    setStartPage(page + 1);
    setEndPage(page + 1);
    Writer dummy = new OutputStreamWriter(new ByteArrayOutputStream());
    writeText(document, dummy);
    // beads in green
    g2d.setStroke(new BasicStroke(0.4f));
    List<PDThreadBead> pageArticles = pdPage.getThreadBeads();
    for (PDThreadBead bead : pageArticles) {
        PDRectangle r = bead.getRectangle();
        Shape s = r.toGeneralPath().createTransformedShape(transAT);
        s = flipAT.createTransformedShape(s);
        s = rotateAT.createTransformedShape(s);
        g2d.setColor(Color.green);
        g2d.draw(s);
    }
    g2d.dispose();
    String imageFilename = filename;
    int pt = imageFilename.lastIndexOf('.');
    imageFilename = imageFilename.substring(0, pt) + "-marked-" + (page + 1) + ".png";
    ImageIO.write(image, "png", new File(imageFilename));
}
Also used : BasicStroke(java.awt.BasicStroke) Shape(java.awt.Shape) PDPage(org.apache.pdfbox.pdmodel.PDPage) ByteArrayOutputStream(java.io.ByteArrayOutputStream) PDThreadBead(org.apache.pdfbox.pdmodel.interactive.pagenavigation.PDThreadBead) AffineTransform(java.awt.geom.AffineTransform) PDRectangle(org.apache.pdfbox.pdmodel.common.PDRectangle) OutputStreamWriter(java.io.OutputStreamWriter) File(java.io.File) PDFRenderer(org.apache.pdfbox.rendering.PDFRenderer) OutputStreamWriter(java.io.OutputStreamWriter) Writer(java.io.Writer)

Example 3 with PDThreadBead

use of org.apache.pdfbox.pdmodel.interactive.pagenavigation.PDThreadBead in project pdfbox by apache.

the class PDPage method getThreadBeads.

/**
 * This will get a list of PDThreadBead objects, which are article threads in the document. This
 * will return an empty list if there are no thread beads.
 *
 * @return A list of article threads on this page, never null. The returned list is backed by
 * the beads COSArray, so any adding or deleting in this list will change the document too.
 */
public List<PDThreadBead> getThreadBeads() {
    COSArray beads = (COSArray) page.getDictionaryObject(COSName.B);
    if (beads == null) {
        beads = new COSArray();
    }
    List<PDThreadBead> pdObjects = new ArrayList<>();
    for (int i = 0; i < beads.size(); i++) {
        COSBase base = beads.getObject(i);
        PDThreadBead bead = null;
        // in some cases the bead is null
        if (base instanceof COSDictionary) {
            bead = new PDThreadBead((COSDictionary) base);
        }
        pdObjects.add(bead);
    }
    return new COSArrayList<>(pdObjects, beads);
}
Also used : COSArrayList(org.apache.pdfbox.pdmodel.common.COSArrayList) COSArray(org.apache.pdfbox.cos.COSArray) COSDictionary(org.apache.pdfbox.cos.COSDictionary) COSArrayList(org.apache.pdfbox.pdmodel.common.COSArrayList) ArrayList(java.util.ArrayList) COSBase(org.apache.pdfbox.cos.COSBase) PDThreadBead(org.apache.pdfbox.pdmodel.interactive.pagenavigation.PDThreadBead)

Aggregations

PDThreadBead (org.apache.pdfbox.pdmodel.interactive.pagenavigation.PDThreadBead)3 PDRectangle (org.apache.pdfbox.pdmodel.common.PDRectangle)2 BasicStroke (java.awt.BasicStroke)1 Shape (java.awt.Shape)1 AffineTransform (java.awt.geom.AffineTransform)1 ByteArrayOutputStream (java.io.ByteArrayOutputStream)1 File (java.io.File)1 OutputStreamWriter (java.io.OutputStreamWriter)1 Writer (java.io.Writer)1 ArrayList (java.util.ArrayList)1 COSArray (org.apache.pdfbox.cos.COSArray)1 COSBase (org.apache.pdfbox.cos.COSBase)1 COSDictionary (org.apache.pdfbox.cos.COSDictionary)1 PDPage (org.apache.pdfbox.pdmodel.PDPage)1 COSArrayList (org.apache.pdfbox.pdmodel.common.COSArrayList)1 PDFRenderer (org.apache.pdfbox.rendering.PDFRenderer)1