Spire.PDF for Java 3.5.1

Spire.PDF for Java 3.5.1 supports signing PDF with timestamp server

We're pleased to announce the release of Spire.PDF for Java 3.5.1. This version supports signing PDF file with timestamp server, showing or not showing signature information on the page and drawing Arrow annotation, Cloud annotation, Circle annotation, Square annotation and Connected lines annotation. In addition, some issues that occurred when extracting text and convert PDF to image are fixed successfully. See the content below for more details.

Here is a list of changes made in this release

Category ID Description
New Feature SPIREPDF-2545 Supports digitally signing a PDF document with a timestamp server.
//Configure a timestamp server
String url = "https://freetsa.org/tsr";
signature.configureTimestamp(url);
New Feature SPIREPDF-3191

Supports showing / not showing signature information on PDF pages.

signature.addShowConfigureText(SignatureConfigureText.Contact_Info);//Show Contact_Info (default show all)
signature.removeShowConfigureText(SignatureConfigureText.Contact_Info);//Do not show Contact_Info
signature.setShowConfigureText(EnumSet.of(SignatureConfigureText.Contact_Info));//Only show Contact_Info
New Feature SPIREPDF-3194

Supports drawing Arrow annotation, Cloud annotation, Circle annotation, Square annotation and Connected lines annotation.

PdfDocument pdf = new PdfDocument();
PdfPageBase page = pdf.getPages().add();

//draw LineArrow
String text1 = "this is Arrow annotation";
PdfFont font = new PdfFont(PdfFontFamily.Helvetica, 20);
PdfSolidBrush brush1 = new PdfSolidBrush(new PdfRGBColor(Color.blue));
PdfStringFormat leftAlignment = new PdfStringFormat(PdfTextAlignment.Left, PdfVerticalAlignment.Middle);
page.getCanvas().drawString(text1, font, brush1, 50, 50, leftAlignment);
Dimension2D dimension = font.measureString(text1);
Rectangle2D.Float bounds = new Rectangle2D.Float(50, 50, (float) dimension.getWidth(), (float) dimension.getHeight());
int[] linePoints = new int[]{92, (int) (page.getSize().getHeight() - bounds.getY() - 60),
        (int) (92 + bounds.getWidth()), (int) (page.getSize().getHeight() - bounds.getY() - 60)};
PdfLineAnnotation annotation1 = new PdfLineAnnotation(linePoints, "LineArrow annotation test");
annotation1.setBeginLineStyle(PdfLineEndingStyle.OpenArrow);
annotation1.setEndLineStyle(PdfLineEndingStyle.OpenArrow);
annotation1.setBackColor(new PdfRGBColor(Color.red));
annotation1.setCaptionType(PdfLineCaptionType.Inline);
annotation1.setLineCaption(true);
((PdfNewPage) page).getAnnotations().add(annotation1);

//draw PolygonCloud
String text2 = "this is Cloud annotation";
PdfBrush brush2 = PdfBrushes.getBlue();
page.getCanvas().drawString(text2, font, brush2, 50, 200);
Point2D point2D[] = new Point2D[]{
        new Point2D.Float(30, 200),
        new Point2D.Float(300, 180),
        new Point2D.Float(300, 250),
        new Point2D.Float(30, 220),
        new Point2D.Float(30, 200)
};
PdfPolygonAnnotation annotation2 = new PdfPolygonAnnotation(page, point2D);
annotation2.setText("PolygonCloud annotation test");
annotation2.setAuthor("E-iceblue");
annotation2.setSubject("test");
annotation2.setModifiedDate(new Date());
annotation2.setBorderEffect(PdfBorderEffect.Big_Cloud);
annotation2.setLocation(new Point2D.Float(190, 230));
annotation2.setColor(new PdfRGBColor(Color.GRAY));
((PdfNewPage) page).getAnnotations().add(annotation2);

