首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Groovy覆盖FlowFile中的NiFi

使用Groovy覆盖FlowFile中的NiFi
EN

Stack Overflow用户
提问于 2018-08-09 15:14:05
回答 1查看 1.8K关注 0票数 1

我试图做一些相当简单的事情,从传入的i9中读取FlowFile PDF表单,将其中的名字和姓氏解析为JSON,然后将JSON输出到传出的FlowFile。

我没有找到关于如何做到这一点的正式文档,但是有人写了几个这里介绍了在NiFi中用几种脚本语言做事情的食谱。 --它看起来相当简单,我很确定我正在做在那里写的东西,但我甚至不确定PDF是否被读取。它每次简单地将未经修改的PDF传递给REL_SUCCESS。

链接到样例PDF

代码语言:javascript
复制
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

编辑编辑:通过移动我的尝试/捕捉来解决。我似乎不明白它是如何工作的,我上面的代码已经被编辑并正常工作了。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 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日志中看到输出(如果出现错误,它将向处理器发布公告,如果您悬停在处理器的右上角(如果存在公告,则为红色方格),则可以看到消息。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/51770565

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档