From 0162464b0f8a176d98121716521cc941fa1d813a Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?J=C3=B6rg=20Prante?= Date: Thu, 31 Aug 2023 17:57:34 +0200 Subject: [PATCH] catch IllegalArgumentException in StyledText when font is selected --- gradle.properties | 2 +- .../pdfbox/layout/element/Paragraph.java | 3 ++ .../scripting/command/CellCommand.java | 3 ++ .../scripting/command/IndentCommand.java | 6 ++- .../scripting/command/MarkupCommand.java | 3 ++ .../scripting/command/ParagraphCommand.java | 3 ++ .../pdfbox/layout/table/Hyperlink.java | 3 ++ .../graphics/pdfbox/layout/table/Markup.java | 3 ++ .../pdfbox/layout/table/ParagraphCell.java | 3 ++ .../pdfbox/layout/table/StyledText.java | 3 ++ .../render/VerticalTextCellRenderer.java | 2 +- .../pdfbox/layout/text/StyledText.java | 2 +- .../graphics/pdfbox/layout/text/TextFlow.java | 3 ++ .../pdfbox/layout/text/TextFlowUtil.java | 3 ++ .../graphics/pdfbox/layout/text/TextLine.java | 33 +++++++++++---- .../pdfbox/layout/text/TextSequenceUtil.java | 16 ++++---- .../layout/util/WordBreakerFactory.java | 3 ++ .../pdfbox/layout/util/WordBreakers.java | 41 +++++++++++-------- 18 files changed, 98 insertions(+), 37 deletions(-) diff --git a/gradle.properties b/gradle.properties index 0baabe7..0e91290 100644 --- a/gradle.properties +++ b/gradle.properties @@ -1,5 +1,5 @@ group = org.xbib.graphics name = graphics -version = 4.5.7 +version = 4.5.8 org.gradle.warning.mode = ALL diff --git a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/Paragraph.java b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/Paragraph.java index 8e541f8..0898894 100644 --- a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/Paragraph.java +++ b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/Paragraph.java @@ -22,6 +22,9 @@ public class Paragraph extends TextFlow implements Drawable, Element, WidthRespe private Alignment alignment = Alignment.LEFT; + public Paragraph() { + } + @Override public Position getAbsolutePosition() { return absolutePosition; diff --git a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/scripting/command/CellCommand.java b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/scripting/command/CellCommand.java index ab5af91..92e9f41 100644 --- a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/scripting/command/CellCommand.java +++ b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/scripting/command/CellCommand.java @@ -28,6 +28,9 @@ import static org.xbib.graphics.pdfbox.layout.util.PdfUtil.mmToPt; public class CellCommand implements Command { + public CellCommand() { + } + @Override public void execute(Engine engine, State state, Settings settings) throws IOException { if (settings.containsSetting("text")) { diff --git a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/scripting/command/IndentCommand.java b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/scripting/command/IndentCommand.java index e3b808a..f42f206 100644 --- a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/scripting/command/IndentCommand.java +++ b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/scripting/command/IndentCommand.java @@ -13,12 +13,14 @@ import static org.xbib.graphics.pdfbox.layout.util.PdfUtil.mmToPt; public class IndentCommand implements Command { + public IndentCommand() { + } + @Override public void execute(Engine engine, State state, Settings settings) throws IOException { float value = settings.getAsFloat("value", 0.0f); Element element = state.getElements().peek(); - if (element instanceof Paragraph) { - Paragraph paragraph = (Paragraph) element; + if (element instanceof Paragraph paragraph) { paragraph.add(new Indent(mmToPt(value), SpaceUnit.pt)); } } diff --git a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/scripting/command/MarkupCommand.java b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/scripting/command/MarkupCommand.java index ea13759..180a6ec 100644 --- a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/scripting/command/MarkupCommand.java +++ b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/scripting/command/MarkupCommand.java @@ -17,6 +17,9 @@ import static org.xbib.graphics.pdfbox.layout.util.PdfUtil.mmToPt; public class MarkupCommand implements Command { + public MarkupCommand() { + } + @Override public void execute(Engine engine, State state, Settings settings) { String text = settings.get("text"); diff --git a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/scripting/command/ParagraphCommand.java b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/scripting/command/ParagraphCommand.java index d2091a5..714312a 100644 --- a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/scripting/command/ParagraphCommand.java +++ b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/element/scripting/command/ParagraphCommand.java @@ -15,6 +15,9 @@ import static org.xbib.graphics.pdfbox.layout.util.PdfUtil.mmToPt; public class ParagraphCommand implements Command { + public ParagraphCommand() { + } + @Override public void execute(Engine engine, State state, Settings settings) throws IOException { Paragraph paragraph = new Paragraph(); diff --git a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/Hyperlink.java b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/Hyperlink.java index fcfdaeb..ec743ae 100644 --- a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/Hyperlink.java +++ b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/Hyperlink.java @@ -20,6 +20,9 @@ public class Hyperlink implements ParagraphProcessor { private float baselineOffset = 1f; + public Hyperlink() { + } + public void setFontDescriptor(FontDescriptor fontDescriptor) { this.fontDescriptor = fontDescriptor; } diff --git a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/Markup.java b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/Markup.java index 58dee22..6f89cb7 100644 --- a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/Markup.java +++ b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/Markup.java @@ -9,6 +9,9 @@ public class Markup implements ParagraphProcessor { private FontDescriptor fontDescriptor; + public Markup() { + } + public Markup setValue(String value) { this.value = value; return this; diff --git a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/ParagraphCell.java b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/ParagraphCell.java index e0493cf..9b683b0 100644 --- a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/ParagraphCell.java +++ b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/ParagraphCell.java @@ -15,6 +15,9 @@ public class ParagraphCell extends AbstractCell { private CellParagraph cellParagraph; + public ParagraphCell() { + } + public void setLineSpacing(float lineSpacing) { this.lineSpacing = lineSpacing; } diff --git a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/StyledText.java b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/StyledText.java index 67c81fa..59908d7 100644 --- a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/StyledText.java +++ b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/StyledText.java @@ -14,6 +14,9 @@ public class StyledText implements ParagraphProcessor { private Color color; + public StyledText() { + } + public void setText(String text) { this.text = text; } diff --git a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/render/VerticalTextCellRenderer.java b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/render/VerticalTextCellRenderer.java index bd362d6..b9dfa58 100644 --- a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/render/VerticalTextCellRenderer.java +++ b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/table/render/VerticalTextCellRenderer.java @@ -40,7 +40,7 @@ public class VerticalTextCellRenderer extends AbstractCellRenderer lines = cell.isWordBreak() ? PdfUtil.getOptimalTextBreakLines(cell.getText(), fontDescriptor, (height - cell.getVerticalPadding())) : Collections.singletonList(cell.getText()); - float xOffset = startX + cell.getPaddingLeft(); /* - PdfUtil.getFontHeight(currentFont, currentFontSize)*/; + float xOffset = startX + cell.getPaddingLeft() - PdfUtil.getFontHeight(fontDescriptor); for (int i = 0; i < lines.size(); i++) { final String line = lines.get(i); xOffset += (PdfUtil.getFontHeight(fontDescriptor) + (i > 0 ? PdfUtil.getFontHeight(fontDescriptor) * cell.getLineSpacing() : 0f)); diff --git a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/StyledText.java b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/StyledText.java index b6268fc..e04bfc8 100644 --- a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/StyledText.java +++ b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/StyledText.java @@ -188,7 +188,7 @@ public class StyledText implements TextFragment { try { return fontDescriptor.getSize() * fontDescriptor.getSelectedFont(text).getStringWidth(text) / 1000; } catch (Exception e) { - logger.log(Level.WARNING, e.getMessage(), e); + logger.log(Level.WARNING, "text = " + text + " " + e.getMessage(), e); return 0f; } } diff --git a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/TextFlow.java b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/TextFlow.java index 7b46c27..bb14896 100644 --- a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/TextFlow.java +++ b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/TextFlow.java @@ -60,6 +60,9 @@ public class TextFlow implements TextSequence, WidthRespecting { private boolean applyLineSpacingToFirstLine = true; + public TextFlow() { + } + private void clearCache() { cache.clear(); } diff --git a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/TextFlowUtil.java b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/TextFlowUtil.java index 98c60b1..a102c11 100644 --- a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/TextFlowUtil.java +++ b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/TextFlowUtil.java @@ -15,6 +15,9 @@ import java.util.regex.Matcher; public class TextFlowUtil { + private TextFlowUtil() { + } + public static TextFlow createTextFlow(String text, FontDescriptor descriptor, float linespacing, float rotation) { return createTextFlow(fromPlainText(text), descriptor, linespacing, rotation); diff --git a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/TextLine.java b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/TextLine.java index b7ba3bd..e4eed15 100644 --- a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/TextLine.java +++ b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/TextLine.java @@ -8,13 +8,14 @@ import org.xbib.graphics.pdfbox.layout.position.Position; import java.awt.Color; import java.io.IOException; -import java.io.UncheckedIOException; import java.util.ArrayList; import java.util.Collections; import java.util.HashMap; import java.util.Iterator; import java.util.List; import java.util.Map; +import java.util.logging.Level; +import java.util.logging.Logger; /** * A text of line containing only {@link StyledText}s. It may be terminated by a @@ -22,6 +23,8 @@ import java.util.Map; */ public class TextLine implements TextSequence { + private static final Logger logger = Logger.getLogger(TextLine.class.getName()); + /** * The font ascent. */ @@ -41,6 +44,9 @@ public class TextLine implements TextSequence { private final Map cache = new HashMap<>(); + public TextLine() { + } + private void clearCache() { cache.clear(); } @@ -170,6 +176,7 @@ public class TextLine implements TextSequence { Alignment alignment, float availableLineWidth, DrawListener drawListener) { + boolean beginText = false; try { contentStream.saveGraphicsState(); float x = upperLeft.getX(); @@ -205,17 +212,17 @@ public class TextLine implements TextSequence { } if (!styledText.getText().isEmpty()) { contentStream.beginText(); + beginText = true; contentStream.setTextMatrix(matrix); - if (!styledText.getFontDescriptor().equals(lastFontDesc)) { - lastFontDesc = styledText.getFontDescriptor(); - contentStream.setFont(lastFontDesc.getSelectedFont(styledText.getText()), lastFontDesc.getSize()); - } + lastFontDesc = styledText.getFontDescriptor(); + contentStream.setFont(lastFontDesc.getSelectedFont(styledText.getText()), lastFontDesc.getSize()); if (!styledText.getColor().equals(lastColor)) { lastColor = styledText.getColor(); contentStream.setNonStrokingColor(lastColor); } contentStream.showText(styledText.getText()); contentStream.endText(); + beginText = false; } if (drawListener != null) { drawListener.drawn(styledText, @@ -230,8 +237,20 @@ public class TextLine implements TextSequence { } } contentStream.restoreGraphicsState(); - } catch (IOException e) { - throw new UncheckedIOException(e); + } catch (IllegalArgumentException | IOException e) { + logger.log(Level.WARNING, e.getMessage(), e); + if (beginText) { + try { + contentStream.endText(); + } catch (IOException ex) { + // ignore + } + } + try { + contentStream.restoreGraphicsState(); + } catch (IOException ex) { + // ignore + } } } diff --git a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/TextSequenceUtil.java b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/TextSequenceUtil.java index f9880d7..a7d6e90 100644 --- a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/TextSequenceUtil.java +++ b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/text/TextSequenceUtil.java @@ -19,6 +19,9 @@ import java.util.List; */ public class TextSequenceUtil { + private TextSequenceUtil() { + } + /** * Dissects the given sequence into {@link TextLine}s. * @@ -419,14 +422,11 @@ public class TextSequenceUtil { */ public static float getOffset(final TextSequence textLine, final float targetWidth, final Alignment alignment) { - switch (alignment) { - case RIGHT: - return targetWidth - textLine.getWidth(); - case CENTER: - return (targetWidth - textLine.getWidth()) / 2f; - default: - return 0; - } + return switch (alignment) { + case RIGHT -> targetWidth - textLine.getWidth(); + case CENTER -> (targetWidth - textLine.getWidth()) / 2f; + default -> 0; + }; } /** diff --git a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/util/WordBreakerFactory.java b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/util/WordBreakerFactory.java index f99dd52..b3c8961 100644 --- a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/util/WordBreakerFactory.java +++ b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/util/WordBreakerFactory.java @@ -16,6 +16,9 @@ import java.util.Map; */ public class WordBreakerFactory { + private WordBreakerFactory() { + } + /** * constant for the system property pdfbox.layout.word.breaker. */ diff --git a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/util/WordBreakers.java b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/util/WordBreakers.java index 91d0300..ded0c60 100644 --- a/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/util/WordBreakers.java +++ b/graphics-pdfbox-layout/src/main/java/org/xbib/graphics/pdfbox/layout/util/WordBreakers.java @@ -11,18 +11,24 @@ import java.util.regex.Pattern; */ public class WordBreakers { + private WordBreakers() { + } + /** * May by used for legacy compatibility, does not break at all. */ public static class NonBreakingWordBreaker implements WordBreaker { + public NonBreakingWordBreaker() { + } + @Override public Pair breakWord(String word, - FontDescriptor fontDescriptor, float maxWidth, + FontDescriptor fontDescriptor, + float maxWidth, boolean breakHardIfNecessary) { return null; } - } /** @@ -33,10 +39,14 @@ public class WordBreakers { */ public static abstract class AbstractWordBreaker implements WordBreaker { + public AbstractWordBreaker() { + } + @Override - public Pair breakWord(final String word, - final FontDescriptor fontDescriptor, final float maxWidth, - final boolean breakHardIfNecessary) { + public Pair breakWord(String word, + FontDescriptor fontDescriptor, + float maxWidth, + boolean breakHardIfNecessary) { Pair brokenWord = breakWordSoft(word, fontDescriptor, maxWidth); @@ -87,11 +97,8 @@ public class WordBreakers { } --cutIndex; } - - return new Pair(word.substring(0, cutIndex), - word.substring(cutIndex)); + return new Pair<>(word.substring(0, cutIndex), word.substring(cutIndex)); } - } /** @@ -110,12 +117,16 @@ public class WordBreakers { * A letter followed by either -, ., * , or /. */ - private final Pattern breakPattern = + private static final Pattern breakPattern = Pattern.compile("[A-Za-z\u00C0-\u00D6\u00D8-\u00F6\u00F8-\u00FF]([\\-\\.\\,/])"); + public DefaultWordBreaker() { + } + @Override - protected Pair breakWordSoft(final String word, - final FontDescriptor fontDescriptor, final float maxWidth) { + protected Pair breakWordSoft(String word, + FontDescriptor fontDescriptor, + float maxWidth) { Matcher matcher = breakPattern.matcher(word); int breakIndex = -1; boolean maxWidthExceeded = false; @@ -130,14 +141,10 @@ public class WordBreakers { } } } - if (breakIndex < 0) { return null; } - return new Pair<>(word.substring(0, breakIndex), - word.substring(breakIndex)); + return new Pair<>(word.substring(0, breakIndex), word.substring(breakIndex)); } - } - }