Почему я получаю исключение 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?