Почему я получаю исключение PDFParseException при попытке получить страницу экземпляра PDFFile?

Я использую PDFRenderer версии 0.9.1 для программного преобразования PDF в PNG в ColdFusion.

Вот UDF, который я написал для этого:

<cffunction
    name="pdfToImageFile"
    returntype="String"
    output="false"
    hint="Converts a phsyical PDF File to a physical Image file and returns the absolute path of the new Image file">
    <cfargument name="sourcePath" type="String" default="" />
    <cfargument name="destinationPath" type="String" default="" />
    <cfargument name="format" type="String" default="png" />

    <cfset var LOCAL = {} />

    <cfif NOT isValidPDF(Trim(ARGUMENTS.sourcePath))>
        <cfthrow
            message="Source file not specified or not a valid PDF file." />
    </cfif>

    <cfif NOT DirectoryExists(Trim(ARGUMENTS.destinationPath))>
        <cfthrow message="Inavlid Destination path." />
    </cfif>

    <cfif
        NOT ListFindNoCase(
                GetWriteableImageFormats(),
                Trim(ARGUMENTS.format)
                )>
        <cfthrow message="Inavlid Image format specified." />
    </cfif>

    <cfscript>
        LOCAL.DestinationFilePath =
                Trim(ARGUMENTS.destinationPath)
            &   "\"
            &   REQUEST.UDFLib.File.getFileNameWithoutExtension(
                    GetFileFromPath(ARGUMENTS.sourcePath)
                    )
            &   "."
            &   LCase(Trim(ARGUMENTS.format));

        LOCAL.RandomAccessFile =
            CreateObject(
                "java",
                "java.io.RandomAccessFile"
                ).init(
                    CreateObject(
                        "java",
                        "java.io.File"
                        ).init(ARGUMENTS.sourcePath),
                    "r"
                    );

        LOCAL.FileChannel = LOCAL.RandomAccessFile.getChannel();

        LOCAL.PDFFile =
            CreateObject(
                "java",
                "com.sun.pdfview.PDFFile"
                ).init(
                    LOCAL.FileChannel.map(
                        CreateObject(
                            "java",
                            "java.nio.channels.FileChannel$MapMode"
                            ).READ_ONLY,
                        0,
                        LOCAL.FileChannel.size()
                        )
                    ) />

        LOCAL.PDFPage = LOCAL.PDFFile.getPage(1) />

        //  The following line throws an exception "Element PDFPAGE is undefined in LOCAL." 
        LOCAL.Rectangle = LOCAL.PDFPage.getBBox();

        LOCAL.BufferedImage =
            CreateObject(
                "java",
                "java.awt.image.BufferedImage"
                ).init(
                    LOCAL.Rectangle.width,
                    LOCAL.Rectangle.height,
                    CreateObject(
                        "java",
                        "java.awt.image.BufferedImage"
                        ).TYPE_INT_RGB
                    );

        LOCAL.Graphics = LOCAL.BufferedImage.createGraphics();

        LOCAL.Graphics.drawImage(
            LOCAL.PDFPage.getImage(
                LOCAL.Rectangle.width,
                LOCAL.Rectangle.height,
                LOCAL.Rectangle,
                JavaCast("null", ""),
                true,
                true
                ),
            0,
            0,
            JavaCast("null", "")
            );

        LOCAL.Graphics.dispose();

        LOCAL.ImageFile =
            CreateObject(
                "java",
                "java.io.File"
                ).init(LOCAL.DestinationFilePath);

        //  Delete existing image file
        if  (LOCAL.ImageFile.exists())
            LOCAL.ImageFile.delete();

        //  Export the image to the specified format
        CreateObject(
            "java",
            "javax.imageio.ImageIO"
            ).write(
                LOCAL.BufferedImage,
                JavaCast("string", Trim(ARGUMENTS.format)),
                LOCAL.ImageFile
                );

        LOCAL.RandomAccessFile.close();

        return LOCAL.DestinationFilePath;
    </cfscript>
</cffunction>

Это прекрасно работает для большинства PDF-файлов. Тем не менее, он иногда создает исключение для определенных PDF-файлов (все PDF-файлы являются проприетарными и не подлежат разглашению).

При попытке ссылки на первую страницу PDF с помощью PDFFile.getPage(1)Я получаю исключение ColdFusion: Element PDFPAGE is undefined in LOCAL.,

Я выполнил это через отладчик, и при более глубокой проверке я вижу следующие значения для определенного PDF:

PDFFile.getNumPages() : 0
PDFFile.getVersionString() : 1.7
PDFFile.getRoot() : 
    Indirect to #182
    Catalog dictionary. Keys:
       StructTreeRoot  Indirect to #40com.sun.pdfview.PDFParseException: Could not decrypt: Need at least 2880 bytes of space in output buffer
       Pages  Indirect to #178com.sun.pdfview.PDFParseException: Could not decrypt: Need at least 80 bytes of space in output buffer
       Type  Name: /Catalog
       ViewerPreferences  Untyped dictionary. Keys:
       Direction  Name: /L2R
       Metadata  Indirect to #23
    Caught an error: com.sun.pdfview.PDFParseException: Could not decrypt: Need at least 2672 bytes of space in output buffer
       MarkInfo  Untyped dictionary. Keys:
       Marked  Boolean: true

Я не очень разбираюсь в Java, поэтому понятия не имею, что это все значит, но это наводит меня на мысль, что PDF-файл искажен и не может быть правильно прочитан библиотекой Java.

Любая идея, что именно может вызвать этот тип ошибки? Может ли это быть из-за того, как PDF создается / создается, будучи более новой версией, которая не совместима с библиотекой PDFRenderer?

0 ответов

Другие вопросы по тегам