//draw circle
String text3 = "this is Circle annotation";
PdfBrush brush3 = PdfBrushes.getBlue();
Dimension2D dimension2D = font.measureString(text3);
dimension2D.setSize(dimension2D.getWidth() + 35, dimension2D.getHeight() + 20);
page.getCanvas().drawString(text3, font, brush3, 50, 300);
Rectangle2D.Float annotationBounds1 = new Rectangle2D.Float();
annotationBounds1.setFrame(new Point2D.Float(36, (float) 290), dimension2D);
PdfSquareAndCircleAnnotation annotation3 = new PdfSquareAndCircleAnnotation(annotationBounds1);
annotation3.setSubType(PdfSquareAndCircleAnnotationType.Circle);
float[] f1 = {0.5f, 0.5f, 0.5f, 0.5f};
annotation3.setRectangularDifferenceArray(f1);
annotation3.setText("Circle annotation test");
annotation3.setColor(new PdfRGBColor(Color.RED));
annotation3.setModifiedDate(new Date());
annotation3.setName("*****");
LineBorder border1 = new LineBorder();
border1.setBorderWidth(2);
annotation3.setLineBorder(border1);
((PdfNewPage) page).getAnnotations().add(annotation3);

//draw Square
String text4 = "this is Square annotation";
PdfBrush brush4 = PdfBrushes.getBlue();
Dimension2D dimension4 = font.measureString(text4);
dimension2D.setSize(dimension2D.getWidth() + 80, dimension2D.getHeight() + 20);
page.getCanvas().drawString(text4, font, brush4, 50, 400);
Rectangle2D.Float annotationBounds2 = new Rectangle2D.Float();
annotationBounds2.setFrame(new Point2D.Float(30, (float) 400), dimension4);
PdfSquareAndCircleAnnotation annotation4 = new PdfSquareAndCircleAnnotation(annotationBounds2);
annotation4.setSubType(PdfSquareAndCircleAnnotationType.Square);
float[] f2 = {0.5f, 0.5f, 0.5f, 0.5f};
annotation4.setRectangularDifferenceArray(f2);
annotation4.setText("Square annotation test");
annotation4.setColor(new PdfRGBColor(Color.RED));
annotation4.setModifiedDate(new Date());
annotation4.setName("*****");
LineBorder border2 = new LineBorder();
border2.setBorderWidth(2);
annotation4.setLineBorder(border2);
((PdfNewPage) page).getAnnotations().add(annotation4);


//draw connected lines
String text5 = "this is Connected lines annotation";
PdfBrush brush5 = PdfBrushes.getBlue();
page.getCanvas().drawString(text5, font, brush5, 50, 465);
Point2D pointzd[] = new Point2D[]{
        new Point2D.Float(30, 470),
        new Point2D.Float(300, 450),
        new Point2D.Float(300, 520),
        new Point2D.Float(30, 490),
        new Point2D.Float(30, 470)
};
PdfPolygonAnnotation annotation5 = new PdfPolygonAnnotation(page, pointzd);
annotation5.setText("Connected Lines annotation test");
annotation5.setAuthor("E-iceblue");
annotation5.setSubject("test");
annotation5.setModifiedDate(new Date());
annotation5.setBorderEffect(PdfBorderEffect.None);
annotation5.setLocation(new Point2D.Float(190, 230));
annotation5.setColor(new PdfRGBColor(Color.GRAY));
((PdfNewPage) page).getAnnotations().add(annotation5);

pdf.saveToFile("output/annotation.pdf");
New Feature SPIREPDF-3201 Adds the parameters "optimizingTextLine" and "optimizingGridText" to optimize the text format when extracting table text from PDF pages.
for (PdfPageBase page : (Iterable) doc.getPages()) {
    content.append(page.extractText(true,true,true));
}
Bug SPIREPDF-3189 Fixes the issue that the spaces were inconsistent with the source document when extracting text.
Bug SPIREPDF-3195 Fixes the issue that setting "setCertificated(true)" did not take effect.
Bug SPIREPDF-3199 Fixes the issue that there were extra blank lines when extacting table text.
Bug SPIREPDF-3211 Fixes the issue that the "File.delete()" method could not delete files after calling the "dispose()" method.
Bug SPIREPDF-3216 Optimizes the time spent when converting PDF to images.
Click the link to download Spire.PDF for Java 3.5.1: