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);
}
}
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));
}
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);
}
Aggregations