From a84424a4f7835a65a003068fba9e1ee39903afa4 Mon Sep 17 00:00:00 2001 From: volker Date: Sun, 6 Sep 2026 20:57:48 +0200 Subject: [PATCH 1/4] New Option to GlyphLayoutProcessor* to use ActualText for correct text extraction and bette accessibility --- .../awt/GlyphLayoutProcessorAwt.java | 19 ++++- .../awt/GlyphLayoutDin91379Test.java | 48 +++++++++-- .../pdf/GlyphLayoutDIN91379_ActualText.pdf | Bin 0 -> 41381 bytes .../fop/GlyphLayoutProcessorFop.java | 13 ++- .../fop/GlyphLayoutDin91379Test.java | 48 +++++++++-- .../pdf/GlyphLayoutDIN91379_ActualText.pdf | Bin 0 -> 41057 bytes .../java/org/apache/pdfbox/cos/COSName.java | 1 + .../pdmodel/AbstractGlyphLayoutProcessor.java | 79 ++++++++++++++++++ .../ContentStreamForGlyphLayoutInterface.java | 20 +++++ 9 files changed, 211 insertions(+), 17 deletions(-) create mode 100644 pdfbox-layout-awt/src/test/resources/pdf/GlyphLayoutDIN91379_ActualText.pdf create mode 100644 pdfbox-layout-fop/src/test/resources/pdf/GlyphLayoutDIN91379_ActualText.pdf diff --git a/pdfbox-layout-awt/src/main/java/org/apache/pdfbox/glyphlayout/awt/GlyphLayoutProcessorAwt.java b/pdfbox-layout-awt/src/main/java/org/apache/pdfbox/glyphlayout/awt/GlyphLayoutProcessorAwt.java index 1d09799972d..3937cba8cf1 100644 --- a/pdfbox-layout-awt/src/main/java/org/apache/pdfbox/glyphlayout/awt/GlyphLayoutProcessorAwt.java +++ b/pdfbox-layout-awt/src/main/java/org/apache/pdfbox/glyphlayout/awt/GlyphLayoutProcessorAwt.java @@ -29,6 +29,7 @@ import java.io.InputStream; import java.util.Objects; +import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.pdmodel.AbstractGlyphLayoutProcessor; import org.apache.pdfbox.pdmodel.ContentStreamForGlyphLayoutInterface; import org.apache.pdfbox.pdmodel.GlyphLayoutProcessorInterface; @@ -48,7 +49,17 @@ public class GlyphLayoutProcessorAwt extends AbstractGlyphLayoutProcessor implements GlyphLayoutProcessorInterface { - private final GlyphLayoutFontLoaderAwt glyphLayoutFontLoaderAwt; + private final GlyphLayoutFontLoaderAwt glyphLayoutFontLoaderAwt = new GlyphLayoutFontLoaderAwt(); + + + /** + * Constructs a GlyphLayoutProcessorFop with options + * + */ + public GlyphLayoutProcessorAwt(AbstractGlyphLayoutProcessor.GlyphLayoutProcessorOptions options) + { + super(options); + } /** * Constructs a GlyphLayoutProcessorAwt @@ -56,10 +67,12 @@ public class GlyphLayoutProcessorAwt extends AbstractGlyphLayoutProcessor implem */ public GlyphLayoutProcessorAwt() { - this.glyphLayoutFontLoaderAwt = new GlyphLayoutFontLoaderAwt(); + super(); } - /** + + + /** * Checks if glyphs needed for text are missing in awtFont * * @param text text to be checked diff --git a/pdfbox-layout-awt/src/test/java/org/apache/pdfbox/glyphlayout/awt/GlyphLayoutDin91379Test.java b/pdfbox-layout-awt/src/test/java/org/apache/pdfbox/glyphlayout/awt/GlyphLayoutDin91379Test.java index 03db0162ebb..94253f42a4f 100644 --- a/pdfbox-layout-awt/src/test/java/org/apache/pdfbox/glyphlayout/awt/GlyphLayoutDin91379Test.java +++ b/pdfbox-layout-awt/src/test/java/org/apache/pdfbox/glyphlayout/awt/GlyphLayoutDin91379Test.java @@ -26,8 +26,11 @@ import java.io.OutputStreamWriter; import java.io.Writer; import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; + import org.apache.pdfbox.Loader; +import org.apache.pdfbox.pdmodel.AbstractGlyphLayoutProcessor; import org.junit.jupiter.api.Test; import org.apache.pdfbox.pdmodel.PDDocument; @@ -90,14 +93,47 @@ class GlyphLayoutDin91379Test extends TestBase + "⁹ ⁿ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ™ ∞ ≤ ≥\n" + "Additional non-letters (not included in DIN 91379): – — •�"; + /** + * Test, no ActualText + * @throws IOException + * @throws FontFormatException + * @throws URISyntaxException + */ + @Test + void testGlyphLayoutDin91379NoActualText() throws IOException, FontFormatException, URISyntaxException { + testGlyphLayoutDin91379(false, ""); + } + + /** + * Test with ActualText + * @throws IOException + * @throws FontFormatException + * @throws URISyntaxException + */ @Test - void testGlyphLayoutDin91379() throws IOException, FontFormatException, URISyntaxException + void testGlyphLayoutDin91379UseActualText() throws IOException, FontFormatException, URISyntaxException { + testGlyphLayoutDin91379(true, "_ActualText"); + } + + /** + * Test GlyphLayoutProcessorAwt with letters and sequences from DIN 91379 + * @param useActualText + * @throws IOException + * @throws FontFormatException + * @throws URISyntaxException + */ + void testGlyphLayoutDin91379(boolean useActualText, String sActualText) throws IOException, FontFormatException, URISyntaxException { - GlyphLayoutProcessorAwt glyphLayoutProcessor = new GlyphLayoutProcessorAwt(); + AbstractGlyphLayoutProcessor.GlyphLayoutProcessorOptions options = new AbstractGlyphLayoutProcessor.GlyphLayoutProcessorOptions(); + if (useActualText) { + options.useActualText(); + } + GlyphLayoutProcessorAwt glyphLayoutProcessor = new GlyphLayoutProcessorAwt(options); - String outputName = "GlyphLayoutDIN91379.pdf"; + String outputName = String.format("GlyphLayoutDIN91379%s.pdf", sActualText); String outputPDFFilename = "target/" + outputName; - String outputTextFilename = "target/GlyphLayoutDIN91379.txt"; + String outputTextFilename = String.format("target/GlyphLayoutDIN91379%s.txt", sActualText); + float fontSize = 12.0f; try (PDDocument doc = new PDDocument()) @@ -133,7 +169,7 @@ void testGlyphLayoutDin91379() throws IOException, FontFormatException, URISynta os.write (0xBB); os.write (0xBF); - try (Writer writer = new BufferedWriter(new OutputStreamWriter(os, "utf-8"))) + try (Writer writer = new BufferedWriter(new OutputStreamWriter(os, StandardCharsets.UTF_8))) { //TODO compare this output with the input, like in TextStripper test // Not yet correct as of 4.7.2026 @@ -158,7 +194,7 @@ private void showComposites(PDPageContentStream cs, PDType0Font font, float font if (!line.isEmpty()) { showCompositesLine(cs, font, fontSize, x, y, line); - y -= fontSize * 1.5; + y -= fontSize * 1.5f; } } } diff --git a/pdfbox-layout-awt/src/test/resources/pdf/GlyphLayoutDIN91379_ActualText.pdf b/pdfbox-layout-awt/src/test/resources/pdf/GlyphLayoutDIN91379_ActualText.pdf new file mode 100644 index 0000000000000000000000000000000000000000..b3e83ea1358393559511855bda0f95a21204354b GIT binary patch literal 41381 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 GB>x2gk3VAo literal 0 HcmV?d00001 diff --git a/pdfbox-layout-fop/src/main/java/org/apache/pdfbox/glyphlayout/fop/GlyphLayoutProcessorFop.java b/pdfbox-layout-fop/src/main/java/org/apache/pdfbox/glyphlayout/fop/GlyphLayoutProcessorFop.java index eae5e72458c..21c833d3dda 100644 --- a/pdfbox-layout-fop/src/main/java/org/apache/pdfbox/glyphlayout/fop/GlyphLayoutProcessorFop.java +++ b/pdfbox-layout-fop/src/main/java/org/apache/pdfbox/glyphlayout/fop/GlyphLayoutProcessorFop.java @@ -45,7 +45,7 @@ public class GlyphLayoutProcessorFop extends AbstractGlyphLayoutProcessor implements GlyphLayoutProcessorInterface { - private final GlyphLayoutFontLoaderFop glyphLayoutFontLoaderFop; + private final GlyphLayoutFontLoaderFop glyphLayoutFontLoaderFop = new GlyphLayoutFontLoaderFop(); /* Before you call GlyphMapping.doGlyphMapping to position the glyphs, @@ -54,13 +54,22 @@ public class GlyphLayoutProcessorFop extends AbstractGlyphLayoutProcessor implem */ private static final float FOP_FONTSIZE_FACTOR = 1000f; + /** + * Constructs a GlyphLayoutProcessorFop with options + * + */ + public GlyphLayoutProcessorFop(AbstractGlyphLayoutProcessor.GlyphLayoutProcessorOptions options) + { + super(options); + } + /** * Constructs a GlyphLayoutProcessorFop * */ public GlyphLayoutProcessorFop() { - this.glyphLayoutFontLoaderFop = new GlyphLayoutFontLoaderFop(); + super(); } /** diff --git a/pdfbox-layout-fop/src/test/java/org/apache/pdfbox/glyphlayout/fop/GlyphLayoutDin91379Test.java b/pdfbox-layout-fop/src/test/java/org/apache/pdfbox/glyphlayout/fop/GlyphLayoutDin91379Test.java index dc6dd74630f..7fbb7f5dc50 100644 --- a/pdfbox-layout-fop/src/test/java/org/apache/pdfbox/glyphlayout/fop/GlyphLayoutDin91379Test.java +++ b/pdfbox-layout-fop/src/test/java/org/apache/pdfbox/glyphlayout/fop/GlyphLayoutDin91379Test.java @@ -16,6 +16,7 @@ */ package org.apache.pdfbox.glyphlayout.fop; +import java.awt.*; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; @@ -25,9 +26,11 @@ import java.io.OutputStreamWriter; import java.io.Writer; import java.net.URISyntaxException; +import java.nio.charset.StandardCharsets; import static org.junit.jupiter.api.Assertions.assertEquals; +import org.apache.pdfbox.pdmodel.AbstractGlyphLayoutProcessor; import org.junit.jupiter.api.Test; import org.apache.pdfbox.Loader; @@ -90,14 +93,47 @@ class GlyphLayoutDin91379Test extends TestBase + "⁹ ⁿ ₀ ₁ ₂ ₃ ₄ ₅ ₆ ₇ ₈ ₉ ™ ∞ ≤ ≥\n" + "Additional non-letters (not included in DIN 91379): – — •�"; + /** + * Test, no ActualText + * @throws IOException + * @throws FontFormatException + * @throws URISyntaxException + */ + @Test + void testGlyphLayoutDin91379NoActualText() throws IOException, FontFormatException, URISyntaxException { + testGlyphLayoutDin91379(false, ""); + } + + /** + * Test with ActualText + * @throws IOException + * @throws FontFormatException + * @throws URISyntaxException + */ @Test - void testGlyphLayoutDin91379() throws IOException, URISyntaxException + void testGlyphLayoutDin91379UseActualText() throws IOException, FontFormatException, URISyntaxException { + testGlyphLayoutDin91379(true, "_ActualText"); + } + + /** + * Test GlyphLayoutProcessorAwt with letters and sequences from DIN 91379 + * @param useActualText + * @throws IOException + * @throws FontFormatException + * @throws URISyntaxException + */ + void testGlyphLayoutDin91379(boolean useActualText, String sActualText) throws IOException, FontFormatException, URISyntaxException { - GlyphLayoutProcessorFop glyphLayoutProcessor = new GlyphLayoutProcessorFop(); + AbstractGlyphLayoutProcessor.GlyphLayoutProcessorOptions options = new AbstractGlyphLayoutProcessor.GlyphLayoutProcessorOptions(); + if (useActualText) { + options.useActualText(); + } + GlyphLayoutProcessorFop glyphLayoutProcessor = new GlyphLayoutProcessorFop(options); - String outputName = "GlyphLayoutDIN91379.pdf"; + String outputName = String.format("GlyphLayoutDIN91379%s.pdf", sActualText); String outputPDFFilename = "target/" + outputName; - String outputTextFilename = "target/GlyphLayoutDIN91379.txt"; + String outputTextFilename = String.format("target/GlyphLayoutDIN91379%s.txt", sActualText); + float fontSize = 12.0f; try (PDDocument doc = new PDDocument()) @@ -132,7 +168,7 @@ void testGlyphLayoutDin91379() throws IOException, URISyntaxException os.write (0xBB); os.write (0xBF); - try (Writer writer = new BufferedWriter(new OutputStreamWriter(os, "utf-8"))) + try (Writer writer = new BufferedWriter(new OutputStreamWriter(os, StandardCharsets.UTF_8))) { //TODO compare this output with the input, like in TextStripper test // Not yet correct as of 4.7.2026 @@ -157,7 +193,7 @@ private void showComposites(PDPageContentStream cs, PDType0Font font, float font if (!line.isEmpty()) { showCompositesLine(cs, font, fontSize, x, y, line); - y -= fontSize * 1.5; + y -= fontSize * 1.5f; } } } diff --git a/pdfbox-layout-fop/src/test/resources/pdf/GlyphLayoutDIN91379_ActualText.pdf b/pdfbox-layout-fop/src/test/resources/pdf/GlyphLayoutDIN91379_ActualText.pdf new file mode 100644 index 0000000000000000000000000000000000000000..acd084f2ac042e88a325a5c8a82a21ce7e42c6ac GIT binary patch literal 41057 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 public static final COSName SORT = getPDFName("Sort"); public static final COSName SOUND = getPDFName("Sound"); public static final COSName SPLIT = getPDFName("Split"); + public static final COSName SPAN = getPDFName("Span"); public static final COSName SS = getPDFName("SS"); public static final COSName ST = getPDFName("St"); public static final COSName STANDARD_ENCODING = getPDFName("StandardEncoding"); diff --git a/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/AbstractGlyphLayoutProcessor.java b/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/AbstractGlyphLayoutProcessor.java index 52dd42120d1..67cde9eef31 100644 --- a/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/AbstractGlyphLayoutProcessor.java +++ b/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/AbstractGlyphLayoutProcessor.java @@ -17,6 +17,10 @@ package org.apache.pdfbox.pdmodel; +import org.apache.pdfbox.cos.COSDictionary; +import org.apache.pdfbox.cos.COSName; +import org.apache.pdfbox.cos.COSString; +import org.apache.pdfbox.pdmodel.documentinterchange.markedcontent.PDPropertyList; import org.apache.pdfbox.pdmodel.font.PDType0Font; import java.io.IOException; @@ -33,6 +37,35 @@ */ public abstract class AbstractGlyphLayoutProcessor implements GlyphLayoutProcessorInterface { + /** + * + */ + private final boolean useActualText; + + /** + * Options for GlyphLayoutProcessor + */ + public static class GlyphLayoutProcessorOptions { + private boolean useActualText; + + /** + * Turn usage of ActualText on + * @return this + */ + public GlyphLayoutProcessorOptions useActualText() { + useActualText = true; + return this; + } + + /** + * Returns the state of useActualText + * @return true, if ActualText is used, falls otherwise + */ + public boolean getUseActualText() { + return useActualText; + } + } + /** * Class for text and Bidi-Level */ @@ -58,6 +91,22 @@ public int getBidiLevel() } } + /** + * Creates an AbstractGlyphLayoutProcessor with the given options + * @param options Options for creation + */ + public AbstractGlyphLayoutProcessor(GlyphLayoutProcessorOptions options) { + useActualText = options.useActualText; + } + + /** + * Creates an AbstractGlyphLayoutProcessor with standard options + */ + public AbstractGlyphLayoutProcessor() { + useActualText = false; + } + + /** * Compute the string width for a unidirectional string * @param font to be used @@ -88,6 +137,30 @@ public float getStringWidth(PDType0Font font, float fontSize, String text) throw return width; } + + /** + * Begin a marked content sequence for ActualText + * + * @param contentStream the content stream + * @param text the text to be written as ActualText + * @throws IOException If the content stream could not be written + */ + protected void beginMarkedContentForActualText(ContentStreamForGlyphLayoutInterface contentStream, String text) throws IOException { + COSDictionary dict = new COSDictionary(); + dict.setItem(COSName.ACTUAL_TEXT, new COSString(text)); + PDPropertyList propertyList = PDPropertyList.create(dict); + contentStream.beginMarkedContent(COSName.SPAN, propertyList); + } + + /** + * End a marked content sequence. + * + * @throws IOException If the content stream could not be written + */ + protected void endMarkedContent(ContentStreamForGlyphLayoutInterface contentStream) throws IOException { + contentStream.endMarkedContent(); + } + /** * Shows unidirectional text using glyph positioning (if needed) * @@ -117,11 +190,17 @@ protected abstract void showTextUni(ContentStreamForGlyphLayoutInterface content public void showText(ContentStreamForGlyphLayoutInterface contentStream, PDType0Font font, float fontSize, String text) throws IOException { + if (useActualText) { + beginMarkedContentForActualText(contentStream, text); + } List textAndBidiLevels = doBidiSplittingAndReordering(text); for (TextAndBidiLevel textAndBidiLevel: textAndBidiLevels) { showTextUni(contentStream, font, fontSize, textAndBidiLevel.getText(), textAndBidiLevel.getBidiLevel()); } + if (useActualText) { + endMarkedContent(contentStream); + } } /** diff --git a/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/ContentStreamForGlyphLayoutInterface.java b/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/ContentStreamForGlyphLayoutInterface.java index 292ea4a689c..d0766c3c196 100644 --- a/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/ContentStreamForGlyphLayoutInterface.java +++ b/pdfbox/src/main/java/org/apache/pdfbox/pdmodel/ContentStreamForGlyphLayoutInterface.java @@ -16,6 +16,9 @@ */ package org.apache.pdfbox.pdmodel; +import org.apache.pdfbox.cos.COSName; +import org.apache.pdfbox.pdmodel.documentinterchange.markedcontent.PDPropertyList; + import java.io.IOException; public interface ContentStreamForGlyphLayoutInterface @@ -46,4 +49,21 @@ public interface ContentStreamForGlyphLayoutInterface * @throws IOException If the content stream could not be written. */ void setTextRise(float rise) throws IOException; + + + /** + * Begin a marked content sequence with a reference to an entry in the page resources' Properties dictionary. + * + * @param tag the tag to be added to the content stream + * @param propertyList property list to be added to the content stream + * @throws IOException If the content stream could not be written + */ + void beginMarkedContent(COSName tag, PDPropertyList propertyList) throws IOException; + + /** + * End a marked content sequence. + * + * @throws IOException If the content stream could not be written + */ + void endMarkedContent() throws IOException; } From 70ac5c699a66fbfc6012ba26b9a0a7839aa1bba0 Mon Sep 17 00:00:00 2001 From: volker Date: Sun, 6 Sep 2026 21:06:12 +0200 Subject: [PATCH 2/4] New Option to GlyphLayoutProcessor* to use ActualText for correct text extraction and bette accessibility --- .../glyphlayout/fop/GlyphLayoutDin91379Test.java | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/pdfbox-layout-fop/src/test/java/org/apache/pdfbox/glyphlayout/fop/GlyphLayoutDin91379Test.java b/pdfbox-layout-fop/src/test/java/org/apache/pdfbox/glyphlayout/fop/GlyphLayoutDin91379Test.java index 7fbb7f5dc50..b97667d6148 100644 --- a/pdfbox-layout-fop/src/test/java/org/apache/pdfbox/glyphlayout/fop/GlyphLayoutDin91379Test.java +++ b/pdfbox-layout-fop/src/test/java/org/apache/pdfbox/glyphlayout/fop/GlyphLayoutDin91379Test.java @@ -16,7 +16,6 @@ */ package org.apache.pdfbox.glyphlayout.fop; -import java.awt.*; import java.io.BufferedWriter; import java.io.File; import java.io.FileOutputStream; @@ -96,22 +95,20 @@ class GlyphLayoutDin91379Test extends TestBase /** * Test, no ActualText * @throws IOException - * @throws FontFormatException * @throws URISyntaxException */ @Test - void testGlyphLayoutDin91379NoActualText() throws IOException, FontFormatException, URISyntaxException { + void testGlyphLayoutDin91379NoActualText() throws IOException, URISyntaxException { testGlyphLayoutDin91379(false, ""); } /** * Test with ActualText * @throws IOException - * @throws FontFormatException * @throws URISyntaxException */ @Test - void testGlyphLayoutDin91379UseActualText() throws IOException, FontFormatException, URISyntaxException { + void testGlyphLayoutDin91379UseActualText() throws IOException, URISyntaxException { testGlyphLayoutDin91379(true, "_ActualText"); } @@ -119,10 +116,9 @@ void testGlyphLayoutDin91379UseActualText() throws IOException, FontFormatExcept * Test GlyphLayoutProcessorAwt with letters and sequences from DIN 91379 * @param useActualText * @throws IOException - * @throws FontFormatException * @throws URISyntaxException */ - void testGlyphLayoutDin91379(boolean useActualText, String sActualText) throws IOException, FontFormatException, URISyntaxException + void testGlyphLayoutDin91379(boolean useActualText, String sActualText) throws IOException, URISyntaxException { AbstractGlyphLayoutProcessor.GlyphLayoutProcessorOptions options = new AbstractGlyphLayoutProcessor.GlyphLayoutProcessorOptions(); if (useActualText) { From cb0e775383ce6c04c361ff33c46bbf3fa600f2d7 Mon Sep 17 00:00:00 2001 From: volker Date: Mon, 7 Sep 2026 21:23:20 +0200 Subject: [PATCH 3/4] Use correct PDF file --- .../pdf/GlyphLayoutDIN91379_ActualText.pdf | Bin 41381 -> 41381 bytes .../pdf/GlyphLayoutDIN91379_ActualText.pdf | Bin 41057 -> 41057 bytes 2 files changed, 0 insertions(+), 0 deletions(-) diff --git a/pdfbox-layout-awt/src/test/resources/pdf/GlyphLayoutDIN91379_ActualText.pdf b/pdfbox-layout-awt/src/test/resources/pdf/GlyphLayoutDIN91379_ActualText.pdf index b3e83ea1358393559511855bda0f95a21204354b..e30eda7314a9b6eb4eea2a5c43b8b61c5aebddbb 100644 GIT binary patch delta 146 zcmZ2_m}%)@rVSbk>dh>S9E}_u-3(of98FwZT#QX!U5s5!TrEsp%*>2k44oZKEnEzY rEDcRfoSmIqjZBT)+>FdzT?|Z2Eu9QaUF;NWC^3QsWX9yx3w{9r1~4V8 delta 146 zcmZ2_m}%)@rVSbk>YZFnES-$poXnj~EnF;&&0LI~OdL(kEzKQGjV%mKT+A&@4Gj$3 poK4(}+#G?lp`){zqk)Tok&CN^vzdX3oq`P|MzDa)n7n$yF97xGC3FA) diff --git a/pdfbox-layout-fop/src/test/resources/pdf/GlyphLayoutDIN91379_ActualText.pdf b/pdfbox-layout-fop/src/test/resources/pdf/GlyphLayoutDIN91379_ActualText.pdf index acd084f2ac042e88a325a5c8a82a21ce7e42c6ac..b27c4764110c45d17f919f2eacf87fe935c8dae3 100644 GIT binary patch delta 146 zcmaEOfa&1@rVUT$)jL|anHicpTNoG_xLLY585=pdxwslTIhz@{I+>d}SsJ)lI=h)# r7@3&47@N4bn!6dhS~we<8yGuVx|o=mnA$1WP+|lN$c)Ju^M3*Wth*+Z delta 146 zcmaEOfa&1@rVUT$)w>v*nVUO0I~qHgn!6ep8X1^6o0|doj;79zMsB7~Zmv$2hK2^N p&Sox7mIfAPu4b+-mX;Q-CdQTqPHx8Lb_zC>7{LNEV{*p)p8&0ECb9qk From f590bb352d4bb600924e72f0598e8e926fa0aee3 Mon Sep 17 00:00:00 2001 From: volker Date: Thu, 10 Sep 2026 21:42:45 +0200 Subject: [PATCH 4/4] delete unused import --- .../apache/pdfbox/glyphlayout/awt/GlyphLayoutProcessorAwt.java | 1 - 1 file changed, 1 deletion(-) diff --git a/pdfbox-layout-awt/src/main/java/org/apache/pdfbox/glyphlayout/awt/GlyphLayoutProcessorAwt.java b/pdfbox-layout-awt/src/main/java/org/apache/pdfbox/glyphlayout/awt/GlyphLayoutProcessorAwt.java index 3937cba8cf1..161a79aecc8 100644 --- a/pdfbox-layout-awt/src/main/java/org/apache/pdfbox/glyphlayout/awt/GlyphLayoutProcessorAwt.java +++ b/pdfbox-layout-awt/src/main/java/org/apache/pdfbox/glyphlayout/awt/GlyphLayoutProcessorAwt.java @@ -29,7 +29,6 @@ import java.io.InputStream; import java.util.Objects; -import org.apache.pdfbox.cos.COSName; import org.apache.pdfbox.pdmodel.AbstractGlyphLayoutProcessor; import org.apache.pdfbox.pdmodel.ContentStreamForGlyphLayoutInterface; import org.apache.pdfbox.pdmodel.GlyphLayoutProcessorInterface;