fixing warnings in pdfbox layout, adding fonts, adding barcodes, adding images
This commit is contained in:
parent
139d43e6b4
commit
d434a9e4ee
71 changed files with 869 additions and 676 deletions
|
@ -1,10 +1,93 @@
|
||||||
|
import org.xbib.graphics.barcode.AustraliaPost;
|
||||||
|
import org.xbib.graphics.barcode.AztecCode;
|
||||||
|
import org.xbib.graphics.barcode.AztecRune;
|
||||||
|
import org.xbib.graphics.barcode.ChannelCode;
|
||||||
|
import org.xbib.graphics.barcode.Codabar;
|
||||||
|
import org.xbib.graphics.barcode.CodablockF;
|
||||||
|
import org.xbib.graphics.barcode.Code11;
|
||||||
|
import org.xbib.graphics.barcode.Code128;
|
||||||
|
import org.xbib.graphics.barcode.Code16k;
|
||||||
|
import org.xbib.graphics.barcode.Code2Of5;
|
||||||
|
import org.xbib.graphics.barcode.Code32;
|
||||||
import org.xbib.graphics.barcode.Code3Of9;
|
import org.xbib.graphics.barcode.Code3Of9;
|
||||||
|
import org.xbib.graphics.barcode.Code3Of9Extended;
|
||||||
|
import org.xbib.graphics.barcode.Code49;
|
||||||
|
import org.xbib.graphics.barcode.Code93;
|
||||||
|
import org.xbib.graphics.barcode.CodeOne;
|
||||||
|
import org.xbib.graphics.barcode.Composite;
|
||||||
|
import org.xbib.graphics.barcode.DataBar14;
|
||||||
|
import org.xbib.graphics.barcode.DataBarExpanded;
|
||||||
|
import org.xbib.graphics.barcode.DataBarLimited;
|
||||||
|
import org.xbib.graphics.barcode.DataMatrix;
|
||||||
|
import org.xbib.graphics.barcode.Ean;
|
||||||
|
import org.xbib.graphics.barcode.GridMatrix;
|
||||||
|
import org.xbib.graphics.barcode.JapanPost;
|
||||||
|
import org.xbib.graphics.barcode.KixCode;
|
||||||
|
import org.xbib.graphics.barcode.KoreaPost;
|
||||||
|
import org.xbib.graphics.barcode.Logmars;
|
||||||
|
import org.xbib.graphics.barcode.MaxiCode;
|
||||||
|
import org.xbib.graphics.barcode.MicroQrCode;
|
||||||
|
import org.xbib.graphics.barcode.MsiPlessey;
|
||||||
|
import org.xbib.graphics.barcode.Nve18;
|
||||||
|
import org.xbib.graphics.barcode.Pdf417;
|
||||||
|
import org.xbib.graphics.barcode.Pharmacode;
|
||||||
|
import org.xbib.graphics.barcode.Pharmacode2Track;
|
||||||
|
import org.xbib.graphics.barcode.Pharmazentralnummer;
|
||||||
|
import org.xbib.graphics.barcode.Postnet;
|
||||||
|
import org.xbib.graphics.barcode.QrCode;
|
||||||
|
import org.xbib.graphics.barcode.RoyalMail4State;
|
||||||
import org.xbib.graphics.barcode.SymbolProvider;
|
import org.xbib.graphics.barcode.SymbolProvider;
|
||||||
|
import org.xbib.graphics.barcode.Telepen;
|
||||||
|
import org.xbib.graphics.barcode.Upc;
|
||||||
|
import org.xbib.graphics.barcode.UspsOneCode;
|
||||||
|
import org.xbib.graphics.barcode.UspsPackage;
|
||||||
|
|
||||||
module org.xbib.graphics.barcode {
|
module org.xbib.graphics.barcode {
|
||||||
exports org.xbib.graphics.barcode;
|
exports org.xbib.graphics.barcode;
|
||||||
exports org.xbib.graphics.barcode.util;
|
exports org.xbib.graphics.barcode.util;
|
||||||
exports org.xbib.graphics.barcode.render;
|
exports org.xbib.graphics.barcode.render;
|
||||||
requires transitive java.desktop;
|
requires transitive java.desktop;
|
||||||
provides SymbolProvider with Code3Of9.Provider;
|
provides SymbolProvider with
|
||||||
|
AustraliaPost.Provider,
|
||||||
|
AztecCode.Provider,
|
||||||
|
AztecRune.Provider,
|
||||||
|
ChannelCode.Provider,
|
||||||
|
Codabar.Provider,
|
||||||
|
CodablockF.Provider,
|
||||||
|
Code2Of5.Provider,
|
||||||
|
Code3Of9.Provider,
|
||||||
|
Code3Of9Extended.Provider,
|
||||||
|
Code11.Provider,
|
||||||
|
Code16k.Provider,
|
||||||
|
Code32.Provider,
|
||||||
|
Code49.Provider,
|
||||||
|
Code93.Provider,
|
||||||
|
Code128.Provider,
|
||||||
|
CodeOne.Provider,
|
||||||
|
Composite.Provider,
|
||||||
|
DataBar14.Provider,
|
||||||
|
DataBarExpanded.Provider,
|
||||||
|
DataBarLimited.Provider,
|
||||||
|
DataMatrix.Provider,
|
||||||
|
Ean.Provider,
|
||||||
|
GridMatrix.Provider,
|
||||||
|
JapanPost.Provider,
|
||||||
|
KixCode.Provider,
|
||||||
|
KoreaPost.Provider,
|
||||||
|
Logmars.Provider,
|
||||||
|
MaxiCode.Provider,
|
||||||
|
MicroQrCode.Provider,
|
||||||
|
MsiPlessey.Provider,
|
||||||
|
Nve18.Provider,
|
||||||
|
Pdf417.Provider,
|
||||||
|
Pharmacode.Provider,
|
||||||
|
Pharmacode2Track.Provider,
|
||||||
|
Pharmazentralnummer.Provider,
|
||||||
|
Postnet.Provider,
|
||||||
|
QrCode.Provider,
|
||||||
|
RoyalMail4State.Provider,
|
||||||
|
Telepen.Provider,
|
||||||
|
Upc.Provider,
|
||||||
|
UspsOneCode.Provider,
|
||||||
|
UspsPackage.Provider;
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,3 +1,4 @@
|
||||||
dependencies {
|
dependencies {
|
||||||
api "org.apache.pdfbox:pdfbox:${project.property('pdfbox.version')}"
|
api project(':graphics-pdfbox')
|
||||||
|
api project(':graphics-barcode')
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,10 +1,12 @@
|
||||||
module org.xbib.graphics.layout.pdfbox {
|
module org.xbib.graphics.layout.pdfbox {
|
||||||
exports org.xbib.graphics.pdfbox.layout.elements;
|
exports org.xbib.graphics.pdfbox.layout.elements;
|
||||||
exports org.xbib.graphics.pdfbox.layout.elements.render;
|
exports org.xbib.graphics.pdfbox.layout.elements.render;
|
||||||
|
exports org.xbib.graphics.pdfbox.layout.font;
|
||||||
exports org.xbib.graphics.pdfbox.layout.shape;
|
exports org.xbib.graphics.pdfbox.layout.shape;
|
||||||
exports org.xbib.graphics.pdfbox.layout.text;
|
exports org.xbib.graphics.pdfbox.layout.text;
|
||||||
exports org.xbib.graphics.pdfbox.layout.text.annotations;
|
exports org.xbib.graphics.pdfbox.layout.text.annotations;
|
||||||
exports org.xbib.graphics.pdfbox.layout.util;
|
exports org.xbib.graphics.pdfbox.layout.util;
|
||||||
requires transitive org.apache.pdfbox;
|
requires transitive org.xbib.graphics.barcode;
|
||||||
|
requires transitive org.xbib.graphics.pdfbox;
|
||||||
requires transitive java.desktop;
|
requires transitive java.desktop;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,116 @@
|
||||||
|
package org.xbib.graphics.pdfbox.layout.elements;
|
||||||
|
|
||||||
|
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||||
|
import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
||||||
|
import org.apache.pdfbox.pdmodel.graphics.form.PDFormXObject;
|
||||||
|
import org.apache.pdfbox.util.Matrix;
|
||||||
|
import org.xbib.graphics.barcode.Symbol;
|
||||||
|
import org.xbib.graphics.barcode.render.BarcodeGraphicsRenderer;
|
||||||
|
import org.xbib.graphics.pdfbox.PdfBoxGraphics2D;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.text.DrawListener;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.text.Position;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.text.WidthRespecting;
|
||||||
|
import java.awt.Color;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class BarcodeElement implements Element, Drawable, Dividable, WidthRespecting {
|
||||||
|
|
||||||
|
private final Symbol symbol;
|
||||||
|
|
||||||
|
private float width;
|
||||||
|
|
||||||
|
private float height;
|
||||||
|
|
||||||
|
private float maxWidth = -1;
|
||||||
|
|
||||||
|
private Position absolutePosition;
|
||||||
|
|
||||||
|
public BarcodeElement(Symbol symbol) {
|
||||||
|
this.symbol = symbol;
|
||||||
|
this.width = symbol.getWidth();
|
||||||
|
this.height = symbol.getHeight();
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setScale(float scale) {
|
||||||
|
setWidth(width * scale);
|
||||||
|
setHeight(height * scale);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getWidth() throws IOException {
|
||||||
|
return width;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setWidth(float width) {
|
||||||
|
this.width = width;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getHeight() throws IOException {
|
||||||
|
return height;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void setHeight(float height) {
|
||||||
|
this.height = height;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Divided divide(float remainingHeight, float nextPageHeight)
|
||||||
|
throws IOException {
|
||||||
|
if (getHeight() <= nextPageHeight) {
|
||||||
|
return new Divided(new VerticalSpacer(remainingHeight), this);
|
||||||
|
}
|
||||||
|
return new Cutter(this).divide(remainingHeight, nextPageHeight);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public float getMaxWidth() {
|
||||||
|
return maxWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void setMaxWidth(float maxWidth) {
|
||||||
|
this.maxWidth = maxWidth;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Position getAbsolutePosition() {
|
||||||
|
return absolutePosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Sets the absolute position to render at.
|
||||||
|
*
|
||||||
|
* @param absolutePosition the absolute position.
|
||||||
|
*/
|
||||||
|
public void setAbsolutePosition(Position absolutePosition) {
|
||||||
|
this.absolutePosition = absolutePosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void draw(PDDocument pdDocument, PDPageContentStream contentStream,
|
||||||
|
Position upperLeft, DrawListener drawListener) throws IOException {
|
||||||
|
float x = upperLeft.getX();
|
||||||
|
float y = upperLeft.getY() - height;
|
||||||
|
PdfBoxGraphics2D pdfBoxGraphics2D = new PdfBoxGraphics2D(pdDocument, width, height);
|
||||||
|
BarcodeGraphicsRenderer renderer = new BarcodeGraphicsRenderer(pdfBoxGraphics2D, null, 1.0d,
|
||||||
|
Color.WHITE, Color.BLACK, false, false);
|
||||||
|
renderer.render(symbol);
|
||||||
|
renderer.close();
|
||||||
|
PDFormXObject xFormObject = pdfBoxGraphics2D.getXFormObject();
|
||||||
|
Matrix matrix = new Matrix();
|
||||||
|
matrix.translate(x, y);
|
||||||
|
contentStream.saveGraphicsState();
|
||||||
|
contentStream.transform(matrix);
|
||||||
|
contentStream.drawForm(xFormObject);
|
||||||
|
contentStream.restoreGraphicsState();
|
||||||
|
if (drawListener != null) {
|
||||||
|
drawListener.drawn(this, upperLeft, getWidth(), getHeight());
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public Drawable removeLeadingEmptyVerticalSpace() {
|
||||||
|
return this;
|
||||||
|
}
|
||||||
|
}
|
|
@ -18,7 +18,6 @@ import java.util.ArrayList;
|
||||||
import java.util.Iterator;
|
import java.util.Iterator;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.Map.Entry;
|
import java.util.Map.Entry;
|
||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* The central class for creating a document.
|
* The central class for creating a document.
|
||||||
|
@ -31,10 +30,13 @@ public class Document implements RenderListener {
|
||||||
public final static PageFormat DEFAULT_PAGE_FORMAT = new PageFormat();
|
public final static PageFormat DEFAULT_PAGE_FORMAT = new PageFormat();
|
||||||
|
|
||||||
private final List<Entry<Element, LayoutHint>> elements = new ArrayList<>();
|
private final List<Entry<Element, LayoutHint>> elements = new ArrayList<>();
|
||||||
private final List<Renderer> customRenderer = new CopyOnWriteArrayList<Renderer>();
|
|
||||||
private final List<RenderListener> renderListener = new CopyOnWriteArrayList<RenderListener>();
|
private final List<Renderer> customRenderer = new ArrayList<>();
|
||||||
|
|
||||||
|
private final List<RenderListener> renderListener = new ArrayList<>();
|
||||||
|
|
||||||
private PDDocument pdDocument;
|
private PDDocument pdDocument;
|
||||||
|
|
||||||
private final PageFormat pageFormat;
|
private final PageFormat pageFormat;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -60,36 +62,6 @@ public class Document implements RenderListener {
|
||||||
.build());
|
.build());
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a Document based on the given media box. By default, a
|
|
||||||
* {@link VerticalLayout} is used.
|
|
||||||
*
|
|
||||||
* @param mediaBox the media box to use.
|
|
||||||
* @deprecated use {@link #Document(PageFormat)} instead.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public Document(PDRectangle mediaBox) {
|
|
||||||
this(mediaBox, 0, 0, 0, 0);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a Document based on the given media box and margins. By default,
|
|
||||||
* a {@link VerticalLayout} is used.
|
|
||||||
*
|
|
||||||
* @param mediaBox the media box to use.
|
|
||||||
* @param marginLeft the left margin
|
|
||||||
* @param marginRight the right margin
|
|
||||||
* @param marginTop the top margin
|
|
||||||
* @param marginBottom the bottom margin
|
|
||||||
* @deprecated use {@link #Document(PageFormat)} instead.
|
|
||||||
*/
|
|
||||||
@Deprecated
|
|
||||||
public Document(PDRectangle mediaBox, float marginLeft, float marginRight,
|
|
||||||
float marginTop, float marginBottom) {
|
|
||||||
this(new PageFormat(mediaBox, Orientation.Portrait, marginLeft,
|
|
||||||
marginRight, marginTop, marginBottom));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a Document based on the given page format. By default, a
|
* Creates a Document based on the given page format. By default, a
|
||||||
* {@link VerticalLayout} is used.
|
* {@link VerticalLayout} is used.
|
||||||
|
|
|
@ -23,7 +23,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
*/
|
*/
|
||||||
public class Frame implements Element, Drawable, WidthRespecting, Dividable {
|
public class Frame implements Element, Drawable, WidthRespecting, Dividable {
|
||||||
|
|
||||||
private final List<Drawable> innerList = new CopyOnWriteArrayList<Drawable>();
|
private final List<Drawable> innerList = new CopyOnWriteArrayList<>();
|
||||||
|
|
||||||
private float paddingLeft;
|
private float paddingLeft;
|
||||||
private float paddingRight;
|
private float paddingRight;
|
||||||
|
|
|
@ -2,18 +2,15 @@ package org.xbib.graphics.pdfbox.layout.elements;
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.PDDocument;
|
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||||
import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
||||||
|
import org.apache.pdfbox.pdmodel.graphics.image.LosslessFactory;
|
||||||
|
import org.apache.pdfbox.pdmodel.graphics.image.PDImageXObject;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.DrawListener;
|
import org.xbib.graphics.pdfbox.layout.text.DrawListener;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Position;
|
import org.xbib.graphics.pdfbox.layout.text.Position;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.WidthRespecting;
|
import org.xbib.graphics.pdfbox.layout.text.WidthRespecting;
|
||||||
import org.xbib.graphics.pdfbox.layout.util.CompatibilityHelper;
|
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.File;
|
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.io.InputStream;
|
|
||||||
import javax.imageio.ImageIO;
|
|
||||||
|
|
||||||
public class ImageElement implements Element, Drawable, Dividable,
|
public class ImageElement implements Element, Drawable, Dividable, WidthRespecting {
|
||||||
WidthRespecting {
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Set this to {@link #setWidth(float)} resp. {@link #setHeight(float)}
|
* Set this to {@link #setWidth(float)} resp. {@link #setHeight(float)}
|
||||||
|
@ -22,23 +19,24 @@ public class ImageElement implements Element, Drawable, Dividable,
|
||||||
public final static float SCALE_TO_RESPECT_WIDTH = -1f;
|
public final static float SCALE_TO_RESPECT_WIDTH = -1f;
|
||||||
|
|
||||||
private final BufferedImage image;
|
private final BufferedImage image;
|
||||||
|
|
||||||
private float width;
|
private float width;
|
||||||
|
|
||||||
private float height;
|
private float height;
|
||||||
|
|
||||||
private float maxWidth = -1;
|
private float maxWidth = -1;
|
||||||
|
|
||||||
private Position absolutePosition;
|
private Position absolutePosition;
|
||||||
|
|
||||||
public ImageElement(final BufferedImage image) {
|
public ImageElement(BufferedImage image) {
|
||||||
this.image = image;
|
this.image = image;
|
||||||
this.width = image.getWidth();
|
this.width = image.getWidth();
|
||||||
this.height = image.getHeight();
|
this.height = image.getHeight();
|
||||||
}
|
}
|
||||||
|
|
||||||
public ImageElement(final InputStream inputStream) throws IOException {
|
public void setScale(float scale) {
|
||||||
this(ImageIO.read(inputStream));
|
setWidth(width * scale);
|
||||||
}
|
setHeight(height * scale);
|
||||||
|
|
||||||
public ImageElement(final String filePath) throws IOException {
|
|
||||||
this(ImageIO.read(new File(filePath)));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -123,8 +121,10 @@ public class ImageElement implements Element, Drawable, Dividable,
|
||||||
@Override
|
@Override
|
||||||
public void draw(PDDocument pdDocument, PDPageContentStream contentStream,
|
public void draw(PDDocument pdDocument, PDPageContentStream contentStream,
|
||||||
Position upperLeft, DrawListener drawListener) throws IOException {
|
Position upperLeft, DrawListener drawListener) throws IOException {
|
||||||
CompatibilityHelper.drawImage(image, pdDocument, contentStream,
|
float x = upperLeft.getX();
|
||||||
upperLeft, getWidth(), getHeight());
|
float y = upperLeft.getY() - height;
|
||||||
|
PDImageXObject imageXObject = LosslessFactory.createFromImage(pdDocument, image);
|
||||||
|
contentStream.drawImage(imageXObject, x, y, width, height);
|
||||||
if (drawListener != null) {
|
if (drawListener != null) {
|
||||||
drawListener.drawn(this, upperLeft, getWidth(), getHeight());
|
drawListener.drawn(this, upperLeft, getWidth(), getHeight());
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.elements;
|
package org.xbib.graphics.pdfbox.layout.elements;
|
||||||
|
|
||||||
|
|
||||||
public enum Orientation {
|
public enum Orientation {
|
||||||
|
|
||||||
Portrait, Landscape
|
PORTRAIT, LANDSCAPE
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,6 @@ package org.xbib.graphics.pdfbox.layout.elements;
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.common.PDRectangle;
|
import org.apache.pdfbox.pdmodel.common.PDRectangle;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayout;
|
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayout;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Constants;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Defines the size and orientation of a page. The default is A4 portrait
|
* Defines the size and orientation of a page. The default is A4 portrait
|
||||||
|
@ -10,19 +9,48 @@ import org.xbib.graphics.pdfbox.layout.text.Constants;
|
||||||
*/
|
*/
|
||||||
public class PageFormat implements Element {
|
public class PageFormat implements Element {
|
||||||
|
|
||||||
|
private static final int DEFAULT_USER_SPACE_UNIT_DPI = 72;
|
||||||
|
|
||||||
|
private static final float MM_TO_UNITS = 1 / (10 * 2.54f)
|
||||||
|
* DEFAULT_USER_SPACE_UNIT_DPI;
|
||||||
|
|
||||||
|
public static final PDRectangle A0 = new PDRectangle(841 * MM_TO_UNITS,
|
||||||
|
1189 * MM_TO_UNITS);
|
||||||
|
public static final PDRectangle A1 = new PDRectangle(594 * MM_TO_UNITS,
|
||||||
|
841 * MM_TO_UNITS);
|
||||||
|
public static final PDRectangle A2 = new PDRectangle(420 * MM_TO_UNITS,
|
||||||
|
594 * MM_TO_UNITS);
|
||||||
|
public static final PDRectangle A3 = new PDRectangle(297 * MM_TO_UNITS,
|
||||||
|
420 * MM_TO_UNITS);
|
||||||
|
public static final PDRectangle A4 = new PDRectangle(210 * MM_TO_UNITS,
|
||||||
|
297 * MM_TO_UNITS);
|
||||||
|
public static final PDRectangle A5 = new PDRectangle(148 * MM_TO_UNITS,
|
||||||
|
210 * MM_TO_UNITS);
|
||||||
|
public static final PDRectangle A6 = new PDRectangle(105 * MM_TO_UNITS,
|
||||||
|
148 * MM_TO_UNITS);
|
||||||
|
|
||||||
|
public static final PDRectangle Letter = new PDRectangle(215.9f * MM_TO_UNITS,
|
||||||
|
279.4f * MM_TO_UNITS);
|
||||||
|
|
||||||
private final float marginLeft;
|
private final float marginLeft;
|
||||||
|
|
||||||
private final float marginRight;
|
private final float marginRight;
|
||||||
|
|
||||||
private final float marginTop;
|
private final float marginTop;
|
||||||
|
|
||||||
private final float marginBottom;
|
private final float marginBottom;
|
||||||
|
|
||||||
private final PDRectangle mediaBox;
|
private final PDRectangle mediaBox;
|
||||||
|
|
||||||
private final Orientation orientation;
|
private final Orientation orientation;
|
||||||
|
|
||||||
private final int rotation;
|
private final int rotation;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a PageFormat with A4 portrait without margins.
|
* Creates a PageFormat with A4 portrait without margins.
|
||||||
*/
|
*/
|
||||||
public PageFormat() {
|
public PageFormat() {
|
||||||
this(Constants.A4);
|
this(A4);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -31,7 +59,7 @@ public class PageFormat implements Element {
|
||||||
* @param mediaBox the size.
|
* @param mediaBox the size.
|
||||||
*/
|
*/
|
||||||
public PageFormat(final PDRectangle mediaBox) {
|
public PageFormat(final PDRectangle mediaBox) {
|
||||||
this(mediaBox, Orientation.Portrait);
|
this(mediaBox, Orientation.PORTRAIT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -93,9 +121,9 @@ public class PageFormat implements Element {
|
||||||
return orientation;
|
return orientation;
|
||||||
}
|
}
|
||||||
if (getMediaBox().getWidth() > getMediaBox().getHeight()) {
|
if (getMediaBox().getWidth() > getMediaBox().getHeight()) {
|
||||||
return Orientation.Landscape;
|
return Orientation.LANDSCAPE;
|
||||||
}
|
}
|
||||||
return Orientation.Portrait;
|
return Orientation.PORTRAIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -153,7 +181,7 @@ public class PageFormat implements Element {
|
||||||
private float marginRight;
|
private float marginRight;
|
||||||
private float marginTop;
|
private float marginTop;
|
||||||
private float marginBottom;
|
private float marginBottom;
|
||||||
private PDRectangle mediaBox = Constants.A4;
|
private PDRectangle mediaBox = A4;
|
||||||
private Orientation orientation;
|
private Orientation orientation;
|
||||||
private int rotation;
|
private int rotation;
|
||||||
|
|
||||||
|
@ -244,82 +272,82 @@ public class PageFormat implements Element {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the media box to size {@link Constants#A0}.
|
* Sets the media box to size {@link #A0}.
|
||||||
*
|
*
|
||||||
* @return the builder.
|
* @return the builder.
|
||||||
*/
|
*/
|
||||||
public PageFormatBuilder A0() {
|
public PageFormatBuilder A0() {
|
||||||
this.mediaBox = Constants.A0;
|
this.mediaBox = A0;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the media box to size {@link Constants#A1}.
|
* Sets the media box to size {@link #A1}.
|
||||||
*
|
*
|
||||||
* @return the builder.
|
* @return the builder.
|
||||||
*/
|
*/
|
||||||
public PageFormatBuilder A1() {
|
public PageFormatBuilder A1() {
|
||||||
this.mediaBox = Constants.A1;
|
this.mediaBox = A1;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the media box to size {@link Constants#A2}.
|
* Sets the media box to size {@link #A2}.
|
||||||
*
|
*
|
||||||
* @return the builder.
|
* @return the builder.
|
||||||
*/
|
*/
|
||||||
public PageFormatBuilder A2() {
|
public PageFormatBuilder A2() {
|
||||||
this.mediaBox = Constants.A2;
|
this.mediaBox = A2;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the media box to size {@link Constants#A3}.
|
* Sets the media box to size {@link #A3}.
|
||||||
*
|
*
|
||||||
* @return the builder.
|
* @return the builder.
|
||||||
*/
|
*/
|
||||||
public PageFormatBuilder A3() {
|
public PageFormatBuilder A3() {
|
||||||
this.mediaBox = Constants.A3;
|
this.mediaBox = A3;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the media box to size {@link Constants#A4}.
|
* Sets the media box to size {@link #A4}.
|
||||||
*
|
*
|
||||||
* @return the builder.
|
* @return the builder.
|
||||||
*/
|
*/
|
||||||
public PageFormatBuilder A4() {
|
public PageFormatBuilder A4() {
|
||||||
this.mediaBox = Constants.A4;
|
this.mediaBox = A4;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the media box to size {@link Constants#A5}.
|
* Sets the media box to size {@link #A5}.
|
||||||
*
|
*
|
||||||
* @return the builder.
|
* @return the builder.
|
||||||
*/
|
*/
|
||||||
public PageFormatBuilder A5() {
|
public PageFormatBuilder A5() {
|
||||||
this.mediaBox = Constants.A5;
|
this.mediaBox = A5;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the media box to size {@link Constants#A6}.
|
* Sets the media box to size {@link #A6}.
|
||||||
*
|
*
|
||||||
* @return the builder.
|
* @return the builder.
|
||||||
*/
|
*/
|
||||||
public PageFormatBuilder A6() {
|
public PageFormatBuilder A6() {
|
||||||
this.mediaBox = Constants.A6;
|
this.mediaBox = A6;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the media box to size {@link Constants#Letter}.
|
* Sets the media box to size {@link #Letter}.
|
||||||
*
|
*
|
||||||
* @return the builder.
|
* @return the builder.
|
||||||
*/
|
*/
|
||||||
public PageFormatBuilder letter() {
|
public PageFormatBuilder letter() {
|
||||||
this.mediaBox = Constants.Letter;
|
this.mediaBox = Letter;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -335,22 +363,22 @@ public class PageFormat implements Element {
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the orientation to {@link Orientation#Portrait}.
|
* Sets the orientation to {@link Orientation#PORTRAIT}.
|
||||||
*
|
*
|
||||||
* @return the builder.
|
* @return the builder.
|
||||||
*/
|
*/
|
||||||
public PageFormatBuilder portrait() {
|
public PageFormatBuilder portrait() {
|
||||||
this.orientation = Orientation.Portrait;
|
this.orientation = Orientation.PORTRAIT;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Sets the orientation to {@link Orientation#Landscape}.
|
* Sets the orientation to {@link Orientation#LANDSCAPE}.
|
||||||
*
|
*
|
||||||
* @return the builder.
|
* @return the builder.
|
||||||
*/
|
*/
|
||||||
public PageFormatBuilder landscape() {
|
public PageFormatBuilder landscape() {
|
||||||
this.orientation = Orientation.Landscape;
|
this.orientation = Orientation.LANDSCAPE;
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,12 @@
|
||||||
|
package org.xbib.graphics.pdfbox.layout.elements;
|
||||||
|
|
||||||
|
public interface PageFormats {
|
||||||
|
|
||||||
|
PageFormat A4_PORTRAIT = new PageFormat();
|
||||||
|
|
||||||
|
PageFormat A4_LANDSCAPE = new PageFormat(PageFormat.A4, Orientation.LANDSCAPE);
|
||||||
|
|
||||||
|
PageFormat A5_PORTRAIT = new PageFormat(PageFormat.A5, Orientation.PORTRAIT);
|
||||||
|
|
||||||
|
PageFormat A5_LANDSCAPE = new PageFormat(PageFormat.A5, Orientation.LANDSCAPE);
|
||||||
|
}
|
|
@ -16,11 +16,11 @@ import java.io.IOException;
|
||||||
* alignment}, and {@link WidthRespecting respects a given width} by applying
|
* alignment}, and {@link WidthRespecting respects a given width} by applying
|
||||||
* word-wrap.
|
* word-wrap.
|
||||||
*/
|
*/
|
||||||
public class Paragraph extends TextFlow implements Drawable, Element,
|
public class Paragraph extends TextFlow implements Drawable, Element, WidthRespecting, Dividable {
|
||||||
WidthRespecting, Dividable {
|
|
||||||
|
|
||||||
private Position absolutePosition;
|
private Position absolutePosition;
|
||||||
private Alignment alignment = Alignment.Left;
|
|
||||||
|
private Alignment alignment = Alignment.LEFT;
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Position getAbsolutePosition() {
|
public Position getAbsolutePosition() {
|
||||||
|
|
|
@ -9,14 +9,14 @@ import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
||||||
public class ColumnLayoutHint extends VerticalLayoutHint {
|
public class ColumnLayoutHint extends VerticalLayoutHint {
|
||||||
|
|
||||||
public final static ColumnLayoutHint LEFT = new ColumnLayoutHint(
|
public final static ColumnLayoutHint LEFT = new ColumnLayoutHint(
|
||||||
Alignment.Left);
|
Alignment.LEFT);
|
||||||
public final static ColumnLayoutHint CENTER = new ColumnLayoutHint(
|
public final static ColumnLayoutHint CENTER = new ColumnLayoutHint(
|
||||||
Alignment.Center);
|
Alignment.CENTER);
|
||||||
public final static ColumnLayoutHint RIGHT = new ColumnLayoutHint(
|
public final static ColumnLayoutHint RIGHT = new ColumnLayoutHint(
|
||||||
Alignment.Right);
|
Alignment.RIGHT);
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a layout hint with {@link Alignment#Left left alignment}.
|
* Creates a layout hint with {@link Alignment#LEFT left alignment}.
|
||||||
*/
|
*/
|
||||||
public ColumnLayoutHint() {
|
public ColumnLayoutHint() {
|
||||||
super();
|
super();
|
||||||
|
|
|
@ -28,16 +28,25 @@ import java.io.IOException;
|
||||||
public class RenderContext implements Renderer, Closeable, DrawContext, DrawListener {
|
public class RenderContext implements Renderer, Closeable, DrawContext, DrawListener {
|
||||||
|
|
||||||
private final Document document;
|
private final Document document;
|
||||||
|
|
||||||
private final PDDocument pdDocument;
|
private final PDDocument pdDocument;
|
||||||
|
|
||||||
private PDPage page;
|
private PDPage page;
|
||||||
|
|
||||||
private int pageIndex = 0;
|
private int pageIndex = 0;
|
||||||
|
|
||||||
private PDPageContentStream contentStream;
|
private PDPageContentStream contentStream;
|
||||||
|
|
||||||
private Position currentPosition;
|
private Position currentPosition;
|
||||||
|
|
||||||
private Position markedPosition;
|
private Position markedPosition;
|
||||||
|
|
||||||
private Position maxPositionOnPage;
|
private Position maxPositionOnPage;
|
||||||
|
|
||||||
private Layout layout = new VerticalLayout();
|
private Layout layout = new VerticalLayout();
|
||||||
|
|
||||||
private PageFormat nextPageFormat;
|
private PageFormat nextPageFormat;
|
||||||
|
|
||||||
private PageFormat pageFormat;
|
private PageFormat pageFormat;
|
||||||
|
|
||||||
private final AnnotationDrawListener annotationDrawListener;
|
private final AnnotationDrawListener annotationDrawListener;
|
||||||
|
@ -49,8 +58,7 @@ public class RenderContext implements Renderer, Closeable, DrawContext, DrawList
|
||||||
* @param pdDocument the underlying pdfbox document.
|
* @param pdDocument the underlying pdfbox document.
|
||||||
* @throws IOException by pdfbox.
|
* @throws IOException by pdfbox.
|
||||||
*/
|
*/
|
||||||
public RenderContext(Document document, PDDocument pdDocument)
|
public RenderContext(Document document, PDDocument pdDocument) throws IOException {
|
||||||
throws IOException {
|
|
||||||
this.document = document;
|
this.document = document;
|
||||||
this.pdDocument = pdDocument;
|
this.pdDocument = pdDocument;
|
||||||
this.pageFormat = document.getPageFormat();
|
this.pageFormat = document.getPageFormat();
|
||||||
|
@ -187,9 +195,9 @@ public class RenderContext implements Renderer, Closeable, DrawContext, DrawList
|
||||||
*/
|
*/
|
||||||
protected Orientation getPageOrientation() {
|
protected Orientation getPageOrientation() {
|
||||||
if (getPageWidth() > getPageHeight()) {
|
if (getPageWidth() > getPageHeight()) {
|
||||||
return Orientation.Landscape;
|
return Orientation.LANDSCAPE;
|
||||||
}
|
}
|
||||||
return Orientation.Portrait;
|
return Orientation.PORTRAIT;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -328,21 +336,22 @@ public class RenderContext implements Renderer, Closeable, DrawContext, DrawList
|
||||||
if (positionControl instanceof SetPosition) {
|
if (positionControl instanceof SetPosition) {
|
||||||
SetPosition setPosition = (SetPosition) positionControl;
|
SetPosition setPosition = (SetPosition) positionControl;
|
||||||
Float x = setPosition.getX();
|
Float x = setPosition.getX();
|
||||||
if (x == PositionControl.MARKED_POSITION) {
|
|
||||||
x = getMarkedPosition().getX();
|
|
||||||
}
|
|
||||||
if (x == null) {
|
if (x == null) {
|
||||||
x = getCurrentPosition().getX();
|
x = getCurrentPosition().getX();
|
||||||
|
} else {
|
||||||
|
if (x.equals(PositionControl.MARKED_POSITION)) {
|
||||||
|
x = getMarkedPosition().getX();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
Float y = setPosition.getY();
|
Float y = setPosition.getY();
|
||||||
if (y == PositionControl.MARKED_POSITION) {
|
|
||||||
y = getMarkedPosition().getY();
|
|
||||||
}
|
|
||||||
if (y == null) {
|
if (y == null) {
|
||||||
y = getCurrentPosition().getY();
|
y = getCurrentPosition().getY();
|
||||||
|
} else {
|
||||||
|
if (y.equals(PositionControl.MARKED_POSITION)) {
|
||||||
|
y = getMarkedPosition().getY();
|
||||||
}
|
}
|
||||||
Position newPosition = new Position(x, y);
|
}
|
||||||
currentPosition = newPosition;
|
currentPosition = new Position(x, y);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
if (positionControl instanceof MovePosition) {
|
if (positionControl instanceof MovePosition) {
|
||||||
|
@ -379,12 +388,9 @@ public class RenderContext implements Renderer, Closeable, DrawContext, DrawList
|
||||||
page.setRotation(90);
|
page.setRotation(90);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (isPageTilted()) {
|
if (isPageTilted()) {
|
||||||
CompatibilityHelper.transform(contentStream, 0, 1, -1, 0,
|
CompatibilityHelper.transform(contentStream, 0, 1, -1, 0, getPageHeight(), 0);
|
||||||
getPageHeight(), 0);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
resetPositionToUpperLeft();
|
resetPositionToUpperLeft();
|
||||||
resetMaxPositionOnPage();
|
resetMaxPositionOnPage();
|
||||||
document.beforePage(this);
|
document.beforePage(this);
|
||||||
|
|
|
@ -234,11 +234,11 @@ public class VerticalLayout implements Layout {
|
||||||
float horizontalExtraSpace = getTargetWidth(renderContext)
|
float horizontalExtraSpace = getTargetWidth(renderContext)
|
||||||
- drawable.getWidth();
|
- drawable.getWidth();
|
||||||
switch (alignment) {
|
switch (alignment) {
|
||||||
case Right:
|
case RIGHT:
|
||||||
offsetX = horizontalExtraSpace
|
offsetX = horizontalExtraSpace
|
||||||
- verticalLayoutHint.getMarginRight();
|
- verticalLayoutHint.getMarginRight();
|
||||||
break;
|
break;
|
||||||
case Center:
|
case CENTER:
|
||||||
offsetX = horizontalExtraSpace / 2f;
|
offsetX = horizontalExtraSpace / 2f;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -14,11 +14,13 @@ import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
||||||
public class VerticalLayoutHint implements LayoutHint {
|
public class VerticalLayoutHint implements LayoutHint {
|
||||||
|
|
||||||
public final static VerticalLayoutHint LEFT = new VerticalLayoutHint(
|
public final static VerticalLayoutHint LEFT = new VerticalLayoutHint(
|
||||||
Alignment.Left);
|
Alignment.LEFT);
|
||||||
|
|
||||||
public final static VerticalLayoutHint CENTER = new VerticalLayoutHint(
|
public final static VerticalLayoutHint CENTER = new VerticalLayoutHint(
|
||||||
Alignment.Center);
|
Alignment.CENTER);
|
||||||
|
|
||||||
public final static VerticalLayoutHint RIGHT = new VerticalLayoutHint(
|
public final static VerticalLayoutHint RIGHT = new VerticalLayoutHint(
|
||||||
Alignment.Right);
|
Alignment.RIGHT);
|
||||||
|
|
||||||
private final Alignment alignment;
|
private final Alignment alignment;
|
||||||
private final float marginLeft;
|
private final float marginLeft;
|
||||||
|
@ -28,10 +30,10 @@ public class VerticalLayoutHint implements LayoutHint {
|
||||||
private final boolean resetY;
|
private final boolean resetY;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a layout hint with {@link Alignment#Left left alignment}.
|
* Creates a layout hint with {@link Alignment#LEFT left alignment}.
|
||||||
*/
|
*/
|
||||||
public VerticalLayoutHint() {
|
public VerticalLayoutHint() {
|
||||||
this(Alignment.Left);
|
this(Alignment.LEFT);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -124,7 +126,7 @@ public class VerticalLayoutHint implements LayoutHint {
|
||||||
* {@link VerticalLayoutHint} using a fluent API.
|
* {@link VerticalLayoutHint} using a fluent API.
|
||||||
*/
|
*/
|
||||||
public static class VerticalLayoutHintBuilder {
|
public static class VerticalLayoutHintBuilder {
|
||||||
protected Alignment alignment = Alignment.Left;
|
protected Alignment alignment = Alignment.LEFT;
|
||||||
protected float marginLeft = 0;
|
protected float marginLeft = 0;
|
||||||
protected float marginRight = 0;
|
protected float marginRight = 0;
|
||||||
protected float marginTop = 0;
|
protected float marginTop = 0;
|
||||||
|
|
|
@ -1,4 +1,4 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.text;
|
package org.xbib.graphics.pdfbox.layout.font;
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.font.PDFont;
|
import org.apache.pdfbox.pdmodel.font.PDFont;
|
||||||
import org.apache.pdfbox.pdmodel.font.PDType1Font;
|
import org.apache.pdfbox.pdmodel.font.PDType1Font;
|
||||||
|
@ -8,21 +8,24 @@ import org.apache.pdfbox.pdmodel.font.PDType1Font;
|
||||||
* plain/italic/bold/bold-italic variants of the three standard font types
|
* plain/italic/bold/bold-italic variants of the three standard font types
|
||||||
* {@link PDType1Font#TIMES_ROMAN Times},{@link PDType1Font#COURIER Courier} and
|
* {@link PDType1Font#TIMES_ROMAN Times},{@link PDType1Font#COURIER Courier} and
|
||||||
* {@link PDType1Font#HELVETICA Helveticy}.
|
* {@link PDType1Font#HELVETICA Helveticy}.
|
||||||
*
|
|
||||||
* @author Ralf
|
|
||||||
*/
|
*/
|
||||||
public enum BaseFont {
|
public enum BaseFont implements Font {
|
||||||
|
|
||||||
Times(PDType1Font.TIMES_ROMAN, PDType1Font.TIMES_BOLD,
|
TIMES(PDType1Font.TIMES_ROMAN, PDType1Font.TIMES_BOLD,
|
||||||
PDType1Font.TIMES_ITALIC, PDType1Font.TIMES_BOLD_ITALIC), //
|
PDType1Font.TIMES_ITALIC, PDType1Font.TIMES_BOLD_ITALIC), //
|
||||||
Courier(PDType1Font.COURIER, PDType1Font.COURIER_BOLD,
|
|
||||||
|
COURIER(PDType1Font.COURIER, PDType1Font.COURIER_BOLD,
|
||||||
PDType1Font.COURIER_OBLIQUE, PDType1Font.COURIER_BOLD_OBLIQUE), //
|
PDType1Font.COURIER_OBLIQUE, PDType1Font.COURIER_BOLD_OBLIQUE), //
|
||||||
Helvetica(PDType1Font.HELVETICA, PDType1Font.HELVETICA_BOLD,
|
|
||||||
|
HELVETICA(PDType1Font.HELVETICA, PDType1Font.HELVETICA_BOLD,
|
||||||
PDType1Font.HELVETICA_OBLIQUE, PDType1Font.HELVETICA_BOLD_OBLIQUE);
|
PDType1Font.HELVETICA_OBLIQUE, PDType1Font.HELVETICA_BOLD_OBLIQUE);
|
||||||
|
|
||||||
private final PDFont plainFont;
|
private final PDFont plainFont;
|
||||||
|
|
||||||
private final PDFont boldFont;
|
private final PDFont boldFont;
|
||||||
|
|
||||||
private final PDFont italicFont;
|
private final PDFont italicFont;
|
||||||
|
|
||||||
private final PDFont boldItalicFont;
|
private final PDFont boldItalicFont;
|
||||||
|
|
||||||
BaseFont(PDFont plainFont, PDFont boldFont, PDFont italicFont,
|
BaseFont(PDFont plainFont, PDFont boldFont, PDFont italicFont,
|
||||||
|
@ -33,18 +36,22 @@ public enum BaseFont {
|
||||||
this.boldItalicFont = boldItalicFont;
|
this.boldItalicFont = boldItalicFont;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public PDFont getPlainFont() {
|
public PDFont getPlainFont() {
|
||||||
return plainFont;
|
return plainFont;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public PDFont getBoldFont() {
|
public PDFont getBoldFont() {
|
||||||
return boldFont;
|
return boldFont;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public PDFont getItalicFont() {
|
public PDFont getItalicFont() {
|
||||||
return italicFont;
|
return italicFont;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
public PDFont getBoldItalicFont() {
|
public PDFont getBoldItalicFont() {
|
||||||
return boldItalicFont;
|
return boldItalicFont;
|
||||||
}
|
}
|
|
@ -0,0 +1,14 @@
|
||||||
|
package org.xbib.graphics.pdfbox.layout.font;
|
||||||
|
|
||||||
|
import org.apache.pdfbox.pdmodel.font.PDFont;
|
||||||
|
|
||||||
|
public interface Font {
|
||||||
|
|
||||||
|
PDFont getPlainFont();
|
||||||
|
|
||||||
|
PDFont getBoldFont();
|
||||||
|
|
||||||
|
PDFont getItalicFont();
|
||||||
|
|
||||||
|
PDFont getBoldItalicFont();
|
||||||
|
}
|
|
@ -1,4 +1,4 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.text;
|
package org.xbib.graphics.pdfbox.layout.font;
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.font.PDFont;
|
import org.apache.pdfbox.pdmodel.font.PDFont;
|
||||||
|
|
|
@ -0,0 +1,47 @@
|
||||||
|
package org.xbib.graphics.pdfbox.layout.font;
|
||||||
|
|
||||||
|
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||||
|
import org.apache.pdfbox.pdmodel.font.PDFont;
|
||||||
|
import org.apache.pdfbox.pdmodel.font.PDType0Font;
|
||||||
|
import java.io.IOException;
|
||||||
|
import java.util.Objects;
|
||||||
|
|
||||||
|
public class NotoSansFont implements Font {
|
||||||
|
|
||||||
|
private static PDType0Font regular;
|
||||||
|
|
||||||
|
private static PDType0Font bold;
|
||||||
|
|
||||||
|
private static PDType0Font italic;
|
||||||
|
|
||||||
|
private static PDType0Font bolditalic;
|
||||||
|
|
||||||
|
public NotoSansFont(PDDocument document) throws IOException {
|
||||||
|
if (regular == null) {
|
||||||
|
regular = PDType0Font.load(document, Objects.requireNonNull(getClass().getResourceAsStream("NotoSans-Regular.ttf")));
|
||||||
|
bold = PDType0Font.load(document, Objects.requireNonNull(getClass().getResourceAsStream("NotoSans-Bold.ttf")));
|
||||||
|
italic = PDType0Font.load(document, Objects.requireNonNull(getClass().getResourceAsStream("NotoSans-Italic.ttf")));
|
||||||
|
bolditalic = PDType0Font.load(document, Objects.requireNonNull(getClass().getResourceAsStream("NotoSans-BoldItalic.ttf")));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PDFont getPlainFont() {
|
||||||
|
return regular;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PDFont getBoldFont() {
|
||||||
|
return bold;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PDFont getItalicFont() {
|
||||||
|
return italic;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public PDFont getBoldItalicFont() {
|
||||||
|
return bolditalic;
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,9 +1,12 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.text;
|
package org.xbib.graphics.pdfbox.layout.text;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Enumeration for (vertical) alignment.
|
* Enumeration for alignment.
|
||||||
*/
|
*/
|
||||||
public enum Alignment {
|
public enum Alignment {
|
||||||
|
|
||||||
Left, Center, Right, Justify
|
LEFT,
|
||||||
|
CENTER,
|
||||||
|
RIGHT,
|
||||||
|
JUSTIFY
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,28 +0,0 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.text;
|
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.common.PDRectangle;
|
|
||||||
|
|
||||||
public class Constants {
|
|
||||||
|
|
||||||
private static final int DEFAULT_USER_SPACE_UNIT_DPI = 72;
|
|
||||||
private static final float MM_TO_UNITS = 1 / (10 * 2.54f)
|
|
||||||
* DEFAULT_USER_SPACE_UNIT_DPI;
|
|
||||||
|
|
||||||
public static final PDRectangle A0 = new PDRectangle(841 * MM_TO_UNITS,
|
|
||||||
1189 * MM_TO_UNITS);
|
|
||||||
public static final PDRectangle A1 = new PDRectangle(594 * MM_TO_UNITS,
|
|
||||||
841 * MM_TO_UNITS);
|
|
||||||
public static final PDRectangle A2 = new PDRectangle(420 * MM_TO_UNITS,
|
|
||||||
594 * MM_TO_UNITS);
|
|
||||||
public static final PDRectangle A3 = new PDRectangle(297 * MM_TO_UNITS,
|
|
||||||
420 * MM_TO_UNITS);
|
|
||||||
public static final PDRectangle A4 = new PDRectangle(210 * MM_TO_UNITS,
|
|
||||||
297 * MM_TO_UNITS);
|
|
||||||
public static final PDRectangle A5 = new PDRectangle(148 * MM_TO_UNITS,
|
|
||||||
210 * MM_TO_UNITS);
|
|
||||||
public static final PDRectangle A6 = new PDRectangle(105 * MM_TO_UNITS,
|
|
||||||
148 * MM_TO_UNITS);
|
|
||||||
|
|
||||||
public static final PDRectangle Letter = new PDRectangle(215.9f * MM_TO_UNITS,
|
|
||||||
279.4f * MM_TO_UNITS);
|
|
||||||
}
|
|
|
@ -10,10 +10,11 @@ import java.util.regex.Pattern;
|
||||||
public class ControlCharacter implements CharSequence {
|
public class ControlCharacter implements CharSequence {
|
||||||
|
|
||||||
private final String description;
|
private final String description;
|
||||||
|
|
||||||
private final String charaterToEscape;
|
private final String charaterToEscape;
|
||||||
|
|
||||||
protected ControlCharacter(final String description,
|
protected ControlCharacter(String description,
|
||||||
final String charaterToEscape) {
|
String charaterToEscape) {
|
||||||
this.description = description;
|
this.description = description;
|
||||||
this.charaterToEscape = charaterToEscape;
|
this.charaterToEscape = charaterToEscape;
|
||||||
}
|
}
|
||||||
|
|
|
@ -179,8 +179,7 @@ public class ControlCharacters {
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
private static class ColorControlCharacterFactory implements
|
private static class ColorControlCharacterFactory implements ControlCharacterFactory {
|
||||||
ControlCharacterFactory {
|
|
||||||
|
|
||||||
private final static Pattern PATTERN = Pattern
|
private final static Pattern PATTERN = Pattern
|
||||||
.compile("(?<!\\\\)(\\\\\\\\)*\\{color:#(\\p{XDigit}{6})\\}");
|
.compile("(?<!\\\\)(\\\\\\\\)*\\{color:#(\\p{XDigit}{6})\\}");
|
||||||
|
@ -279,5 +278,4 @@ public class ControlCharacters {
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.text;
|
package org.xbib.graphics.pdfbox.layout.text;
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.font.PDType1Font;
|
import org.apache.pdfbox.pdmodel.font.PDType1Font;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.font.FontDescriptor;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.text;
|
package org.xbib.graphics.pdfbox.layout.text;
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Called if an object has been drawn.
|
* Called if an object has been drawn.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.text;
|
package org.xbib.graphics.pdfbox.layout.text;
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.font.PDFont;
|
import org.apache.pdfbox.pdmodel.font.PDFont;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.font.FontDescriptor;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@ -14,9 +15,8 @@ public class Indent extends ControlFragment {
|
||||||
*/
|
*/
|
||||||
public final static Indent UNINDENT = new Indent(0);
|
public final static Indent UNINDENT = new Indent(0);
|
||||||
|
|
||||||
protected float indentWidth = 4;
|
protected Alignment alignment = Alignment.LEFT;
|
||||||
protected SpaceUnit indentUnit = SpaceUnit.em;
|
|
||||||
protected Alignment alignment = Alignment.Left;
|
|
||||||
protected StyledText styledText;
|
protected StyledText styledText;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -29,7 +29,7 @@ public class Indent extends ControlFragment {
|
||||||
public Indent(final float indentWidth, final SpaceUnit indentUnit)
|
public Indent(final float indentWidth, final SpaceUnit indentUnit)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
this("", indentWidth, indentUnit, DEFAULT_FONT_DESCRIPTOR,
|
this("", indentWidth, indentUnit, DEFAULT_FONT_DESCRIPTOR,
|
||||||
Alignment.Left, Color.black);
|
Alignment.LEFT, Color.black);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -48,7 +48,7 @@ public class Indent extends ControlFragment {
|
||||||
final SpaceUnit indentUnit, final float fontSize, final PDFont font)
|
final SpaceUnit indentUnit, final float fontSize, final PDFont font)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
|
|
||||||
this(label, indentWidth, indentUnit, fontSize, font, Alignment.Left,
|
this(label, indentWidth, indentUnit, fontSize, font, Alignment.LEFT,
|
||||||
Color.black);
|
Color.black);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -120,10 +120,10 @@ public class Indent extends ControlFragment {
|
||||||
float marginRight = 0;
|
float marginRight = 0;
|
||||||
if (textWidth < indent) {
|
if (textWidth < indent) {
|
||||||
switch (alignment) {
|
switch (alignment) {
|
||||||
case Left:
|
case LEFT:
|
||||||
marginRight = indent - textWidth;
|
marginRight = indent - textWidth;
|
||||||
break;
|
break;
|
||||||
case Right:
|
case RIGHT:
|
||||||
marginLeft = indent - textWidth;
|
marginLeft = indent - textWidth;
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
|
|
|
@ -87,7 +87,7 @@ public class IndentCharacters {
|
||||||
public Indent createNewIndent(final float fontSize, final PDFont font,
|
public Indent createNewIndent(final float fontSize, final PDFont font,
|
||||||
final Color color) throws IOException {
|
final Color color) throws IOException {
|
||||||
return new Indent(nextLabel(), level * indentWidth, indentUnit,
|
return new Indent(nextLabel(), level * indentWidth, indentUnit,
|
||||||
fontSize, font, Alignment.Right, color);
|
fontSize, font, Alignment.RIGHT, color);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.text;
|
package org.xbib.graphics.pdfbox.layout.text;
|
||||||
|
|
||||||
|
import org.xbib.graphics.pdfbox.layout.font.FontDescriptor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Control fragment that represents a new line in text. It has a (font and)
|
* Control fragment that represents a new line in text. It has a (font and)
|
||||||
* height in order to specify the height of an empty line.
|
* height in order to specify the height of an empty line.
|
||||||
|
|
|
@ -1,5 +1,7 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.text;
|
package org.xbib.graphics.pdfbox.layout.text;
|
||||||
|
|
||||||
|
import org.xbib.graphics.pdfbox.layout.font.FontDescriptor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Acts as a replacement for whitespace that has been removed by word wrapping.
|
* Acts as a replacement for whitespace that has been removed by word wrapping.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.text;
|
package org.xbib.graphics.pdfbox.layout.text;
|
||||||
|
|
||||||
|
import org.xbib.graphics.pdfbox.layout.font.FontDescriptor;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.text;
|
package org.xbib.graphics.pdfbox.layout.text;
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.font.PDFont;
|
import org.apache.pdfbox.pdmodel.font.PDFont;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.font.FontDescriptor;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
|
@ -10,10 +11,15 @@ import java.io.IOException;
|
||||||
public class StyledText implements TextFragment {
|
public class StyledText implements TextFragment {
|
||||||
|
|
||||||
private final String text;
|
private final String text;
|
||||||
|
|
||||||
private final FontDescriptor fontDescriptor;
|
private final FontDescriptor fontDescriptor;
|
||||||
|
|
||||||
private final Color color;
|
private final Color color;
|
||||||
|
|
||||||
private final float leftMargin;
|
private final float leftMargin;
|
||||||
|
|
||||||
private final float rightMargin;
|
private final float rightMargin;
|
||||||
|
|
||||||
private final float baselineOffset;
|
private final float baselineOffset;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.text;
|
package org.xbib.graphics.pdfbox.layout.text;
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
||||||
import org.apache.pdfbox.pdmodel.font.PDFont;
|
import org.xbib.graphics.pdfbox.layout.font.Font;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.HashMap;
|
import java.util.HashMap;
|
||||||
|
@ -13,7 +13,7 @@ import java.util.Map;
|
||||||
* A text flow is a text sequence that {@link WidthRespecting respects a given
|
* A text flow is a text sequence that {@link WidthRespecting respects a given
|
||||||
* width} by word wrapping the text. The text may contain line breaks ('\n').<br>
|
* width} by word wrapping the text. The text may contain line breaks ('\n').<br>
|
||||||
* In order to ease creation of styled text, this class supports a kind of
|
* In order to ease creation of styled text, this class supports a kind of
|
||||||
* {@link #addMarkup(String, float, BaseFont) markup}. The following raw text
|
* {@link #addMarkup(String, float, Font) markup}. The following raw text
|
||||||
*
|
*
|
||||||
* <pre>
|
* <pre>
|
||||||
* Markup supports *bold*, _italic_, and *even _mixed* markup_.
|
* Markup supports *bold*, _italic_, and *even _mixed* markup_.
|
||||||
|
@ -40,14 +40,19 @@ import java.util.Map;
|
||||||
public class TextFlow implements TextSequence, WidthRespecting {
|
public class TextFlow implements TextSequence, WidthRespecting {
|
||||||
|
|
||||||
public static final float DEFAULT_LINE_SPACING = 1.2f;
|
public static final float DEFAULT_LINE_SPACING = 1.2f;
|
||||||
|
|
||||||
private static final String HEIGHT = "height";
|
private static final String HEIGHT = "height";
|
||||||
|
|
||||||
private static final String WIDTH = "width";
|
private static final String WIDTH = "width";
|
||||||
|
|
||||||
private final Map<String, Object> cache = new HashMap<String, Object>();
|
private final Map<String, Object> cache = new HashMap<>();
|
||||||
|
|
||||||
|
private final List<TextFragment> text = new ArrayList<>();
|
||||||
|
|
||||||
private final List<TextFragment> text = new ArrayList<TextFragment>();
|
|
||||||
private float lineSpacing = DEFAULT_LINE_SPACING;
|
private float lineSpacing = DEFAULT_LINE_SPACING;
|
||||||
|
|
||||||
private float maxWidth = -1;
|
private float maxWidth = -1;
|
||||||
|
|
||||||
private boolean applyLineSpacingToFirstLine = true;
|
private boolean applyLineSpacingToFirstLine = true;
|
||||||
|
|
||||||
private void clearCache() {
|
private void clearCache() {
|
||||||
|
@ -63,17 +68,8 @@ public class TextFlow implements TextSequence, WidthRespecting {
|
||||||
return (T) cache.get(key);
|
return (T) cache.get(key);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds some text associated with the font to draw. The text may contain
|
|
||||||
* line breaks ('\n').
|
|
||||||
*
|
|
||||||
* @param text the text to add.
|
|
||||||
* @param fontSize the size of the font.
|
|
||||||
* @param font the font to use to draw the text.
|
|
||||||
* @throws IOException by PDFBox
|
|
||||||
*/
|
|
||||||
public void addText(final String text, final float fontSize,
|
public void addText(final String text, final float fontSize,
|
||||||
final PDFont font) throws IOException {
|
final Font font) throws IOException {
|
||||||
add(TextFlowUtil.createTextFlow(text, fontSize, font));
|
add(TextFlowUtil.createTextFlow(text, fontSize, font));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -87,28 +83,10 @@ public class TextFlow implements TextSequence, WidthRespecting {
|
||||||
* @throws IOException by PDFBox
|
* @throws IOException by PDFBox
|
||||||
*/
|
*/
|
||||||
public void addMarkup(final String markup, final float fontSize,
|
public void addMarkup(final String markup, final float fontSize,
|
||||||
final BaseFont baseFont) throws IOException {
|
final Font baseFont) throws IOException {
|
||||||
add(TextFlowUtil.createTextFlowFromMarkup(markup, fontSize, baseFont));
|
add(TextFlowUtil.createTextFlowFromMarkup(markup, fontSize, baseFont));
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Adds some markup to the text flow.
|
|
||||||
*
|
|
||||||
* @param markup the markup to add.
|
|
||||||
* @param fontSize the font size to use.
|
|
||||||
* @param plainFont the plain font to use.
|
|
||||||
* @param boldFont the bold font to use.
|
|
||||||
* @param italicFont the italic font to use.
|
|
||||||
* @param boldItalicFont the bold-italic font to use.
|
|
||||||
* @throws IOException by PDFBox
|
|
||||||
*/
|
|
||||||
public void addMarkup(final String markup, final float fontSize,
|
|
||||||
final PDFont plainFont, final PDFont boldFont,
|
|
||||||
final PDFont italicFont, final PDFont boldItalicFont) throws IOException {
|
|
||||||
add(TextFlowUtil.createTextFlowFromMarkup(markup, fontSize, plainFont,
|
|
||||||
boldFont, italicFont, boldItalicFont));
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Adds a text sequence to this flow.
|
* Adds a text sequence to this flow.
|
||||||
*
|
*
|
||||||
|
@ -252,7 +230,7 @@ public class TextFlow implements TextSequence, WidthRespecting {
|
||||||
public void drawTextRightAligned(PDPageContentStream contentStream,
|
public void drawTextRightAligned(PDPageContentStream contentStream,
|
||||||
Position endOfFirstLine, DrawListener drawListener) throws IOException {
|
Position endOfFirstLine, DrawListener drawListener) throws IOException {
|
||||||
drawText(contentStream, endOfFirstLine.add(-getWidth(), 0),
|
drawText(contentStream, endOfFirstLine.add(-getWidth(), 0),
|
||||||
Alignment.Right, drawListener);
|
Alignment.RIGHT, drawListener);
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.text;
|
package org.xbib.graphics.pdfbox.layout.text;
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.font.PDFont;
|
import org.apache.pdfbox.pdmodel.font.PDFont;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.font.Font;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.annotations.AnnotatedStyledText;
|
import org.xbib.graphics.pdfbox.layout.text.annotations.AnnotatedStyledText;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.annotations.Annotation;
|
import org.xbib.graphics.pdfbox.layout.text.annotations.Annotation;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.annotations.AnnotationCharacters;
|
import org.xbib.graphics.pdfbox.layout.text.annotations.AnnotationCharacters;
|
||||||
|
@ -16,40 +17,11 @@ import java.util.regex.Matcher;
|
||||||
|
|
||||||
public class TextFlowUtil {
|
public class TextFlowUtil {
|
||||||
|
|
||||||
/**
|
public static TextFlow createTextFlow(String text,
|
||||||
* Creates a text flow from the given text. The text may contain line
|
float fontSize,
|
||||||
* breaks.
|
Font baseFont) throws IOException {
|
||||||
*
|
|
||||||
* @param text the text
|
|
||||||
* @param fontSize the font size to use.
|
|
||||||
* @param font the font to use.
|
|
||||||
* @return the created text flow.
|
|
||||||
* @throws IOException by pdfbox
|
|
||||||
*/
|
|
||||||
public static TextFlow createTextFlow(final String text,
|
|
||||||
final float fontSize, final PDFont font) throws IOException {
|
|
||||||
final Iterable<CharSequence> parts = fromPlainText(text);
|
final Iterable<CharSequence> parts = fromPlainText(text);
|
||||||
return createTextFlow(parts, fontSize, font, font, font, font);
|
return createTextFlow(parts, fontSize, baseFont);
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Convenience alternative to
|
|
||||||
* {@link #createTextFlowFromMarkup(String, float, PDFont, PDFont, PDFont, PDFont)}
|
|
||||||
* which allows to specifies the fonts to use by using the {@link BaseFont}
|
|
||||||
* enum.
|
|
||||||
*
|
|
||||||
* @param markup the markup text.
|
|
||||||
* @param fontSize the font size to use.
|
|
||||||
* @param baseFont the base font describing the bundle of
|
|
||||||
* plain/blold/italic/bold-italic fonts.
|
|
||||||
* @return the created text flow.
|
|
||||||
* @throws IOException by pdfbox
|
|
||||||
*/
|
|
||||||
public static TextFlow createTextFlowFromMarkup(final String markup,
|
|
||||||
final float fontSize, final BaseFont baseFont) throws IOException {
|
|
||||||
return createTextFlowFromMarkup(markup, fontSize,
|
|
||||||
baseFont.getPlainFont(), baseFont.getBoldFont(),
|
|
||||||
baseFont.getItalicFont(), baseFont.getBoldItalicFont());
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -81,20 +53,15 @@ public class TextFlowUtil {
|
||||||
*
|
*
|
||||||
* @param markup the markup text.
|
* @param markup the markup text.
|
||||||
* @param fontSize the font size to use.
|
* @param fontSize the font size to use.
|
||||||
* @param plainFont the plain font.
|
* @param baseFont the font.
|
||||||
* @param boldFont the bold font.
|
|
||||||
* @param italicFont the italic font.
|
|
||||||
* @param boldItalicFont the bold-italic font.
|
|
||||||
* @return the created text flow.
|
* @return the created text flow.
|
||||||
* @throws IOException by pdfbox
|
* @throws IOException by pdfbox
|
||||||
*/
|
*/
|
||||||
public static TextFlow createTextFlowFromMarkup(final String markup,
|
public static TextFlow createTextFlowFromMarkup(final String markup,
|
||||||
final float fontSize, final PDFont plainFont,
|
final float fontSize,
|
||||||
final PDFont boldFont, final PDFont italicFont,
|
Font baseFont) throws IOException {
|
||||||
final PDFont boldItalicFont) throws IOException {
|
|
||||||
final Iterable<CharSequence> parts = fromMarkup(markup);
|
final Iterable<CharSequence> parts = fromMarkup(markup);
|
||||||
return createTextFlow(parts, fontSize, plainFont, boldFont, italicFont,
|
return createTextFlow(parts, fontSize, baseFont);
|
||||||
boldItalicFont);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -102,17 +69,11 @@ public class TextFlowUtil {
|
||||||
*
|
*
|
||||||
* @param parts the parts to create the text flow from.
|
* @param parts the parts to create the text flow from.
|
||||||
* @param fontSize the font size to use.
|
* @param fontSize the font size to use.
|
||||||
* @param plainFont the plain font.
|
|
||||||
* @param boldFont the bold font.
|
|
||||||
* @param italicFont the italic font.
|
|
||||||
* @param boldItalicFont the bold-italic font.
|
|
||||||
* @return the created text flow.
|
* @return the created text flow.
|
||||||
* @throws IOException by pdfbox
|
* @throws IOException by pdfbox
|
||||||
*/
|
*/
|
||||||
protected static TextFlow createTextFlow(
|
protected static TextFlow createTextFlow(final Iterable<CharSequence> parts,
|
||||||
final Iterable<CharSequence> parts, final float fontSize,
|
final float fontSize, Font baseFont)
|
||||||
final PDFont plainFont, final PDFont boldFont,
|
|
||||||
final PDFont italicFont, final PDFont boldItalicFont)
|
|
||||||
throws IOException {
|
throws IOException {
|
||||||
final TextFlow result = new TextFlow();
|
final TextFlow result = new TextFlow();
|
||||||
boolean bold = false;
|
boolean bold = false;
|
||||||
|
@ -175,12 +136,11 @@ public class TextFlowUtil {
|
||||||
}
|
}
|
||||||
indentStack.push(currentIndent);
|
indentStack.push(currentIndent);
|
||||||
result.add(currentIndent.createNewIndent(fontSize,
|
result.add(currentIndent.createNewIndent(fontSize,
|
||||||
plainFont, color));
|
baseFont.getPlainFont(), color));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
PDFont font = getFont(bold, italic, plainFont, boldFont,
|
PDFont font = getFont(bold, italic, baseFont);
|
||||||
italicFont, boldItalicFont);
|
|
||||||
float baselineOffset = 0;
|
float baselineOffset = 0;
|
||||||
float currentFontSize = fontSize;
|
float currentFontSize = fontSize;
|
||||||
if (metricsControl != null) {
|
if (metricsControl != null) {
|
||||||
|
@ -193,7 +153,7 @@ public class TextFlowUtil {
|
||||||
result.add(styledText);
|
result.add(styledText);
|
||||||
} else {
|
} else {
|
||||||
AnnotatedStyledText styledText = new AnnotatedStyledText(
|
AnnotatedStyledText styledText = new AnnotatedStyledText(
|
||||||
fragment.toString(), currentFontSize, font, color, baselineOffset,
|
fragment.toString(), currentFontSize, baseFont, color, baselineOffset,
|
||||||
annotationMap.values());
|
annotationMap.values());
|
||||||
result.add(styledText);
|
result.add(styledText);
|
||||||
}
|
}
|
||||||
|
@ -210,12 +170,25 @@ public class TextFlowUtil {
|
||||||
font = boldFont;
|
font = boldFont;
|
||||||
} else if (!bold && italic) {
|
} else if (!bold && italic) {
|
||||||
font = italicFont;
|
font = italicFont;
|
||||||
} else if (bold && italic) {
|
} else if (bold) {
|
||||||
font = boldItalicFont;
|
font = boldItalicFont;
|
||||||
}
|
}
|
||||||
return font;
|
return font;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
protected static PDFont getFont(boolean bold, boolean italic,
|
||||||
|
Font baseFont) {
|
||||||
|
PDFont font = baseFont.getPlainFont();
|
||||||
|
if (bold && !italic) {
|
||||||
|
font = baseFont.getBoldFont();
|
||||||
|
} else if (!bold && italic) {
|
||||||
|
font = baseFont.getItalicFont();
|
||||||
|
} else if (bold) {
|
||||||
|
font = baseFont.getBoldItalicFont();
|
||||||
|
}
|
||||||
|
return font;
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a char sequence where new-line is replaced by the corresponding
|
* Creates a char sequence where new-line is replaced by the corresponding
|
||||||
* {@link ControlCharacter}.
|
* {@link ControlCharacter}.
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.text;
|
package org.xbib.graphics.pdfbox.layout.text;
|
||||||
|
|
||||||
|
import org.xbib.graphics.pdfbox.layout.font.FontDescriptor;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
|
|
@ -1,7 +1,8 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.text;
|
package org.xbib.graphics.pdfbox.layout.text;
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
||||||
import org.xbib.graphics.pdfbox.layout.util.CompatibilityHelper;
|
import org.apache.pdfbox.util.Matrix;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.font.FontDescriptor;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -30,9 +31,11 @@ public class TextLine implements TextSequence {
|
||||||
*/
|
*/
|
||||||
private static final String WIDTH = "width";
|
private static final String WIDTH = "width";
|
||||||
|
|
||||||
private final List<StyledText> styledTextList = new ArrayList<StyledText>();
|
private final List<StyledText> styledTextList = new ArrayList<>();
|
||||||
|
|
||||||
private NewLine newLine;
|
private NewLine newLine;
|
||||||
private final Map<String, Object> cache = new HashMap<String, Object>();
|
|
||||||
|
private final Map<String, Object> cache = new HashMap<>();
|
||||||
|
|
||||||
private void clearCache() {
|
private void clearCache() {
|
||||||
cache.clear();
|
cache.clear();
|
||||||
|
@ -160,48 +163,44 @@ public class TextLine implements TextSequence {
|
||||||
Alignment alignment, float availableLineWidth,
|
Alignment alignment, float availableLineWidth,
|
||||||
DrawListener drawListener) throws IOException {
|
DrawListener drawListener) throws IOException {
|
||||||
contentStream.saveGraphicsState();
|
contentStream.saveGraphicsState();
|
||||||
contentStream.beginText();
|
|
||||||
|
|
||||||
float x = upperLeft.getX();
|
float x = upperLeft.getX();
|
||||||
float y = upperLeft.getY() - getAscent(); // the baseline
|
float y = upperLeft.getY() - getAscent();
|
||||||
float offset = TextSequenceUtil.getOffset(this, availableLineWidth, alignment);
|
|
||||||
x += offset;
|
|
||||||
CompatibilityHelper.setTextTranslation(contentStream, x, y);
|
|
||||||
float extraWordSpacing = 0;
|
|
||||||
if (alignment == Alignment.Justify && (getNewLine() instanceof WrappingNewLine)) {
|
|
||||||
extraWordSpacing = (availableLineWidth - getWidth()) / (styledTextList.size() - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
FontDescriptor lastFontDesc = null;
|
FontDescriptor lastFontDesc = null;
|
||||||
float lastBaselineOffset = 0;
|
float lastBaselineOffset = 0;
|
||||||
Color lastColor = null;
|
Color lastColor = null;
|
||||||
float gap = 0;
|
float gap = 0;
|
||||||
|
float extraWordSpacing = 0;
|
||||||
|
if (alignment == Alignment.JUSTIFY && (getNewLine() instanceof WrappingNewLine)) {
|
||||||
|
extraWordSpacing = (availableLineWidth - getWidth()) / (styledTextList.size() - 1);
|
||||||
|
}
|
||||||
|
float offset = TextSequenceUtil.getOffset(this, availableLineWidth, alignment);
|
||||||
|
x += offset;
|
||||||
for (StyledText styledText : styledTextList) {
|
for (StyledText styledText : styledTextList) {
|
||||||
|
Matrix matrix = Matrix.getTranslateInstance(x, y);
|
||||||
|
if (styledText.getLeftMargin() > 0) {
|
||||||
|
gap += styledText.getLeftMargin();
|
||||||
|
}
|
||||||
|
boolean moveBaseline = styledText.getBaselineOffset() != lastBaselineOffset;
|
||||||
|
if (moveBaseline || gap > 0) {
|
||||||
|
float baselineDelta = lastBaselineOffset - styledText.getBaselineOffset();
|
||||||
|
lastBaselineOffset = styledText.getBaselineOffset();
|
||||||
|
matrix = matrix.multiply(new Matrix(1, 0, 0, 1, gap, baselineDelta));
|
||||||
|
x += gap;
|
||||||
|
}
|
||||||
|
contentStream.beginText();
|
||||||
|
contentStream.setTextMatrix(matrix);
|
||||||
if (!styledText.getFontDescriptor().equals(lastFontDesc)) {
|
if (!styledText.getFontDescriptor().equals(lastFontDesc)) {
|
||||||
lastFontDesc = styledText.getFontDescriptor();
|
lastFontDesc = styledText.getFontDescriptor();
|
||||||
contentStream.setFont(lastFontDesc.getFont(),
|
contentStream.setFont(lastFontDesc.getFont(), lastFontDesc.getSize());
|
||||||
lastFontDesc.getSize());
|
|
||||||
}
|
}
|
||||||
if (!styledText.getColor().equals(lastColor)) {
|
if (!styledText.getColor().equals(lastColor)) {
|
||||||
lastColor = styledText.getColor();
|
lastColor = styledText.getColor();
|
||||||
contentStream.setNonStrokingColor(lastColor);
|
contentStream.setNonStrokingColor(lastColor);
|
||||||
}
|
}
|
||||||
if (styledText.getLeftMargin() > 0) {
|
|
||||||
gap += styledText.getLeftMargin();
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean moveBaseline = styledText.getBaselineOffset() != lastBaselineOffset;
|
|
||||||
if (moveBaseline || gap > 0) {
|
|
||||||
float baselineDelta = lastBaselineOffset - styledText.getBaselineOffset();
|
|
||||||
lastBaselineOffset = styledText.getBaselineOffset();
|
|
||||||
CompatibilityHelper.moveTextPosition(contentStream, gap, baselineDelta);
|
|
||||||
x += gap;
|
|
||||||
}
|
|
||||||
if (styledText.getText().length() > 0) {
|
if (styledText.getText().length() > 0) {
|
||||||
CompatibilityHelper.showText(contentStream,
|
contentStream.showText(styledText.getText());
|
||||||
styledText.getText());
|
|
||||||
}
|
}
|
||||||
|
contentStream.endText();
|
||||||
if (drawListener != null) {
|
if (drawListener != null) {
|
||||||
float currentUpperLeft = y + styledText.getAsent();
|
float currentUpperLeft = y + styledText.getAsent();
|
||||||
drawListener.drawn(styledText,
|
drawListener.drawn(styledText,
|
||||||
|
@ -210,13 +209,11 @@ public class TextLine implements TextSequence {
|
||||||
styledText.getHeight());
|
styledText.getHeight());
|
||||||
}
|
}
|
||||||
x += styledText.getWidthWithoutMargin();
|
x += styledText.getWidthWithoutMargin();
|
||||||
|
|
||||||
gap = extraWordSpacing;
|
gap = extraWordSpacing;
|
||||||
if (styledText.getRightMargin() > 0) {
|
if (styledText.getRightMargin() > 0) {
|
||||||
gap += styledText.getRightMargin();
|
gap += styledText.getRightMargin();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
contentStream.endText();
|
|
||||||
contentStream.restoreGraphicsState();
|
contentStream.restoreGraphicsState();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -3,6 +3,7 @@ package org.xbib.graphics.pdfbox.layout.text;
|
||||||
import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Dividable.Divided;
|
import org.xbib.graphics.pdfbox.layout.elements.Dividable.Divided;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.font.FontDescriptor;
|
||||||
import org.xbib.graphics.pdfbox.layout.util.Pair;
|
import org.xbib.graphics.pdfbox.layout.util.Pair;
|
||||||
import org.xbib.graphics.pdfbox.layout.util.WordBreakerFactory;
|
import org.xbib.graphics.pdfbox.layout.util.WordBreakerFactory;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
@ -473,9 +474,9 @@ public class TextSequenceUtil {
|
||||||
final float targetWidth, final Alignment alignment)
|
final float targetWidth, final Alignment alignment)
|
||||||
throws IOException {
|
throws IOException {
|
||||||
switch (alignment) {
|
switch (alignment) {
|
||||||
case Right:
|
case RIGHT:
|
||||||
return targetWidth - textLine.getWidth();
|
return targetWidth - textLine.getWidth();
|
||||||
case Center:
|
case CENTER:
|
||||||
return (targetWidth - textLine.getWidth()) / 2f;
|
return (targetWidth - textLine.getWidth()) / 2f;
|
||||||
default:
|
default:
|
||||||
return 0;
|
return 0;
|
||||||
|
|
|
@ -1,6 +1,8 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.text;
|
package org.xbib.graphics.pdfbox.layout.text;
|
||||||
|
|
||||||
|
|
||||||
|
import org.xbib.graphics.pdfbox.layout.font.FontDescriptor;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* A NewLine introduced by wrapping. This interface is useful for detecting
|
* A NewLine introduced by wrapping. This interface is useful for detecting
|
||||||
* new-lines not contained in the original text.
|
* new-lines not contained in the original text.
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.text.annotations;
|
package org.xbib.graphics.pdfbox.layout.text.annotations;
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.font.PDFont;
|
import org.xbib.graphics.pdfbox.layout.font.Font;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.FontDescriptor;
|
import org.xbib.graphics.pdfbox.layout.font.FontDescriptor;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.StyledText;
|
import org.xbib.graphics.pdfbox.layout.text.StyledText;
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
@ -15,7 +15,24 @@ import java.util.List;
|
||||||
*/
|
*/
|
||||||
public class AnnotatedStyledText extends StyledText implements Annotated {
|
public class AnnotatedStyledText extends StyledText implements Annotated {
|
||||||
|
|
||||||
private final List<Annotation> annotations = new ArrayList<Annotation>();
|
private final List<Annotation> annotations = new ArrayList<>();
|
||||||
|
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Creates a styled text.
|
||||||
|
*
|
||||||
|
* @param text the text to draw. Must not contain line feeds ('\n').
|
||||||
|
* @param size the size of the font.
|
||||||
|
* @param font the font to use..
|
||||||
|
* @param color the color to use.
|
||||||
|
* @param baselineOffset the offset of the baseline.
|
||||||
|
* @param annotations the annotations associated with the text.
|
||||||
|
*/
|
||||||
|
public AnnotatedStyledText(String text, float size, Font font,
|
||||||
|
Color color, final float baselineOffset,
|
||||||
|
Collection<? extends Annotation> annotations) {
|
||||||
|
this(text, new FontDescriptor(font.getPlainFont(), size), color, baselineOffset, 0, 0, annotations);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Creates a styled text.
|
* Creates a styled text.
|
||||||
|
@ -29,8 +46,10 @@ public class AnnotatedStyledText extends StyledText implements Annotated {
|
||||||
* @param annotations the annotations associated with the text.
|
* @param annotations the annotations associated with the text.
|
||||||
*/
|
*/
|
||||||
public AnnotatedStyledText(final String text,
|
public AnnotatedStyledText(final String text,
|
||||||
final FontDescriptor fontDescriptor, final Color color,
|
final FontDescriptor fontDescriptor,
|
||||||
final float leftMargin, final float rightMargin,
|
final Color color,
|
||||||
|
final float leftMargin,
|
||||||
|
final float rightMargin,
|
||||||
final float baselineOffset,
|
final float baselineOffset,
|
||||||
Collection<? extends Annotation> annotations) {
|
Collection<? extends Annotation> annotations) {
|
||||||
super(text, fontDescriptor, color, baselineOffset, leftMargin,
|
super(text, fontDescriptor, color, baselineOffset, leftMargin,
|
||||||
|
@ -40,23 +59,6 @@ public class AnnotatedStyledText extends StyledText implements Annotated {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Creates a styled text.
|
|
||||||
*
|
|
||||||
* @param text the text to draw. Must not contain line feeds ('\n').
|
|
||||||
* @param size the size of the font.
|
|
||||||
* @param font the font to use..
|
|
||||||
* @param color the color to use.
|
|
||||||
* @param baselineOffset the offset of the baseline.
|
|
||||||
* @param annotations the annotations associated with the text.
|
|
||||||
*/
|
|
||||||
public AnnotatedStyledText(String text, float size, PDFont font,
|
|
||||||
Color color, final float baselineOffset,
|
|
||||||
Collection<? extends Annotation> annotations) {
|
|
||||||
this(text, new FontDescriptor(font, size), color, baselineOffset, 0, 0,
|
|
||||||
annotations);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public Iterator<Annotation> iterator() {
|
public Iterator<Annotation> iterator() {
|
||||||
return annotations.iterator();
|
return annotations.iterator();
|
||||||
|
|
|
@ -23,6 +23,7 @@ import java.io.IOException;
|
||||||
public class AnnotationDrawListener implements DrawListener, RenderListener {
|
public class AnnotationDrawListener implements DrawListener, RenderListener {
|
||||||
|
|
||||||
private final DrawContext drawContext;
|
private final DrawContext drawContext;
|
||||||
|
|
||||||
private final Iterable<AnnotationProcessor> annotationProcessors;
|
private final Iterable<AnnotationProcessor> annotationProcessors;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -33,8 +34,7 @@ public class AnnotationDrawListener implements DrawListener, RenderListener {
|
||||||
*/
|
*/
|
||||||
public AnnotationDrawListener(final DrawContext drawContext) {
|
public AnnotationDrawListener(final DrawContext drawContext) {
|
||||||
this.drawContext = drawContext;
|
this.drawContext = drawContext;
|
||||||
annotationProcessors = AnnotationProcessorFactory
|
annotationProcessors = AnnotationProcessorFactory.createAnnotationProcessors();
|
||||||
.createAnnotationProcessors();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|
|
@ -2,7 +2,6 @@ package org.xbib.graphics.pdfbox.layout.text.annotations;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Factory used to create all available {@link AnnotationProcessor}s. You may
|
* Factory used to create all available {@link AnnotationProcessor}s. You may
|
||||||
|
@ -11,7 +10,7 @@ import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
*/
|
*/
|
||||||
public class AnnotationProcessorFactory {
|
public class AnnotationProcessorFactory {
|
||||||
|
|
||||||
private final static List<Class<? extends AnnotationProcessor>> ANNOTATION_PROCESSORS = new CopyOnWriteArrayList<Class<? extends AnnotationProcessor>>();
|
private final static List<Class<? extends AnnotationProcessor>> ANNOTATION_PROCESSORS = new ArrayList<>();
|
||||||
|
|
||||||
static {
|
static {
|
||||||
register(HyperlinkAnnotationProcessor.class);
|
register(HyperlinkAnnotationProcessor.class);
|
||||||
|
|
|
@ -61,11 +61,7 @@ public class HyperlinkAnnotationProcessor implements AnnotationProcessor {
|
||||||
Iterable<HyperlinkAnnotation> hyperlinkAnnotations = annotatedText
|
Iterable<HyperlinkAnnotation> hyperlinkAnnotations = annotatedText
|
||||||
.getAnnotationsOfType(HyperlinkAnnotation.class);
|
.getAnnotationsOfType(HyperlinkAnnotation.class);
|
||||||
for (HyperlinkAnnotation hyperlinkAnnotation : hyperlinkAnnotations) {
|
for (HyperlinkAnnotation hyperlinkAnnotation : hyperlinkAnnotations) {
|
||||||
List<Hyperlink> links = linkMap.get(drawContext.getCurrentPage());
|
List<Hyperlink> links = linkMap.computeIfAbsent(drawContext.getCurrentPage(), k -> new ArrayList<>());
|
||||||
if (links == null) {
|
|
||||||
links = new ArrayList<Hyperlink>();
|
|
||||||
linkMap.put(drawContext.getCurrentPage(), links);
|
|
||||||
}
|
|
||||||
PDRectangle bounds = new PDRectangle();
|
PDRectangle bounds = new PDRectangle();
|
||||||
bounds.setLowerLeftX(upperLeft.getX());
|
bounds.setLowerLeftX(upperLeft.getX());
|
||||||
bounds.setLowerLeftY(upperLeft.getY() - height);
|
bounds.setLowerLeftY(upperLeft.getY() - height);
|
||||||
|
|
|
@ -18,17 +18,15 @@ import java.util.List;
|
||||||
*/
|
*/
|
||||||
public class UnderlineAnnotationProcessor implements AnnotationProcessor {
|
public class UnderlineAnnotationProcessor implements AnnotationProcessor {
|
||||||
|
|
||||||
private final List<Line> linesOnPage = new ArrayList<Line>();
|
private final List<Line> linesOnPage = new ArrayList<>();
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void annotatedObjectDrawn(Annotated drawnObject,
|
public void annotatedObjectDrawn(Annotated drawnObject,
|
||||||
DrawContext drawContext, Position upperLeft, float width,
|
DrawContext drawContext, Position upperLeft, float width,
|
||||||
float height) throws IOException {
|
float height) {
|
||||||
|
|
||||||
if (!(drawnObject instanceof StyledText)) {
|
if (!(drawnObject instanceof StyledText)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
StyledText drawnText = (StyledText) drawnObject;
|
StyledText drawnText = (StyledText) drawnObject;
|
||||||
for (UnderlineAnnotation underlineAnnotation : drawnObject
|
for (UnderlineAnnotation underlineAnnotation : drawnObject
|
||||||
.getAnnotationsOfType(UnderlineAnnotation.class)) {
|
.getAnnotationsOfType(UnderlineAnnotation.class)) {
|
||||||
|
@ -36,11 +34,9 @@ public class UnderlineAnnotationProcessor implements AnnotationProcessor {
|
||||||
float ascent = fontSize
|
float ascent = fontSize
|
||||||
* drawnText.getFontDescriptor().getFont()
|
* drawnText.getFontDescriptor().getFont()
|
||||||
.getFontDescriptor().getAscent() / 1000;
|
.getFontDescriptor().getAscent() / 1000;
|
||||||
|
|
||||||
float baselineOffset = fontSize * underlineAnnotation.getBaselineOffsetScale();
|
float baselineOffset = fontSize * underlineAnnotation.getBaselineOffsetScale();
|
||||||
float thickness = (0.01f + fontSize * 0.05f)
|
float thickness = (0.01f + fontSize * 0.05f)
|
||||||
* underlineAnnotation.getLineWeight();
|
* underlineAnnotation.getLineWeight();
|
||||||
|
|
||||||
Position start = new Position(upperLeft.getX(), upperLeft.getY()
|
Position start = new Position(upperLeft.getX(), upperLeft.getY()
|
||||||
- ascent + baselineOffset);
|
- ascent + baselineOffset);
|
||||||
Position end = new Position(start.getX() + width, start.getY());
|
Position end = new Position(start.getX() + width, start.getY());
|
||||||
|
|
|
@ -14,8 +14,6 @@ import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotation;
|
||||||
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink;
|
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationLink;
|
||||||
import org.apache.pdfbox.pdmodel.interactive.annotation.PDBorderStyleDictionary;
|
import org.apache.pdfbox.pdmodel.interactive.annotation.PDBorderStyleDictionary;
|
||||||
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDDestination;
|
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDDestination;
|
||||||
import org.apache.pdfbox.rendering.ImageType;
|
|
||||||
import org.apache.pdfbox.rendering.PDFRenderer;
|
|
||||||
import org.apache.pdfbox.util.Matrix;
|
import org.apache.pdfbox.util.Matrix;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Position;
|
import org.xbib.graphics.pdfbox.layout.text.Position;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.annotations.Annotations.HyperlinkAnnotation.LinkStyle;
|
import org.xbib.graphics.pdfbox.layout.text.annotations.Annotations.HyperlinkAnnotation.LinkStyle;
|
||||||
|
@ -23,23 +21,13 @@ import java.awt.Color;
|
||||||
import java.awt.geom.AffineTransform;
|
import java.awt.geom.AffineTransform;
|
||||||
import java.awt.image.BufferedImage;
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.HashMap;
|
|
||||||
import java.util.Map;
|
|
||||||
import java.util.WeakHashMap;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Provide compatible methods for API changes from pdfbox 1x to 2x.
|
|
||||||
*/
|
|
||||||
public class CompatibilityHelper {
|
public class CompatibilityHelper {
|
||||||
|
|
||||||
private static final String BULLET = "\u2022";
|
private static final String BULLET = "\u2022";
|
||||||
|
|
||||||
private static final String DOUBLE_ANGLE = "\u00bb";
|
private static final String DOUBLE_ANGLE = "\u00bb";
|
||||||
|
|
||||||
private static final String IMAGE_CACHE = "IMAGE_CACHE";
|
|
||||||
|
|
||||||
private static final Map<PDDocument, Map<String, Map<?, ?>>> documentCaches = new WeakHashMap<>();
|
|
||||||
|
|
||||||
private static PDBorderStyleDictionary noBorder;
|
private static PDBorderStyleDictionary noBorder;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -88,51 +76,16 @@ public class CompatibilityHelper {
|
||||||
contentStream.showText(text);
|
contentStream.showText(text);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void setTextTranslation(
|
|
||||||
final PDPageContentStream contentStream, final float x,
|
|
||||||
final float y) throws IOException {
|
|
||||||
contentStream.setTextMatrix(Matrix.getTranslateInstance(x, y));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static void moveTextPosition(
|
|
||||||
final PDPageContentStream contentStream, final float x,
|
|
||||||
final float y) throws IOException {
|
|
||||||
contentStream.transform(new Matrix(1, 0, 0, 1, x, y));
|
|
||||||
}
|
|
||||||
|
|
||||||
public static PDPageContentStream createAppendablePDPageContentStream(
|
public static PDPageContentStream createAppendablePDPageContentStream(
|
||||||
final PDDocument pdDocument, final PDPage page) throws IOException {
|
final PDDocument pdDocument, final PDPage page) throws IOException {
|
||||||
return new PDPageContentStream(pdDocument, page, PDPageContentStream.AppendMode.APPEND, true);
|
return new PDPageContentStream(pdDocument, page, PDPageContentStream.AppendMode.APPEND, true);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static void drawImage(final BufferedImage image,
|
|
||||||
final PDDocument document, final PDPageContentStream contentStream,
|
|
||||||
Position upperLeft, final float width, final float height)
|
|
||||||
throws IOException {
|
|
||||||
PDImageXObject cachedImage = getCachedImage(document, image);
|
|
||||||
float x = upperLeft.getX();
|
|
||||||
float y = upperLeft.getY() - height;
|
|
||||||
contentStream.drawImage(cachedImage, x, y, width, height);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static int getPageRotation(final PDPage page) {
|
public static int getPageRotation(final PDPage page) {
|
||||||
return page.getRotation();
|
return page.getRotation();
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Renders the given page as an RGB image.
|
|
||||||
*
|
|
||||||
* @param document the document containing the page.
|
|
||||||
* @param pageIndex the index of the page to render.
|
|
||||||
* @param resolution the image resolution.
|
|
||||||
* @return the rendered image
|
|
||||||
* @throws IOException by pdfbox
|
|
||||||
*/
|
|
||||||
public static BufferedImage createImageFromPage(final PDDocument document, int pageIndex, final int resolution) throws IOException {
|
|
||||||
PDFRenderer pdfRenderer = new PDFRenderer(document);
|
|
||||||
return pdfRenderer.renderImageWithDPI(pageIndex, resolution, ImageType.RGB);
|
|
||||||
}
|
|
||||||
|
|
||||||
public static PDAnnotationLink createLink(PDPage page, PDRectangle rect, Color color,
|
public static PDAnnotationLink createLink(PDPage page, PDRectangle rect, Color color,
|
||||||
LinkStyle linkStyle, final String uri) {
|
LinkStyle linkStyle, final String uri) {
|
||||||
PDAnnotationLink pdLink = createLink(page, rect, color, linkStyle);
|
PDAnnotationLink pdLink = createLink(page, rect, color, linkStyle);
|
||||||
|
@ -146,7 +99,6 @@ public class CompatibilityHelper {
|
||||||
public static PDAnnotationLink createLink(PDPage page, PDRectangle rect, Color color,
|
public static PDAnnotationLink createLink(PDPage page, PDRectangle rect, Color color,
|
||||||
LinkStyle linkStyle, final PDDestination destination) {
|
LinkStyle linkStyle, final PDDestination destination) {
|
||||||
PDAnnotationLink pdLink = createLink(page, rect, color, linkStyle);
|
PDAnnotationLink pdLink = createLink(page, rect, color, linkStyle);
|
||||||
|
|
||||||
PDActionGoTo gotoAction = new PDActionGoTo();
|
PDActionGoTo gotoAction = new PDActionGoTo();
|
||||||
gotoAction.setDestination(destination);
|
gotoAction.setDestination(destination);
|
||||||
pdLink.setAction(gotoAction);
|
pdLink.setAction(gotoAction);
|
||||||
|
@ -159,37 +111,36 @@ public class CompatibilityHelper {
|
||||||
* @param annotation the annotation.
|
* @param annotation the annotation.
|
||||||
* @param color the color to set.
|
* @param color the color to set.
|
||||||
*/
|
*/
|
||||||
public static void setAnnotationColor(final PDAnnotation annotation, Color color) {
|
public static void setAnnotationColor(PDAnnotation annotation, Color color) {
|
||||||
annotation.setColor(toPDColor(color));
|
annotation.setColor(toPDColor(color));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static PDColor toPDColor(final Color color) {
|
||||||
|
float[] components = {
|
||||||
|
color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f
|
||||||
|
};
|
||||||
|
return new PDColor(components, PDDeviceRGB.INSTANCE);
|
||||||
|
}
|
||||||
|
|
||||||
private static PDAnnotationLink createLink(PDPage page, PDRectangle rect, Color color,
|
private static PDAnnotationLink createLink(PDPage page, PDRectangle rect, Color color,
|
||||||
LinkStyle linkStyle) {
|
LinkStyle linkStyle) {
|
||||||
PDAnnotationLink pdLink = new PDAnnotationLink();
|
PDAnnotationLink pdLink = new PDAnnotationLink();
|
||||||
pdLink.setBorderStyle(toBorderStyle(linkStyle));
|
if (linkStyle == LinkStyle.none) {
|
||||||
|
if (noBorder == null) {
|
||||||
|
noBorder = new PDBorderStyleDictionary();
|
||||||
|
noBorder.setWidth(0);
|
||||||
|
}
|
||||||
|
return pdLink;
|
||||||
|
}
|
||||||
|
PDBorderStyleDictionary borderStyle = new PDBorderStyleDictionary();
|
||||||
|
borderStyle.setStyle(PDBorderStyleDictionary.STYLE_UNDERLINE);
|
||||||
|
pdLink.setBorderStyle(borderStyle);
|
||||||
PDRectangle rotatedRect = transformToPageRotation(rect, page);
|
PDRectangle rotatedRect = transformToPageRotation(rect, page);
|
||||||
pdLink.setRectangle(rotatedRect);
|
pdLink.setRectangle(rotatedRect);
|
||||||
setAnnotationColor(pdLink, color);
|
setAnnotationColor(pdLink, color);
|
||||||
return pdLink;
|
return pdLink;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static PDBorderStyleDictionary toBorderStyle(
|
|
||||||
final LinkStyle linkStyle) {
|
|
||||||
if (linkStyle == LinkStyle.none) {
|
|
||||||
return getNoBorder();
|
|
||||||
}
|
|
||||||
PDBorderStyleDictionary borderStyle = new PDBorderStyleDictionary();
|
|
||||||
borderStyle.setStyle(PDBorderStyleDictionary.STYLE_UNDERLINE);
|
|
||||||
return borderStyle;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static PDColor toPDColor(final Color color) {
|
|
||||||
float[] components = new float[]{
|
|
||||||
color.getRed() / 255f, color.getGreen() / 255f, color.getBlue() / 255f};
|
|
||||||
return new PDColor(components, PDDeviceRGB.INSTANCE);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Return the quad points representation of the given rect.
|
* Return the quad points representation of the given rect.
|
||||||
*
|
*
|
||||||
|
@ -208,8 +159,7 @@ public class CompatibilityHelper {
|
||||||
* @param yOffset the offset in y-direction to add.
|
* @param yOffset the offset in y-direction to add.
|
||||||
* @return the quad points.
|
* @return the quad points.
|
||||||
*/
|
*/
|
||||||
public static float[] toQuadPoints(final PDRectangle rect, float xOffset,
|
private static float[] toQuadPoints(final PDRectangle rect, float xOffset, float yOffset) {
|
||||||
float yOffset) {
|
|
||||||
float[] quads = new float[8];
|
float[] quads = new float[8];
|
||||||
quads[0] = rect.getLowerLeftX() + xOffset; // x1
|
quads[0] = rect.getLowerLeftX() + xOffset; // x1
|
||||||
quads[1] = rect.getUpperRightY() + yOffset; // y1
|
quads[1] = rect.getUpperRightY() + yOffset; // y1
|
||||||
|
@ -229,8 +179,7 @@ public class CompatibilityHelper {
|
||||||
* @param page the page.
|
* @param page the page.
|
||||||
* @return the transformed quad points.
|
* @return the transformed quad points.
|
||||||
*/
|
*/
|
||||||
public static float[] transformToPageRotation(
|
public static float[] transformToPageRotation(final float[] quadPoints, final PDPage page) {
|
||||||
final float[] quadPoints, final PDPage page) {
|
|
||||||
AffineTransform transform = transformToPageRotation(page);
|
AffineTransform transform = transformToPageRotation(page);
|
||||||
if (transform == null) {
|
if (transform == null) {
|
||||||
return quadPoints;
|
return quadPoints;
|
||||||
|
@ -247,8 +196,7 @@ public class CompatibilityHelper {
|
||||||
* @param page the page.
|
* @param page the page.
|
||||||
* @return the transformed rectangle.
|
* @return the transformed rectangle.
|
||||||
*/
|
*/
|
||||||
public static PDRectangle transformToPageRotation(
|
private static PDRectangle transformToPageRotation(final PDRectangle rect, final PDPage page) {
|
||||||
final PDRectangle rect, final PDPage page) {
|
|
||||||
AffineTransform transform = transformToPageRotation(page);
|
AffineTransform transform = transformToPageRotation(page);
|
||||||
if (transform == null) {
|
if (transform == null) {
|
||||||
return rect;
|
return rect;
|
||||||
|
@ -278,49 +226,4 @@ public class CompatibilityHelper {
|
||||||
transform.translate(-offset, offset);
|
transform.translate(-offset, offset);
|
||||||
return transform;
|
return transform;
|
||||||
}
|
}
|
||||||
|
|
||||||
private static PDBorderStyleDictionary getNoBorder() {
|
|
||||||
if (noBorder == null) {
|
|
||||||
noBorder = new PDBorderStyleDictionary();
|
|
||||||
noBorder.setWidth(0);
|
|
||||||
}
|
|
||||||
return noBorder;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
private static synchronized Map<String, Map<?, ?>> getDocumentCache(
|
|
||||||
final PDDocument document) {
|
|
||||||
Map<String, Map<?, ?>> cache = documentCaches.get(document);
|
|
||||||
if (cache == null) {
|
|
||||||
cache = new HashMap<String, Map<?, ?>>();
|
|
||||||
documentCaches.put(document, cache);
|
|
||||||
}
|
|
||||||
return cache;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static synchronized Map<BufferedImage, PDImageXObject> getImageCache(
|
|
||||||
final PDDocument document) {
|
|
||||||
Map<String, Map<?, ?>> documentCache = getDocumentCache(document);
|
|
||||||
@SuppressWarnings("unchecked")
|
|
||||||
Map<BufferedImage, PDImageXObject> imageCache = (Map<BufferedImage, PDImageXObject>) documentCache
|
|
||||||
.get(IMAGE_CACHE);
|
|
||||||
if (imageCache == null) {
|
|
||||||
imageCache = new HashMap<BufferedImage, PDImageXObject>();
|
|
||||||
documentCache.put(IMAGE_CACHE, imageCache);
|
|
||||||
}
|
|
||||||
return imageCache;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static synchronized PDImageXObject getCachedImage(
|
|
||||||
final PDDocument document, final BufferedImage image)
|
|
||||||
throws IOException {
|
|
||||||
Map<BufferedImage, PDImageXObject> imageCache = getImageCache(document);
|
|
||||||
PDImageXObject pdxObjectImage = imageCache.get(image);
|
|
||||||
if (pdxObjectImage == null) {
|
|
||||||
pdxObjectImage = LosslessFactory.createFromImage(document, image);
|
|
||||||
imageCache.put(image, pdxObjectImage);
|
|
||||||
}
|
|
||||||
return pdxObjectImage;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.util;
|
package org.xbib.graphics.pdfbox.layout.util;
|
||||||
|
|
||||||
import org.xbib.graphics.pdfbox.layout.text.FontDescriptor;
|
import org.xbib.graphics.pdfbox.layout.font.FontDescriptor;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -21,8 +21,8 @@ public interface WordBreaker {
|
||||||
* @return the broken word, or <code>null</code> if it cannot be broken.
|
* @return the broken word, or <code>null</code> if it cannot be broken.
|
||||||
* @throws IOException by pdfbox
|
* @throws IOException by pdfbox
|
||||||
*/
|
*/
|
||||||
Pair<String> breakWord(final String word,
|
Pair<String> breakWord(String word,
|
||||||
final FontDescriptor fontDescriptor, final float maxWidth,
|
FontDescriptor fontDescriptor, float maxWidth,
|
||||||
final boolean breakHardIfNecessary) throws IOException;
|
boolean breakHardIfNecessary) throws IOException;
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,6 +1,6 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.util;
|
package org.xbib.graphics.pdfbox.layout.util;
|
||||||
|
|
||||||
import org.xbib.graphics.pdfbox.layout.text.FontDescriptor;
|
import org.xbib.graphics.pdfbox.layout.font.FontDescriptor;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.TextSequenceUtil;
|
import org.xbib.graphics.pdfbox.layout.text.TextSequenceUtil;
|
||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
|
|
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
|
@ -1,16 +1,16 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.test;
|
package org.xbib.graphics.pdfbox.layout.test;
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.font.PDType1Font;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayoutHint;
|
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayoutHint;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
import org.xbib.graphics.pdfbox.layout.util.WordBreakerFactory;
|
import org.xbib.graphics.pdfbox.layout.util.WordBreakerFactory;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
public class Aligned {
|
public class AlignedTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() throws Exception {
|
public void test() throws Exception {
|
||||||
|
@ -18,27 +18,23 @@ public class Aligned {
|
||||||
WordBreakerFactory.LEGACY_WORD_BREAKER_CLASS_NAME);
|
WordBreakerFactory.LEGACY_WORD_BREAKER_CLASS_NAME);
|
||||||
Document document = new Document(40, 60, 40, 60);
|
Document document = new Document(40, 60, 40, 60);
|
||||||
Paragraph paragraph = new Paragraph();
|
Paragraph paragraph = new Paragraph();
|
||||||
paragraph.addText("This is some left aligned text", 11,
|
paragraph.addText("This is some left aligned text", 11, BaseFont.HELVETICA);
|
||||||
PDType1Font.HELVETICA);
|
paragraph.setAlignment(Alignment.LEFT);
|
||||||
paragraph.setAlignment(Alignment.Left);
|
|
||||||
paragraph.setMaxWidth(40);
|
paragraph.setMaxWidth(40);
|
||||||
document.add(paragraph, VerticalLayoutHint.LEFT);
|
document.add(paragraph, VerticalLayoutHint.LEFT);
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
paragraph.addText("This is some centered text", 11,
|
paragraph.addText("This is some centered text", 11, BaseFont.HELVETICA);
|
||||||
PDType1Font.HELVETICA);
|
paragraph.setAlignment(Alignment.CENTER);
|
||||||
paragraph.setAlignment(Alignment.Center);
|
|
||||||
paragraph.setMaxWidth(40);
|
paragraph.setMaxWidth(40);
|
||||||
document.add(paragraph, VerticalLayoutHint.CENTER);
|
document.add(paragraph, VerticalLayoutHint.CENTER);
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
paragraph.addText("This is some right aligned text", 11,
|
paragraph.addText("This is some right aligned text", 11, BaseFont.HELVETICA);
|
||||||
PDType1Font.HELVETICA);
|
paragraph.setAlignment(Alignment.RIGHT);
|
||||||
paragraph.setAlignment(Alignment.Right);
|
|
||||||
paragraph.setMaxWidth(40);
|
paragraph.setMaxWidth(40);
|
||||||
document.add(paragraph, VerticalLayoutHint.RIGHT);
|
document.add(paragraph, VerticalLayoutHint.RIGHT);
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
paragraph.addText("Text is right aligned, and paragraph centered", 11,
|
paragraph.addText("Text is right aligned, and paragraph centered", 11, BaseFont.HELVETICA);
|
||||||
PDType1Font.HELVETICA);
|
paragraph.setAlignment(Alignment.RIGHT);
|
||||||
paragraph.setAlignment(Alignment.Right);
|
|
||||||
paragraph.setMaxWidth(40);
|
paragraph.setMaxWidth(40);
|
||||||
document.add(paragraph, VerticalLayoutHint.CENTER);
|
document.add(paragraph, VerticalLayoutHint.CENTER);
|
||||||
OutputStream outputStream = new FileOutputStream("build/aligned.pdf");
|
OutputStream outputStream = new FileOutputStream("build/aligned.pdf");
|
|
@ -6,11 +6,11 @@ import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.VerticalSpacer;
|
import org.xbib.graphics.pdfbox.layout.elements.VerticalSpacer;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.render.ColumnLayout;
|
import org.xbib.graphics.pdfbox.layout.elements.render.ColumnLayout;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayoutHint;
|
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayoutHint;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.BaseFont;
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
public class Columns {
|
public class ColumnsTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() throws Exception {
|
public void test() throws Exception {
|
||||||
|
@ -35,7 +35,7 @@ public class Columns {
|
||||||
Document document = new Document(40, 50, 40, 60);
|
Document document = new Document(40, 50, 40, 60);
|
||||||
|
|
||||||
Paragraph title = new Paragraph();
|
Paragraph title = new Paragraph();
|
||||||
title.addMarkup("*This Text is organized in Colums*", 20, BaseFont.Times);
|
title.addMarkup("*This Text is organized in Colums*", 20, BaseFont.TIMES);
|
||||||
document.add(title, VerticalLayoutHint.CENTER);
|
document.add(title, VerticalLayoutHint.CENTER);
|
||||||
document.add(new VerticalSpacer(5));
|
document.add(new VerticalSpacer(5));
|
||||||
|
|
||||||
|
@ -43,15 +43,15 @@ public class Columns {
|
||||||
document.add(new ColumnLayout(2, 10));
|
document.add(new ColumnLayout(2, 10));
|
||||||
|
|
||||||
Paragraph paragraph1 = new Paragraph();
|
Paragraph paragraph1 = new Paragraph();
|
||||||
paragraph1.addMarkup(text1, 11, BaseFont.Times);
|
paragraph1.addMarkup(text1, 11, BaseFont.TIMES);
|
||||||
document.add(paragraph1);
|
document.add(paragraph1);
|
||||||
|
|
||||||
Paragraph paragraph2 = new Paragraph();
|
Paragraph paragraph2 = new Paragraph();
|
||||||
paragraph2.addMarkup(text2, 12, BaseFont.Helvetica);
|
paragraph2.addMarkup(text2, 12, BaseFont.HELVETICA);
|
||||||
document.add(paragraph2);
|
document.add(paragraph2);
|
||||||
|
|
||||||
Paragraph paragraph3 = new Paragraph();
|
Paragraph paragraph3 = new Paragraph();
|
||||||
paragraph3.addMarkup(text1, 8, BaseFont.Courier);
|
paragraph3.addMarkup(text1, 8, BaseFont.COURIER);
|
||||||
document.add(paragraph3);
|
document.add(paragraph3);
|
||||||
|
|
||||||
document.add(paragraph1);
|
document.add(paragraph1);
|
||||||
|
@ -79,9 +79,7 @@ public class Columns {
|
||||||
document.add(paragraph3);
|
document.add(paragraph3);
|
||||||
document.add(paragraph2);
|
document.add(paragraph2);
|
||||||
document.add(paragraph2);
|
document.add(paragraph2);
|
||||||
|
|
||||||
final OutputStream outputStream = new FileOutputStream("build/columns.pdf");
|
final OutputStream outputStream = new FileOutputStream("build/columns.pdf");
|
||||||
document.save(outputStream);
|
document.save(outputStream);
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
|
@ -2,13 +2,12 @@ package org.xbib.graphics.pdfbox.layout.test;
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.PDDocument;
|
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||||
import org.apache.pdfbox.pdmodel.common.PDRectangle;
|
import org.apache.pdfbox.pdmodel.common.PDRectangle;
|
||||||
import org.apache.pdfbox.pdmodel.font.PDType1Font;
|
|
||||||
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationTextMarkup;
|
import org.apache.pdfbox.pdmodel.interactive.annotation.PDAnnotationTextMarkup;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.PageFormat;
|
import org.xbib.graphics.pdfbox.layout.elements.PageFormat;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.BaseFont;
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.DrawContext;
|
import org.xbib.graphics.pdfbox.layout.text.DrawContext;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Position;
|
import org.xbib.graphics.pdfbox.layout.text.Position;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.annotations.Annotated;
|
import org.xbib.graphics.pdfbox.layout.text.annotations.Annotated;
|
||||||
|
@ -29,7 +28,7 @@ import java.util.List;
|
||||||
import java.util.regex.Matcher;
|
import java.util.regex.Matcher;
|
||||||
import java.util.regex.Pattern;
|
import java.util.regex.Pattern;
|
||||||
|
|
||||||
public class CustomAnnotation {
|
public class CustomAnnotationTest {
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Represents a highlight annotation that might be added to a
|
* Represents a highlight annotation that might be added to a
|
||||||
|
@ -192,19 +191,19 @@ public class CustomAnnotation {
|
||||||
.margins(40, 60, 40, 60).portrait().build());
|
.margins(40, 60, 40, 60).portrait().build());
|
||||||
|
|
||||||
Paragraph paragraph = new Paragraph();
|
Paragraph paragraph = new Paragraph();
|
||||||
paragraph.addText("Hello there, here is ", 10, PDType1Font.HELVETICA);
|
paragraph.addText("Hello there, here is ", 10, BaseFont.HELVETICA);
|
||||||
|
|
||||||
// now add some annotated text using our custom highlight annotation
|
// now add some annotated text using our custom highlight annotation
|
||||||
HighlightAnnotation annotation = new HighlightAnnotation(Color.green);
|
HighlightAnnotation annotation = new HighlightAnnotation(Color.green);
|
||||||
AnnotatedStyledText highlightedText = new AnnotatedStyledText(
|
AnnotatedStyledText highlightedText = new AnnotatedStyledText(
|
||||||
"highlighted text", 10, PDType1Font.HELVETICA, Color.black, 0f,
|
"highlighted text", 10, BaseFont.HELVETICA, Color.black, 0f,
|
||||||
Collections.singleton(annotation));
|
Collections.singleton(annotation));
|
||||||
paragraph.add(highlightedText);
|
paragraph.add(highlightedText);
|
||||||
|
|
||||||
paragraph
|
paragraph
|
||||||
.addText(
|
.addText(
|
||||||
". Do whatever you want here...strike, squiggle, whatsoever\n\n",
|
". Do whatever you want here...strike, squiggle, whatsoever\n\n",
|
||||||
10, PDType1Font.HELVETICA);
|
10, BaseFont.HELVETICA);
|
||||||
paragraph.setMaxWidth(150);
|
paragraph.setMaxWidth(150);
|
||||||
document.add(paragraph);
|
document.add(paragraph);
|
||||||
|
|
||||||
|
@ -216,7 +215,7 @@ public class CustomAnnotation {
|
||||||
.addMarkup(
|
.addMarkup(
|
||||||
"Hello there, here is {hl:#ffff00}highlighted text{hl}. "
|
"Hello there, here is {hl:#ffff00}highlighted text{hl}. "
|
||||||
+ "Do whatever you want here...strike, squiggle, whatsoever\n\n",
|
+ "Do whatever you want here...strike, squiggle, whatsoever\n\n",
|
||||||
10, BaseFont.Helvetica);
|
10, BaseFont.HELVETICA);
|
||||||
paragraph.setMaxWidth(150);
|
paragraph.setMaxWidth(150);
|
||||||
document.add(paragraph);
|
document.add(paragraph);
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.test;
|
package org.xbib.graphics.pdfbox.layout.test;
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.font.PDType1Font;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Element;
|
import org.xbib.graphics.pdfbox.layout.elements.Element;
|
||||||
|
@ -14,7 +13,7 @@ import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayoutHint;
|
||||||
import org.xbib.graphics.pdfbox.layout.shape.Stroke;
|
import org.xbib.graphics.pdfbox.layout.shape.Stroke;
|
||||||
import org.xbib.graphics.pdfbox.layout.shape.Stroke.CapStyle;
|
import org.xbib.graphics.pdfbox.layout.shape.Stroke.CapStyle;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.BaseFont;
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Position;
|
import org.xbib.graphics.pdfbox.layout.text.Position;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.TextFlow;
|
import org.xbib.graphics.pdfbox.layout.text.TextFlow;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.TextFlowUtil;
|
import org.xbib.graphics.pdfbox.layout.text.TextFlowUtil;
|
||||||
|
@ -52,9 +51,9 @@ public class CustomRenderer {
|
||||||
document.addRenderListener(sectionRenderer);
|
document.addRenderListener(sectionRenderer);
|
||||||
|
|
||||||
Paragraph paragraph = new Paragraph();
|
Paragraph paragraph = new Paragraph();
|
||||||
paragraph.addMarkup(text1, 11, BaseFont.Times);
|
paragraph.addMarkup(text1, 11, BaseFont.TIMES);
|
||||||
paragraph.addMarkup(text2, 12, BaseFont.Helvetica);
|
paragraph.addMarkup(text2, 12, BaseFont.HELVETICA);
|
||||||
paragraph.addMarkup(text1, 8, BaseFont.Courier);
|
paragraph.addMarkup(text1, 8, BaseFont.COURIER);
|
||||||
|
|
||||||
document.add(new Section(1));
|
document.add(new Section(1));
|
||||||
document.add(paragraph);
|
document.add(paragraph);
|
||||||
|
@ -108,29 +107,13 @@ public class CustomRenderer {
|
||||||
public void afterPage(RenderContext renderContext) throws IOException {
|
public void afterPage(RenderContext renderContext) throws IOException {
|
||||||
String content = String.format("Section %s, Page %s",
|
String content = String.format("Section %s, Page %s",
|
||||||
sectionNumber, renderContext.getPageIndex() + 1);
|
sectionNumber, renderContext.getPageIndex() + 1);
|
||||||
TextFlow text = TextFlowUtil.createTextFlow(content, 11,
|
TextFlow text = TextFlowUtil.createTextFlow(content, 11, BaseFont.TIMES);
|
||||||
PDType1Font.TIMES_ROMAN);
|
float offset = renderContext.getPageFormat().getMarginLeft() +
|
||||||
float offset = renderContext.getPageFormat().getMarginLeft()
|
TextSequenceUtil.getOffset(text, renderContext.getWidth(), Alignment.RIGHT);
|
||||||
+ TextSequenceUtil.getOffset(text,
|
|
||||||
renderContext.getWidth(), Alignment.Right);
|
|
||||||
text.drawText(renderContext.getContentStream(), new Position(
|
text.drawText(renderContext.getContentStream(), new Position(
|
||||||
offset, 30), Alignment.Right, null);
|
offset, 30), Alignment.RIGHT, null);
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
public static class Section extends Paragraph {
|
|
||||||
private final int number;
|
|
||||||
|
|
||||||
public Section(int number) throws IOException {
|
|
||||||
super();
|
|
||||||
this.number = number;
|
|
||||||
addMarkup(String.format("*Section %d", number), 16, BaseFont.Times);
|
|
||||||
}
|
|
||||||
|
|
||||||
public int getNumber() {
|
|
||||||
return number;
|
|
||||||
}
|
|
||||||
|
|
||||||
}
|
|
||||||
}
|
}
|
|
@ -3,7 +3,7 @@ package org.xbib.graphics.pdfbox.layout.test;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Frame;
|
import org.xbib.graphics.pdfbox.layout.elements.Frame;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.PageFormat;
|
import org.xbib.graphics.pdfbox.layout.elements.PageFormats;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayoutHint;
|
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayoutHint;
|
||||||
import org.xbib.graphics.pdfbox.layout.shape.Ellipse;
|
import org.xbib.graphics.pdfbox.layout.shape.Ellipse;
|
||||||
|
@ -11,13 +11,12 @@ import org.xbib.graphics.pdfbox.layout.shape.Rect;
|
||||||
import org.xbib.graphics.pdfbox.layout.shape.RoundRect;
|
import org.xbib.graphics.pdfbox.layout.shape.RoundRect;
|
||||||
import org.xbib.graphics.pdfbox.layout.shape.Stroke;
|
import org.xbib.graphics.pdfbox.layout.shape.Stroke;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.BaseFont;
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Constants;
|
|
||||||
import java.awt.Color;
|
import java.awt.Color;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
public class Frames {
|
public class FramesTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() throws Exception {
|
public void test() throws Exception {
|
||||||
|
@ -39,10 +38,10 @@ public class Frames {
|
||||||
+ "eos et _accusam et *justo* duo dolores_ et ea rebum. Stet clita kasd "
|
+ "eos et _accusam et *justo* duo dolores_ et ea rebum. Stet clita kasd "
|
||||||
+ "gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n";
|
+ "gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n";
|
||||||
|
|
||||||
Document document = new Document(new PageFormat(Constants.A5));
|
Document document = new Document(PageFormats.A5_PORTRAIT);
|
||||||
|
|
||||||
Paragraph paragraph = new Paragraph();
|
Paragraph paragraph = new Paragraph();
|
||||||
paragraph.addMarkup("Am I living in a box?", 11, BaseFont.Times);
|
paragraph.addMarkup("Am I living in a box?", 11, BaseFont.TIMES);
|
||||||
Frame frame = new Frame(paragraph);
|
Frame frame = new Frame(paragraph);
|
||||||
frame.setShape(new Rect());
|
frame.setShape(new Rect());
|
||||||
frame.setBorder(Color.black, new Stroke());
|
frame.setBorder(Color.black, new Stroke());
|
||||||
|
@ -51,7 +50,7 @@ public class Frames {
|
||||||
document.add(frame, VerticalLayoutHint.CENTER);
|
document.add(frame, VerticalLayoutHint.CENTER);
|
||||||
|
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
paragraph.addMarkup(text1, 11, BaseFont.Times);
|
paragraph.addMarkup(text1, 11, BaseFont.TIMES);
|
||||||
frame = new Frame(paragraph, 200f, null);
|
frame = new Frame(paragraph, 200f, null);
|
||||||
frame.setShape(new Rect());
|
frame.setShape(new Rect());
|
||||||
frame.setBackgroundColor(Color.black);
|
frame.setBackgroundColor(Color.black);
|
||||||
|
@ -60,8 +59,8 @@ public class Frames {
|
||||||
document.add(frame);
|
document.add(frame);
|
||||||
|
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
paragraph.addMarkup("{color:#aa00aa}*Ain't no rectangle*", 22, BaseFont.Helvetica);
|
paragraph.addMarkup("{color:#aa00aa}*Ain't no rectangle*", 22, BaseFont.HELVETICA);
|
||||||
paragraph.setAlignment(Alignment.Center);
|
paragraph.setAlignment(Alignment.CENTER);
|
||||||
frame = new Frame(paragraph, 300f, 100f);
|
frame = new Frame(paragraph, 300f, 100f);
|
||||||
frame.setShape(new Ellipse());
|
frame.setShape(new Ellipse());
|
||||||
frame.setBorder(Color.green, new Stroke(2));
|
frame.setBorder(Color.green, new Stroke(2));
|
||||||
|
@ -71,9 +70,9 @@ public class Frames {
|
||||||
document.add(frame);
|
document.add(frame);
|
||||||
|
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
paragraph.addMarkup("Frames also paginate, see here:\n\n", 13, BaseFont.Times);
|
paragraph.addMarkup("Frames also paginate, see here:\n\n", 13, BaseFont.TIMES);
|
||||||
paragraph.addMarkup(text2, 11, BaseFont.Times);
|
paragraph.addMarkup(text2, 11, BaseFont.TIMES);
|
||||||
paragraph.addMarkup(text2, 11, BaseFont.Times);
|
paragraph.addMarkup(text2, 11, BaseFont.TIMES);
|
||||||
frame = new Frame(paragraph, null, null);
|
frame = new Frame(paragraph, null, null);
|
||||||
frame.setShape(new RoundRect(10));
|
frame.setShape(new RoundRect(10));
|
||||||
frame.setBorder(Color.magenta, new Stroke(3));
|
frame.setBorder(Color.magenta, new Stroke(3));
|
||||||
|
@ -82,8 +81,8 @@ public class Frames {
|
||||||
frame.setMargin(50, 50, 20, 10);
|
frame.setMargin(50, 50, 20, 10);
|
||||||
|
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
paragraph.addMarkup(text2, 11, BaseFont.Times);
|
paragraph.addMarkup(text2, 11, BaseFont.TIMES);
|
||||||
paragraph.addMarkup(text2, 11, BaseFont.Times);
|
paragraph.addMarkup(text2, 11, BaseFont.TIMES);
|
||||||
frame.add(paragraph);
|
frame.add(paragraph);
|
||||||
|
|
||||||
document.add(frame);
|
document.add(frame);
|
|
@ -0,0 +1,38 @@
|
||||||
|
package org.xbib.graphics.pdfbox.layout.test;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.xbib.graphics.barcode.Code3Of9;
|
||||||
|
import org.xbib.graphics.barcode.HumanReadableLocation;
|
||||||
|
import org.xbib.graphics.barcode.Symbol;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.elements.BarcodeElement;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.elements.PageFormats;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayoutHint;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.font.NotoSansFont;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.text.Indent;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.text.SpaceUnit;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
public class HelloBarcodeTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() throws Exception {
|
||||||
|
Document document = new Document(PageFormats.A4_PORTRAIT);
|
||||||
|
Paragraph paragraph = new Paragraph();
|
||||||
|
paragraph.add(new Indent(50, SpaceUnit.pt));
|
||||||
|
paragraph.addMarkup("Hello Barcode\n", 12, BaseFont.HELVETICA);
|
||||||
|
document.add(paragraph);
|
||||||
|
Symbol symbol = new Code3Of9();
|
||||||
|
symbol.setContent("1234567890");
|
||||||
|
symbol.setBarHeight(150);
|
||||||
|
symbol.setHumanReadableLocation(HumanReadableLocation.BOTTOM);
|
||||||
|
BarcodeElement barcodeElement = new BarcodeElement(symbol);
|
||||||
|
document.add(barcodeElement, new VerticalLayoutHint(Alignment.LEFT, 10, 10, 10, 10, true));
|
||||||
|
final OutputStream outputStream = new FileOutputStream("build/hellobarcode.pdf");
|
||||||
|
document.save(outputStream);
|
||||||
|
}
|
||||||
|
}
|
|
@ -0,0 +1,28 @@
|
||||||
|
package org.xbib.graphics.pdfbox.layout.test;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.elements.ImageElement;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayoutHint;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
|
||||||
|
public class HelloCatTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() throws Exception {
|
||||||
|
Document document = new Document();
|
||||||
|
Paragraph paragraph = new Paragraph();
|
||||||
|
paragraph.addText("Hello Cat", 12, BaseFont.HELVETICA);
|
||||||
|
document.add(paragraph);
|
||||||
|
ImageElement imageElement = new ImageElement(ImageIO.read(getClass().getResourceAsStream("cat.jpg")));
|
||||||
|
imageElement.setScale(0.1f);
|
||||||
|
document.add(imageElement, new VerticalLayoutHint(Alignment.LEFT, 10, 10, 10, 10, true));
|
||||||
|
final OutputStream outputStream = new FileOutputStream("build/hellocat.pdf");
|
||||||
|
document.save(outputStream);
|
||||||
|
}
|
||||||
|
}
|
|
@ -1,9 +1,9 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.test;
|
package org.xbib.graphics.pdfbox.layout.test;
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.font.PDType1Font;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
@ -14,10 +14,8 @@ public class HelloDoc {
|
||||||
Document document = new Document(40, 60, 40, 60);
|
Document document = new Document(40, 60, 40, 60);
|
||||||
|
|
||||||
Paragraph paragraph = new Paragraph();
|
Paragraph paragraph = new Paragraph();
|
||||||
paragraph.addText("Hello Document", 20,
|
paragraph.addText("Hello Document", 20, BaseFont.HELVETICA);
|
||||||
PDType1Font.HELVETICA);
|
|
||||||
document.add(paragraph);
|
document.add(paragraph);
|
||||||
|
|
||||||
final OutputStream outputStream = new FileOutputStream("build/hellodoc.pdf");
|
final OutputStream outputStream = new FileOutputStream("build/hellodoc.pdf");
|
||||||
document.save(outputStream);
|
document.save(outputStream);
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
package org.xbib.graphics.pdfbox.layout.test;
|
||||||
|
|
||||||
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.elements.PageFormats;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.font.NotoSansFont;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.text.Indent;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.text.SpaceUnit;
|
||||||
|
import java.io.FileOutputStream;
|
||||||
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
public class HelloNotoFontTest {
|
||||||
|
|
||||||
|
@Test
|
||||||
|
public void test() throws Exception {
|
||||||
|
Document document = new Document(PageFormats.A4_PORTRAIT);
|
||||||
|
Paragraph paragraph = new Paragraph();
|
||||||
|
paragraph.add(new Indent(32, SpaceUnit.pt));
|
||||||
|
paragraph.addMarkup("Hello Noto Regular\n", 12, new NotoSansFont(document.getPDDocument()));
|
||||||
|
paragraph.addMarkup("*Hello Noto Bold*\n", 12, new NotoSansFont(document.getPDDocument()));
|
||||||
|
paragraph.addMarkup("_Hello Noto Italic_\n", 12, new NotoSansFont(document.getPDDocument()));
|
||||||
|
paragraph.addMarkup("*_Hello Noto Bold Italic_*\n", 12, new NotoSansFont(document.getPDDocument()));
|
||||||
|
document.add(paragraph);
|
||||||
|
final OutputStream outputStream = new FileOutputStream("build/hellonotofont.pdf");
|
||||||
|
document.save(outputStream);
|
||||||
|
}
|
||||||
|
}
|
|
@ -5,7 +5,7 @@ import org.junit.jupiter.api.Test;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.BaseFont;
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Indent;
|
import org.xbib.graphics.pdfbox.layout.text.Indent;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.SpaceUnit;
|
import org.xbib.graphics.pdfbox.layout.text.SpaceUnit;
|
||||||
import org.xbib.graphics.pdfbox.layout.util.CompatibilityHelper;
|
import org.xbib.graphics.pdfbox.layout.util.CompatibilityHelper;
|
||||||
|
@ -17,121 +17,115 @@ import org.xbib.graphics.pdfbox.layout.util.Enumerators.RomanEnumerator;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
public class Indentation {
|
public class IndentationTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() throws Exception {
|
public void test() throws Exception {
|
||||||
String bulletOdd = CompatibilityHelper.getBulletCharacter(1) + " ";
|
String bulletOdd = CompatibilityHelper.getBulletCharacter(1) + " ";
|
||||||
String bulletEven = CompatibilityHelper.getBulletCharacter(2) + " ";
|
String bulletEven = CompatibilityHelper.getBulletCharacter(2) + " ";
|
||||||
String text1 = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, "
|
|
||||||
+ "sed diam nonumy eirmod tempor invidunt ut labore et dolore magna "
|
|
||||||
+ "aliquyam erat\n";
|
|
||||||
|
|
||||||
Document document = new Document(40, 60, 40, 60);
|
Document document = new Document(40, 60, 40, 60);
|
||||||
Paragraph paragraph = new Paragraph();
|
Paragraph paragraph = new Paragraph();
|
||||||
paragraph
|
paragraph.addMarkup("This is an example for the new indent feature. Let's do some empty space indentation:\n",
|
||||||
.addMarkup(
|
11, BaseFont.TIMES);
|
||||||
"This is an example for the new indent feature. Let's do some empty space indentation:\n",
|
|
||||||
11, BaseFont.Times);
|
|
||||||
paragraph.add(new Indent(50, SpaceUnit.pt));
|
paragraph.add(new Indent(50, SpaceUnit.pt));
|
||||||
paragraph.addMarkup("Here we go indented.\n", 11, BaseFont.Times);
|
paragraph.addMarkup("Here we go indented.\n", 11, BaseFont.TIMES);
|
||||||
paragraph.addMarkup(
|
paragraph.addMarkup("The Indentation holds for the rest of the paragraph, or... \n",
|
||||||
"The Indentation holds for the rest of the paragraph, or... \n",
|
11, BaseFont.TIMES);
|
||||||
11, BaseFont.Times);
|
|
||||||
paragraph.add(new Indent(70, SpaceUnit.pt));
|
paragraph.add(new Indent(70, SpaceUnit.pt));
|
||||||
paragraph.addMarkup("any new indent comes.\n", 11, BaseFont.Times);
|
paragraph.addMarkup("any new indent comes.\n", 11, BaseFont.TIMES);
|
||||||
document.add(paragraph);
|
document.add(paragraph);
|
||||||
|
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
paragraph
|
paragraph
|
||||||
.addMarkup(
|
.addMarkup(
|
||||||
"New paragraph, now indentation is gone. But we can indent with a label also:\n",
|
"New paragraph, now indentation is gone. But we can indent with a label also:\n",
|
||||||
11, BaseFont.Times);
|
11, BaseFont.TIMES);
|
||||||
paragraph.add(new Indent("This is some label", 100, SpaceUnit.pt, 11,
|
paragraph.add(new Indent("This is some label", 100, SpaceUnit.pt, 11,
|
||||||
PDType1Font.TIMES_BOLD));
|
PDType1Font.TIMES_BOLD));
|
||||||
paragraph.addMarkup("Here we go indented.\n", 11, BaseFont.Times);
|
paragraph.addMarkup("Here we go indented.\n", 11, BaseFont.TIMES);
|
||||||
paragraph
|
paragraph
|
||||||
.addMarkup(
|
.addMarkup(
|
||||||
"And again, the Indentation holds for the rest of the paragraph, or any new indent comes.\nLabels can be aligned:\n",
|
"And again, the Indentation holds for the rest of the paragraph, or any new indent comes.\nLabels can be aligned:\n",
|
||||||
11, BaseFont.Times);
|
11, BaseFont.TIMES);
|
||||||
paragraph.add(new Indent("Left", 100, SpaceUnit.pt, 11,
|
paragraph.add(new Indent("Left", 100, SpaceUnit.pt, 11,
|
||||||
PDType1Font.TIMES_BOLD, Alignment.Left));
|
PDType1Font.TIMES_BOLD, Alignment.LEFT));
|
||||||
paragraph.addMarkup("Indent with label aligned to the left.\n", 11,
|
paragraph.addMarkup("Indent with label aligned to the left.\n", 11,
|
||||||
BaseFont.Times);
|
BaseFont.TIMES);
|
||||||
paragraph.add(new Indent("Center", 100, SpaceUnit.pt, 11,
|
paragraph.add(new Indent("Center", 100, SpaceUnit.pt, 11,
|
||||||
PDType1Font.TIMES_BOLD, Alignment.Center));
|
PDType1Font.TIMES_BOLD, Alignment.CENTER));
|
||||||
paragraph.addMarkup("Indent with label aligned to the center.\n", 11,
|
paragraph.addMarkup("Indent with label aligned to the center.\n", 11,
|
||||||
BaseFont.Times);
|
BaseFont.TIMES);
|
||||||
paragraph.add(new Indent("Right", 100, SpaceUnit.pt, 11,
|
paragraph.add(new Indent("Right", 100, SpaceUnit.pt, 11,
|
||||||
PDType1Font.TIMES_BOLD, Alignment.Right));
|
PDType1Font.TIMES_BOLD, Alignment.RIGHT));
|
||||||
paragraph.addMarkup("Indent with label aligned to the right.\n", 11,
|
paragraph.addMarkup("Indent with label aligned to the right.\n", 11,
|
||||||
BaseFont.Times);
|
BaseFont.TIMES);
|
||||||
document.add(paragraph);
|
document.add(paragraph);
|
||||||
|
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
paragraph.addMarkup(
|
paragraph.addMarkup(
|
||||||
"So, what can you do with that? How about lists:\n", 11,
|
"So, what can you do with that? How about lists:\n", 11,
|
||||||
BaseFont.Times);
|
BaseFont.TIMES);
|
||||||
paragraph.add(new Indent(bulletOdd, 4, SpaceUnit.em, 11,
|
paragraph.add(new Indent(bulletOdd, 4, SpaceUnit.em, 11,
|
||||||
PDType1Font.TIMES_BOLD, Alignment.Right));
|
PDType1Font.TIMES_BOLD, Alignment.RIGHT));
|
||||||
paragraph.addMarkup("This is a list item\n", 11, BaseFont.Times);
|
paragraph.addMarkup("This is a list item\n", 11, BaseFont.TIMES);
|
||||||
paragraph.add(new Indent(bulletOdd, 4, SpaceUnit.em, 11,
|
paragraph.add(new Indent(bulletOdd, 4, SpaceUnit.em, 11,
|
||||||
PDType1Font.TIMES_BOLD, Alignment.Right));
|
PDType1Font.TIMES_BOLD, Alignment.RIGHT));
|
||||||
paragraph.addMarkup("Another list item\n", 11, BaseFont.Times);
|
paragraph.addMarkup("Another list item\n", 11, BaseFont.TIMES);
|
||||||
paragraph.add(new Indent(bulletEven, 8, SpaceUnit.em, 11,
|
paragraph.add(new Indent(bulletEven, 8, SpaceUnit.em, 11,
|
||||||
PDType1Font.TIMES_BOLD, Alignment.Right));
|
PDType1Font.TIMES_BOLD, Alignment.RIGHT));
|
||||||
paragraph.addMarkup("Sub list item\n", 11, BaseFont.Times);
|
paragraph.addMarkup("Sub list item\n", 11, BaseFont.TIMES);
|
||||||
paragraph.add(new Indent(bulletOdd, 4, SpaceUnit.em, 11,
|
paragraph.add(new Indent(bulletOdd, 4, SpaceUnit.em, 11,
|
||||||
PDType1Font.TIMES_BOLD, Alignment.Right));
|
PDType1Font.TIMES_BOLD, Alignment.RIGHT));
|
||||||
paragraph.addMarkup("And yet another one\n", 11, BaseFont.Times);
|
paragraph.addMarkup("And yet another one\n", 11, BaseFont.TIMES);
|
||||||
document.add(paragraph);
|
document.add(paragraph);
|
||||||
|
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
paragraph.addMarkup("Also available with indents: Enumerators:\n", 11,
|
paragraph.addMarkup("Also available with indents: Enumerators:\n", 11,
|
||||||
BaseFont.Times);
|
BaseFont.TIMES);
|
||||||
RomanEnumerator e1 = new RomanEnumerator();
|
RomanEnumerator e1 = new RomanEnumerator();
|
||||||
LowerCaseAlphabeticEnumerator e2 = new LowerCaseAlphabeticEnumerator();
|
LowerCaseAlphabeticEnumerator e2 = new LowerCaseAlphabeticEnumerator();
|
||||||
paragraph.add(new Indent(e1.next() + ". ", 4, SpaceUnit.em, 11,
|
paragraph.add(new Indent(e1.next() + ". ", 4, SpaceUnit.em, 11,
|
||||||
PDType1Font.TIMES_BOLD, Alignment.Right));
|
PDType1Font.TIMES_BOLD, Alignment.RIGHT));
|
||||||
paragraph.addMarkup("First item\n", 11, BaseFont.Times);
|
paragraph.addMarkup("First item\n", 11, BaseFont.TIMES);
|
||||||
paragraph.add(new Indent(e1.next() + ". ", 4, SpaceUnit.em, 11,
|
paragraph.add(new Indent(e1.next() + ". ", 4, SpaceUnit.em, 11,
|
||||||
PDType1Font.TIMES_BOLD, Alignment.Right));
|
PDType1Font.TIMES_BOLD, Alignment.RIGHT));
|
||||||
paragraph.addMarkup("Second item\n", 11, BaseFont.Times);
|
paragraph.addMarkup("Second item\n", 11, BaseFont.TIMES);
|
||||||
paragraph.add(new Indent(e2.next() + ") ", 8, SpaceUnit.em, 11,
|
paragraph.add(new Indent(e2.next() + ") ", 8, SpaceUnit.em, 11,
|
||||||
PDType1Font.TIMES_BOLD, Alignment.Right));
|
PDType1Font.TIMES_BOLD, Alignment.RIGHT));
|
||||||
paragraph.addMarkup("A sub item\n", 11, BaseFont.Times);
|
paragraph.addMarkup("A sub item\n", 11, BaseFont.TIMES);
|
||||||
paragraph.add(new Indent(e2.next() + ") ", 8, SpaceUnit.em, 11,
|
paragraph.add(new Indent(e2.next() + ") ", 8, SpaceUnit.em, 11,
|
||||||
PDType1Font.TIMES_BOLD, Alignment.Right));
|
PDType1Font.TIMES_BOLD, Alignment.RIGHT));
|
||||||
paragraph.addMarkup("Another sub item\n", 11, BaseFont.Times);
|
paragraph.addMarkup("Another sub item\n", 11, BaseFont.TIMES);
|
||||||
paragraph.add(new Indent(e1.next() + ". ", 4, SpaceUnit.em, 11,
|
paragraph.add(new Indent(e1.next() + ". ", 4, SpaceUnit.em, 11,
|
||||||
PDType1Font.TIMES_BOLD, Alignment.Right));
|
PDType1Font.TIMES_BOLD, Alignment.RIGHT));
|
||||||
paragraph.addMarkup("Third item\n", 11, BaseFont.Times);
|
paragraph.addMarkup("Third item\n", 11, BaseFont.TIMES);
|
||||||
document.add(paragraph);
|
document.add(paragraph);
|
||||||
|
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
paragraph.addMarkup("The following types are built in:\n", 11,
|
paragraph.addMarkup("The following types are built in:\n", 11,
|
||||||
BaseFont.Times);
|
BaseFont.TIMES);
|
||||||
paragraph.add(new Indent(new ArabicEnumerator().next() + " ", 4,
|
paragraph.add(new Indent(new ArabicEnumerator().next() + " ", 4,
|
||||||
SpaceUnit.em, 11, PDType1Font.TIMES_BOLD, Alignment.Right));
|
SpaceUnit.em, 11, PDType1Font.TIMES_BOLD, Alignment.RIGHT));
|
||||||
paragraph.addMarkup("ArabicEnumerator\n", 11, BaseFont.Times);
|
paragraph.addMarkup("ArabicEnumerator\n", 11, BaseFont.TIMES);
|
||||||
paragraph.add(new Indent(new RomanEnumerator().next() + " ", 4,
|
paragraph.add(new Indent(new RomanEnumerator().next() + " ", 4,
|
||||||
SpaceUnit.em, 11, PDType1Font.TIMES_BOLD, Alignment.Right));
|
SpaceUnit.em, 11, PDType1Font.TIMES_BOLD, Alignment.RIGHT));
|
||||||
paragraph.addMarkup("RomanEnumerator\n", 11, BaseFont.Times);
|
paragraph.addMarkup("RomanEnumerator\n", 11, BaseFont.TIMES);
|
||||||
paragraph.add(new Indent(new LowerCaseRomanEnumerator().next() + " ",
|
paragraph.add(new Indent(new LowerCaseRomanEnumerator().next() + " ",
|
||||||
4, SpaceUnit.em, 11, PDType1Font.TIMES_BOLD, Alignment.Right));
|
4, SpaceUnit.em, 11, PDType1Font.TIMES_BOLD, Alignment.RIGHT));
|
||||||
paragraph.addMarkup("LowerCaseRomanEnumerator\n", 11, BaseFont.Times);
|
paragraph.addMarkup("LowerCaseRomanEnumerator\n", 11, BaseFont.TIMES);
|
||||||
paragraph.add(new Indent(new AlphabeticEnumerator().next() + " ", 4,
|
paragraph.add(new Indent(new AlphabeticEnumerator().next() + " ", 4,
|
||||||
SpaceUnit.em, 11, PDType1Font.TIMES_BOLD, Alignment.Right));
|
SpaceUnit.em, 11, PDType1Font.TIMES_BOLD, Alignment.RIGHT));
|
||||||
paragraph.addMarkup("AlphabeticEnumerator\n", 11, BaseFont.Times);
|
paragraph.addMarkup("AlphabeticEnumerator\n", 11, BaseFont.TIMES);
|
||||||
paragraph.add(new Indent(new LowerCaseAlphabeticEnumerator().next()
|
paragraph.add(new Indent(new LowerCaseAlphabeticEnumerator().next()
|
||||||
+ " ", 4, SpaceUnit.em, 11, PDType1Font.TIMES_BOLD,
|
+ " ", 4, SpaceUnit.em, 11, PDType1Font.TIMES_BOLD,
|
||||||
Alignment.Right));
|
Alignment.RIGHT));
|
||||||
paragraph.addMarkup("LowerCaseAlphabeticEnumerator\n", 11,
|
paragraph.addMarkup("LowerCaseAlphabeticEnumerator\n", 11,
|
||||||
BaseFont.Times);
|
BaseFont.TIMES);
|
||||||
document.add(paragraph);
|
document.add(paragraph);
|
||||||
|
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
text1 = "For your convenience, you can do all that much easier with markup, e.g. simple indentation\n"
|
String text1 = "For your convenience, you can do all that much easier with markup, e.g. simple indentation\n"
|
||||||
+ "--At vero eos et accusam\n\n"
|
+ "--At vero eos et accusam\n\n"
|
||||||
+ "-!And end the indentation. Now a list:\n"
|
+ "-!And end the indentation. Now a list:\n"
|
||||||
+ "-+This is a list item\n"
|
+ "-+This is a list item\n"
|
||||||
|
@ -148,7 +142,7 @@ public class Indentation {
|
||||||
+ "-#{I ->:5}Another list item\n"
|
+ "-#{I ->:5}Another list item\n"
|
||||||
+ " -#{a ~:30pt}A sub list item\n"
|
+ " -#{a ~:30pt}A sub list item\n"
|
||||||
+ "-#{I ->:5}And yet another one\n\n";
|
+ "-#{I ->:5}And yet another one\n\n";
|
||||||
paragraph.addMarkup(text1, 11, BaseFont.Times);
|
paragraph.addMarkup(text1, 11, BaseFont.TIMES);
|
||||||
document.add(paragraph);
|
document.add(paragraph);
|
||||||
|
|
||||||
final OutputStream outputStream = new FileOutputStream("build/indentation.pdf");
|
final OutputStream outputStream = new FileOutputStream("build/indentation.pdf");
|
|
@ -9,7 +9,7 @@ import org.xbib.graphics.pdfbox.layout.elements.VerticalSpacer;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.render.ColumnLayout;
|
import org.xbib.graphics.pdfbox.layout.elements.render.ColumnLayout;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayout;
|
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayout;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayoutHint;
|
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayoutHint;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.BaseFont;
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
@ -36,16 +36,16 @@ public class Landscape {
|
||||||
+ "gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n";
|
+ "gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n";
|
||||||
|
|
||||||
Paragraph paragraph1 = new Paragraph();
|
Paragraph paragraph1 = new Paragraph();
|
||||||
paragraph1.addMarkup(text1, 11, BaseFont.Times);
|
paragraph1.addMarkup(text1, 11, BaseFont.TIMES);
|
||||||
Paragraph paragraph2 = new Paragraph();
|
Paragraph paragraph2 = new Paragraph();
|
||||||
paragraph2.addMarkup(text2, 12, BaseFont.Helvetica);
|
paragraph2.addMarkup(text2, 12, BaseFont.HELVETICA);
|
||||||
Paragraph paragraph3 = new Paragraph();
|
Paragraph paragraph3 = new Paragraph();
|
||||||
paragraph3.addMarkup(text1, 8, BaseFont.Courier);
|
paragraph3.addMarkup(text1, 8, BaseFont.COURIER);
|
||||||
|
|
||||||
Paragraph titleA4 = new Paragraph();
|
Paragraph titleA4 = new Paragraph();
|
||||||
titleA4.addMarkup("*Format A4 in Portrait*", 20, BaseFont.Times);
|
titleA4.addMarkup("*Format A4 in Portrait*", 20, BaseFont.TIMES);
|
||||||
Paragraph titleA5 = new Paragraph();
|
Paragraph titleA5 = new Paragraph();
|
||||||
titleA5.addMarkup("*Format A5 in Landscape*", 20, BaseFont.Times);
|
titleA5.addMarkup("*Format A5 in Landscape*", 20, BaseFont.TIMES);
|
||||||
|
|
||||||
PageFormat a5_landscape = PageFormat.with().A5().landscape().margins(10, 50, 0, 30).build();
|
PageFormat a5_landscape = PageFormat.with().A5().landscape().margins(10, 50, 0, 30).build();
|
||||||
PageFormat a4_portrait = PageFormat.with().margins(40, 50, 40, 60).build();
|
PageFormat a4_portrait = PageFormat.with().margins(40, 50, 40, 60).build();
|
||||||
|
|
|
@ -1,6 +1,5 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.test;
|
package org.xbib.graphics.pdfbox.layout.test;
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.font.PDType1Font;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.ImageElement;
|
import org.xbib.graphics.pdfbox.layout.elements.ImageElement;
|
||||||
|
@ -8,11 +7,13 @@ import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.VerticalSpacer;
|
import org.xbib.graphics.pdfbox.layout.elements.VerticalSpacer;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayoutHint;
|
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayoutHint;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.BaseFont;
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Position;
|
import org.xbib.graphics.pdfbox.layout.text.Position;
|
||||||
|
import java.awt.image.BufferedImage;
|
||||||
import java.io.File;
|
import java.io.File;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
import javax.imageio.ImageIO;
|
||||||
|
|
||||||
public class Letter {
|
public class Letter {
|
||||||
|
|
||||||
|
@ -24,32 +25,31 @@ public class Letter {
|
||||||
|
|
||||||
ImageElement image;
|
ImageElement image;
|
||||||
if (new File("arrow.png").exists()) {
|
if (new File("arrow.png").exists()) {
|
||||||
image = new ImageElement("arrow.png");
|
BufferedImage arrowImage = ImageIO.read(new File("arrow.png"));
|
||||||
|
image = new ImageElement(arrowImage);
|
||||||
} else {
|
} else {
|
||||||
image = new ImageElement(Letter.class.getResourceAsStream("arrow.png"));
|
BufferedImage arrowImage = ImageIO.read(getClass().getResourceAsStream("arrow.png"));
|
||||||
|
image = new ImageElement(arrowImage);
|
||||||
}
|
}
|
||||||
image.setWidth(image.getWidth() / 7);
|
image.setWidth(image.getWidth() / 7);
|
||||||
image.setHeight(image.getHeight() / 7);
|
image.setHeight(image.getHeight() / 7);
|
||||||
document.add(image, new VerticalLayoutHint(Alignment.Right, 0, 0,
|
document.add(image, new VerticalLayoutHint(Alignment.RIGHT, 0, 0, 0, 0, true));
|
||||||
0, 0, true));
|
|
||||||
|
|
||||||
document.add(new VerticalSpacer(100));
|
document.add(new VerticalSpacer(100));
|
||||||
|
|
||||||
Paragraph paragraph = new Paragraph();
|
Paragraph paragraph = new Paragraph();
|
||||||
paragraph.addText("Blubberhausen, 01.04.2016", 11,
|
paragraph.addText("Blubberhausen, 01.04.2016", 11, BaseFont.HELVETICA);
|
||||||
PDType1Font.HELVETICA);
|
document.add(paragraph, new VerticalLayoutHint(Alignment.RIGHT, 0, 0,
|
||||||
document.add(paragraph, new VerticalLayoutHint(Alignment.Right, 0, 0,
|
|
||||||
0, 0, true));
|
0, 0, true));
|
||||||
|
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
String address = "Ralf Stuckert\nAm Hollergraben 24\n67346 Blubberhausen";
|
String address = "Ralf Stuckert\nAm Hollergraben 24\n67346 Blubberhausen";
|
||||||
paragraph.addText(address, 11, PDType1Font.HELVETICA);
|
paragraph.addText(address, 11, BaseFont.HELVETICA);
|
||||||
document.add(paragraph);
|
document.add(paragraph);
|
||||||
|
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
paragraph.addMarkup("*Labore et dolore magna aliquyam erat*", 11,
|
paragraph.addMarkup("*Labore et dolore magna aliquyam erat*", 11, BaseFont.HELVETICA);
|
||||||
BaseFont.Helvetica);
|
document.add(paragraph, new VerticalLayoutHint(Alignment.LEFT, 0, 0,
|
||||||
document.add(paragraph, new VerticalLayoutHint(Alignment.Left, 0, 0,
|
|
||||||
40, 20));
|
40, 20));
|
||||||
|
|
||||||
String text = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, "
|
String text = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, "
|
||||||
|
@ -62,21 +62,21 @@ public class Letter {
|
||||||
+ "At vero eos et accusam* et justo duo dolores et ea rebum. Stet clita kasd "
|
+ "At vero eos et accusam* et justo duo dolores et ea rebum. Stet clita kasd "
|
||||||
+ "gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n\n";
|
+ "gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n\n";
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
paragraph.addMarkup(text, 11, BaseFont.Helvetica);
|
paragraph.addMarkup(text, 11, BaseFont.HELVETICA);
|
||||||
document.add(paragraph);
|
document.add(paragraph);
|
||||||
|
|
||||||
document.add(paragraph);
|
document.add(paragraph);
|
||||||
|
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
paragraph.addMarkup("Dolore magna aliquyam erat\nRalf Stuckert", 11,
|
paragraph.addMarkup("Dolore magna aliquyam erat\nRalf Stuckert", 11,
|
||||||
BaseFont.Helvetica);
|
BaseFont.HELVETICA);
|
||||||
document.add(paragraph, new VerticalLayoutHint(Alignment.Left, 60, 0,
|
document.add(paragraph, new VerticalLayoutHint(Alignment.LEFT, 60, 0,
|
||||||
40, 0));
|
40, 0));
|
||||||
|
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
paragraph.addMarkup("*Sanctus est:* Lorem ipsum dolor consetetur "
|
paragraph.addMarkup("*Sanctus est:* Lorem ipsum dolor consetetur "
|
||||||
+ "sadipscing sed diam nonumy eirmod tempor invidunt", 6,
|
+ "sadipscing sed diam nonumy eirmod tempor invidunt", 6,
|
||||||
BaseFont.Times);
|
BaseFont.TIMES);
|
||||||
paragraph.setAbsolutePosition(new Position(hMargin, vMargin));
|
paragraph.setAbsolutePosition(new Position(hMargin, vMargin));
|
||||||
document.add(paragraph);
|
document.add(paragraph);
|
||||||
|
|
||||||
|
|
|
@ -4,11 +4,11 @@ import org.junit.jupiter.api.Test;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.render.ColumnLayout;
|
import org.xbib.graphics.pdfbox.layout.elements.render.ColumnLayout;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.BaseFont;
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
public class LineSpacing {
|
public class LineSpacingTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() throws Exception {
|
public void test() throws Exception {
|
||||||
|
@ -30,18 +30,15 @@ public class LineSpacing {
|
||||||
// use a bigger line spacing to visualize the effects of line spacing more drastically
|
// use a bigger line spacing to visualize the effects of line spacing more drastically
|
||||||
left.setLineSpacing(1.5f);
|
left.setLineSpacing(1.5f);
|
||||||
left.setMaxWidth(document.getPageWidth() / 2);
|
left.setMaxWidth(document.getPageWidth() / 2);
|
||||||
left.addMarkup(text, 11, BaseFont.Times);
|
left.addMarkup(text, 11, BaseFont.TIMES);
|
||||||
document.add(left);
|
document.add(left);
|
||||||
|
|
||||||
document.add(left);
|
document.add(left);
|
||||||
document.add(left);
|
document.add(left);
|
||||||
|
|
||||||
document.add(ColumnLayout.NEWCOLUMN);
|
document.add(ColumnLayout.NEWCOLUMN);
|
||||||
|
|
||||||
Paragraph right = new Paragraph();
|
Paragraph right = new Paragraph();
|
||||||
right.setLineSpacing(1.5f);
|
right.setLineSpacing(1.5f);
|
||||||
right.setMaxWidth(document.getPageWidth() / 2);
|
right.setMaxWidth(document.getPageWidth() / 2);
|
||||||
right.addMarkup(text, 11, BaseFont.Times);
|
right.addMarkup(text, 11, BaseFont.TIMES);
|
||||||
document.add(right);
|
document.add(right);
|
||||||
|
|
||||||
document.add(right);
|
document.add(right);
|
|
@ -3,7 +3,7 @@ package org.xbib.graphics.pdfbox.layout.test;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.BaseFont;
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
@ -33,25 +33,25 @@ public class Links {
|
||||||
|
|
||||||
|
|
||||||
Paragraph paragraph0 = new Paragraph();
|
Paragraph paragraph0 = new Paragraph();
|
||||||
paragraph0.addMarkup("This is a link to {link[https://github.com/ralfstuckert/pdfbox-layout]}PDFBox-Layout{link}.\n\n", 11, BaseFont.Times);
|
paragraph0.addMarkup("This is a link to {link[https://github.com/ralfstuckert/pdfbox-layout]}PDFBox-Layout{link}.\n\n", 11, BaseFont.TIMES);
|
||||||
paragraph0.addMarkup("Now the same link with color instead of underline {color:#ff5000}{link:none[https://github.com/ralfstuckert/pdfbox-layout]}PDFBox-Layout{link}{color:#000000}.\n\n", 11, BaseFont.Times);
|
paragraph0.addMarkup("Now the same link with color instead of underline {color:#ff5000}{link:none[https://github.com/ralfstuckert/pdfbox-layout]}PDFBox-Layout{link}{color:#000000}.\n\n", 11, BaseFont.TIMES);
|
||||||
paragraph0.addMarkup("And here comes a link to an internal anchor name {color:#ff5000}{link[#hello]}hello{link}{color:#000000}.\n\n", 11, BaseFont.Times);
|
paragraph0.addMarkup("And here comes a link to an internal anchor name {color:#ff5000}{link[#hello]}hello{link}{color:#000000}.\n\n", 11, BaseFont.TIMES);
|
||||||
document.add(paragraph0);
|
document.add(paragraph0);
|
||||||
|
|
||||||
Paragraph paragraph1 = new Paragraph();
|
Paragraph paragraph1 = new Paragraph();
|
||||||
paragraph1.addMarkup(text1, 11, BaseFont.Times);
|
paragraph1.addMarkup(text1, 11, BaseFont.TIMES);
|
||||||
document.add(paragraph1);
|
document.add(paragraph1);
|
||||||
|
|
||||||
Paragraph paragraph2 = new Paragraph();
|
Paragraph paragraph2 = new Paragraph();
|
||||||
paragraph2.addMarkup(text2, 12, BaseFont.Helvetica);
|
paragraph2.addMarkup(text2, 12, BaseFont.HELVETICA);
|
||||||
document.add(paragraph2);
|
document.add(paragraph2);
|
||||||
|
|
||||||
Paragraph paragraph3 = new Paragraph();
|
Paragraph paragraph3 = new Paragraph();
|
||||||
paragraph3.addMarkup(text1, 8, BaseFont.Courier);
|
paragraph3.addMarkup(text1, 8, BaseFont.COURIER);
|
||||||
document.add(paragraph3);
|
document.add(paragraph3);
|
||||||
|
|
||||||
Paragraph paragraph4 = new Paragraph();
|
Paragraph paragraph4 = new Paragraph();
|
||||||
paragraph4.addMarkup("\n\n{anchor:hello}Here{anchor} comes the internal anchor named *hello*\n\n", 15, BaseFont.Courier);
|
paragraph4.addMarkup("\n\n{anchor:hello}Here{anchor} comes the internal anchor named *hello*\n\n", 15, BaseFont.COURIER);
|
||||||
|
|
||||||
document.add(paragraph1);
|
document.add(paragraph1);
|
||||||
document.add(paragraph3);
|
document.add(paragraph3);
|
||||||
|
|
|
@ -1,13 +1,12 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.test;
|
package org.xbib.graphics.pdfbox.layout.test;
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.font.PDType1Font;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.render.RenderContext;
|
import org.xbib.graphics.pdfbox.layout.elements.render.RenderContext;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.render.RenderListener;
|
import org.xbib.graphics.pdfbox.layout.elements.render.RenderListener;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.BaseFont;
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Position;
|
import org.xbib.graphics.pdfbox.layout.text.Position;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.TextFlow;
|
import org.xbib.graphics.pdfbox.layout.text.TextFlow;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.TextFlowUtil;
|
import org.xbib.graphics.pdfbox.layout.text.TextFlowUtil;
|
||||||
|
@ -52,20 +51,19 @@ public class Listener {
|
||||||
throws IOException {
|
throws IOException {
|
||||||
String content = String.format("Page %s",
|
String content = String.format("Page %s",
|
||||||
renderContext.getPageIndex() + 1);
|
renderContext.getPageIndex() + 1);
|
||||||
TextFlow text = TextFlowUtil.createTextFlow(content, 11,
|
TextFlow text = TextFlowUtil.createTextFlow(content, 11, BaseFont.HELVETICA);
|
||||||
PDType1Font.TIMES_ROMAN);
|
|
||||||
float offset = renderContext.getPageFormat().getMarginLeft()
|
float offset = renderContext.getPageFormat().getMarginLeft()
|
||||||
+ TextSequenceUtil.getOffset(text,
|
+ TextSequenceUtil.getOffset(text,
|
||||||
renderContext.getWidth(), Alignment.Right);
|
renderContext.getWidth(), Alignment.RIGHT);
|
||||||
text.drawText(renderContext.getContentStream(), new Position(
|
text.drawText(renderContext.getContentStream(), new Position(
|
||||||
offset, 30), Alignment.Right, null);
|
offset, 30), Alignment.RIGHT, null);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Paragraph paragraph = new Paragraph();
|
Paragraph paragraph = new Paragraph();
|
||||||
paragraph.addMarkup(text1, 11, BaseFont.Times);
|
paragraph.addMarkup(text1, 11, BaseFont.TIMES);
|
||||||
paragraph.addMarkup(text2, 12, BaseFont.Helvetica);
|
paragraph.addMarkup(text2, 12, BaseFont.HELVETICA);
|
||||||
paragraph.addMarkup(text1, 8, BaseFont.Courier);
|
paragraph.addMarkup(text1, 8, BaseFont.COURIER);
|
||||||
|
|
||||||
document.add(paragraph);
|
document.add(paragraph);
|
||||||
document.add(paragraph);
|
document.add(paragraph);
|
||||||
|
|
|
@ -3,14 +3,13 @@ package org.xbib.graphics.pdfbox.layout.test;
|
||||||
import org.apache.pdfbox.pdmodel.PDDocument;
|
import org.apache.pdfbox.pdmodel.PDDocument;
|
||||||
import org.apache.pdfbox.pdmodel.PDPage;
|
import org.apache.pdfbox.pdmodel.PDPage;
|
||||||
import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
import org.apache.pdfbox.pdmodel.PDPageContentStream;
|
||||||
import org.apache.pdfbox.pdmodel.font.PDType1Font;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.elements.PageFormat;
|
||||||
import org.xbib.graphics.pdfbox.layout.shape.RoundRect;
|
import org.xbib.graphics.pdfbox.layout.shape.RoundRect;
|
||||||
import org.xbib.graphics.pdfbox.layout.shape.Shape;
|
import org.xbib.graphics.pdfbox.layout.shape.Shape;
|
||||||
import org.xbib.graphics.pdfbox.layout.shape.Stroke;
|
import org.xbib.graphics.pdfbox.layout.shape.Stroke;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.BaseFont;
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Constants;
|
|
||||||
import org.xbib.graphics.pdfbox.layout.text.DrawContext;
|
import org.xbib.graphics.pdfbox.layout.text.DrawContext;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Position;
|
import org.xbib.graphics.pdfbox.layout.text.Position;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.TextFlow;
|
import org.xbib.graphics.pdfbox.layout.text.TextFlow;
|
||||||
|
@ -25,22 +24,19 @@ public class LowLevelText {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() throws Exception {
|
public void test() throws Exception {
|
||||||
|
PDDocument pdDocument = new PDDocument();
|
||||||
final PDDocument test = new PDDocument();
|
PDPage page = new PDPage(PageFormat.A4);
|
||||||
final PDPage page = new PDPage(Constants.A4);
|
|
||||||
float pageWidth = page.getMediaBox().getWidth();
|
float pageWidth = page.getMediaBox().getWidth();
|
||||||
float pageHeight = page.getMediaBox().getHeight();
|
float pageHeight = page.getMediaBox().getHeight();
|
||||||
|
pdDocument.addPage(page);
|
||||||
test.addPage(page);
|
|
||||||
final PDPageContentStream contentStream =
|
final PDPageContentStream contentStream =
|
||||||
new PDPageContentStream(test, page, PDPageContentStream.AppendMode.APPEND, true);
|
new PDPageContentStream(pdDocument, page, PDPageContentStream.AppendMode.APPEND, true);
|
||||||
|
|
||||||
// AnnotationDrawListener is only needed if you use annoation based stuff, e.g. hyperlinks
|
|
||||||
AnnotationDrawListener annotationDrawListener = new AnnotationDrawListener(new DrawContext() {
|
AnnotationDrawListener annotationDrawListener = new AnnotationDrawListener(new DrawContext() {
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public PDDocument getPdDocument() {
|
public PDDocument getPdDocument() {
|
||||||
return test;
|
return pdDocument;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -59,17 +55,17 @@ public class LowLevelText {
|
||||||
TextFlow text = TextFlowUtil
|
TextFlow text = TextFlowUtil
|
||||||
.createTextFlowFromMarkup(
|
.createTextFlowFromMarkup(
|
||||||
"Hello *bold _italic bold-end* italic-end_. Eirmod\ntempor invidunt ut \\*labore",
|
"Hello *bold _italic bold-end* italic-end_. Eirmod\ntempor invidunt ut \\*labore",
|
||||||
11, BaseFont.Times);
|
11, BaseFont.TIMES);
|
||||||
|
|
||||||
text.addText("Spongebob", 11, PDType1Font.COURIER);
|
text.addText("Spongebob", 11, BaseFont.COURIER);
|
||||||
text.addText(" is ", 20, PDType1Font.HELVETICA_BOLD_OBLIQUE);
|
text.addText(" is ", 20, BaseFont.HELVETICA);
|
||||||
text.addText("cool", 7, PDType1Font.HELVETICA);
|
text.addText("cool", 7, BaseFont.HELVETICA);
|
||||||
|
|
||||||
text.setMaxWidth(100);
|
text.setMaxWidth(100);
|
||||||
float xOffset = TextSequenceUtil.getOffset(text, pageWidth,
|
float xOffset = TextSequenceUtil.getOffset(text, pageWidth,
|
||||||
Alignment.Right);
|
Alignment.RIGHT);
|
||||||
text.drawText(contentStream, new Position(xOffset, pageHeight - 50),
|
text.drawText(contentStream, new Position(xOffset, pageHeight - 50),
|
||||||
Alignment.Right, annotationDrawListener);
|
Alignment.RIGHT, annotationDrawListener);
|
||||||
|
|
||||||
String textBlock = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, "
|
String textBlock = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, "
|
||||||
+ "{link[https://github.com/ralfstuckert/pdfbox-layout/]}pdfbox layout{link} "
|
+ "{link[https://github.com/ralfstuckert/pdfbox-layout/]}pdfbox layout{link} "
|
||||||
|
@ -83,11 +79,11 @@ public class LowLevelText {
|
||||||
+ "gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n";
|
+ "gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n";
|
||||||
|
|
||||||
text = new TextFlow();
|
text = new TextFlow();
|
||||||
text.addMarkup(textBlock, 8, BaseFont.Courier);
|
text.addMarkup(textBlock, 8, BaseFont.COURIER);
|
||||||
text.setMaxWidth(200);
|
text.setMaxWidth(200);
|
||||||
xOffset = TextSequenceUtil.getOffset(text, pageWidth, Alignment.Center);
|
xOffset = TextSequenceUtil.getOffset(text, pageWidth, Alignment.CENTER);
|
||||||
text.drawText(contentStream, new Position(xOffset, pageHeight - 100),
|
text.drawText(contentStream, new Position(xOffset, pageHeight - 100),
|
||||||
Alignment.Justify, annotationDrawListener);
|
Alignment.JUSTIFY, annotationDrawListener);
|
||||||
|
|
||||||
// draw a round rect box with text
|
// draw a round rect box with text
|
||||||
text.setMaxWidth(350);
|
text.setMaxWidth(350);
|
||||||
|
@ -99,13 +95,13 @@ public class LowLevelText {
|
||||||
float boxHeight = text.getHeight() + 2 * paddingY;
|
float boxHeight = text.getHeight() + 2 * paddingY;
|
||||||
|
|
||||||
Shape shape = new RoundRect(20);
|
Shape shape = new RoundRect(20);
|
||||||
shape.fill(test, contentStream, new Position(x, y), boxWidth,
|
shape.fill(pdDocument, contentStream, new Position(x, y), boxWidth,
|
||||||
boxHeight, Color.pink, null);
|
boxHeight, Color.pink, null);
|
||||||
shape.draw(test, contentStream, new Position(x, y), boxWidth,
|
shape.draw(pdDocument, contentStream, new Position(x, y), boxWidth,
|
||||||
boxHeight, Color.blue, new Stroke(3), null);
|
boxHeight, Color.blue, new Stroke(3), null);
|
||||||
// now the text
|
// now the text
|
||||||
text.drawText(contentStream, new Position(x + paddingX, y - paddingY),
|
text.drawText(contentStream, new Position(x + paddingX, y - paddingY),
|
||||||
Alignment.Center, annotationDrawListener);
|
Alignment.CENTER, annotationDrawListener);
|
||||||
|
|
||||||
annotationDrawListener.afterPage(null);
|
annotationDrawListener.afterPage(null);
|
||||||
contentStream.close();
|
contentStream.close();
|
||||||
|
@ -113,8 +109,7 @@ public class LowLevelText {
|
||||||
annotationDrawListener.afterRender();
|
annotationDrawListener.afterRender();
|
||||||
|
|
||||||
final OutputStream outputStream = new FileOutputStream("build/lowleveltext.pdf");
|
final OutputStream outputStream = new FileOutputStream("build/lowleveltext.pdf");
|
||||||
test.save(outputStream);
|
pdDocument.save(outputStream);
|
||||||
test.close();
|
pdDocument.close();
|
||||||
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -1,11 +1,11 @@
|
||||||
package org.xbib.graphics.pdfbox.layout.test;
|
package org.xbib.graphics.pdfbox.layout.test;
|
||||||
|
|
||||||
import org.apache.pdfbox.pdmodel.font.PDType1Font;
|
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayoutHint;
|
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayoutHint;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
|
@ -37,18 +37,18 @@ public class Margin {
|
||||||
|
|
||||||
Document document = new Document(40, 60, 40, 60);
|
Document document = new Document(40, 60, 40, 60);
|
||||||
Paragraph paragraph = new Paragraph();
|
Paragraph paragraph = new Paragraph();
|
||||||
paragraph.addText(text1, 11, PDType1Font.HELVETICA);
|
paragraph.addText(text1, 11, BaseFont.HELVETICA);
|
||||||
document.add(paragraph, new VerticalLayoutHint(Alignment.Left, 0, 100,
|
document.add(paragraph, new VerticalLayoutHint(Alignment.LEFT, 0, 100,
|
||||||
100, 100));
|
100, 100));
|
||||||
|
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
paragraph.addText(text2, 11, PDType1Font.HELVETICA);
|
paragraph.addText(text2, 11, BaseFont.HELVETICA);
|
||||||
document.add(paragraph, new VerticalLayoutHint(Alignment.Right, 0, 50,
|
document.add(paragraph, new VerticalLayoutHint(Alignment.RIGHT, 0, 50,
|
||||||
0, 0));
|
0, 0));
|
||||||
|
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
paragraph.addText(text3, 11, PDType1Font.HELVETICA);
|
paragraph.addText(text3, 11, BaseFont.HELVETICA);
|
||||||
document.add(paragraph, new VerticalLayoutHint(Alignment.Right, 150,
|
document.add(paragraph, new VerticalLayoutHint(Alignment.RIGHT, 150,
|
||||||
150, 20, 0));
|
150, 20, 0));
|
||||||
|
|
||||||
final OutputStream outputStream = new FileOutputStream("build/margin.pdf");
|
final OutputStream outputStream = new FileOutputStream("build/margin.pdf");
|
||||||
|
|
|
@ -5,11 +5,11 @@ import org.xbib.graphics.pdfbox.layout.elements.Document;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayoutHint;
|
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayoutHint;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
import org.xbib.graphics.pdfbox.layout.text.Alignment;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.BaseFont;
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
public class Markup {
|
public class MarkupTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() throws Exception {
|
public void test() throws Exception {
|
||||||
|
@ -25,32 +25,32 @@ public class Markup {
|
||||||
|
|
||||||
Document document = new Document(40, 60, 40, 60);
|
Document document = new Document(40, 60, 40, 60);
|
||||||
Paragraph paragraph = new Paragraph();
|
Paragraph paragraph = new Paragraph();
|
||||||
paragraph.addMarkup(text1, 11, BaseFont.Times);
|
paragraph.addMarkup(text1, 11, BaseFont.TIMES);
|
||||||
document.add(paragraph);
|
document.add(paragraph);
|
||||||
|
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
paragraph
|
paragraph
|
||||||
.addMarkup(
|
.addMarkup(
|
||||||
"Markup supports *bold*, _italic_, and *even _mixed* markup_.\n\n",
|
"Markup supports *bold*, _italic_, and *even _mixed* markup_.\n\n",
|
||||||
11, BaseFont.Times);
|
11, BaseFont.TIMES);
|
||||||
paragraph.addMarkup(
|
paragraph.addMarkup(
|
||||||
"Escape \\* with \\\\\\* and \\_ with \\\\\\_ in markup.\n\n",
|
"Escape \\* with \\\\\\* and \\_ with \\\\\\_ in markup.\n\n",
|
||||||
11, BaseFont.Times);
|
11, BaseFont.TIMES);
|
||||||
|
|
||||||
paragraph
|
paragraph
|
||||||
.addMarkup(
|
.addMarkup(
|
||||||
"And now also {color:#ff0000}c{color:#00ff00}o{color:#0000ff}l{color:#00cccc}o{color:#cc00cc}r{color:#000000}",
|
"And now also {color:#ff0000}c{color:#00ff00}o{color:#0000ff}l{color:#00cccc}o{color:#cc00cc}r{color:#000000}",
|
||||||
11, BaseFont.Times);
|
11, BaseFont.TIMES);
|
||||||
paragraph.addMarkup(" , {_}subscript{_} and {^}superscript{^}.\n\n",
|
paragraph.addMarkup(" , {_}subscript{_} and {^}superscript{^}.\n\n",
|
||||||
11, BaseFont.Times);
|
11, BaseFont.TIMES);
|
||||||
|
|
||||||
paragraph
|
paragraph
|
||||||
.addMarkup(
|
.addMarkup(
|
||||||
"You can alternate the position and thickness of an __underline__, "
|
"You can alternate the position and thickness of an __underline__, "
|
||||||
+ "so you may also use this to __{0.25:}strike through__ or blacken __{0.25:20}things__ out\n\n",
|
+ "so you may also use this to __{0.25:}strike through__ or blacken __{0.25:20}things__ out\n\n",
|
||||||
11, BaseFont.Times);
|
11, BaseFont.TIMES);
|
||||||
|
|
||||||
document.add(paragraph, new VerticalLayoutHint(Alignment.Left, 0, 0,
|
document.add(paragraph, new VerticalLayoutHint(Alignment.LEFT, 0, 0,
|
||||||
30, 0));
|
30, 0));
|
||||||
|
|
||||||
paragraph = new Paragraph();
|
paragraph = new Paragraph();
|
||||||
|
@ -71,7 +71,7 @@ public class Markup {
|
||||||
+ "-#{I ->:5}Another list item\n"
|
+ "-#{I ->:5}Another list item\n"
|
||||||
+ " -#{a ~:30pt}A sub list item\n"
|
+ " -#{a ~:30pt}A sub list item\n"
|
||||||
+ "-#{I ->:5}And yet another one\n\n";
|
+ "-#{I ->:5}And yet another one\n\n";
|
||||||
paragraph.addMarkup(text1, 11, BaseFont.Times);
|
paragraph.addMarkup(text1, 11, BaseFont.TIMES);
|
||||||
document.add(paragraph);
|
document.add(paragraph);
|
||||||
|
|
||||||
final OutputStream outputStream = new FileOutputStream("build/markup.pdf");
|
final OutputStream outputStream = new FileOutputStream("build/markup.pdf");
|
|
@ -3,11 +3,11 @@ package org.xbib.graphics.pdfbox.layout.test;
|
||||||
import org.junit.jupiter.api.Test;
|
import org.junit.jupiter.api.Test;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
import org.xbib.graphics.pdfbox.layout.elements.Document;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.BaseFont;
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
public class MultiplePages {
|
public class MultiplePagesTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() throws Exception {
|
public void test() throws Exception {
|
||||||
|
@ -32,15 +32,15 @@ public class MultiplePages {
|
||||||
Document document = new Document(40, 60, 40, 60);
|
Document document = new Document(40, 60, 40, 60);
|
||||||
|
|
||||||
Paragraph paragraph1 = new Paragraph();
|
Paragraph paragraph1 = new Paragraph();
|
||||||
paragraph1.addMarkup(text1, 11, BaseFont.Times);
|
paragraph1.addMarkup(text1, 11, BaseFont.TIMES);
|
||||||
document.add(paragraph1);
|
document.add(paragraph1);
|
||||||
|
|
||||||
Paragraph paragraph2 = new Paragraph();
|
Paragraph paragraph2 = new Paragraph();
|
||||||
paragraph2.addMarkup(text2, 12, BaseFont.Helvetica);
|
paragraph2.addMarkup(text2, 12, BaseFont.HELVETICA);
|
||||||
document.add(paragraph2);
|
document.add(paragraph2);
|
||||||
|
|
||||||
Paragraph paragraph3 = new Paragraph();
|
Paragraph paragraph3 = new Paragraph();
|
||||||
paragraph3.addMarkup(text1, 8, BaseFont.Courier);
|
paragraph3.addMarkup(text1, 8, BaseFont.COURIER);
|
||||||
document.add(paragraph3);
|
document.add(paragraph3);
|
||||||
|
|
||||||
document.add(paragraph1);
|
document.add(paragraph1);
|
|
@ -9,11 +9,11 @@ import org.xbib.graphics.pdfbox.layout.elements.VerticalSpacer;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.render.ColumnLayout;
|
import org.xbib.graphics.pdfbox.layout.elements.render.ColumnLayout;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayout;
|
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayout;
|
||||||
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayoutHint;
|
import org.xbib.graphics.pdfbox.layout.elements.render.VerticalLayoutHint;
|
||||||
import org.xbib.graphics.pdfbox.layout.text.BaseFont;
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
import java.io.FileOutputStream;
|
import java.io.FileOutputStream;
|
||||||
import java.io.OutputStream;
|
import java.io.OutputStream;
|
||||||
|
|
||||||
public class Rotation {
|
public class RotationTest {
|
||||||
|
|
||||||
@Test
|
@Test
|
||||||
public void test() throws Exception {
|
public void test() throws Exception {
|
||||||
|
@ -36,16 +36,16 @@ public class Rotation {
|
||||||
+ "gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n";
|
+ "gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n";
|
||||||
|
|
||||||
Paragraph paragraph1 = new Paragraph();
|
Paragraph paragraph1 = new Paragraph();
|
||||||
paragraph1.addMarkup(text1, 11, BaseFont.Times);
|
paragraph1.addMarkup(text1, 11, BaseFont.TIMES);
|
||||||
Paragraph paragraph2 = new Paragraph();
|
Paragraph paragraph2 = new Paragraph();
|
||||||
paragraph2.addMarkup(text2, 12, BaseFont.Helvetica);
|
paragraph2.addMarkup(text2, 12, BaseFont.HELVETICA);
|
||||||
Paragraph paragraph3 = new Paragraph();
|
Paragraph paragraph3 = new Paragraph();
|
||||||
paragraph3.addMarkup(text1, 8, BaseFont.Courier);
|
paragraph3.addMarkup(text1, 8, BaseFont.COURIER);
|
||||||
|
|
||||||
Paragraph titleA4 = new Paragraph();
|
Paragraph titleA4 = new Paragraph();
|
||||||
titleA4.addMarkup("*Format A4 Landscape*", 20, BaseFont.Times);
|
titleA4.addMarkup("*Format A4 Landscape*", 20, BaseFont.TIMES);
|
||||||
Paragraph titleA5 = new Paragraph();
|
Paragraph titleA5 = new Paragraph();
|
||||||
titleA5.addMarkup("*Format A4 Landscape rotated by -90 degrees*", 20, BaseFont.Times);
|
titleA5.addMarkup("*Format A4 Landscape rotated by -90 degrees*", 20, BaseFont.TIMES);
|
||||||
|
|
||||||
PageFormat a4_landscape = PageFormat.with().margins(40, 50, 40, 60).landscape().build();
|
PageFormat a4_landscape = PageFormat.with().margins(40, 50, 40, 60).landscape().build();
|
||||||
PageFormat a4_landscape_rotated = PageFormat.with().margins(40, 50, 40, 60).landscape().rotation(-90).build();
|
PageFormat a4_landscape_rotated = PageFormat.with().margins(40, 50, 40, 60).landscape().rotation(-90).build();
|
|
@ -0,0 +1,20 @@
|
||||||
|
package org.xbib.graphics.pdfbox.layout.test;
|
||||||
|
|
||||||
|
import org.xbib.graphics.pdfbox.layout.elements.Paragraph;
|
||||||
|
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
|
||||||
|
import java.io.IOException;
|
||||||
|
|
||||||
|
public class Section extends Paragraph {
|
||||||
|
private final int number;
|
||||||
|
|
||||||
|
public Section(int number) throws IOException {
|
||||||
|
super();
|
||||||
|
this.number = number;
|
||||||
|
addMarkup(String.format("*Section %d", number), 16, BaseFont.TIMES);
|
||||||
|
}
|
||||||
|
|
||||||
|
public int getNumber() {
|
||||||
|
return number;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
Binary file not shown.
After Width: | Height: | Size: 67 KiB |
Loading…
Reference in a new issue