Exporting to PDF a page with a large dimensions image fails with "Failed to read image"

XMLWordPrintable

    • 8
    • Severity 3 - Minor
    • 1

      Issue Summary

      When exporting to PDF a page which includes a large dimensions image, it fails to be exported.

      This is reproducible on Data Center: yes

      Steps to Reproduce

      1. Create a new Confluence page
      2. Add the attached file as an image: BLANK.png ( width: 30000 and height: 11300)
      3. Export this page to PDF (Page tools > Export to PDF)

      Expected Results

      The PDF is created.

      Actual Results

      PDF fails to be created and user receives a "System Error" instead.

      When enabled DEBUG levels for com.atlassian.confluence.extra.flyingpdf and
      com.atlassian.confluence.impl.util.sandbox classes, the following exception can be observed in the atlassian-confluence.log file:

      2023-12-21 09:16:56,489 INFO [sandbox-logger] [impl.util.sandbox.ConversionSandbox] lambda$buildConfig$0 worker1: Exception in thread \"main\" java.lang.RuntimeException: Failed to create the PDF document: /var/atlassian/application-data/confluence/temp/pdfexport-20231221-211223-0916-1/Page854 30000_18b29ef3d6294359bdfbc8bc001737a2-211223-0916-2.pdf
      at com.atlassian.confluence.extra.flyingpdf.sandbox.SandboxPdfConversionTask.createPdfFile(SandboxPdfConversionTask.java:85)
      at com.atlassian.confluence.extra.flyingpdf.sandbox.SandboxPdfConversionTask.apply(SandboxPdfConversionTask.java:49)
      at com.atlassian.confluence.extra.flyingpdf.sandbox.SandboxPdfConversionTask.apply(SandboxPdfConversionTask.java:34)
      at com.atlassian.confluence.impl.util.sandbox.SandboxServerWorker.processNextMessage(SandboxServerWorker.java:53)
      at com.atlassian.confluence.impl.util.sandbox.SandboxServer.run(SandboxServer.java:36)
      at com.atlassian.confluence.impl.util.sandbox.SandboxServer.main(SandboxServer.java:56)
      
      Caused by: java.lang.RuntimeException: Failed to read image
      at com.atlassian.confluence.extra.flyingpdf.impl.LightITextFSImage.getImage(LightITextFSImage.java:219)
      at org.xhtmlrenderer.pdf.ITextOutputDevice.drawImage(ITextOutputDevice.java:828)
      at org.xhtmlrenderer.pdf.ITextImageElement.paint(ITextImageElement.java:72)
      at org.xhtmlrenderer.pdf.ITextOutputDevice.paintReplacedElement(ITextOutputDevice.java:199)
      at org.xhtmlrenderer.layout.Layer.paintReplacedElement(Layer.java:540)
      at org.xhtmlrenderer.layout.Layer.paintReplacedElements(Layer.java:497)
      at org.xhtmlrenderer.layout.Layer.paintAsLayer(Layer.java:471)
      at org.xhtmlrenderer.render.BlockBox.paintInline(BlockBox.java:265)
      at org.xhtmlrenderer.layout.Layer.paintInlineContent(Layer.java:274)
      at org.xhtmlrenderer.layout.Layer.paint(Layer.java:332)
      at org.xhtmlrenderer.pdf.ITextRenderer.paintPage(ITextRenderer.java:432)
      at org.xhtmlrenderer.pdf.ITextRenderer.writePDF(ITextRenderer.java:380)
      at org.xhtmlrenderer.pdf.ITextRenderer.createPDF(ITextRenderer.java:333)
      at org.xhtmlrenderer.pdf.ITextRenderer.createPDF(ITextRenderer.java:265)
      at com.atlassian.confluence.extra.flyingpdf.sandbox.SandboxPdfConversionTask.createPdfFile(SandboxPdfConversionTask.java:81)
      ... 5 more
      
      Caused by: java.lang.RuntimeException: Failed to read image
      at com.atlassian.confluence.extra.flyingpdf.impl.LightITextFSImage.getImage(LightITextFSImage.java:212)
      ... 19 more
      
      Caused by: java.net.MalformedURLException: no protocol: /confluence/download/attachments/1146885/BLANK.png?version=1&modificationDate=1703150098857&api=v2
      at java.base/java.net.URL.<init>(URL.java:645)
      at java.base/java.net.URL.<init>(URL.java:541)
      at java.base/java.net.URL.<init>(URL.java:488)
      at com.atlassian.confluence.extra.flyingpdf.impl.LightITextFSImage.getImage(LightITextFSImage.java:201)
      ... 19 more
      

      When the image size is reduced, but not enough (for example half width:15000 as in file BLANK_15000.png, the error might change and trigger and OutOfMemory by PixelGrabber.setDimensions() method:

      2023-12-21 09:35:56,490 INFO [sandbox-logger] [impl.util.sandbox.ConversionSandbox] lambda$buildConfig$0 worker1: Exception in thread \"main\" java.lang.OutOfMemoryError: Java heap space
      at java.desktop/java.awt.image.PixelGrabber.setDimensions(PixelGrabber.java:377)
      at java.desktop/sun.awt.image.OffScreenImageSource.produce(OffScreenImageSource.java:185)
      at java.desktop/sun.awt.image.OffScreenImageSource.addConsumer(OffScreenImageSource.java:66)
      at java.desktop/sun.awt.image.OffScreenImageSource.startProduction(OffScreenImageSource.java:80)
      at java.desktop/java.awt.image.PixelGrabber.grabPixels(PixelGrabber.java:259)
      at java.desktop/java.awt.image.PixelGrabber.grabPixels(PixelGrabber.java:226)
      at com.lowagie.text.Image.getInstance(Image.java:586)
      at com.lowagie.text.Image.getInstance(Image.java:751)
      at com.atlassian.confluence.extra.flyingpdf.impl.LightITextFSImage.getImage(LightITextFSImage.java:196)
      at org.xhtmlrenderer.pdf.ITextOutputDevice.drawImage(ITextOutputDevice.java:828)
      at org.xhtmlrenderer.pdf.ITextImageElement.paint(ITextImageElement.java:72)
      at org.xhtmlrenderer.pdf.ITextOutputDevice.paintReplacedElement(ITextOutputDevice.java:199)
      at org.xhtmlrenderer.layout.Layer.paintReplacedElement(Layer.java:540)
      at org.xhtmlrenderer.layout.Layer.paintReplacedElements(Layer.java:497)
      at org.xhtmlrenderer.layout.Layer.paintAsLayer(Layer.java:471)
      at org.xhtmlrenderer.render.BlockBox.paintInline(BlockBox.java:265)
      at org.xhtmlrenderer.layout.Layer.paintInlineContent(Layer.java:274)
      at org.xhtmlrenderer.layout.Layer.paint(Layer.java:332)
      at org.xhtmlrenderer.pdf.ITextRenderer.paintPage(ITextRenderer.java:432)
      at org.xhtmlrenderer.pdf.ITextRenderer.writePDF(ITextRenderer.java:380)
      at org.xhtmlrenderer.pdf.ITextRenderer.createPDF(ITextRenderer.java:333)
      at org.xhtmlrenderer.pdf.ITextRenderer.createPDF(ITextRenderer.java:265)
      at com.atlassian.confluence.extra.flyingpdf.sandbox.SandboxPdfConversionTask.createPdfFile(SandboxPdfConversionTask.java:81)
      at com.atlassian.confluence.extra.flyingpdf.sandbox.SandboxPdfConversionTask.apply(SandboxPdfConversionTask.java:49)
      at com.atlassian.confluence.extra.flyingpdf.sandbox.SandboxPdfConversionTask.apply(SandboxPdfConversionTask.java:34)
      at com.atlassian.confluence.impl.util.sandbox.SandboxServerWorker.processNextMessage(SandboxServerWorker.java:53)
      at com.atlassian.confluence.impl.util.sandbox.SandboxServer.run(SandboxServer.java:36)
      at com.atlassian.confluence.impl.util.sandbox.SandboxServer.main(SandboxServer.java:56)
      

      Workaround

      Workaround 1) 

      Reduce the image dimensions and upload it into the page as a new version of the same attachment.

      Workaround 2)

      Add 20GB extra memory for running External Sandbox process, as a system property in your setenv.sh:

      -Dconversion.sandbox.memory.limit.megabytes=20480
      

        1. BLANK_15000.png
          258 kB
          Iker Alonso
        2. BLANK.png
          995 kB
          Iker Alonso

            Assignee:
            Unassigned
            Reporter:
            Iker Alonso (Inactive)
            Votes:
            11 Vote for this issue
            Watchers:
            10 Start watching this issue

              Created:
              Updated: