News & Releases
|
|

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. |