v1.0.148: PDF parsing via PyPDF2 on VM (replaces broken PDFBox on Lucee)

This commit is contained in:
2026-06-23 12:18:48 +04:00
parent 6c288b2b0e
commit 2399b01a26
3 changed files with 64 additions and 34 deletions
+13 -34
View File
@@ -10,42 +10,21 @@
<cfargument name="fileBytes" type="binary">
<cfset var out = {elements: [], errors: []}>
<cftry>
<cfset var pdfDoc = 0>
<cftry>
<cfset pdfDoc = createObject("java", "org.apache.pdfbox.Loader").loadPDF(fileBytes)>
<cfcatch>
<cftry>
<cfset pdfDoc = createObject("java", "org.apache.pdfbox.pdmodel.PDDocument").load(fileBytes)>
<cfcatch>
<cfset arrayAppend(out.errors, "PDFBox: cannot open — " & cfcatch.message)>
</cftry>
<cfif NOT isNumeric(pdfDoc)>
<cfset var stripper = createObject("java", "org.apache.pdfbox.text.PDFTextStripper")>
<cfset var pageCount = pdfDoc.getNumberOfPages()>
<cfloop from="1" to="#pageCount#" index="pn">
<cfset stripper.setStartPage(pn)>
<cfset stripper.setEndPage(pn)>
<cfset var pageText = stripper.getText(pdfDoc)>
<cfif len(trim(pageText))>
<cfloop list="#pageText#" index="line" delimiters="#chr(10)#">
<cfset line = trim(line)>
<cfif len(line)>
<cfset var el = structNew()>
<cfset el.type = "paragraph">
<cfset el.style = "">
<cfset el.text = line>
<cfset el.page = pn>
<cfset arrayAppend(out.elements, el)>
</cfif>
</cfloop>
</cfif>
</cfloop>
<cfset pdfDoc.close()>
<cfhttp url="https://contracts.kube5s.ru/parse-pdf" method="post" timeout="30">
<cfhttpparam type="body" value="#binaryEncode(fileBytes, 'base64')#">
</cfhttp>
<cfif cfhttp.statusCode EQ 200>
<cfset var data = deserializeJSON(cfhttp.fileContent)>
<cfif data.ok>
<cfset out.elements = data.elements>
<cfelse>
<cfset arrayAppend(out.errors, "VM parse error: " & (structKeyExists(data, 'error') ? data.error : 'unknown'))>
</cfif>
<cfelse>
<cfset arrayAppend(out.errors, "VM HTTP error: " & cfhttp.statusCode)>
</cfif>
<cfset bis.close()>
<cfset bais.close()>
<cfcatch>
<cfset arrayAppend(out.errors, "PDFBox: " & cfcatch.message)>
<cfset arrayAppend(out.errors, "PDF parse failed: " & cfcatch.message)>
</cfcatch>
</cftry>
<cfreturn out>