j a v a如何实现pdf文档(主要是提取文档中的表格数据)内容提取

如何用j a v a实现p d f文档内容提取,其中包含文字,图片,流程图表,数据表格等内容。我用p d f box或i text读取可以实现数据的提取,但是一方面是提取的表格内容无格式,另一方面也是最重要的如果表格单元格中的内容有换行的文字或数据,这时读出的内容就会错位,也就是说可能第三个单元格的上边数据会先读,出现在第一个单元格内容的前面;或者读出的没有格式,找不到对应项,如何能够使读出的表格按照原有的对应样式输出,或者说直接把表格整个抠出来,都行,当然要带表格前面的一局提示话,希望哪位大神能够解决,我需要代码和解释。谢谢。

首先要制作模板 模板里的需要传入的数据用${data} 填充,在代码里给其赋值即可

模板制作好后 ,点击另存为 xml 文件 如:data.xml

如果xml需要动态填充 可以用

< #list personnelView as e>

</#list>

<#list personnelView as e> // personnelView为循环集合





/w:tblCellMar
/w:tblPrEx


/w:trPr




/w:tcPr




/w:pPr



/w:rPr
${e_index +1}/w:t //e_index 为索引从0 开始
/w:r
/w:p
/w:tc




/w:tcPr





/w:rPr
${e.COLUMN_1}/w:t
/w:r
/w:p
/w:tc




/w:tcPr





/w:rPr
/w:pPr



/w:rPr
${e.COLUMN_2}/w:t
/w:r
/w:p
/w:tc





/w:tcPr





/w:rPr
${e.COLUMN_3}/w:t
/w:r
/w:p
/w:tc





/w:tcPr





/w:rPr
${e.COLUMN_4}/w:t
/w:r
/w:p
/w:tc





/w:tcPr





/w:rPr
${e.COLUMN_5}/w:t
/w:r
/w:p
/w:tc
/w:tr
</#list>

下面是代码

package com.asiainfo.boms.machineroom.action;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.OutputStreamWriter;
import java.io.Writer;
import java.util.Map;

import org.apache.struts2.ServletActionContext;

import freemarker.template.Configuration;
import freemarker.template.Template;
import freemarker.template.TemplateException;
public class DocumentHandler {

private Configuration configuration = null;

public DocumentHandler() {
configuration = new Configuration();
configuration.setDefaultEncoding("utf-8");
}

public Template getTemplate(){
configuration.setClassForTemplateLoading(this.getClass(),
"/com/asiainfo/boms/machineroom/template");
Template t = null;
try {
// test.ftl为要装载的模板
t = configuration.getTemplate("sg.xml");
t.setEncoding("utf-8");
} catch (IOException e) {
e.printStackTrace();
}
return t;
}

public Writer getWriter(String jobId){
// 输出文档路径及名称
String savePath = ServletActionContext.getServletContext().getRealPath("/");
File file = new File(savePath+"upload");
if(!file.exists()){
file.mkdirs();
}
File outFile = new File(savePath+"upload/machine"+jobId+".doc");
Writer out = null;
try {
out = new BufferedWriter(new OutputStreamWriter(
new FileOutputStream(outFile), "utf-8"));
} catch (Exception e1) {
e1.printStackTrace();
}
return out;
}

public void createDoc(Template t,Map dataMap,Writer out) {
try {
t.process(dataMap, out);
out.close();
} catch (TemplateException e) {
e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();
}

}

// private void getData(Map dataMap) {
//
// dataMap.put("title_name", "用户信息");
//
// dataMap.put("user_name", "李四");
//
// dataMap.put("org_name", "微软公司");
//
// dataMap.put("dept_name", "事业部");
//
// }

}

public String personnelImportWord() throws Exception{
String path = ServletActionContext.getServletContext().getRealPath("/");
String jobId = getStringParameter("job_id");
Map paraMap = new HashMap();
Map dataMap = new HashMap();
paraMap.put("jobId", jobId);
DocumentHandler dh = new DocumentHandler();
Template t = dh.getTemplate();
Writer out = dh.getWriter(jobId);
Map queryWFjobObj = .............
dataMap.put("COLUMN_1", queryWFjobObj.get("COLUMN_1"));
dataMap.put("COLUMN_2", queryWFjobObj.get("COLUMN_2"));
dataMap.put("COLUMN_3", queryWFjobObj.get("COLUMN_3"));
dataMap.put("CLOB_1", queryWFjobObj.get("CLOB_1"));
dataMap.put("DATE_1", queryWFjobObj.get("DATE_1"));
dataMap.put("DATE_2", queryWFjobObj.get("DATE_2"));
dataMap.put("COLUMN_4", queryWFjobObj.get("COLUMN_4"));
Map mobileObj = .................
dataMap.put("CALLER", mobileObj.get("CALLER"));
dataMap.put("STARTDATE", mobileObj.get("STARTDATE"));
dataMap.put("MSISDN", mobileObj.get("MSISDN"));
Map machineroomObj = .......................
dataMap.put("CALLER1", machineroomObj.get("CALLER"));
dataMap.put("STARTDATE1", machineroomObj.get("STARTDATE"));
dataMap.put("MSISDN1", machineroomObj.get("MSISDN"));
List personnelView = .........................
dataMap.put("personnelView", personnelView);
dh.createDoc(t, dataMap, out);
fileName = "machine"+jobId+".doc";

return "personnelImportWord";
}

public InputStream getInputStream() throws Exception
{
String path = ServletActionContext.getServletContext().getRealPath("/");
File file = new File(path+"upload");
if(!file.exists()){
file.mkdirs();
}
return new FileInputStream(path+"upload/"+fileName);
}

这个需要了解pdf文档的格式和编码方式。。

这也可以,pdf本身格式没那么规范吧,存 excel可能好些

<%@page language="java" pageEncoding="gb2312" import="java.io.*"%>
<%@page import="java.net.*"%>
<%
URL url = null;
InputStream is = null;
BufferedInputStream bis = null;
URLConnection urlconn = null;
String pdfUrl=request.getParameter("pdf");
//pdfUrl="http://localhost:9003/application/2.pdf";
System.out.print("pdf地址"+pdfUrl);
int buff=0;
response.setContentType("application/pdf");
response.setHeader("Content-disposition", "file=电子发票");
try {
url = new URL(pdfUrl);
urlconn = url.openConnection();
bis = new BufferedInputStream(urlconn.getInputStream());
if(null==bis){
System.out.print("电子发票io流为空");
}
while ((buff=bis.read())!=-1) {
response.getOutputStream().write(buff);
}

} catch (IOException ee) {
ee.printStackTrace();
} finally {
if (is != null) {
is.close();
}
if (bis != null) {
bis.close();
}
}
%>

拿着接好,这段代码可以读取pdf文件,还可以展示在页面,还可以利用浏览器本身插件下载成为pdf文件

编写一个pdf解析器,网上是有开源代码的,记得12年就做了这个事情