switch to multi font parameter, this allows for fallback fonts

This commit is contained in:
Jörg Prante 2023-08-04 11:26:48 +02:00
parent ba2641b774
commit 53a27c5792
55 changed files with 426 additions and 610 deletions

View file

@ -7,7 +7,7 @@ dependencies {
test {
useJUnitPlatform()
failFast = true
failFast = false
environment 'TMPDIR', '/var/tmp/gs'
file('/var/tmp/gs').mkdirs()
systemProperty 'java.awt.headless', 'true'

View file

@ -1,7 +1,13 @@
package org.xbib.graphics.pdfbox.layout.element;
import org.apache.fontbox.ttf.TTFParser;
import org.apache.fontbox.ttf.TrueTypeFont;
import org.apache.pdfbox.io.RandomAccessRead;
import org.apache.pdfbox.io.RandomAccessReadBuffer;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.PDDocumentInformation;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.xbib.graphics.pdfbox.layout.element.render.Layout;
import org.xbib.graphics.pdfbox.layout.element.render.LayoutHint;
import org.xbib.graphics.pdfbox.layout.element.render.RenderContext;
@ -9,8 +15,12 @@ import org.xbib.graphics.pdfbox.layout.element.render.RenderListener;
import org.xbib.graphics.pdfbox.layout.element.render.Renderer;
import org.xbib.graphics.pdfbox.layout.element.render.VerticalLayout;
import org.xbib.graphics.pdfbox.layout.element.render.VerticalLayoutHint;
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
import org.xbib.graphics.pdfbox.layout.font.Font;
import java.io.Closeable;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.time.Instant;
import java.time.ZoneId;
@ -19,6 +29,7 @@ import java.util.ArrayList;
import java.util.Calendar;
import java.util.GregorianCalendar;
import java.util.Iterator;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
@ -28,11 +39,13 @@ import java.util.Map.Entry;
*/
public class Document implements Element, Closeable, RenderListener {
private final List<Entry<Element, LayoutHint>> elements = new ArrayList<>();
private final List<Entry<Element, LayoutHint>> elements;
private final List<Renderer> customRenderer = new ArrayList<>();
private final Map<String, Font> fonts;
private final List<RenderListener> renderListener = new ArrayList<>();
private final List<Renderer> customRenderer;
private final List<RenderListener> renderListener;
private PageFormat pageFormat;
@ -72,7 +85,12 @@ public class Document implements Element, Closeable, RenderListener {
public Document(PageFormat pageFormat) {
this.pdDocument = new PDDocument();
this.pdDocumentInformation = new PDDocumentInformation();
this.elements = new ArrayList<>();
this.fonts = new LinkedHashMap<>();
this.customRenderer = new ArrayList<>();
this.renderListener = new ArrayList<>();
setPageFormat(pageFormat);
registerFont("helvetica", BaseFont.HELVETICA);
}
public void setPageFormat(PageFormat pageFormat) {
@ -127,6 +145,105 @@ public class Document implements Element, Closeable, RenderListener {
pdDocumentInformation.setCustomMetadataValue(key, value);
}
public void registerFont(String name, Font font) {
fonts.put(name, font);
}
public void registerNotoSansFont() throws IOException {
registerFont("notosans",
"NotoSans-Regular.ttf",
"NotoSans-Bold.ttf",
"NotoSans-Italic.ttf",
"NotoSans-BoldItalic.ttf");
}
public void registerNotoSansCJKSCFont() throws IOException {
registerFont("notosanscjksc",
"NotoSansCJKsc-Regular.ttf",
"NotoSansCJKsc-Bold.ttf",
"NotoSansCJKsc-Italic.ttf",
"NotoSansCJKsc-BoldItalic.ttf");
}
public void registerOpenSansFont() throws IOException {
registerFont("opensans",
"OpenSans-Regular.ttf",
"OpenSans-Bold.ttf",
"OpenSans-Italic.ttf",
"OpenSans-BoldItalic.ttf");
}
public void registerSourceSansFont() throws IOException {
registerFont("sourcesans",
"SourceSans3-Regular.ttf",
"SourceSans3-Bold.ttf",
"SourceSans3-It.ttf",
"SourceSans3-BoldIt.ttf");
}
public void registerFont(String name,
String regularFontResource,
String boldFontResource,
String italicsFontResource,
String boldItalicsFontResource) throws IOException {
final PDType0Font regularFont = loadTrueTypeFont(regularFontResource);
final PDType0Font boldFont = loadTrueTypeFont(boldFontResource);
final PDType0Font italicsFont = loadTrueTypeFont(italicsFontResource);
final PDType0Font boldItalicsFont = loadTrueTypeFont(boldItalicsFontResource);
fonts.put(name, new Font() {
@Override
public PDFont getRegularFont() {
return regularFont;
}
@Override
public PDFont getBoldFont() {
return boldFont;
}
@Override
public PDFont getItalicFont() {
return italicsFont;
}
@Override
public PDFont getBoldItalicFont() {
return boldItalicsFont;
}
@Override
public boolean hasGlyph(int code) {
try {
return regularFont.hasGlyph(code);
} catch (IOException e) {
return false;
}
}
@Override
public boolean canWrite(String string) {
try {
return regularFont.getStringWidth(string) > 0;
} catch (IOException e) {
return false;
}
}
});
}
private PDType0Font loadTrueTypeFont(String resourceName) throws IOException {
InputStream inputStream = Font.class.getResourceAsStream(resourceName);
TTFParser ttfParser = new TTFParser();
RandomAccessRead randomAccessRead = new RandomAccessReadBuffer(inputStream);
TrueTypeFont openTypeFont = ttfParser.parse(randomAccessRead);
return PDType0Font.load(pdDocument, openTypeFont, true);
}
public Font getFont(String name) {
return fonts.get(name);
}
/**
* Adds an element to the document using a {@link VerticalLayoutHint}.
*
@ -144,6 +261,7 @@ public class Document implements Element, Closeable, RenderListener {
* @param element the element to add
* @param layoutHint the hint for the {@link Layout}.
*/
@Override
public Element add(Element element, LayoutHint layoutHint) {
elements.add(Map.entry(element, layoutHint));
return this;

View file

@ -85,9 +85,9 @@ public class Paragraph extends TextFlow implements Drawable, Element, WidthRespe
public Element add(Element element) {
if (element instanceof TextElement textElement) {
if (textElement.isMarkup()) {
addMarkup(textElement.getValue(), textElement.getFontSize(), textElement.getFont());
addMarkup(textElement.getValue(), textElement.getFontSize(), textElement.getFonts());
} else {
addText(textElement.getValue(), textElement.getFontSize(), textElement.getFont());
addText(textElement.getValue(), textElement.getFontSize(), textElement.getFonts());
}
} else {
throw new UnsupportedOperationException();

View file

@ -2,6 +2,8 @@ package org.xbib.graphics.pdfbox.layout.element;
import org.xbib.graphics.pdfbox.layout.font.Font;
import java.util.ArrayList;
import java.util.List;
import java.util.Objects;
public class TextElement implements Element {
@ -10,17 +12,20 @@ public class TextElement implements Element {
private final String value;
private final Font font;
private final List<Font> fonts;
private final float fontsize;
private float fontsize;
public TextElement(boolean markup, String value, Font font, float fontsize) {
public TextElement(boolean markup, String value) {
this.markup = markup;
this.value = value;
this.font = font;
this.fontsize = fontsize;
Objects.requireNonNull(value, "you must specify a value");
Objects.requireNonNull(font, "you must specify a font");
this.fonts = new ArrayList<>();
}
public void addFont(Font font, float size) {
this.fonts.add(font);
this.fontsize = size;
}
public String getValue() {
@ -31,8 +36,8 @@ public class TextElement implements Element {
return markup;
}
public Font getFont() {
return font;
public List<Font> getFonts() {
return fonts;
}
public float getFontSize() {

View file

@ -4,7 +4,6 @@ import org.xbib.graphics.pdfbox.layout.color.ColorFactory;
import org.xbib.graphics.pdfbox.layout.element.Document;
import org.xbib.graphics.pdfbox.layout.element.Paragraph;
import org.xbib.graphics.pdfbox.layout.font.Font;
import org.xbib.graphics.pdfbox.layout.font.Fonts;
import org.xbib.graphics.pdfbox.layout.element.scripting.Engine;
import org.xbib.graphics.pdfbox.layout.element.scripting.State;
import org.xbib.graphics.pdfbox.layout.table.BorderStyle;
@ -42,7 +41,7 @@ public class CellCommand implements Command {
cell.text(settings.get("value"));
cell.fontSize(settings.getAsFloat("fontsize", 11.0f));
Document document = state.getDocument();
Font font = Fonts.valueOf(settings.get("font", "helvetica").toUpperCase(Locale.ROOT)).getFont(document);
Font font = document.getFont(settings.get("font", "helvetica").toUpperCase(Locale.ROOT));
cell.font(font);
Color color = ColorFactory.web(settings.get("color", "black"));
cell.textColor(color);
@ -83,11 +82,11 @@ public class CellCommand implements Command {
cell.paragraph(paragraph);
String value = settings.get("markup");
float size = settings.getAsFloat("fontsize", 11.0f);
Float lineSpacing = settings.getAsFloat("linespacing", -1f);
float lineSpacing = settings.getAsFloat("linespacing", -1f);
Document document = state.getDocument();
Font font = Fonts.valueOf(settings.get("font", "helvetica").toUpperCase(Locale.ROOT)).getFont(document);
Font font = document.getFont(settings.get("font", "helvetica"));
cell.add(new Markup().setValue(value).setFont(font).setFontSize(size));
if (lineSpacing != null && lineSpacing >= 0f) {
if (lineSpacing >= 0f) {
cell.lineSpacing(lineSpacing);
}
state.getElements().peek().add(cell.build());

View file

@ -4,6 +4,7 @@ import org.xbib.graphics.pdfbox.layout.element.Document;
import org.xbib.graphics.pdfbox.layout.element.PageFormat;
import org.xbib.graphics.pdfbox.layout.element.scripting.Engine;
import org.xbib.graphics.pdfbox.layout.element.scripting.State;
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
import org.xbib.settings.Settings;
import java.io.IOException;
@ -14,6 +15,9 @@ import static org.xbib.graphics.pdfbox.layout.util.PdfUtil.mmToPt;
public class DocumentCommand implements Command {
public DocumentCommand() {
}
@Override
public void execute(Engine engine, State state, Settings settings) throws IOException {
PageFormat.PageFormatBuilder pageFormat = PageFormat.builder();
@ -67,6 +71,20 @@ public class DocumentCommand implements Command {
} else {
document.setModificationDate(instant);
}
if (settings.containsSetting("font")) {
String[] fonts = settings.getAsArray("font");
for (String font : fonts) {
switch (font) {
case "helvetica" -> document.registerFont("helvetica", BaseFont.HELVETICA);
case "times" -> document.registerFont("times", BaseFont.TIMES);
case "courier" -> document.registerFont("courier", BaseFont.COURIER);
case "notosans" -> document.registerNotoSansFont();
case "notosanscjksc" -> document.registerNotoSansCJKSCFont();
case "opensans" -> document.registerOpenSansFont();
case "sourcesans" -> document.registerSourceSansFont();
}
}
}
state.getElements().push(document);
engine.executeElements(settings);
}

View file

@ -7,8 +7,6 @@ import org.xbib.graphics.pdfbox.layout.element.TextElement;
import org.xbib.graphics.pdfbox.layout.element.render.VerticalLayoutHint;
import org.xbib.graphics.pdfbox.layout.element.scripting.Engine;
import org.xbib.graphics.pdfbox.layout.element.scripting.State;
import org.xbib.graphics.pdfbox.layout.font.Font;
import org.xbib.graphics.pdfbox.layout.font.Fonts;
import org.xbib.graphics.pdfbox.layout.position.Position;
import org.xbib.graphics.pdfbox.layout.text.Alignment;
import org.xbib.settings.Settings;
@ -22,11 +20,14 @@ public class MarkupCommand implements Command {
@Override
public void execute(Engine engine, State state, Settings settings) {
String value = settings.get("value");
float fontsize = settings.getAsFloat("fontsize", 11.0f);
Document document = state.getDocument();
Font font = Fonts.valueOf(settings.get("font", "helvetica").toUpperCase(Locale.ROOT)).getFont(document);
TextElement textElement = new TextElement(true, value);
String[] fonts = settings.getAsArray("font");
float fontsize = settings.getAsFloat("fontsize", 10.0f);
for (String font : fonts) {
textElement.addFont(document.getFont(font), fontsize);
}
Element element = state.getElements().peek();
TextElement textElement = new TextElement(true, value, font, fontsize);
if (element instanceof Paragraph) {
element.add(textElement);
} else if (element instanceof Document) {

View file

@ -2,7 +2,6 @@ package org.xbib.graphics.pdfbox.layout.element.scripting.command;
import org.xbib.graphics.pdfbox.layout.color.ColorFactory;
import org.xbib.graphics.pdfbox.layout.element.Document;
import org.xbib.graphics.pdfbox.layout.font.Fonts;
import org.xbib.graphics.pdfbox.layout.element.scripting.Engine;
import org.xbib.graphics.pdfbox.layout.element.scripting.State;
import org.xbib.graphics.pdfbox.layout.table.BorderStyle;
@ -32,7 +31,7 @@ public class RowCommand implements Command {
}
row.fontSize(settings.getAsFloat("fontsize", 11.0f));
Document document = state.getDocument();
row.font(Fonts.valueOf(settings.get("font", "helvetica").toUpperCase(Locale.ROOT)).getFont(document));
row.font(document.getFont(settings.get("font", "helvetica")));
Color color = ColorFactory.web(settings.get("color", "black"));
row.textColor(color);
if (settings.containsSetting("backgroundcolor")) {

View file

@ -5,8 +5,6 @@ import org.xbib.graphics.pdfbox.layout.element.Element;
import org.xbib.graphics.pdfbox.layout.element.Paragraph;
import org.xbib.graphics.pdfbox.layout.element.TextElement;
import org.xbib.graphics.pdfbox.layout.element.render.VerticalLayoutHint;
import org.xbib.graphics.pdfbox.layout.font.Font;
import org.xbib.graphics.pdfbox.layout.font.Fonts;
import org.xbib.graphics.pdfbox.layout.element.scripting.Engine;
import org.xbib.graphics.pdfbox.layout.element.scripting.State;
import org.xbib.graphics.pdfbox.layout.text.Alignment;
@ -22,11 +20,14 @@ public class TextCommand implements Command {
@Override
public void execute(Engine engine, State state, Settings settings) {
String value = settings.get("value");
float fontsize = settings.getAsFloat("fontsize", 11.0f);
Document document = state.getDocument();
Font font = Fonts.valueOf(settings.get("font", "helvetica").toUpperCase(Locale.ROOT)).getFont(document);
TextElement textElement = new TextElement(false, value);
String[] fonts = settings.getAsArray("font");
float fontsize = settings.getAsFloat("fontsize", 10.0f);
for (String font : fonts) {
textElement.addFont(document.getFont(font), fontsize);
}
Element element = state.getElements().peek();
TextElement textElement = new TextElement(false, value, font, fontsize);
if (element instanceof Paragraph) {
element.add(textElement);
} else if (element instanceof Document) {

View file

@ -5,6 +5,8 @@ import org.apache.pdfbox.pdmodel.font.PDType1Font;
import org.apache.pdfbox.pdmodel.font.Standard14Fonts;
import java.io.IOException;
import java.util.logging.Level;
import java.util.logging.Logger;
import static org.apache.pdfbox.pdmodel.font.Standard14Fonts.FontName.COURIER_BOLD;
import static org.apache.pdfbox.pdmodel.font.Standard14Fonts.FontName.COURIER_BOLD_OBLIQUE;
@ -79,9 +81,16 @@ public enum BaseFont implements Font {
@Override
public boolean canWrite(String string) {
if (string == null) {
return false;
}
String printable = string.replaceAll("\\P{Print}|\\p{Cntrl}|\\p{Space}", "");
if (printable.isEmpty()) {
return true;
}
try {
return regularFont.getStringWidth(string) > 0;
} catch (IOException e) {
return regularFont.getStringWidth(printable) > 0;
} catch (IllegalArgumentException | IOException e) {
return false;
}
}

View file

@ -2,6 +2,8 @@ package org.xbib.graphics.pdfbox.layout.font;
import org.apache.pdfbox.pdmodel.font.PDFont;
import java.io.IOException;
public interface Font {
PDFont getRegularFont();

View file

@ -1,6 +1,8 @@
package org.xbib.graphics.pdfbox.layout.font;
import org.apache.pdfbox.pdmodel.font.PDFont;
import java.util.List;
import java.util.Objects;
/**
@ -8,7 +10,7 @@ import java.util.Objects;
*/
public class FontDescriptor {
private final Font font;
private final List<Font> fonts;
private float size;
@ -18,20 +20,20 @@ public class FontDescriptor {
private boolean italic;
public FontDescriptor(Font font, float size) {
this(font, size, false, false);
public FontDescriptor(List<Font> fonts, float size) {
this(fonts, size, false, false);
}
public FontDescriptor(Font font, float size, boolean bold, boolean italic) {
this.font = font;
public FontDescriptor(List<Font> fonts, float size, boolean bold, boolean italic) {
this.fonts = fonts;
this.size = size;
this.bold = bold;
this.italic = italic;
this.regular = !bold && !italic;
}
public Font getFont() {
return font;
public List<Font> getFonts() {
return fonts;
}
public void setSize(float size) {
@ -52,27 +54,31 @@ public class FontDescriptor {
this.regular = !bold && !italic;
}
public PDFont getSelectedFont() {
if (regular) {
return font.getRegularFont();
}
if (italic) {
return bold ? font.getBoldItalicFont() : font.getItalicFont();
}
if (bold) {
return font.getBoldFont();
public PDFont getSelectedFont(String text) {
for (Font font : fonts) {
if (font.canWrite(text)) {
if (regular) {
return font.getRegularFont();
}
if (italic) {
return bold ? font.getBoldItalicFont() : font.getItalicFont();
}
if (bold) {
return font.getBoldFont();
}
}
}
throw new IllegalStateException();
}
@Override
public String toString() {
return "FontDescriptor [font=" + font + ", size=" + size + "]";
return "FontDescriptor [font=" + fonts + ", size=" + size + "]";
}
@Override
public int hashCode() {
return Objects.hash(font, size, regular, bold, italic);
return Objects.hash(fonts, size, regular, bold, italic);
}
@Override

View file

@ -1,29 +0,0 @@
package org.xbib.graphics.pdfbox.layout.font;
import org.xbib.graphics.pdfbox.layout.element.Document;
public enum Fonts {
HELVETICA,
TIMES,
COURIER,
NOTOSANS,
NOTOSANSCJK,
OPENSANS,
SOURCESANS;
public Font getFont(Document document) {
if ("notosans".equalsIgnoreCase(name())) {
return new NotoSansFont(document);
}
if ("notosanscjk".equalsIgnoreCase(name())) {
return new NotoSansCJKFont(document);
}
if ("opensans".equalsIgnoreCase(name())) {
return new OpenSansFont(document);
}
if ("sourcesans".equalsIgnoreCase(name())) {
return new SourceSansFont(document);
}
return BaseFont.valueOf(name());
}
}

View file

@ -1,93 +0,0 @@
package org.xbib.graphics.pdfbox.layout.font;
import org.apache.fontbox.ttf.TTFParser;
import org.apache.fontbox.ttf.TrueTypeFont;
import org.apache.pdfbox.io.RandomAccessRead;
import org.apache.pdfbox.io.RandomAccessReadBuffer;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.pdmodel.font.PDFont;
import org.apache.pdfbox.pdmodel.font.PDType0Font;
import org.xbib.graphics.pdfbox.layout.element.Document;
import java.io.IOException;
import java.io.InputStream;
import java.io.UncheckedIOException;
public class NotoSansCJKFont implements Font {
private final PDDocument pdDocument;
private PDType0Font regularFont;
private PDType0Font boldFont;
private PDType0Font italicFont;
private PDType0Font boldItalicFont;
public NotoSansCJKFont(Document document) {
this.pdDocument = document.getPdDocument();
}
@Override
public PDFont getRegularFont() {
if (regularFont == null) {
regularFont = load("NotoSansCJKsc-Regular.ttf");
}
return regularFont;
}
@Override
public PDFont getBoldFont() {
if (boldFont == null) {
boldFont = load("NotoSansCJKsc-Regular.ttf");
}
return boldFont;
}
@Override
public PDFont getItalicFont() {
if (italicFont == null) {
italicFont = load("NotoSansCJKsc-Regular.ttf");
}
return italicFont;
}
@Override
public PDFont getBoldItalicFont() {
if (boldItalicFont == null) {
boldItalicFont = load("NotoSansCJKsc-Regular.ttf");
}
return boldItalicFont;
}
@Override
public boolean hasGlyph(int code) {
try {
return regularFont.hasGlyph(code);
} catch (IOException e) {
return false;
}
}
@Override
public boolean canWrite(String string) {
try {
return regularFont.getStringWidth(string) > 0;
} catch (IOException e) {
return false;
}
}
private PDType0Font load(String resourceName) {
try {
InputStream inputStream = NotoSansCJKFont.class.getResourceAsStream(resourceName);
TTFParser ttfParser = new TTFParser();
RandomAccessRead randomAccessRead = new RandomAccessReadBuffer(inputStream);
TrueTypeFont openTypeFont = ttfParser.parse(randomAccessRead);
return PDType0Font.load(pdDocument, openTypeFont, true);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}

View file

@ -1,84 +0,0 @@
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 org.xbib.graphics.pdfbox.layout.element.Document;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.Objects;
public class NotoSansFont implements Font {
private final PDDocument pdDocument;
private PDType0Font regularFont;
private PDType0Font boldFont;
private PDType0Font italicFont;
private PDType0Font boldItalicFont;
public NotoSansFont(Document document) {
this.pdDocument = document.getPdDocument();
}
@Override
public PDFont getRegularFont() {
if (regularFont == null) {
regularFont = load("NotoSans-Regular.ttf");
}
return regularFont;
}
@Override
public PDFont getBoldFont() {
if (boldFont == null) {
boldFont = load("NotoSans-Bold.ttf");
}
return boldFont;
}
@Override
public PDFont getItalicFont() {
if (italicFont == null) {
italicFont = load("NotoSans-Italic.ttf");
}
return italicFont;
}
@Override
public PDFont getBoldItalicFont() {
if (boldItalicFont == null) {
boldItalicFont = load("NotoSans-BoldItalic.ttf");
}
return boldItalicFont;
}
@Override
public boolean hasGlyph(int code) {
try {
return regularFont.hasGlyph(code);
} catch (IOException e) {
return false;
}
}
@Override
public boolean canWrite(String string) {
try {
return regularFont.getStringWidth(string) > 0;
} catch (IOException e) {
return false;
}
}
private PDType0Font load(String resourceName) {
try {
return PDType0Font.load(pdDocument, Objects.requireNonNull(NotoSansFont.class.getResourceAsStream(resourceName)), true);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}

View file

@ -1,85 +0,0 @@
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 org.xbib.graphics.pdfbox.layout.element.Document;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.Objects;
public class OpenSansFont implements Font {
private final PDDocument pdDocument;
private PDType0Font regularFont;
private PDType0Font boldFont;
private PDType0Font italicFont;
private PDType0Font boldItalicFont;
public OpenSansFont(Document document) {
this.pdDocument = document.getPdDocument();
}
@Override
public PDFont getRegularFont() {
if (regularFont == null) {
regularFont = load("OpenSans-Regular.ttf");
}
return regularFont;
}
@Override
public PDFont getBoldFont() {
if (boldFont == null) {
boldFont = load("OpenSans-Bold.ttf");
}
return boldFont;
}
@Override
public PDFont getItalicFont() {
if (italicFont == null) {
italicFont = load("OpenSans-Italic.ttf");
}
return italicFont;
}
@Override
public PDFont getBoldItalicFont() {
if (boldItalicFont == null) {
boldItalicFont = load("OpenSans-BoldItalic.ttf");
}
return boldItalicFont;
}
@Override
public boolean hasGlyph(int code) {
try {
return regularFont.hasGlyph(code);
} catch (IOException e) {
return false;
}
}
@Override
public boolean canWrite(String string) {
try {
return regularFont.getStringWidth(string) > 0;
} catch (IOException e) {
return false;
}
}
private PDType0Font load(String resourceName) {
try {
return PDType0Font.load(pdDocument, Objects.requireNonNull(OpenSansFont.class.getResourceAsStream(resourceName)), true);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}

View file

@ -1,85 +0,0 @@
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 org.xbib.graphics.pdfbox.layout.element.Document;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.Objects;
public class SourceSansFont implements Font {
private final PDDocument pdDocument;
private PDType0Font regularFont;
private PDType0Font boldFont;
private PDType0Font italicFont;
private PDType0Font boldItalicFont;
public SourceSansFont(Document document) {
this.pdDocument = document.getPdDocument();
}
@Override
public PDFont getRegularFont() {
if (regularFont == null) {
regularFont = load("SourceSans3-Regular.ttf");
}
return regularFont;
}
@Override
public PDFont getBoldFont() {
if (boldFont == null) {
boldFont = load("SourceSans3-Bold.ttf");
}
return boldFont;
}
@Override
public PDFont getItalicFont() {
if (italicFont == null) {
italicFont = load("SourceSans3-It.ttf");
}
return italicFont;
}
@Override
public PDFont getBoldItalicFont() {
if (boldItalicFont == null) {
boldItalicFont = load("SourceSans3-BoldIt.ttf");
}
return boldItalicFont;
}
@Override
public boolean hasGlyph(int code) {
try {
return regularFont.hasGlyph(code);
} catch (IOException e) {
return false;
}
}
@Override
public boolean canWrite(String string) {
try {
return regularFont.getStringWidth(string) > 0;
} catch (IOException e) {
return false;
}
}
private PDType0Font load(String resourceName) {
try {
return PDType0Font.load(pdDocument, Objects.requireNonNull(SourceSansFont.class.getResourceAsStream(resourceName)), true);
} catch (IOException e) {
throw new UncheckedIOException(e);
}
}
}

View file

@ -8,6 +8,7 @@ import org.xbib.graphics.pdfbox.layout.text.annotations.Annotations;
import java.awt.Color;
import java.util.Collections;
import java.util.List;
public class Hyperlink implements ParagraphProcessor {
@ -75,7 +76,7 @@ public class Hyperlink implements ParagraphProcessor {
public void process(Paragraph paragraph, Parameters parameters) {
Annotations.HyperlinkAnnotation hyperlink =
new Annotations.HyperlinkAnnotation(getUrl(), Annotations.HyperlinkAnnotation.LinkStyle.ul);
FontDescriptor fontDescriptor = new FontDescriptor(getFont() != null ? getFont() : parameters.getFont(),
FontDescriptor fontDescriptor = new FontDescriptor(List.of(getFont() != null ? getFont() : parameters.getFont()),
getFontSize() != null ? getFontSize() : parameters.getFontSize());
paragraph.add(new AnnotatedStyledText(getText(), fontDescriptor,
getColor(), getBaselineOffset(), 0, 0, Collections.singleton(hyperlink)));

View file

@ -3,6 +3,8 @@ package org.xbib.graphics.pdfbox.layout.table;
import org.xbib.graphics.pdfbox.layout.element.Paragraph;
import org.xbib.graphics.pdfbox.layout.font.Font;
import java.util.List;
public class Markup implements ParagraphProcessor {
private String value;
@ -41,6 +43,6 @@ public class Markup implements ParagraphProcessor {
@Override
public void process(Paragraph paragraph, Parameters parameters) {
float fontSize = getFontSize() != null ? getFontSize() : parameters.getFontSize();
paragraph.addMarkup(getValue(), fontSize, font);
paragraph.addMarkup(getValue(), fontSize, List.of(font));
}
}

View file

@ -4,6 +4,8 @@ import org.xbib.graphics.pdfbox.layout.element.Paragraph;
import org.xbib.graphics.pdfbox.layout.font.Font;
import org.xbib.graphics.pdfbox.layout.font.FontDescriptor;
import java.util.List;
public class NewLine implements ParagraphProcessor {
private final Font font;
@ -17,7 +19,7 @@ public class NewLine implements ParagraphProcessor {
@Override
public void process(Paragraph paragraph, Parameters parameters) {
paragraph.add(new org.xbib.graphics.pdfbox.layout.text.NewLine(new FontDescriptor(font, fontSize)));
paragraph.add(new org.xbib.graphics.pdfbox.layout.text.NewLine(new FontDescriptor(List.of(font), fontSize)));
}
}

View file

@ -6,6 +6,7 @@ import org.xbib.graphics.pdfbox.layout.font.FontDescriptor;
import org.xbib.graphics.pdfbox.layout.util.PdfUtil;
import java.awt.Color;
import java.util.List;
public class StyledText implements ParagraphProcessor {
@ -57,10 +58,10 @@ public class StyledText implements ParagraphProcessor {
// TODO this is a complete mess to handle new lines!!!
String[] lines = getText().split(PdfUtil.NEW_LINE_REGEX);
for (int i = 0; i < lines.length; i++) {
FontDescriptor fontDescriptor = new FontDescriptor(actualFont, actualFontSize);
FontDescriptor fontDescriptor = new FontDescriptor(List.of(actualFont), actualFontSize);
paragraph.add(new org.xbib.graphics.pdfbox.layout.text.StyledText(lines[i], fontDescriptor, actualColor, 0f, 0, 0, 0));
if (i < lines.length - 1) {
paragraph.add(new org.xbib.graphics.pdfbox.layout.text.NewLine(new FontDescriptor(actualFont, actualFontSize)));
paragraph.add(new org.xbib.graphics.pdfbox.layout.text.NewLine(new FontDescriptor(List.of(actualFont), actualFontSize)));
}
}
}

View file

@ -5,13 +5,14 @@ import org.xbib.graphics.pdfbox.layout.font.FontDescriptor;
import java.awt.Color;
import java.io.IOException;
import java.io.UncheckedIOException;
import java.util.List;
/**
* Control fragment that represents a indent in text.
*/
public class Indent extends ControlFragment {
public static final FontDescriptor DEFAULT_FONT_DESCRIPTOR = new FontDescriptor(BaseFont.HELVETICA, 11);
public static final FontDescriptor DEFAULT_FONT_DESCRIPTOR = new FontDescriptor(List.of(BaseFont.HELVETICA), 10);
/**
* Constant for the indentation of 0.
@ -87,21 +88,17 @@ public class Indent extends ControlFragment {
}
try {
float indent = calculateIndent(indentWidth, indentUnit, fontDescriptor);
float textWidth = fontDescriptor.getSize() * fontDescriptor.getSelectedFont().getStringWidth(label) / 1000f;
float textWidth = fontDescriptor.getSize() * fontDescriptor.getSelectedFont(label).getStringWidth(label) / 1000f;
float marginLeft = 0;
float marginRight = 0;
if (textWidth < indent) {
switch (alignment) {
case LEFT:
marginRight = indent - textWidth;
break;
case RIGHT:
marginLeft = indent - textWidth;
break;
default:
case LEFT -> marginRight = indent - textWidth;
case RIGHT -> marginLeft = indent - textWidth;
default -> {
marginLeft = (indent - textWidth) / 2f;
marginRight = marginLeft;
break;
}
}
}
styledText = new StyledText(label, fontDescriptor, getColor(), 0, marginLeft, marginRight, 0);

View file

@ -23,11 +23,10 @@ public enum SpaceUnit {
* @param size the size with respect to the unit.
* @param fontDescriptor the font/size to use.
* @return the size in pt.
* @throws IOException by pdfbox
*/
public float toPt(float size, FontDescriptor fontDescriptor) throws IOException {
public float toPt(float size, FontDescriptor fontDescriptor) {
if (this == em) {
return fontDescriptor.getSize() * fontDescriptor.getSelectedFont().getAverageFontWidth() / 1000 * size;
return fontDescriptor.getSize() * fontDescriptor.getSelectedFont(" ").getAverageFontWidth() / 1000 * size;
}
return size;
}

View file

@ -124,7 +124,7 @@ public class StyledText implements TextFragment {
* @throws IOException by pdfbox.
*/
public float getAscent() throws IOException {
return getFontDescriptor().getSize() * getFontDescriptor().getSelectedFont().getFontDescriptor().getAscent() / 1000;
return getFontDescriptor().getSize() * getFontDescriptor().getSelectedFont(text).getFontDescriptor().getAscent() / 1000;
}
public float getBaselineOffset() {
@ -180,7 +180,7 @@ public class StyledText implements TextFragment {
private static float getWidth(FontDescriptor fontDescriptor, String text) {
try {
return fontDescriptor.getSize() * fontDescriptor.getSelectedFont().getStringWidth(text) / 1000;
return fontDescriptor.getSize() * fontDescriptor.getSelectedFont(text).getStringWidth(text) / 1000;
} catch (Exception e) {
logger.log(Level.WARNING, e.getMessage(), e);
return 0f;

View file

@ -16,7 +16,7 @@ import java.util.Map;
* 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>
* In order to ease creation of styled text, this class supports a kind of
* {@link #addMarkup(String, float, Font) markup}. The following raw text
* markup. The following raw text
*
* <pre>
* Markup supports *bold*, _italic_, and *even _mixed* markup_.
@ -73,24 +73,24 @@ public class TextFlow implements TextSequence, WidthRespecting {
return (T) cache.get(key);
}
public void addText(String text, float fontSize, Font font) {
add(TextFlowUtil.createTextFlow(text, new FontDescriptor(font, fontSize), lineSpacing, rotation));
public void addText(String text, float fontSize, List<Font> fonts) {
add(TextFlowUtil.createTextFlow(text, new FontDescriptor(fonts, fontSize), lineSpacing, rotation));
}
public void addMarkup(String markup, FontDescriptor fontDescriptor) {
add(TextFlowUtil.createTextFlowFromMarkup(markup, fontDescriptor, lineSpacing, rotation));
}
public void addMarkup(String markup, float fontSize, Font font) {
add(TextFlowUtil.createTextFlowFromMarkup(markup, new FontDescriptor(font, fontSize), lineSpacing, rotation));
public void addMarkup(String markup, float fontSize, List<Font> fonts) {
add(TextFlowUtil.createTextFlowFromMarkup(markup, new FontDescriptor(fonts, fontSize), lineSpacing, rotation));
}
public void addIndent(String label, float indentWidth, SpaceUnit indentUnit, float fontsize, Font font) {
add(new Indent(label, indentWidth, indentUnit, new FontDescriptor(font, fontsize)));
public void addIndent(String label, float indentWidth, SpaceUnit indentUnit, float fontsize, List<Font> fonts) {
add(new Indent(label, indentWidth, indentUnit, new FontDescriptor(fonts, fontsize)));
}
public void addIndent(String label, float indentWidth, SpaceUnit indentUnit, float fontsize, Font font, Alignment alignment) {
add(new Indent(label, indentWidth, indentUnit, new FontDescriptor(font, fontsize), alignment));
public void addIndent(String label, float indentWidth, SpaceUnit indentUnit, float fontsize, List<Font> fonts, Alignment alignment) {
add(new Indent(label, indentWidth, indentUnit, new FontDescriptor(fonts, fontsize), alignment));
}
/**

View file

@ -90,8 +90,7 @@ public class TextFlowUtil {
if (fragment instanceof ControlCharacters.ColorControlCharacter) {
color = ((ControlCharacters.ColorControlCharacter) fragment).getColor();
}
if (fragment instanceof AnnotationCharacters.AnnotationControlCharacter) {
AnnotationCharacters.AnnotationControlCharacter<?> annotationControlCharacter = (AnnotationCharacters.AnnotationControlCharacter<?>) fragment;
if (fragment instanceof AnnotationCharacters.AnnotationControlCharacter<?> annotationControlCharacter) {
if (annotationMap.containsKey(annotationControlCharacter.getAnnotationType())) {
annotationMap.remove(annotationControlCharacter.getAnnotationType());
} else {
@ -106,8 +105,7 @@ public class TextFlowUtil {
metricsControl = (ControlCharacters.MetricsControlCharacter) fragment;
}
}
if (fragment instanceof IndentCharacters.IndentCharacter) {
IndentCharacters.IndentCharacter currentIndent = (IndentCharacters.IndentCharacter) fragment;
if (fragment instanceof IndentCharacters.IndentCharacter currentIndent) {
if (currentIndent.getLevel() == 0) {
indentStack.clear();
textFlow.add(Indent.UNINDENT);
@ -124,7 +122,7 @@ public class TextFlowUtil {
}
indentStack.push(currentIndent);
FontDescriptor fontDescriptor =
new FontDescriptor(descriptor.getFont(), descriptor.getSize(), bold, italic);
new FontDescriptor(descriptor.getFonts(), descriptor.getSize(), bold, italic);
textFlow.add(currentIndent.createNewIndent(fontDescriptor, color));
}
}
@ -135,7 +133,7 @@ public class TextFlowUtil {
baselineOffset = metricsControl.getBaselineOffsetScale() * descriptor.getSize();
currentFontSize *= metricsControl.getFontScale();
}
FontDescriptor fontDescriptor = new FontDescriptor(descriptor.getFont(), currentFontSize, bold, italic);
FontDescriptor fontDescriptor = new FontDescriptor(descriptor.getFonts(), currentFontSize, bold, italic);
if (annotationMap.isEmpty()) {
StyledText styledText = new StyledText(fragment.toString(), fontDescriptor, color, baselineOffset, 0, 0, rotation);
textFlow.add(styledText);

View file

@ -147,8 +147,11 @@ public class TextLine implements TextSequence {
ascent = 0f;
for (TextFragment fragment : this) {
FontDescriptor fontDescriptor = fragment.getFontDescriptor();
float currentAscent = fontDescriptor.getSize() * fontDescriptor.getSelectedFont().getFontDescriptor().getAscent() / 1000;
ascent = Math.max(ascent, currentAscent);
String printable = fragment.getText().replaceAll("\\P{Print}|\\p{Cntrl}|\\p{Space}", "");
if (!printable.isEmpty()) {
float currentAscent = fontDescriptor.getSize() * fontDescriptor.getSelectedFont(printable).getFontDescriptor().getAscent() / 1000;
ascent = Math.max(ascent, currentAscent);
}
}
setCachedValue(ASCENT, ascent);
}
@ -204,13 +207,13 @@ public class TextLine implements TextSequence {
contentStream.setTextMatrix(matrix);
if (!styledText.getFontDescriptor().equals(lastFontDesc)) {
lastFontDesc = styledText.getFontDescriptor();
contentStream.setFont(lastFontDesc.getSelectedFont(), lastFontDesc.getSize());
contentStream.setFont(lastFontDesc.getSelectedFont(styledText.getText()), lastFontDesc.getSize());
}
if (!styledText.getColor().equals(lastColor)) {
lastColor = styledText.getColor();
contentStream.setNonStrokingColor(lastColor);
}
if (styledText.getText().length() > 0) {
if (!styledText.getText().isEmpty()) {
contentStream.showText(styledText.getText());
}
contentStream.endText();

View file

@ -354,13 +354,13 @@ public class TextSequenceUtil {
/**
* Returns the width of the given text in the given font.
*
* @param text the text to measure.
* @param text the text to measure.
* @param fontDescriptor font and size.
* @return the width of given text.
*/
public static float getStringWidth(String text, FontDescriptor fontDescriptor) {
try {
return fontDescriptor.getSize() * fontDescriptor.getSelectedFont().getStringWidth(text) / 1000;
return fontDescriptor.getSize() * fontDescriptor.getSelectedFont(text).getStringWidth(text) / 1000;
} catch (IOException exception) {
throw new UncheckedIOException(exception);
}

View file

@ -27,13 +27,12 @@ public class UnderlineAnnotationProcessor implements AnnotationProcessor {
Position upperLeft,
float width,
float height) {
if (!(drawnObject instanceof StyledText)) {
if (!(drawnObject instanceof StyledText drawnText)) {
return;
}
StyledText drawnText = (StyledText) drawnObject;
for (UnderlineAnnotation underlineAnnotation : drawnObject.getAnnotationsOfType(UnderlineAnnotation.class)) {
float fontSize = drawnText.getFontDescriptor().getSize();
float ascent = fontSize * drawnText.getFontDescriptor().getSelectedFont().getFontDescriptor().getAscent() / 1000;
float ascent = fontSize * drawnText.getFontDescriptor().getSelectedFont(drawnText.getText()).getFontDescriptor().getAscent() / 1000;
float baselineOffset = fontSize * underlineAnnotation.getBaselineOffsetScale();
float thickness = (0.01f + fontSize * 0.05f) * underlineAnnotation.getLineWeight();
Position start = new Position(upperLeft.getX(), upperLeft.getY() - ascent + baselineOffset);

View file

@ -9,6 +9,7 @@ import org.xbib.graphics.pdfbox.layout.font.BaseFont;
import org.xbib.graphics.pdfbox.layout.util.WordBreakerFactory;
import java.io.FileOutputStream;
import java.io.OutputStream;
import java.util.List;
public class AlignedTest {
@ -18,22 +19,22 @@ public class AlignedTest {
WordBreakerFactory.LEGACY_WORD_BREAKER_CLASS_NAME);
Document document = new Document(40, 60, 40, 60);
Paragraph paragraph = new Paragraph();
paragraph.addText("This is some left aligned text", 11, BaseFont.HELVETICA);
paragraph.addText("This is some left aligned text", 11, List.of(BaseFont.HELVETICA));
paragraph.setAlignment(Alignment.LEFT);
paragraph.setMaxWidth(40);
document.add(paragraph, VerticalLayoutHint.LEFT);
paragraph = new Paragraph();
paragraph.addText("This is some centered text", 11, BaseFont.HELVETICA);
paragraph.addText("This is some centered text", 11, List.of(BaseFont.HELVETICA));
paragraph.setAlignment(Alignment.CENTER);
paragraph.setMaxWidth(40);
document.add(paragraph, VerticalLayoutHint.CENTER);
paragraph = new Paragraph();
paragraph.addText("This is some right aligned text", 11, BaseFont.HELVETICA);
paragraph.addText("This is some right aligned text", 11, List.of(BaseFont.HELVETICA));
paragraph.setAlignment(Alignment.RIGHT);
paragraph.setMaxWidth(40);
document.add(paragraph, VerticalLayoutHint.RIGHT);
paragraph = new Paragraph();
paragraph.addText("Text is right aligned, and paragraph centered", 11, BaseFont.HELVETICA);
paragraph.addText("Text is right aligned, and paragraph centered", 11, List.of(BaseFont.HELVETICA));
paragraph.setAlignment(Alignment.RIGHT);
paragraph.setMaxWidth(40);
document.add(paragraph, VerticalLayoutHint.CENTER);

View file

@ -8,6 +8,7 @@ import org.xbib.graphics.pdfbox.layout.element.render.ColumnLayout;
import org.xbib.graphics.pdfbox.layout.element.render.VerticalLayoutHint;
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
import java.io.FileOutputStream;
import java.util.List;
public class ColumnsTest {
@ -33,18 +34,18 @@ public class ColumnsTest {
Document document = new Document(40, 50, 40, 60);
Paragraph title = new Paragraph();
title.addMarkup("*This Text is organized in Colums*", 20, BaseFont.TIMES);
title.addMarkup("*This Text is organized in Colums*", 20, List.of(BaseFont.TIMES));
document.add(title, VerticalLayoutHint.CENTER);
document.add(new VerticalSpacer(5));
document.add(new ColumnLayout().setColumnCount(2).setColumnSpacing(10f));
Paragraph paragraph1 = new Paragraph();
paragraph1.addMarkup(text1, 11, BaseFont.TIMES);
paragraph1.addMarkup(text1, 11, List.of(BaseFont.TIMES));
document.add(paragraph1);
Paragraph paragraph2 = new Paragraph();
paragraph2.addMarkup(text2, 12, BaseFont.HELVETICA);
paragraph2.addMarkup(text2, 12, List.of(BaseFont.HELVETICA));
document.add(paragraph2);
Paragraph paragraph3 = new Paragraph();
paragraph3.addMarkup(text1, 8, BaseFont.COURIER);
paragraph3.addMarkup(text1, 8, List.of(BaseFont.COURIER));
document.add(paragraph3);
document.add(paragraph1);
document.add(paragraph3);

View file

@ -191,17 +191,17 @@ public class CustomAnnotationTest {
.margins(40, 60, 40, 60).portrait().build());
Paragraph paragraph = new Paragraph();
paragraph.addText("Hello there, here is ", 10, BaseFont.HELVETICA);
paragraph.addText("Hello there, here is ", 10, List.of(BaseFont.HELVETICA));
// now add some annotated text using our custom highlight annotation
HighlightAnnotation annotation = new HighlightAnnotation(Color.green);
FontDescriptor fontDescriptor = new FontDescriptor(BaseFont.HELVETICA, 10);
FontDescriptor fontDescriptor = new FontDescriptor(List.of(BaseFont.HELVETICA), 10);
AnnotatedStyledText highlightedText = new AnnotatedStyledText(
"highlighted text", fontDescriptor, Color.black, 0f, 0, 0,
Collections.singleton(annotation));
paragraph.add(highlightedText);
paragraph.addText(". Do whatever you want here...strike, squiggle, whatsoever\n\n",
10, BaseFont.HELVETICA);
10, List.of(BaseFont.HELVETICA));
paragraph.setMaxWidth(150);
document.add(paragraph);
@ -210,7 +210,7 @@ public class CustomAnnotationTest {
paragraph = new Paragraph();
paragraph.addMarkup("Hello there, here is {hl:#ffff00}highlighted text{hl}. "
+ "Do whatever you want here...strike, squiggle, whatsoever\n\n",
10, BaseFont.HELVETICA);
10, List.of(BaseFont.HELVETICA));
paragraph.setMaxWidth(150);
document.add(paragraph);
document.render().save(new FileOutputStream("build/customannotation.pdf")).close();

View file

@ -22,6 +22,7 @@ import org.xbib.graphics.pdfbox.layout.text.TextSequenceUtil;
import java.awt.Color;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
public class CustomRendererTest {
@ -51,9 +52,9 @@ public class CustomRendererTest {
document.addRenderListener(sectionRenderer);
Paragraph paragraph = new Paragraph();
paragraph.addMarkup(text1, 11, BaseFont.TIMES);
paragraph.addMarkup(text2, 12, BaseFont.HELVETICA);
paragraph.addMarkup(text1, 8, BaseFont.COURIER);
paragraph.addMarkup(text1, 11, List.of(BaseFont.TIMES));
paragraph.addMarkup(text2, 12, List.of(BaseFont.HELVETICA));
paragraph.addMarkup(text1, 8, List.of(BaseFont.COURIER));
document.add(new Section(1));
document.add(paragraph);
@ -97,7 +98,7 @@ public class CustomRendererTest {
@Override
public void afterPage(RenderContext renderContext) {
String content = String.format("Section %s, Page %s", sectionNumber, renderContext.getPageIndex() + 1);
FontDescriptor fontDescriptor = new FontDescriptor(BaseFont.TIMES, 11);
FontDescriptor fontDescriptor = new FontDescriptor(List.of(BaseFont.TIMES), 11);
TextFlow text = TextFlowUtil.createTextFlow(content, fontDescriptor, 1.2f, 0f);
float offset = renderContext.getPageFormat().getMarginLeft() +
TextSequenceUtil.getOffset(text, renderContext.getWidth(), Alignment.RIGHT);

View file

@ -14,6 +14,7 @@ import org.xbib.graphics.pdfbox.layout.text.Alignment;
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
import java.awt.Color;
import java.io.FileOutputStream;
import java.util.List;
public class FramesTest {
@ -39,7 +40,7 @@ public class FramesTest {
Document document = new Document(PageFormats.A5_PORTRAIT);
Paragraph paragraph = new Paragraph();
paragraph.addMarkup("Am I living in a box?", 11, BaseFont.TIMES);
paragraph.addMarkup("Am I living in a box?", 11, List.of(BaseFont.TIMES));
Frame frame = new Frame(paragraph);
frame.setShape(new Rect());
frame.setBorder(Color.black, new Stroke());
@ -47,7 +48,7 @@ public class FramesTest {
frame.setMargin(40, 40, 20, 10);
document.add(frame, VerticalLayoutHint.CENTER);
paragraph = new Paragraph();
paragraph.addMarkup(text1, 11, BaseFont.TIMES);
paragraph.addMarkup(text1, 11, List.of(BaseFont.TIMES));
frame = new Frame(paragraph, 200f, null);
frame.setShape(new Rect());
frame.setBackgroundColor(Color.black);
@ -55,7 +56,7 @@ public class FramesTest {
frame.setMargin(40, 40, 20, 10);
document.add(frame);
paragraph = new Paragraph();
paragraph.addMarkup("{color:#aa00aa}*Ain't no rectangle*", 22, BaseFont.HELVETICA);
paragraph.addMarkup("{color:#aa00aa}*Ain't no rectangle*", 22, List.of(BaseFont.HELVETICA));
paragraph.setAlignment(Alignment.CENTER);
frame = new Frame(paragraph, 300f, 100f);
frame.setShape(new Ellipse());
@ -64,9 +65,9 @@ public class FramesTest {
frame.setPadding(50, 0, 35, 0);
document.add(frame);
paragraph = new Paragraph();
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("Frames also paginate, see here:\n\n", 13, List.of(BaseFont.TIMES));
paragraph.addMarkup(text2, 11, List.of(BaseFont.TIMES));
paragraph.addMarkup(text2, 11, List.of(BaseFont.TIMES));
frame = new Frame(paragraph, null, null);
frame.setShape(new RoundRect(10));
frame.setBorder(Color.magenta, new Stroke(3));
@ -74,8 +75,8 @@ public class FramesTest {
frame.setPadding(20, 15, 10, 15);
frame.setMargin(50, 50, 20, 10);
paragraph = new Paragraph();
paragraph.addMarkup(text2, 11, BaseFont.TIMES);
paragraph.addMarkup(text2, 11, BaseFont.TIMES);
paragraph.addMarkup(text2, 11, List.of(BaseFont.TIMES));
paragraph.addMarkup(text2, 11, List.of(BaseFont.TIMES));
frame.addDrawable(paragraph);
document.add(frame);
document.render().save(new FileOutputStream("build/frames.pdf")).close();

View file

@ -14,6 +14,7 @@ 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.util.List;
public class HelloBarcodeTest {
@ -22,7 +23,7 @@ public class HelloBarcodeTest {
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);
paragraph.addMarkup("Hello Barcode\n", 12, List.of(BaseFont.HELVETICA));
document.add(paragraph);
Symbol symbol = new Code3Of9();
symbol.setContent("1234567890");

View file

@ -8,6 +8,7 @@ import org.xbib.graphics.pdfbox.layout.element.render.VerticalLayoutHint;
import org.xbib.graphics.pdfbox.layout.text.Alignment;
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
import java.io.FileOutputStream;
import java.util.List;
import javax.imageio.ImageIO;
public class HelloCatTest {
@ -16,7 +17,7 @@ public class HelloCatTest {
public void test() throws Exception {
Document document = new Document();
Paragraph paragraph = new Paragraph();
paragraph.addText("Hello Cat", 12, BaseFont.HELVETICA);
paragraph.addText("Hello Cat", 12, List.of(BaseFont.HELVETICA));
document.add(paragraph);
ImageElement imageElement = new ImageElement();
imageElement.setImage(ImageIO.read(getClass().getResourceAsStream("cat.jpg")));

View file

@ -5,6 +5,7 @@ import org.xbib.graphics.pdfbox.layout.element.Document;
import org.xbib.graphics.pdfbox.layout.element.Paragraph;
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
import java.io.FileOutputStream;
import java.util.List;
public class HelloDocTest {
@ -12,7 +13,7 @@ public class HelloDocTest {
public void test() throws Exception {
Document document = new Document(40, 60, 40, 60);
Paragraph paragraph = new Paragraph();
paragraph.addText("Hello Document", 20, BaseFont.HELVETICA);
paragraph.addText("Hello Document", 20, List.of(BaseFont.HELVETICA));
document.add(paragraph);
document.render().save(new FileOutputStream("build/hellodoc.pdf")).close();
}

View file

@ -5,19 +5,19 @@ import org.xbib.graphics.pdfbox.layout.element.Document;
import org.xbib.graphics.pdfbox.layout.element.PageFormats;
import org.xbib.graphics.pdfbox.layout.element.Paragraph;
import org.xbib.graphics.pdfbox.layout.font.Font;
import org.xbib.graphics.pdfbox.layout.font.NotoSansCJKFont;
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.util.List;
public class HelloNotoSansCJKFontTest {
@Test
public void testDocumentOne() throws Exception {
Document document = new Document(PageFormats.A4_PORTRAIT);
Font font = new NotoSansCJKFont(document);
document.registerNotoSansCJKSCFont();
List<Font> font = List.of(document.getFont("notosanscjksc"));
Paragraph paragraph = new Paragraph();
paragraph.add(new Indent(32, SpaceUnit.pt));
paragraph.addMarkup("Hello Noto Sans CJK Regular\n", 12, font);
@ -36,7 +36,8 @@ public class HelloNotoSansCJKFontTest {
@Test
public void testDocumentTwo() throws Exception {
Document document = new Document(PageFormats.A4_PORTRAIT);
Font font = new NotoSansCJKFont(document);
document.registerNotoSansCJKSCFont();
List<Font> font = List.of(document.getFont("notosanscjksc"));
Paragraph paragraph = new Paragraph();
paragraph.add(new Indent(32, SpaceUnit.pt));
paragraph.addMarkup("Hello Noto Sans CJK Regular 2\n", 12, font);

View file

@ -5,17 +5,18 @@ import org.xbib.graphics.pdfbox.layout.element.Document;
import org.xbib.graphics.pdfbox.layout.element.PageFormats;
import org.xbib.graphics.pdfbox.layout.element.Paragraph;
import org.xbib.graphics.pdfbox.layout.font.Font;
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.util.List;
public class HelloNotoSansFontTest {
@Test
public void testDocumentOne() throws Exception {
Document document = new Document(PageFormats.A4_PORTRAIT);
Font font = new NotoSansFont(document);
document.registerNotoSansFont();
List<Font> font = List.of(document.getFont("notosans"));
Paragraph paragraph = new Paragraph();
paragraph.add(new Indent(32, SpaceUnit.pt));
paragraph.addMarkup("Hello Noto Regular\n", 12, font);
@ -35,7 +36,8 @@ public class HelloNotoSansFontTest {
@Test
public void testDocumentTwo() throws Exception {
Document document = new Document(PageFormats.A4_PORTRAIT);
Font font = new NotoSansFont(document);
document.registerNotoSansFont();
List<Font> font = List.of(document.getFont("notosans"));
Paragraph paragraph = new Paragraph();
paragraph.add(new Indent(32, SpaceUnit.pt));
paragraph.addMarkup("Hello Noto Regular 2\n", 12, font);

View file

@ -5,18 +5,19 @@ import org.xbib.graphics.pdfbox.layout.element.Document;
import org.xbib.graphics.pdfbox.layout.element.PageFormats;
import org.xbib.graphics.pdfbox.layout.element.Paragraph;
import org.xbib.graphics.pdfbox.layout.font.Font;
import org.xbib.graphics.pdfbox.layout.font.OpenSansFont;
import org.xbib.graphics.pdfbox.layout.text.Indent;
import org.xbib.graphics.pdfbox.layout.text.SpaceUnit;
import java.io.FileOutputStream;
import java.util.List;
public class HelloOpenSansFontTest {
@Test
public void testDocumentOne() throws Exception {
Document document = new Document(PageFormats.A4_PORTRAIT);
Font font = new OpenSansFont(document);
document.registerOpenSansFont();
List<Font> font = List.of(document.getFont("opensans"));
Paragraph paragraph = new Paragraph();
paragraph.add(new Indent(32, SpaceUnit.pt));
paragraph.addMarkup("Hello Open Sans Regular\n", 12, font);
@ -37,7 +38,8 @@ public class HelloOpenSansFontTest {
@Test
public void testDocumentTwo() throws Exception {
Document document = new Document(PageFormats.A4_PORTRAIT);
Font font = new OpenSansFont(document);
document.registerOpenSansFont();
List<Font> font = List.of(document.getFont("opensans"));
Paragraph paragraph = new Paragraph();
paragraph.add(new Indent(32, SpaceUnit.pt));
paragraph.addMarkup("Hello Open Sans Regular 2\n", 12, font);

View file

@ -5,18 +5,19 @@ import org.xbib.graphics.pdfbox.layout.element.Document;
import org.xbib.graphics.pdfbox.layout.element.PageFormats;
import org.xbib.graphics.pdfbox.layout.element.Paragraph;
import org.xbib.graphics.pdfbox.layout.font.Font;
import org.xbib.graphics.pdfbox.layout.font.SourceSansFont;
import org.xbib.graphics.pdfbox.layout.text.Indent;
import org.xbib.graphics.pdfbox.layout.text.SpaceUnit;
import java.io.FileOutputStream;
import java.util.List;
public class HelloSourceSansFontTest {
@Test
public void testDocumentOne() throws Exception {
Document document = new Document(PageFormats.A4_PORTRAIT);
Font font = new SourceSansFont(document);
document.registerSourceSansFont();
List<Font> font = List.of(document.getFont("sourcesans"));
Paragraph paragraph = new Paragraph();
paragraph.add(new Indent(32, SpaceUnit.pt));
paragraph.addMarkup("Hello Source Sans Regular\n", 12, font);
@ -37,7 +38,8 @@ public class HelloSourceSansFontTest {
@Test
public void testDocumentTwo() throws Exception {
Document document = new Document(PageFormats.A4_PORTRAIT);
Font font = new SourceSansFont(document);
document.registerSourceSansFont();
List<Font> font = List.of(document.getFont("sourcesans"));
Paragraph paragraph = new Paragraph();
paragraph.add(new Indent(32, SpaceUnit.pt));
paragraph.addMarkup("Hello Source Sans Regular 2\n", 12, font);

View file

@ -13,6 +13,7 @@ import org.xbib.graphics.pdfbox.layout.util.Enumerators.LowerCaseAlphabeticEnume
import org.xbib.graphics.pdfbox.layout.util.Enumerators.LowerCaseRomanEnumerator;
import org.xbib.graphics.pdfbox.layout.util.Enumerators.RomanEnumerator;
import java.io.FileOutputStream;
import java.util.List;
public class IndentationTest {
@ -23,68 +24,68 @@ public class IndentationTest {
Document document = new Document(40, 60, 40, 60);
Paragraph paragraph = new Paragraph();
paragraph.addMarkup("This is an example for the new indent feature. Let's do some empty space indentation:\n",
11, BaseFont.TIMES);
11, List.of(BaseFont.TIMES));
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, List.of(BaseFont.TIMES));
paragraph.addMarkup("The Indentation holds for the rest of the paragraph, or... \n",
11, BaseFont.TIMES);
11, List.of(BaseFont.TIMES));
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, List.of(BaseFont.TIMES));
document.add(paragraph);
paragraph = new Paragraph();
paragraph.addMarkup("New paragraph, now indentation is gone. But we can indent with a label also:\n", 11, BaseFont.TIMES);
paragraph.addIndent("This is some label", 100, SpaceUnit.pt, 11, BaseFont.TIMES);
paragraph.addMarkup("Here we go indented.\n", 11, BaseFont.TIMES);
paragraph.addMarkup("And again, the Indentation holds for the rest of the paragraph, or any new indent comes.\nLabels can be aligned:\n", 11, BaseFont.TIMES);
paragraph.addIndent("Left", 100, SpaceUnit.pt, 11, BaseFont.TIMES, Alignment.LEFT);
paragraph.addMarkup("Indent with label aligned to the left.\n", 11, BaseFont.TIMES);
paragraph.addIndent("Center", 100, SpaceUnit.pt, 11, BaseFont.TIMES, Alignment.CENTER);
paragraph.addMarkup("Indent with label aligned to the center.\n", 11, BaseFont.TIMES);
paragraph.addIndent("Right", 100, SpaceUnit.pt, 11, BaseFont.TIMES, Alignment.RIGHT);
paragraph.addMarkup("Indent with label aligned to the right.\n", 11, BaseFont.TIMES);
paragraph.addMarkup("New paragraph, now indentation is gone. But we can indent with a label also:\n", 11, List.of(BaseFont.TIMES));
paragraph.addIndent("This is some label", 100, SpaceUnit.pt, 11, List.of(BaseFont.TIMES));
paragraph.addMarkup("Here we go indented.\n", 11, List.of(BaseFont.TIMES));
paragraph.addMarkup("And again, the Indentation holds for the rest of the paragraph, or any new indent comes.\nLabels can be aligned:\n", 11, List.of(BaseFont.TIMES));
paragraph.addIndent("Left", 100, SpaceUnit.pt, 11, List.of(BaseFont.TIMES), Alignment.LEFT);
paragraph.addMarkup("Indent with label aligned to the left.\n", 11, List.of(BaseFont.TIMES));
paragraph.addIndent("Center", 100, SpaceUnit.pt, 11, List.of(BaseFont.TIMES), Alignment.CENTER);
paragraph.addMarkup("Indent with label aligned to the center.\n", 11, List.of(BaseFont.TIMES));
paragraph.addIndent("Right", 100, SpaceUnit.pt, 11, List.of(BaseFont.TIMES), Alignment.RIGHT);
paragraph.addMarkup("Indent with label aligned to the right.\n", 11, List.of(BaseFont.TIMES));
document.add(paragraph);
paragraph = new Paragraph();
paragraph.addMarkup("So, what can you do with that? How about lists:\n", 11, BaseFont.TIMES);
paragraph.addIndent(bulletOdd, 4, SpaceUnit.em, 11, BaseFont.TIMES, Alignment.RIGHT);
paragraph.addMarkup("This is a list item\n", 11, BaseFont.TIMES);
paragraph.addIndent(bulletOdd, 4, SpaceUnit.em, 11, BaseFont.TIMES, Alignment.RIGHT);
paragraph.addMarkup("Another list item\n", 11, BaseFont.TIMES);
paragraph.addIndent(bulletEven, 8, SpaceUnit.em, 11, BaseFont.TIMES, Alignment.RIGHT);
paragraph.addMarkup("Sub list item\n", 11, BaseFont.TIMES);
paragraph.addIndent(bulletOdd, 4, SpaceUnit.em, 11, BaseFont.TIMES, Alignment.RIGHT);
paragraph.addMarkup("And yet another one\n", 11, BaseFont.TIMES);
paragraph.addMarkup("So, what can you do with that? How about lists:\n", 11, List.of(BaseFont.TIMES));
paragraph.addIndent(bulletOdd, 4, SpaceUnit.em, 11, List.of(BaseFont.TIMES), Alignment.RIGHT);
paragraph.addMarkup("This is a list item\n", 11, List.of(BaseFont.TIMES));
paragraph.addIndent(bulletOdd, 4, SpaceUnit.em, 11, List.of(BaseFont.TIMES), Alignment.RIGHT);
paragraph.addMarkup("Another list item\n", 11, List.of(BaseFont.TIMES));
paragraph.addIndent(bulletEven, 8, SpaceUnit.em, 11, List.of(BaseFont.TIMES), Alignment.RIGHT);
paragraph.addMarkup("Sub list item\n", 11, List.of(BaseFont.TIMES));
paragraph.addIndent(bulletOdd, 4, SpaceUnit.em, 11, List.of(BaseFont.TIMES), Alignment.RIGHT);
paragraph.addMarkup("And yet another one\n", 11, List.of(BaseFont.TIMES));
document.add(paragraph);
paragraph = new Paragraph();
paragraph.addMarkup("Also available with indents: Enumerators:\n", 11, BaseFont.TIMES);
paragraph.addMarkup("Also available with indents: Enumerators:\n", 11, List.of(BaseFont.TIMES));
RomanEnumerator e1 = new RomanEnumerator();
LowerCaseAlphabeticEnumerator e2 = new LowerCaseAlphabeticEnumerator();
paragraph.addIndent(e1.next() + ". ", 4, SpaceUnit.em, 11, BaseFont.TIMES, Alignment.RIGHT);
paragraph.addMarkup("First item\n", 11, BaseFont.TIMES);
paragraph.addIndent(e1.next() + ". ", 4, SpaceUnit.em, 11, BaseFont.TIMES, Alignment.RIGHT);
paragraph.addMarkup("Second item\n", 11, BaseFont.TIMES);
paragraph.addIndent(e2.next() + ") ", 8, SpaceUnit.em, 11, BaseFont.TIMES, Alignment.RIGHT);
paragraph.addMarkup("A sub item\n", 11, BaseFont.TIMES);
paragraph.addIndent(e2.next() + ") ", 8, SpaceUnit.em, 11, BaseFont.TIMES, Alignment.RIGHT);
paragraph.addMarkup("Another sub item\n", 11, BaseFont.TIMES);
paragraph.addIndent(e1.next() + ". ", 4, SpaceUnit.em, 11, BaseFont.TIMES, Alignment.RIGHT);
paragraph.addMarkup("Third item\n", 11, BaseFont.TIMES);
paragraph.addIndent(e1.next() + ". ", 4, SpaceUnit.em, 11, List.of(BaseFont.TIMES), Alignment.RIGHT);
paragraph.addMarkup("First item\n", 11, List.of(BaseFont.TIMES));
paragraph.addIndent(e1.next() + ". ", 4, SpaceUnit.em, 11, List.of(BaseFont.TIMES), Alignment.RIGHT);
paragraph.addMarkup("Second item\n", 11, List.of(BaseFont.TIMES));
paragraph.addIndent(e2.next() + ") ", 8, SpaceUnit.em, 11, List.of(BaseFont.TIMES), Alignment.RIGHT);
paragraph.addMarkup("A sub item\n", 11, List.of(BaseFont.TIMES));
paragraph.addIndent(e2.next() + ") ", 8, SpaceUnit.em, 11, List.of(BaseFont.TIMES), Alignment.RIGHT);
paragraph.addMarkup("Another sub item\n", 11, List.of(BaseFont.TIMES));
paragraph.addIndent(e1.next() + ". ", 4, SpaceUnit.em, 11, List.of(BaseFont.TIMES), Alignment.RIGHT);
paragraph.addMarkup("Third item\n", 11, List.of(BaseFont.TIMES));
document.add(paragraph);
paragraph = new Paragraph();
paragraph.addMarkup("The following types are built in:\n", 11,
BaseFont.TIMES);
paragraph.addIndent(new ArabicEnumerator().next() + " ", 4, SpaceUnit.em, 11, BaseFont.TIMES, Alignment.RIGHT);
paragraph.addMarkup("ArabicEnumerator\n", 11, BaseFont.TIMES);
paragraph.addIndent(new RomanEnumerator().next() + " ", 4, SpaceUnit.em, 11, BaseFont.TIMES, Alignment.RIGHT);
paragraph.addMarkup("RomanEnumerator\n", 11, BaseFont.TIMES);
paragraph.addIndent(new LowerCaseRomanEnumerator().next() + " ", 4, SpaceUnit.em, 11, BaseFont.TIMES, Alignment.RIGHT);
paragraph.addMarkup("LowerCaseRomanEnumerator\n", 11, BaseFont.TIMES);
paragraph.addIndent(new AlphabeticEnumerator().next() + " ", 4, SpaceUnit.em, 11, BaseFont.TIMES, Alignment.RIGHT);
paragraph.addMarkup("AlphabeticEnumerator\n", 11, BaseFont.TIMES);
paragraph.addIndent(new LowerCaseAlphabeticEnumerator().next() + " ", 4, SpaceUnit.em, 11, BaseFont.TIMES, Alignment.RIGHT);
List.of(BaseFont.TIMES));
paragraph.addIndent(new ArabicEnumerator().next() + " ", 4, SpaceUnit.em, 11, List.of(BaseFont.TIMES), Alignment.RIGHT);
paragraph.addMarkup("ArabicEnumerator\n", 11, List.of(BaseFont.TIMES));
paragraph.addIndent(new RomanEnumerator().next() + " ", 4, SpaceUnit.em, 11, List.of(BaseFont.TIMES), Alignment.RIGHT);
paragraph.addMarkup("RomanEnumerator\n", 11, List.of(BaseFont.TIMES));
paragraph.addIndent(new LowerCaseRomanEnumerator().next() + " ", 4, SpaceUnit.em, 11, List.of(BaseFont.TIMES), Alignment.RIGHT);
paragraph.addMarkup("LowerCaseRomanEnumerator\n", 11, List.of(BaseFont.TIMES));
paragraph.addIndent(new AlphabeticEnumerator().next() + " ", 4, SpaceUnit.em, 11, List.of(BaseFont.TIMES), Alignment.RIGHT);
paragraph.addMarkup("AlphabeticEnumerator\n", 11, List.of(BaseFont.TIMES));
paragraph.addIndent(new LowerCaseAlphabeticEnumerator().next() + " ", 4, SpaceUnit.em, 11, List.of(BaseFont.TIMES), Alignment.RIGHT);
paragraph.addMarkup("LowerCaseAlphabeticEnumerator\n", 11,
BaseFont.TIMES);
List.of(BaseFont.TIMES));
document.add(paragraph);
paragraph = new Paragraph();
String text1 = "For your convenience, you can do all that much easier with markup, e.g. simple indentation\n"
@ -104,7 +105,7 @@ public class IndentationTest {
+ "-#{I ->:5}Another list item\n"
+ " -#{a ~:30pt}A sub list item\n"
+ "-#{I ->:5}And yet another one\n\n";
paragraph.addMarkup(text1, 11, BaseFont.TIMES);
paragraph.addMarkup(text1, 11, List.of(BaseFont.TIMES));
document.add(paragraph);
document.render().save(new FileOutputStream("build/indentation.pdf")).close();
}

View file

@ -11,11 +11,12 @@ import org.xbib.graphics.pdfbox.layout.element.render.VerticalLayout;
import org.xbib.graphics.pdfbox.layout.element.render.VerticalLayoutHint;
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
import java.io.FileOutputStream;
import java.util.List;
public class LandscapeTest {
@Test
public void main() throws Exception {
public void test() throws Exception {
String text1 = "Lorem ipsum dolor sit amet, consetetur sadipscing elitr, "
+ "sed diam nonumy eirmod tempor invidunt ut labore et dolore magna "
+ "aliquyam erat, _sed diam_ voluptua. At vero eos et *accusam et justo* "
@ -35,16 +36,16 @@ public class LandscapeTest {
+ "gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n";
Paragraph paragraph1 = new Paragraph();
paragraph1.addMarkup(text1, 11, BaseFont.TIMES);
paragraph1.addMarkup(text1, 11, List.of(BaseFont.TIMES));
Paragraph paragraph2 = new Paragraph();
paragraph2.addMarkup(text2, 12, BaseFont.HELVETICA);
paragraph2.addMarkup(text2, 12, List.of(BaseFont.HELVETICA));
Paragraph paragraph3 = new Paragraph();
paragraph3.addMarkup(text1, 8, BaseFont.COURIER);
paragraph3.addMarkup(text1, 8, List.of(BaseFont.COURIER));
Paragraph titleA4 = new Paragraph();
titleA4.addMarkup("*Format A4 in Portrait*", 20, BaseFont.TIMES);
titleA4.addMarkup("*Format A4 in Portrait*", 20, List.of(BaseFont.TIMES));
Paragraph titleA5 = new Paragraph();
titleA5.addMarkup("*Format A5 in Landscape*", 20, BaseFont.TIMES);
titleA5.addMarkup("*Format A5 in Landscape*", 20, List.of(BaseFont.TIMES));
PageFormat a5_landscape = PageFormat.builder().A5().landscape().margins(10, 50, 0, 30).build();
PageFormat a4_portrait = PageFormat.builder().margins(40, 50, 40, 60).build();

View file

@ -12,6 +12,7 @@ import org.xbib.graphics.pdfbox.layout.position.Position;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.FileOutputStream;
import java.util.List;
import javax.imageio.ImageIO;
public class LetterTest {
@ -39,17 +40,16 @@ public class LetterTest {
document.add(new VerticalSpacer(100));
Paragraph paragraph = new Paragraph();
paragraph.addText("Blubberhausen, 01.04.2016", 11, BaseFont.HELVETICA);
paragraph.addText("Blubberhausen, 01.04.2016", 11, List.of(BaseFont.HELVETICA));
document.add(paragraph, new VerticalLayoutHint(Alignment.RIGHT, 0, 0,
0, 0, true));
paragraph = new Paragraph();
String address = "Ralf Stuckert\nAm Hollergraben 24\n67346 Blubberhausen";
paragraph.addText(address, 11, BaseFont.HELVETICA);
paragraph.addText(address, 11, List.of(BaseFont.HELVETICA));
document.add(paragraph);
paragraph = new Paragraph();
paragraph.addMarkup("*Labore et dolore magna aliquyam erat*", 11, BaseFont.HELVETICA);
document.add(paragraph, new VerticalLayoutHint(Alignment.LEFT, 0, 0,
40, 20));
@ -63,21 +63,21 @@ public class LetterTest {
+ "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";
paragraph = new Paragraph();
paragraph.addMarkup(text, 11, BaseFont.HELVETICA);
paragraph.addMarkup(text, 11, List.of(BaseFont.HELVETICA));
document.add(paragraph);
document.add(paragraph);
paragraph = new Paragraph();
paragraph.addMarkup("Dolore magna aliquyam erat\nRalf Stuckert", 11,
BaseFont.HELVETICA);
List.of(BaseFont.HELVETICA));
document.add(paragraph, new VerticalLayoutHint(Alignment.LEFT, 60, 0,
40, 0));
paragraph = new Paragraph();
paragraph.addMarkup("*Sanctus est:* Lorem ipsum dolor consetetur "
+ "sadipscing sed diam nonumy eirmod tempor invidunt", 6,
BaseFont.TIMES);
List.of(BaseFont.TIMES));
paragraph.setAbsolutePosition(new Position(hMargin, vMargin));
document.add(paragraph);

View file

@ -7,6 +7,7 @@ import org.xbib.graphics.pdfbox.layout.element.Paragraph;
import org.xbib.graphics.pdfbox.layout.element.render.ColumnLayout;
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
import java.io.FileOutputStream;
import java.util.List;
public class LineSpacingTest {
@ -30,7 +31,7 @@ public class LineSpacingTest {
// use a bigger line spacing to visualize the effects of line spacing more drastically
left.setLineSpacing(1.5f);
left.setMaxWidth(document.getPageWidth() / 2);
left.addMarkup(text, 11, BaseFont.TIMES);
left.addMarkup(text, 11, List.of(BaseFont.TIMES));
document.add(left);
document.add(left);
document.add(left);
@ -38,7 +39,7 @@ public class LineSpacingTest {
Paragraph right = new Paragraph();
right.setLineSpacing(1.5f);
right.setMaxWidth(document.getPageWidth() / 2);
right.addMarkup(text, 11, BaseFont.TIMES);
right.addMarkup(text, 11, List.of(BaseFont.TIMES));
document.add(right);
document.add(right);

View file

@ -5,6 +5,7 @@ import org.xbib.graphics.pdfbox.layout.element.Document;
import org.xbib.graphics.pdfbox.layout.element.Paragraph;
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
import java.io.FileOutputStream;
import java.util.List;
public class LinksTest {
@ -31,25 +32,25 @@ public class LinksTest {
Document document = new Document(40, 60, 40, 60);
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("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("This is a link to {link[https://xbib.org]}PDFBox-Layout{link}.\n\n", 11, List.of(BaseFont.TIMES));
paragraph0.addMarkup("Now the same link with color instead of underline {color:#ff5000}{link:none[https://xbib.org]}PDFBox-Layout{link}{color:#000000}.\n\n", 11, List.of(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, List.of(BaseFont.TIMES));
document.add(paragraph0);
Paragraph paragraph1 = new Paragraph();
paragraph1.addMarkup(text1, 11, BaseFont.TIMES);
paragraph1.addMarkup(text1, 11, List.of(BaseFont.TIMES));
document.add(paragraph1);
Paragraph paragraph2 = new Paragraph();
paragraph2.addMarkup(text2, 12, BaseFont.HELVETICA);
paragraph2.addMarkup(text2, 12, List.of(BaseFont.HELVETICA));
document.add(paragraph2);
Paragraph paragraph3 = new Paragraph();
paragraph3.addMarkup(text1, 8, BaseFont.COURIER);
paragraph3.addMarkup(text1, 8, List.of(BaseFont.COURIER));
document.add(paragraph3);
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, List.of(BaseFont.COURIER));
document.add(paragraph1);
document.add(paragraph3);
document.add(paragraph1);

View file

@ -13,6 +13,7 @@ import org.xbib.graphics.pdfbox.layout.text.TextFlow;
import org.xbib.graphics.pdfbox.layout.text.TextFlowUtil;
import org.xbib.graphics.pdfbox.layout.text.TextSequenceUtil;
import java.io.FileOutputStream;
import java.util.List;
public class ListenerTest {
@ -47,7 +48,7 @@ public class ListenerTest {
@Override
public void afterPage(RenderContext renderContext) {
String content = String.format("Page %s", renderContext.getPageIndex() + 1);
FontDescriptor fontDescriptor = new FontDescriptor(BaseFont.HELVETICA, 11);
FontDescriptor fontDescriptor = new FontDescriptor(List.of(BaseFont.HELVETICA), 11);
TextFlow text = TextFlowUtil.createTextFlow(content, fontDescriptor, 1.2f, 0f);
float offset = renderContext.getPageFormat().getMarginLeft()
+ TextSequenceUtil.getOffset(text,
@ -58,9 +59,9 @@ public class ListenerTest {
});
Paragraph paragraph = new Paragraph();
paragraph.addMarkup(text1, 11, BaseFont.TIMES);
paragraph.addMarkup(text2, 12, BaseFont.HELVETICA);
paragraph.addMarkup(text1, 8, BaseFont.COURIER);
paragraph.addMarkup(text1, 11, List.of(BaseFont.TIMES));
paragraph.addMarkup(text2, 12, List.of(BaseFont.HELVETICA));
paragraph.addMarkup(text1, 8, List.of(BaseFont.COURIER));
document.add(paragraph);
document.add(paragraph);

View file

@ -21,6 +21,7 @@ import org.xbib.graphics.pdfbox.layout.text.annotations.AnnotationDrawListener;
import java.awt.Color;
import java.io.FileOutputStream;
import java.io.IOException;
import java.util.List;
public class LowLevelText {
@ -56,10 +57,10 @@ public class LowLevelText {
TextFlow text = TextFlowUtil.createTextFlowFromMarkup(
"Hello *bold _italic bold-end* italic-end_. Eirmod\ntempor invidunt ut \\*labore",
new FontDescriptor(BaseFont.TIMES, 11), 1.2f, 0f);
text.addText("Spongebob", 11, BaseFont.COURIER);
text.addText(" is ", 20, BaseFont.HELVETICA);
text.addText("cool", 7, BaseFont.HELVETICA);
new FontDescriptor(List.of(BaseFont.TIMES), 11), 1.2f, 0f);
text.addText("Spongebob", 11, List.of(BaseFont.COURIER));
text.addText(" is ", 20, List.of(BaseFont.HELVETICA));
text.addText("cool", 7, List.of(BaseFont.HELVETICA));
text.setMaxWidth(100);
float xOffset = TextSequenceUtil.getOffset(text, pageWidth,
Alignment.RIGHT);
@ -78,7 +79,7 @@ public class LowLevelText {
+ "gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n";
text = new TextFlow();
text.addMarkup(textBlock, 8, BaseFont.COURIER);
text.addMarkup(textBlock, 8, List.of(BaseFont.COURIER));
text.setMaxWidth(200);
xOffset = TextSequenceUtil.getOffset(text, pageWidth, Alignment.CENTER);
text.drawText(contentStream, new Position(xOffset, pageHeight - 100), null,

View file

@ -7,6 +7,7 @@ import org.xbib.graphics.pdfbox.layout.element.render.VerticalLayoutHint;
import org.xbib.graphics.pdfbox.layout.text.Alignment;
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
import java.io.FileOutputStream;
import java.util.List;
public class MarginTest {
@ -36,17 +37,17 @@ public class MarginTest {
Document document = new Document(40, 60, 40, 60);
Paragraph paragraph = new Paragraph();
paragraph.addText(text1, 11, BaseFont.HELVETICA);
paragraph.addText(text1, 11, List.of(BaseFont.HELVETICA));
document.add(paragraph, new VerticalLayoutHint(Alignment.LEFT, 0, 100,
100, 100));
paragraph = new Paragraph();
paragraph.addText(text2, 11, BaseFont.HELVETICA);
paragraph.addText(text2, 11, List.of(BaseFont.HELVETICA));
document.add(paragraph, new VerticalLayoutHint(Alignment.RIGHT, 0, 50,
0, 0));
paragraph = new Paragraph();
paragraph.addText(text3, 11, BaseFont.HELVETICA);
paragraph.addText(text3, 11, List.of(BaseFont.HELVETICA));
document.add(paragraph, new VerticalLayoutHint(Alignment.RIGHT, 150,
150, 20, 0));
document.render().save(new FileOutputStream("build/margin.pdf")).close();

View file

@ -7,6 +7,7 @@ import org.xbib.graphics.pdfbox.layout.element.render.VerticalLayoutHint;
import org.xbib.graphics.pdfbox.layout.text.Alignment;
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
import java.io.FileOutputStream;
import java.util.List;
public class MarkupTest {
@ -25,26 +26,26 @@ public class MarkupTest {
Document document = new Document(40, 60, 40, 60);
Paragraph paragraph = new Paragraph();
paragraph.addMarkup(text1, 11, BaseFont.TIMES);
paragraph.addMarkup(text1, 11, List.of(BaseFont.TIMES));
document.add(paragraph);
paragraph = new Paragraph();
paragraph.addMarkup("Markup supports *bold*, _italic_, and *even _mixed* markup_.\n\n",
11, BaseFont.TIMES);
11, List.of(BaseFont.TIMES));
paragraph.addMarkup("Escape \\* with \\\\\\* and \\_ with \\\\\\_ in markup.\n\n",
11, BaseFont.TIMES);
11, List.of(BaseFont.TIMES));
paragraph.addMarkup("And now also {color:#ff0000}c{color:#00ff00}o{color:#0000ff}l{color:#00cccc}o{color:#cc00cc}r{color:#000000}",
11, BaseFont.TIMES);
11, List.of(BaseFont.TIMES));
paragraph.addMarkup(" , {_}subscript{_} and {^}superscript{^}.\n\n",
11, BaseFont.TIMES);
11, List.of(BaseFont.TIMES));
paragraph.addMarkup("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",
11, BaseFont.TIMES);
11, List.of(BaseFont.TIMES));
document.add(paragraph, new VerticalLayoutHint(Alignment.LEFT, 0, 0, 30, 0));
paragraph = new Paragraph();
paragraph.addMarkup("And here comes a link to an internal anchor name {color:#ff5000}{link[#hello]}hello{link}{color:#000000}.\n\n", 11, BaseFont.TIMES);
paragraph.addMarkup("\n\n{anchor:hello}Here{anchor} comes the internal anchor named *hello*\n\n", 11, BaseFont.COURIER);
paragraph.addMarkup("And here comes a link to an internal anchor name {color:#ff5000}{link[#hello]}hello{link}{color:#000000}.\n\n", 11, List.of(BaseFont.TIMES));
paragraph.addMarkup("\n\n{anchor:hello}Here{anchor} comes the internal anchor named *hello*\n\n", 11, List.of(BaseFont.COURIER));
document.add(paragraph);
paragraph = new Paragraph();
@ -65,7 +66,7 @@ public class MarkupTest {
+ "-#{I ->:5}Another list item\n"
+ " -#{a ~:30pt}A sub list item\n"
+ "-#{I ->:5}And yet another one\n\n";
paragraph.addMarkup(text1, 11, BaseFont.TIMES);
paragraph.addMarkup(text1, 11, List.of(BaseFont.TIMES));
document.add(paragraph);
document.render().save( new FileOutputStream("build/markup.pdf")).close();

View file

@ -5,6 +5,7 @@ import org.xbib.graphics.pdfbox.layout.element.Document;
import org.xbib.graphics.pdfbox.layout.element.Paragraph;
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
import java.io.FileOutputStream;
import java.util.List;
public class MultiplePagesTest {
@ -31,15 +32,15 @@ public class MultiplePagesTest {
Document document = new Document(40, 60, 40, 60);
Paragraph paragraph1 = new Paragraph();
paragraph1.addMarkup(text1, 11, BaseFont.TIMES);
paragraph1.addMarkup(text1, 11, List.of(BaseFont.TIMES));
document.add(paragraph1);
Paragraph paragraph2 = new Paragraph();
paragraph2.addMarkup(text2, 12, BaseFont.HELVETICA);
paragraph2.addMarkup(text2, 12, List.of(BaseFont.HELVETICA));
document.add(paragraph2);
Paragraph paragraph3 = new Paragraph();
paragraph3.addMarkup(text1, 8, BaseFont.COURIER);
paragraph3.addMarkup(text1, 8, List.of(BaseFont.COURIER));
document.add(paragraph3);
document.add(paragraph1);

View file

@ -11,6 +11,7 @@ import org.xbib.graphics.pdfbox.layout.element.render.VerticalLayout;
import org.xbib.graphics.pdfbox.layout.element.render.VerticalLayoutHint;
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
import java.io.FileOutputStream;
import java.util.List;
public class PageFormatRotationTest {
@ -35,16 +36,16 @@ public class PageFormatRotationTest {
+ "gubergren, no sea takimata sanctus est Lorem ipsum dolor sit amet.\n";
Paragraph paragraph1 = new Paragraph();
paragraph1.addMarkup(text1, 11, BaseFont.TIMES);
paragraph1.addMarkup(text1, 11, List.of(BaseFont.TIMES));
Paragraph paragraph2 = new Paragraph();
paragraph2.addMarkup(text2, 12, BaseFont.HELVETICA);
paragraph2.addMarkup(text2, 12, List.of(BaseFont.HELVETICA));
Paragraph paragraph3 = new Paragraph();
paragraph3.addMarkup(text1, 8, BaseFont.COURIER);
paragraph3.addMarkup(text1, 8, List.of(BaseFont.COURIER));
Paragraph titleA4 = new Paragraph();
titleA4.addMarkup("*Format A4 Landscape*", 20, BaseFont.TIMES);
titleA4.addMarkup("*Format A4 Landscape*", 20, List.of(BaseFont.TIMES));
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, List.of(BaseFont.TIMES));
PageFormat a4_landscape = PageFormat.builder().margins(40, 50, 40, 60).landscape().build();
PageFormat a4_landscape_rotated = PageFormat.builder().margins(40, 50, 40, 60).landscape().rotation(-90).build();

View file

@ -3,13 +3,15 @@ package org.xbib.graphics.pdfbox.layout.test;
import org.xbib.graphics.pdfbox.layout.element.Paragraph;
import org.xbib.graphics.pdfbox.layout.font.BaseFont;
import java.util.List;
public class Section extends Paragraph {
private final int number;
public Section(int number) {
super();
this.number = number;
addMarkup(String.format("*Section %d", number), 16, BaseFont.TIMES);
addMarkup(String.format("*Section %d", number), 16, List.of(BaseFont.TIMES));
}
public int getNumber() {

View file

@ -1,6 +1,8 @@
package org.xbib.graphics.pdfbox.layout.test;
import java.io.FileOutputStream;
import java.util.List;
import org.junit.jupiter.api.Test;
import org.xbib.graphics.pdfbox.layout.element.Document;
import org.xbib.graphics.pdfbox.layout.element.Paragraph;
@ -15,13 +17,13 @@ public class TextRotationTest {
Paragraph paragraph = new Paragraph();
paragraph.addMarkup("Hello there, here is text text text text text text text text text text text text text text text text" +
" text text text text text text text text text text text",
10, BaseFont.HELVETICA);
10, List.of(BaseFont.HELVETICA));
paragraph.setMaxWidth(100);
document.add(paragraph);
paragraph = new Paragraph();
paragraph.setRotation(90);
paragraph.addMarkup("Hello\u00a0Text\u00a0Rotation", 10, BaseFont.HELVETICA);
paragraph.addMarkup("Hello\u00a0Text\u00a0Rotation", 10, List.of(BaseFont.HELVETICA));
document.add(paragraph);
document.render().save(new FileOutputStream("build/textrotation.pdf")).close();
}

View file

@ -2,6 +2,10 @@
"type": "document",
"margin": "0 0 0 0",
"author": "Jörg Prante",
"font": [
"helvetica",
"notosans"
],
"elements": [
{
"type": "transform",