Search code examples
javapdfrectanglespdfclown

PDFClown Editable Rectangle


Following the given examples pdfClown can both highlight a specific text and draw a rectangle around the respective words.

Is there a possibility to make this reactangle editable afterwards with the Adobe Acrobat?

My current workflow (as planned):

  1. Import a document
  2. Search document for Highlightings
  3. Determine the Hightlighting's color
  4. Draw a rectangle around the outer boundaries of the rectangle
  5. add a callout to a another rectangle containing a letter, depending on the determined color

I can not (e.g.) drag the rectangle around the formerly highlighted word with Acrobat Reader, as far as I can see. I used the provided example from pdfClown's webpage to draw a reactangle around every character.

Is there something that I forgot to consider?

File inFile = null;
String inFilePath = "/path/to/inputFile/input_highlight.pdf";
String outDirPath = "/tmp";

try {
    inFile = new File(inFilePath);
} catch (Exception e) {
    throw new RuntimeException(inFilePath + " file access error.", e);
}

Document document = inFile.getDocument();

Pages pages = document.getPages();

PageStamper stamper = new PageStamper();
    for (Page page : pages) {

    stamper.setPage(page);

    PageAnnotations annotations = page.getAnnotations();

    for (Annotation annotation : annotations) {

        if (annotation.getColor() == null) {

            continue;

        }

        Rectangle2D textStringBox = annotation.getBox();

        PrimitiveComposer composer = stamper.getBackground();
        composer.setStrokeColor(DeviceRGBColor.Black);
        textStringBox.setRect(annotation.getBox().getX(), annotation.getBox().getY(), annotation.getBox().getWidth(), annotation.getBox().getHeight());
        composer.drawRectangle(textStringBox);
        composer.stroke();

        composer.beginLocalState();
        composer.setStrokeColor(DeviceRGBColor.Black);
        composer.end();

        stamper.flush();

        System.out.println("Text: " + annotation.getText());
        System.out.println("Color: " + annotation.getColor());
        System.out.println("Coordinates: " + annotation.getBox().toString());

        annotation.setColor(DeviceRGBColor.White);

    }

}

Solution

  • As it seems your main issue is that

    I can not (e.g.) drag the rectangle around the formerly highlighted word with Acrobat Reader

    The reason is that you draw your rectangle in the page content (the PageStamper you use is documented as Tool for content insertion into existing pages). The page content is fixed, in particular as far as Acrobat Reader is concerned; Acrobat Reader only allows you to move annotations.

    If you want to have a rectangle you can drag around, therefore, you have to use a rectangle annotation. Rectangle annotations can be created like this:

    new org.pdfclown.documents.interaction.annotations.Rectangle(
      page,
      new Rectangle(50, 370, 100, 30),
      "Text of the Rectangle annotation"
      ).withColor(DeviceRGBColor.get(Color.RED))
       .withBorder(new Border(1, new LineDash(new double[]{5})))
       .withAuthor("Stefano")
       .withSubject("Rectangle")
       .withPopup(new Popup(
         page,
         new Rectangle2D.Double(200, 325, 200, 75),
         "Text of the Popup annotation (this text won't be visible as associating popups to markup annotations overrides the former's properties with the latter's)"
         ));
    

    (AnnotationSample.java)

    You also mention that you want to add a callout; a callout annotation can be created like this:

    new StaticNote(
      page,
      new Rectangle(250, 90, 150, 70),
      "Text of the Callout note annotation"
      ).withLine(
         new StaticNote.CalloutLine(
           page,
           new Point(250,125),
           new Point(150,125),
           new Point(100,100)
           )
         )
       .withLineEndStyle(LineEndStyleEnum.OpenArrow)
       .withBorder(new Border(1))
       .withColor(DeviceRGBColor.get(Color.YELLOW));
    

    (AnnotationSample.java)