NiFi выдержка из PDF в текст - PullRequest
0 голосов
/ 14 марта 2019

Для этого использовалось 3 процессораgroovy script и следуйте инструкциям в этой ссылке ниже.Он работает нормально, но последние несколько страниц / последние несколько строк последней страницы не извлекаются.Пробовал с разными файлами PDF и столкнулся с той же проблемой.

   import org.apache.pdfbox.pdmodel.*
import org.apache.pdfbox.util.*

def flowFile = session.get()
if(!flowFile) return

def doc, info
def s  = new PDFTextStripper()

flowFile = session.write(flowFile, {inputStream, outputStream ->
 doc = PDDocument.load(inputStream)
 info = doc.getDocumentInformation()

        s.writeText(doc, new OutputStreamWriter(outputStream))
    } as StreamCallback
)
flowFile = session.putAttribute(flowFile, 'pdf.page.count', "${doc.getNumberOfPages()}")
flowFile = session.putAttribute(flowFile, 'pdf.title', "${info.getTitle()}" )
flowFile = session.putAttribute(flowFile, 'pdf.author',"${info.getAuthor()}" );
flowFile = session.putAttribute(flowFile, 'pdf.subject', "${info.getSubject()}" );
flowFile = session.putAttribute(flowFile, 'pdf.keywords', "${info.getKeywords()}" );
flowFile = session.putAttribute(flowFile, 'pdf.creator', "${info.getCreator()}" );
flowFile = session.putAttribute(flowFile, 'pdf.producer', "${info.getProducer()}" );
flowFile = session.putAttribute(flowFile, 'pdf.date.creation', "${info.getCreationDate()}" );
flowFile = session.putAttribute(flowFile, 'pdf.date.modified', "${info.getModificationDate()}");
flowFile = session.putAttribute(flowFile, 'pdf.trapped', "${info.getTrapped()}" );   
session.transfer(flowFile, REL_SUCCESS)

http://funnifi.blogspot.com/2016/02/executescript-extract-text-metadata.html

Есть ли способ это исправить?

1 Ответ

0 голосов
/ 18 марта 2019

проблема выглядит в этой строке кода:

s.writeText(doc, new OutputStreamWriter(outputStream))

вы создаете OutputStreamWriter с внутренним буфером, который передается в базовый выходной поток при вызове OutputStreamWriter.flush() или OutputStreamWriter.close(). Ни один из этих методов не вызывается в вашем коде.

Вы можете использовать метод groovy withWriter, чтобы закрыть писатель после завершения закрытия:

outputStream.withWriter{w-> s.writeText(doc, w) }
...