关闭

Apache PDFbox开发指南之PDF文本内容挖掘

标签: apache数据库pdf数据
3863人阅读 评论(0) 收藏 举报
分类:

转载请注明来源:http://blog.csdn.net/loongshawn/article/details/51550383

相关文章:

1、场景说明

上一篇文章《Apache PDFbox开发指南之PDF文档读取》讲述了如何读取PDF文档的内容,但这并不是止步,其实想做的是对特定的文本内容进行挖掘,以便获取结构性有价值数据。

2、需要什么

下面这是直接读出来的数据,虽说可以看出大概,但其中参考区间字段内容需要处理,当前不便数据库存储。

检查项目 缩写 测量结果 提示 参考区间 单位
白细胞计数 WBC 6.1 3.5 -- 9.5 10^9/L
淋巴细胞百分比 LYM% 39.3 20 -- 40 %
中间细胞百分比 MXD% 10.1 0 -- 15 %
中性粒细胞百分比 NEUT% 50.6 50 -- 70 %
淋巴细胞绝对值 LYM# 2.7 0.8 -- 4 10^9/L
中间细胞绝对值 MXD# 0.6 0.1 -- 1.4 10^9/L
中性粒细胞绝对值 NEUT# 2.8 2 -- 7 10^9/L
红细胞计数 RBC 5.6 4.3 -- 5.8 10^12/L
血红蛋白 HGB 171 130 -- 175 g/L
红细胞压积 HCT 0.49 0.40 -- 0.50 L/L
平均红细胞体积 MCV 83.5 82 -- 100 fL
平均红细胞血红蛋白含量 MCH 30.8 27 -- 34 pg
平均红细胞血红蛋白浓度 MCHC 354 316 -- 355 g/L
血小板计数 PLT 219 125 -- 350 10^9/L

处理后的数据,便于数据库存储:

