我试图做一些相当简单的事情,从传入的i9中读取FlowFile PDF表单,将其中的名字和姓氏解析为JSON,然后将JSON输出到传出的FlowFile。
我没有找到关于如何做到这一点的正式文档,但是有人写了几个这里介绍了在NiFi中用几种脚本语言做事情的食谱。 --它看起来相当简单,我很确定我正在做在那里写的东西,但我甚至不确定PDF是否被读取。它每次简单地将未经修改的PDF传递给REL_SUCCESS。
import java.nio.charset.StandardCharsets
import org.apache.pdfbox.io.IOUtils
import org.apache.pdfbox.pdmodel.PDDocument
import org.apache.pdfbox.util.PDFTextStripperByArea
import java.awt.Rectangle
import org.apache.pdfbox.pdmodel.PDPage
import com.google.gson.Gson
import java.nio.charset.StandardCharsets
def flowFile = session.get()
flowFile = session.write(flowFile, { inputStream, outputStream ->
try {
//Load Flowfile contents
PDDocument document = PDDocument.load(inputStream)
PDFTextStripperByArea stripper = new PDFTextStripperByArea()
//Get the first page
List<PDPage> allPages = document.getDocumentCatalog().getAllPages()
PDPage page = allPages.get(0)
//Define the areas to search and add them as search regions
stripper = new PDFTextStripperByArea()
Rectangle lname = new Rectangle(25, 226, 240, 15)
stripper.addRegion("lname", lname)
Rectangle fname = new Rectangle(276, 226, 240, 15)
stripper.addRegion("fname", fname)
//Load the results into a JSON
def boxMap = [:]
stripper.setSortByPosition(true)
stripper.extractRegions(page)
regions = stripper.getRegions()
for (String region : regions) {
String box = stripper.getTextForRegion(region)
boxMap.put(region, box)
}
Gson gson = new Gson()
//Remove random noise from the output
json = gson.toJson(boxMap, LinkedHashMap.class)
json = json.replace('\\n', '')
json = json.replace('\\r', '')
json = json.replace(',"', ',\n"')
//Overwrite flowfile contents with JSON
outputStream.write(json.getBytes(StandardCharsets.UTF_8))
} catch (Exception e){
System.out.println(e.getMessage())
session.transfer(flowFile, REL_FAILURE)
}
} as StreamCallback)
session.transfer(flowFile, REL_SUCCESS)编辑:能够确认flowFile对象正被正确地读取,方法是将一个txt文件在。因此,问题似乎是,inputStream从来没有被传递给PDDocument,或者当它这样做的时候发生了什么事情。我首先编辑了代码,尝试将其读入File对象,但这导致了一个错误:
FlowFileHandlingException: null is not known in this session
编辑编辑:通过移动我的尝试/捕捉来解决。我似乎不明白它是如何工作的,我上面的代码已经被编辑并正常工作了。
发布于 2018-08-09 15:57:41
session.get可以返回null,因此肯定会在该if(!flowFile) return之后添加一行。另外,在session.write之外放置try/catch,这样就可以将session.transfer(flowFile,REL_SUCCESS)放在session.write之后(在try中),catch可以传输到失败。
另外,我无法从代码中知道PDFTextStripperByArea是如何从传入的文档中获取信息的。看起来所有的文档内容都在try中,所以PDFTextStripper将无法使用(并且不会传入)。
所有这些都不能解释为什么要在success关系上获得原始的流文件,但是也许我没有看到的东西会被上面的更改神奇地解决:)
另外,如果您使用log.info()或log.error()而不是System.out.println,您将在NiFi日志中看到输出(如果出现错误,它将向处理器发布公告,如果您悬停在处理器的右上角(如果存在公告,则为红色方格),则可以看到消息。
https://stackoverflow.com/questions/51770565
复制相似问题