Thank you, fixed in
https://issues.apache.org/jira/browse/PDFBOX-6214

please try with a snapshot
https://repository.apache.org/content/groups/snapshots/org/apache/pdfbox/pdfbox-app/3.0.8-SNAPSHOT/

and tell us whether it works. It might still fail later because pdfbox uses 
some awt classes when when not rendering.

Tilman


On 2026/06/30 23:35:32 Wanling Fu wrote:
> Hi all,
> 
> I'm using PDFBox in a GraalVM native-image CLI that only does non-rendering
> work: reading metadata and embedding an attachment. It never renders pages
> or touches images. I'd appreciate your advice on a small robustness
> question rather than reporting it as an outright bug.
> 
> org.apache.pdfbox.pdmodel.PDDocument has a static initializer that eagerly
> warms up the RGB color subsystem:
> 
>     /* avoid concurrency issues with PDDeviceRGB */
>     static {
>         try {
>             WritableRaster raster = Raster.createBandedRaster(
>                     DataBuffer.TYPE_BYTE, 1, 1, 3, new Point(0, 0));
>             PDDeviceRGB.INSTANCE.toRGBImage(raster);
>         } catch (IOException ex) {
>             LOG.debug("voodoo error", ex);
>         }
>     }
> 
> I understand the intent: avoiding a first-use concurrency race in color
> management. The eager warm-up itself seems reasonable.
> 
> The problem is the failure mode. The block only catches IOException. If AWT
> native libraries cannot be loaded, the warm-up throws UnsatisfiedLinkError
> instead. That is an Error, so it is not caught. As a result, PDDocument
> class initialization fails with ExceptionInInitializerError, and PDDocument
> becomes unusable even for operations that do not need rendering or color
> conversion.
> 
> Minimal reproducer:
> 
>     //DEPS org.apache.pdfbox:pdfbox:3.0.7
> 
>     import java.io.File;
> 
>     import org.apache.pdfbox.Loader;
>     import org.apache.pdfbox.pdmodel.PDDocument;
> 
>     public class PdfBoxMwe {
>         public static void main(String[] args) throws Exception {
>             try (PDDocument doc = Loader.loadPDF(new File(args[0]))) {
>                 System.out.println("pages: " + doc.getNumberOfPages());
>             }
>         }
>     }
> 
> This works on a normal JVM. It fails when built as a GraalVM native image
> where the AWT native libraries are unavailable or not loadable.
> 
> Stack excerpt, using PDFBox 3.0.7, JDK 25, GraalVM/Liberica NIK native
> image, macOS arm64:
> 
>     java.lang.UnsatisfiedLinkError: Can't load library:
> .../libawt_lwawt.dylib
>         at java.awt.image.ColorModel.loadLibraries(ColorModel.java:208)
>         at java.awt.image.ColorModel.<clinit>(ColorModel.java:215)
>         at java.awt.image.Raster.<clinit>(Raster.java:172)
>         at
> org.apache.pdfbox.pdmodel.PDDocument.<clinit>(PDDocument.java:103)
>         at org.apache.pdfbox.Loader.loadPDF(Loader.java:...)
>         ...
> 
> Note: this is not strictly macOS-specific. A similar failure also occurs on
> Linux with GraalVM CE, where the AWT native libraries are not bundled. The
> symptom is different there (NoClassDefFoundError:
> java.awt.GraphicsEnvironment), but it comes from the same
> PDDocument.<clinit> path. It works on Linux only when the toolchain bundles
> AWT (e.g. Liberica NIK).
> 
> The specific PDF does not matter. The failure happens in PDDocument's
> static initializer, before any document content is parsed. Even new
> PDDocument() can trigger it.
> 
> My question: would it be reasonable to broaden the catch in that static
> block, for example by catching LinkageError or Throwable, logging it, and
> continuing? The warm-up would still run where available. Environments
> without AWT would skip it, leaving PDDocument usable for non-rendering
> operations such as parsing, metadata, and attachments. Rendering or color
> conversion could still fail later when actually used.
> 
> I searched first: PDFBOX-4746
> <https://issues.apache.org/jira/browse/PDFBOX-4746> looks related but is a
> different build-time native-image issue. There is also related GraalVM
> context <https://github.com/oracle/graal/issues/13272> about macOS AWT
> support in native-image (oracle/graal#13272).
> 
> Happy to open a JIRA enhancement and/or submit a PR if this direction
> sounds acceptable.
> 
> Thanks for the great library.
> 
> Best regards,
> Wanling
> 

---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to