[白细胞计数, WBC, 6.1, 3.5--9.5, 10^9/L]
[淋巴细胞百分比, LYM%, 39.3, 20--40, %]
[中间细胞百分比, MXD%, 10.1, 0--15, %]
[中性粒细胞百分比, NEUT%, 50.6, 50--70, %]
[淋巴细胞绝对值, LYM#, 2.7, 0.8--4, 10^9/L]
[中间细胞绝对值, MXD#, 0.6, 0.1--1.4, 10^9/L]
[中性粒细胞绝对值, NEUT#, 2.8, 2--7, 10^9/L]
[红细胞计数, RBC, 5.6, 4.3--5.8, 10^12/L]
[血红蛋白, HGB, 171, 130--175, g/L]
[红细胞压积, HCT, 0.49, 0.40--0.50, L/L]
[平均红细胞体积, MCV, 83.5, 82--100, fL]
[平均红细胞血红蛋白含量, MCH, 30.8, 27--34, pg]
[平均红细胞血红蛋白浓度, MCHC, 354, 316--355, g/L]
[血小板计数, PLT, 219, 125--350, 10^9/L]

3、代码片段

代码旨在将读取到的文本内容结构化输出。

package com.loongshaw;

import java.io.BufferedReader;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.nio.charset.Charset;
import java.util.ArrayList;
import java.util.List;

import org.apache.pdfbox.io.RandomAccessBuffer;
import org.apache.pdfbox.pdfparser.PDFParser;
import org.apache.pdfbox.pdmodel.PDDocument;
import org.apache.pdfbox.text.PDFTextStripper;

public class PdfReader {

    public static void main(String[] args){

        File pdfFile = new File("/Users/dddd/Downloads/0571888890423456_182-9320151031326-2.pdf");
        PDDocument document = null;
        try
        {
            // 方式一:
            /**
            InputStream input = null;
            input = new FileInputStream( pdfFile );
            //加载 pdf 文档
            PDFParser parser = new PDFParser(new RandomAccessBuffer(input));
            parser.parse();
            document = parser.getPDDocument();
            **/

            // 方式二:
            document=PDDocument.load(pdfFile);

            // 获取页码
            int pages = document.getNumberOfPages();

            // 读文本内容
            PDFTextStripper stripper=new PDFTextStripper();
            // 设置按顺序输出
            stripper.setSortByPosition(true);
            stripper.setStartPage(4);
            stripper.setEndPage(4);
            String content = stripper.getText(document);
            //System.out.println(content);    

            BufferedReader bre = null;
            String str = "";
            int state = 0;
            bre = new BufferedReader(new InputStreamReader(new ByteArrayInputStream(content.getBytes(Charset.forName("utf8"))), Charset.forName("utf8")));
            while ((str = bre.readLine())!= null) 
            {
                if(str.startsWith("·血常规")){
                    state = 1;
                    continue;
                }
                if(state == 1){
                    String[] array = str.split(" ");

                    List list = new ArrayList();
                    for(int i=0;i<array.length;i++){
                        list.add(array[i]);
                    }
                    for(int i=0;i<list.size();i++){
                        String one = (String) list.get(i);

                        if(one.equals("--")){
                            String one_b = (String) list.get(i-1);
                            String one_a = (String) list.get(i+1);

                            String new_one = one_b + one + one_a;
                            list.set(i, new_one);
                            list.remove(i-1);
                            list.remove(i);

                            System.out.println(list.toString());
                        }
                    }
                    //System.out.println(str + ",size-"+array.length);
                }

            }
        }
        catch(Exception e)
        {
            System.out.println(e);
        }       
    }
}

运行结果:
这里写图片描述

4、小结

上面仅仅是做了个点皮毛,要想把特定文本内容处理得好一点,还需要深入开发。这篇文章对读者可能没有多大帮助,只是提供一种思考的角度,结构化的数据价值更大一点。

0
0
查看评论

Apache PDFbox开发指南之PDF文档读取

介绍如何利用Apache PDFbox开发包读取PDF文件文本、图片内容。
  • loongshawn
  • loongshawn
  • 2016-05-31 00:12
  • 23384

Apache PDFbox快速开发指南

Apache PDFbox快速开发指南作者:chszs,转载需注明。博客主页:http://blog.csdn.net/chszs一、介绍Apache PDFbox是一个开源的、基于Java的、支持PDF文档生成的工具库,它可以用于创建新的PDF文档,修改现有的PDF文档,还可以从PDF文档中提取所...
  • chszs
  • chszs
  • 2013-06-04 22:53
  • 38126

java使用PDFBox2.0将PDF生成图片

使用到包:commons-logging.jar、 pdfbox-2.0.1.jar、fontbox-2.0.1.jar import java.awt.image.BufferedImage; import java.io.ByteArrayOutputStream; import java.i...
  • wydhao123
  • wydhao123
  • 2016-06-06 15:44
  • 4385

(8)PDFBOX读取PDF(元数据、纲要、文本、图片)

PDFBox是Java实现的PDF文档协作类库,提供PDF文档的创建、处理以及文档内容提取功能,也包含了一些命令行实用工具。其主要特性包括: 1、提取PDF文件的Unicode文本 2、将PDF切分成多个PDF文件或合并多个PDF文件 3、从PDF表格中提取数据或填写PDF表格 4、验证PD...
  • Fighting_No1
  • Fighting_No1
  • 2016-04-01 18:52
  • 6321

APache PDFbox API使用(2)----命令行工具的使用

在写具体代码之前,咱们先了解一下Apache PDFbox API框架给我们提供的命令行工具。通过这个命令行工具,我们可以了解大部分Apache PDFbox给我们提供的强大功能。 在我们运行命令之前,我们首先需要去下载这个命令行工具所依赖的jar文件,大家可以去下面的任何一个站点。限于篇幅,我们当...
  • chancein007
  • chancein007
  • 2014-06-21 23:35
  • 2308

APache PDFbox API使用(1)----简介

由于项目的需要,最近在学习APache PDFbox API,Apache PDFbox API是一个开源的项目,其提供了下面的8大功能。如果大家英文比较好的话,可以去其官方网站去进一步了解其框架的架构,具体的使用方式等。在本系列的文章中,我将会逐一的给大家展示其API的使用。当前最新的PDFbo...
  • chancein007
  • chancein007
  • 2014-06-21 22:30
  • 2258

PDFBox提取文本

这两天在写自己的桌面搜索程序,陆续把自己所碰到的一些问题写一下,防止以后遗忘,再犯同样的错误。 现在先说一下PDFBox对文本的提取,我最开始的时候对于文本的提取是按照下面的方式来写的:  COSDocument cosDoc = null;  FileInputStr...
  • rxr1st
  • rxr1st
  • 2008-03-22 00:19
  • 4447

使用pdfbox填写pdfForm官方示例

/* * Licensed to the Apache Software Foundation (ASF) under one or more * contributor license agreements. See the NOTICE file distributed with * t...
  • qq_22156459
  • qq_22156459
  • 2017-12-26 17:38
  • 86

java : pdfbox 读取 PDF文件内中文

java : pdfbox 读取 PDF文件内中文 , 读取图片
  • belldeep
  • belldeep
  • 2016-08-13 15:26
  • 2925

使用PDFBOX提取PDF文件

最近在使用lucene建立索引时,要使用PDFBOX提取PDF文件,但结果总是报错: java.lang.Throwable: Warning: You did not close the PDF Document 这个问题很烦人,从第三方类库例出来。 在网上记录下找到的解决办法: 原来...
  • seansaint
  • seansaint
  • 2017-05-07 13:44
  • 433
    个人资料
    • 访问:785696次
    • 积分:6914
    • 等级:
    • 排名:第3987名
    • 原创:157篇
    • 转载:29篇
    • 译文:2篇
    • 评论:158条
    最新评论