v1.0.5: parser.cfm — PDF через PDFBox, TXT
This commit is contained in:
+116
@@ -0,0 +1,116 @@
|
||||
<cfsetting showdebugoutput="no" enablecfoutputonly="true">
|
||||
<cfheader name="Content-Type" value="application/json; charset=utf-8">
|
||||
|
||||
<cfparam name="url.doc_id" default="">
|
||||
|
||||
<cfset result = {ok: false, error: ""}>
|
||||
|
||||
<cftry>
|
||||
<cfif NOT len(url.doc_id)>
|
||||
<cfset result.error = "doc_id required">
|
||||
<cfelse>
|
||||
<!--- Читаем документ из БД --->
|
||||
<cfquery name="doc" datasource="baza">
|
||||
SELECT id, filename, mime_type, original_bytes, status
|
||||
FROM documents
|
||||
WHERE id = <cfqueryparam value="#url.doc_id#" cfsqltype="cf_sql_varchar">
|
||||
</cfquery>
|
||||
|
||||
<cfif doc.recordCount EQ 0>
|
||||
<cfset result.error = "document not found">
|
||||
<cfelse>
|
||||
<cfset elements = []>
|
||||
<cfset errors = []>
|
||||
|
||||
<!--- PDF --->
|
||||
<cfif doc.mime_type EQ "application/pdf">
|
||||
<cftry>
|
||||
<!--- Base64 → байты --->
|
||||
<cfset fileBytes = binaryDecode(doc.original_bytes, "base64")>
|
||||
<!--- Байты → InputStream --->
|
||||
<cfset bais = createObject("java", "java.io.ByteArrayInputStream").init(fileBytes)>
|
||||
<!--- Открываем PDF --->
|
||||
<cfset pdfDoc = createObject("java", "org.apache.pdfbox.pdmodel.PDDocument").load(bais)>
|
||||
<cfset stripper = createObject("java", "org.apache.pdfbox.text.PDFTextStripper")>
|
||||
|
||||
<cfset pageCount = pdfDoc.getNumberOfPages()>
|
||||
<cfloop from="1" to="#pageCount#" index="pn">
|
||||
<cfset stripper.setStartPage(pn)>
|
||||
<cfset stripper.setEndPage(pn)>
|
||||
<cfset pageText = stripper.getText(pdfDoc)>
|
||||
<cfif len(trim(pageText))>
|
||||
<cfloop list="#pageText#" index="line" delimiters="#chr(10)#">
|
||||
<cfset line = trim(line)>
|
||||
<cfif len(line)>
|
||||
<cfset arrayAppend(elements, {type: "paragraph", style: "", text: line, page: pn})>
|
||||
</cfif>
|
||||
</cfloop>
|
||||
</cfif>
|
||||
</cfloop>
|
||||
|
||||
<cfset pdfDoc.close()>
|
||||
<cfset bais.close()>
|
||||
|
||||
<cfcatch>
|
||||
<cfset arrayAppend(errors, "PDFBox: " & cfcatch.message)>
|
||||
</cfcatch>
|
||||
</cftry>
|
||||
|
||||
<!--- DOCX/DOC — POI нет, пропускаем --->
|
||||
<cfelseif doc.mime_type EQ "application/vnd.openxmlformats-officedocument.wordprocessingml.document"
|
||||
OR doc.mime_type EQ "application/msword">
|
||||
<cfset arrayAppend(errors, "DOCX/DOC parsing not available (POI not installed)")>
|
||||
|
||||
<!--- TXT — plain text --->
|
||||
<cfelseif doc.mime_type EQ "text/plain" OR doc.mime_type EQ "application/octet-stream">
|
||||
<cftry>
|
||||
<cfset fileBytes = binaryDecode(doc.original_bytes, "base64")>
|
||||
<cfset text = createObject("java", "java.lang.String").init(fileBytes, "UTF-8")>
|
||||
<cfloop list="#text#" index="line" delimiters="#chr(10)#">
|
||||
<cfset line = trim(line)>
|
||||
<cfif len(line)>
|
||||
<cfset arrayAppend(elements, {type: "paragraph", style: "", text: line, page: 1})>
|
||||
</cfif>
|
||||
</cfloop>
|
||||
<cfcatch>
|
||||
<cfset arrayAppend(errors, "TXT: " & cfcatch.message)>
|
||||
</cfcatch>
|
||||
</cftry>
|
||||
|
||||
<cfelse>
|
||||
<cfset arrayAppend(errors, "unsupported mime_type: " & doc.mime_type)>
|
||||
</cfif>
|
||||
|
||||
<!--- Сохраняем результат --->
|
||||
<cfset newStatus = arrayLen(elements) GT 0 ? "parsed" : "error">
|
||||
<cfif arrayLen(errors) GT 0 AND arrayLen(elements) EQ 0>
|
||||
<cfset newStatus = "error">
|
||||
</cfif>
|
||||
|
||||
<cfquery datasource="baza">
|
||||
UPDATE documents
|
||||
SET elements_json = <cfqueryparam value="#serializeJSON(elements)#" cfsqltype="cf_sql_varchar">::jsonb,
|
||||
status = <cfqueryparam value="#newStatus#" cfsqltype="cf_sql_varchar">,
|
||||
error_message = <cfqueryparam value="#arrayLen(errors) ? serializeJSON(errors) : ''#" cfsqltype="cf_sql_varchar">
|
||||
WHERE id = <cfqueryparam value="#url.doc_id#" cfsqltype="cf_sql_varchar">
|
||||
</cfquery>
|
||||
|
||||
<cfset result = {
|
||||
ok: true,
|
||||
doc_id: url.doc_id,
|
||||
filename: doc.filename,
|
||||
mime_type: doc.mime_type,
|
||||
status: newStatus,
|
||||
element_count: arrayLen(elements),
|
||||
page_count: isDefined("pageCount") ? pageCount : 0,
|
||||
errors: errors
|
||||
}>
|
||||
</cfif>
|
||||
</cfif>
|
||||
|
||||
<cfcatch>
|
||||
<cfset result = {ok: false, error: cfcatch.message, detail: cfcatch.detail}>
|
||||
</cfcatch>
|
||||
</cftry>
|
||||
|
||||
<cfoutput>#serializeJSON(result)#</cfoutput>
|
||||
Reference in New Issue
Block a user