QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4340|回复: 2
打印 上一主题 下一主题

[转帖]java抽取word,pdf的四种武器

[复制链接]
字体大小: 正常 放大
god        

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
1#
发表于 2005-3-31 01:15 |只看该作者 |倒序浏览
|招呼Ta 关注Ta
<BLOCKQUOTE>很多人用java进行文档操作时经常会遇到一个问题,就是如何获得word,excel,pdf等文档的内容?我研究了一下,在这里总结一下抽取word,pdf的几种方法。</BLOCKQUOTE>& c, M. H8 V% S0 @
<><A>1 .用jacob</A>+ I8 l$ B7 Q7 [( v7 V6 h6 ?' ?/ u
其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P># X' K% m6 i$ k+ [
<>jacob jar与dll文件下载: <a href="http://www.matrix.org.cn/down_view.asp?id=13" target="_blank" >http://www.matrix.org.cn/down_view.asp?id=13</A> </P>
! _& N. p/ [2 `* l<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>
- u* s, j. n* d8 b<>
0 j! {1 b7 I6 W<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">
1 w" e0 w8 }/ H, O; M, c# v
, ^/ i& G* e5 x! }<TR>
9 h, j& _$ }" g9 j% }9 X6 {<TD><RE><CODE>; Z# N' `& A+ k  d0 u
import java.io.File;
' O3 J4 I; f3 Y3 J  F" J9 uimport com.jacob.com.*;
" y4 B9 H4 a, f4 P# V. F% K2 {" \import com.jacob.activeX.*;
6 H1 ^+ m) x' o/**
8 p' @9 g5 N6 S" E" ^% k. n! K * <>Title: pdf extraction</P>
8 O) ~  ~" H# D3 U  ] * <>Description: email:chris@matrix.org.cn</P>
6 m/ u! {# E) `. {* u * <>Copyright: Matrix Copyright (c) 2003</P>
- M9 g1 x( F6 w/ g: A# S * <>Company: Matrix.org.cn</P>$ j0 e- o7 T, P9 Z- l" o$ }) _1 W
* @author chris' n1 `- v) W5 b" l4 _  f
* @version 1.0,who use this example pls remain the declare
% `8 y6 n3 Q5 R; i. t% y: l/ h */
! H' y% ^1 Y- _8 q, }! ^/ ipublic class FileExtracter{
" B! u# f8 L/ _  {' D1 ?6 [1 B0 E* O public static void main(String[] args) {) h2 }- p/ k! m3 z
  ActiveXComponent component = new ActiveXComponent("Word.Application");' C+ k' r% u' ?+ B- ?
  String inFile = "c:\\test.doc";
+ V" d6 P5 [: L0 S; B) [ String tpFile = "c:\\temp.htm";2 x0 W) A: f& N* ?( i
  String otFile = "c:\\temp.xml";7 o0 |/ E/ @5 Z  C/ _9 f; _; V
  boolean flag = false;
7 W9 d, P7 m: d: [( z# H  try {. C* O% v$ j, w- }' ~4 U( _! F
   component.setProperty("Visible", new Variant(false));2 |: ~* T: V. E: D( i7 M3 J
   Object wordacc = component.getProperty("document.").toDispatch();
" A* I+ t. e, ]5 j5 G   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method, , j) X' M3 L8 v" \# r
                                     new Object[]{inFile,new Variant(false), new Variant(true)},
7 P, J4 T6 F, Z$ A4 `1 _/ I                                     new int[1] ).toDispatch();
9 U+ l! g& [8 Y1 }   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);
: O% o9 d' w: L+ X" P; B; l   Variant f = new Variant(false);
# C- n% O) G* G8 B4 P   Dispatch.call(wordfile, "Close", f);
: X, t, }/ k8 ?   flag = true;
5 M0 k8 m# E% p% p+ p  } catch (Exception e) {! x. O# R6 m1 I+ e2 U9 z
   e.printStackTrace();- V. c6 z0 y. \8 Z+ B. R% m$ L
  } finally {
, ]' s( ]0 D4 m0 J  Y2 Q6 N   component.invoke("Quit", new Variant[] {});
& M( C) R3 s' Q  }2 ~4 Z; X, L  O8 N# t4 f7 M
}% m" Y1 E% |# f% Q
}
# `0 f* Q6 w; B' h7 p</CODE></PRE></TD></TR></TABLE></P>
8 L' d2 X6 {+ C( S+ l<><A>2. 用apache的poi来抽取word,excel。</A>
) u, Z4 i! z$ g9 N' Vpoi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>0 s: k4 E  ~5 t
<>下载经过封装后的poi包: <a href="http://www.matrix.org.cn/down_view.asp?id=14" target="_blank" >http://www.matrix.org.cn/down_view.asp?id=14</A> </P>7 u' T- y1 [5 V' m
<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>
* Q6 K$ b1 `) }' v1 M! O4 T<>
* U7 Q: D! g$ E+ ~% S( K$ D. D<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
0 W% l$ P% w  `' ~1 ?- _! R
! A- {  t2 `9 M' u" G% V<TR>- C. r. x5 j5 |( o3 d7 V5 N
<TD><RE><CODE>1 E& E) M5 O' `
import java.io.*;
( H8 Q( ]1 y; E3 _( }- j7 \. `import  org.textmining.text.extraction.WordExtractor;& F5 n0 P& ]* [  ~
/*** L7 z3 a+ a) m: \7 }* w% P# Q  Z7 |0 G
* <>Title: word extraction</P>: R: B1 F8 y3 B9 e
* <>Description: email:chris@matrix.org.cn</P>4 R* h8 P" g6 W' W, Z# _- L/ z
* <>Copyright: Matrix Copyright (c) 2003</P>
/ ], N3 @- \( K4 Y * <>Company: Matrix.org.cn</P>
* `& w/ s8 q$ _3 o, l" \. s$ I * @author chris  G$ V7 H8 z/ E# P3 ~2 m* Z
* @version 1.0,who use this example pls remain the declare5 u9 H1 {* l2 \4 |* ~6 _; D
*/
9 `: O( v, ~1 U# i& i8 P- A! E1 h/ C# [7 @* v/ T$ \7 q
public class PdfExtractor {0 n7 l# K7 G6 D" p, R& M# L+ C  K
  public PdfExtractor() {
6 W9 p  N# \$ A/ T  }2 W6 P* s% w; L, d7 X$ I( B2 P4 e
  public static void main(String args[]) throws Exception
) d8 o2 l# g/ c; W, z6 E: `. {  {/ I8 N. b2 L$ ^: V/ Y$ s3 e
  FileInputStream in = new FileInputStream ("c:\\a.doc");, Y- K/ w- y9 l3 n/ \
  WordExtractor extractor = new WordExtractor();; O# I+ z" t/ z8 \+ O6 L6 E
  String str = extractor.extractText(in);. q; e+ {; k- U
  System.out.println("the result length is"+str.length());9 \' n" o' |* @* U5 p4 c' F
   System.out.println("the result is"+str);
! W- C& L5 u" H* h}
( j  g6 }6 q! `' ~) ~6 W& [% g2 ]}, M$ {1 T; L& y  i
</CODE></PRE></TD></TR></TABLE></P>, V8 [8 O! U" ?! F; t2 P
<><A>3. pdfbox-用来抽取pdf文件</A>5 q1 f  @- Q4 O+ }0 i
但是pdfbox对中文支持还不好,先下载pdfbox: <a href="http://www.matrix.org.cn/down_view.asp?id=12" target="_blank" >http://www.matrix.org.cn/down_view.asp?id=12</A> </P>8 O% W! N* L0 ^3 n; d. o
<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>7 e  ^9 y7 F2 r! E2 a& }2 e% [
<>; K1 \% I6 J, O* O/ @- T) ], _
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
2 u9 S, _# n  o; F  N7 p2 z/ v) O8 i: R6 H* X: I
<TR>
6 M: Q$ f. [  L+ @8 S6 }; C/ k<TD><RE><CODE>
% {5 D5 [! l% p, A) G6 r0 U: mimport org.pdfbox.pdmodel.PDdocument.
* Q! g+ Y5 ?$ K6 \; V7 C: o: z+ bimport org.pdfbox.pdfparser.PDFParser;
  u- k, e( d* G+ Y# s7 timport java.io.*;0 U) v* E  D0 D' Z
import org.pdfbox.util.PDFTextStripper;
& g& @! ~; a& J* g! Ximport java.util.Date;% L4 P$ y" L% c# Z4 |* r8 G
/**
' w9 `6 }% h5 O) {+ l * <>Title: pdf extraction</P>; b5 b0 w, F' a5 D5 b+ L1 c
* <>Description: email:chris@matrix.org.cn</P>1 K, l/ L: ?( q/ Z  U, G- }
* <>Copyright: Matrix Copyright (c) 2003</P>( Z: D# I2 Q! l4 e6 m. K2 U, m
* <>Company: Matrix.org.cn</P>
# H% J0 ?# i! h8 V8 r! A" \ * @author chris
8 ~1 t# w3 h( }! h8 n% E3 Y% u * @version 1.0,who use this example pls remain the declare
- P) ^4 N4 X/ b5 t* f( W */
5 k+ L. t( f1 G, r6 g* M. b% l
. [, b( j$ i  }/ f4 Z) Rpublic class PdfExtracter{5 Z2 v+ Q* S+ i

: q" z% V& I. c/ Npublic PdfExtracter(){
- ?3 H1 H' m1 X$ {  }
+ U& N& D) L6 {; Ipublic String GetTextFromPdf(String filename) throws Exception
7 o/ x: b- q1 P3 O" G  {
- ~8 n) z6 q2 Y* v6 ]% X  String temp=null;
1 C. c4 t6 @5 n4 X- u- D  PDdocument.nbsppdfdocument.null;
! x6 M+ U5 I& h0 ~: w  FileInputStream is=new FileInputStream(filename);6 f% u' `( d/ s7 i4 m  E
  PDFParser parser = new PDFParser( is );0 J2 i* i. T# K: S3 d# F3 l
  parser.parse();5 b3 S$ z! L' D" g# }
  pdfdocument.nbsp= parser.getPDdocument.);
: d5 _( L; N. }# x( J7 D7 Z  ByteArrayOutputStream out = new ByteArrayOutputStream();
, j1 \; ?" D$ `$ B* s8 ?7 c$ }  OutputStreamWriter writer = new OutputStreamWriter( out );: i2 t7 Z. n$ o! m
  PDFTextStripper stripper = new PDFTextStripper();8 q: C' j, }. }# f! G
  stripper.writeText(pdfdocument.getdocument.), writer );
7 W7 o' u/ i; h+ ^- K8 u  writer.close();8 {1 m) E" E, r
  byte[] contents = out.toByteArray();
8 {% P& u1 Q  H- q) q6 c
( U0 a2 ]( P( L9 l) L) x  String ts=new String(contents);& K2 O0 G0 C2 _. R1 Y. Y. j4 }
  System.out.println("the string length is"+contents.length+"\n");* ?+ T( |& I5 Y" C
  return ts;1 g$ r8 q' F5 P* C- Z& \; J2 ]' [
}
: v8 }1 M9 B& b- ^# \7 ?) e& Apublic static void main(String args[])
5 V, D0 L& D3 ^' Y6 X; }{* m5 u, u! V/ ~0 q0 r  H9 _- o* B
PdfExtracter pf=new PdfExtracter();. f* e# q& X9 h* D. P
PDdocument.nbsppdfdocument.nbsp= null;
4 j0 e( f$ {, s- u5 c- T  f+ v" c; N4 E( C( ]$ B; l" Y4 z" x
try{3 `: j5 O7 R! ^* x) J
String ts=pf.GetTextFromPdf("c:\\a.pdf");
& ~6 |7 a2 x; q- B; gSystem.out.println(ts);
5 b( D0 P, t  y" ]0 i}* ~  V% b: ~/ X6 r
catch(Exception e)! w3 j( c  G+ @" P% ~' ^: ^2 X
  {- `. R; C: |# f, `5 x# B9 x2 X
  e.printStackTrace();
3 c% O8 ?3 s; n  }
1 z- H  j# a4 I3 ~( W% s4 |: e}
1 v$ B- H0 g7 E8 B7 f7 _; \9 G  J
8 b8 G: ^3 U. W1 n4 s4 V}
6 q. d5 X2 K1 r</CODE></PRE></TD></TR></TABLE></P>+ d1 R; {0 U$ w, c* e& x) p
<><A>4. 抽取支持中文的pdf文件-xpdf</A>
9 y+ s+ g+ G: e) ]  ^xpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P># A8 @8 z% z) i. S5 g
<>下载xpdf函数包: <a href="http://www.matrix.org.cn/down_view.asp?id=15" target="_blank" >http://www.matrix.org.cn/down_view.asp?id=15</A> </P>' `6 S4 n7 D% S2 |$ I
<>同时需要下载支持中文的补丁包: <a href="http://www.matrix.org.cn/down_view.asp?id=16" target="_blank" >http://www.matrix.org.cn/down_view.asp?id=16</A> </P>. {. n( H- T9 S+ z
<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>
+ y) e" a4 u8 x. d" p4 h' d4 z<P>下面是一个如何调用的例子: </P>% t, p3 O& i7 H
<P>
; z7 u$ ]* P) ]1 k# H<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">* B4 R" e, N. _$ F/ f
" M3 P( ?" e  Y6 q- |  a' o
<TR>2 W" Z7 [7 \9 u- r! i1 j
<TD><PRE><CODE>
! _0 `: F% G( t, `import java.io.*;
4 [3 y' j! v- k- z5 W& r( q/**  T9 i. D& \: o1 J6 I7 u+ o7 ^
* <P>Title: pdf extraction</P>6 j: ?5 Z. x; @3 h. I! O9 `
* <P>Description: email:chris@matrix.org.cn</P>  G5 Y4 Q. i- u( q, Q
* <P>Copyright: Matrix Copyright (c) 2003</P>" }- |; E/ v1 k$ {- B0 i8 ~
* <P>Company: Matrix.org.cn</P>9 o9 w+ c" B0 f2 t' I* l9 x
* @author chris
- L/ S* p& r! d' Z" ^5 ^ * @version 1.0,who use this example pls remain the declare% y) `5 c) [# U) j
*/& q$ K0 R8 }7 q$ G- p

: F* X, Z3 J9 f; W2 |$ E$ W0 }0 h
/ d* Z2 m# S# G7 p) H8 a2 _& E0 Jpublic class PdfWin {
6 A- C& |7 q- p$ o% F8 v. i, m# S  public PdfWin() {! z( C/ S3 G, }  \5 u3 W
  }
) O1 p* M9 b( }) ?2 D3 X  public static void main(String args[]) throws Exception: G) q, K" L! z: F: T9 @& U
  {
, v- [5 _0 b( G! X0 O2 ^    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";8 U- [+ e4 ?& @4 w. O
    String filename="c:\\a.pdf";
( W3 R8 F  B% p9 U+ s: T    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};
- j0 @2 y0 r& b5 Z    Process p = Runtime.getRuntime().exec(cmd);& W8 G2 r7 N* f2 K( z) q" t5 A0 V
    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());  J7 o0 C% q+ F
    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");) L# f! Y/ P; h
    StringWriter out = new StringWriter();, z" W& Z+ ?& M0 k( t3 p% f
    char [] buf = new char[10000];4 R0 N( {, q& \0 Z
    int len;
3 r5 j: {9 R6 z8 Q6 M    while((len = reader.read(buf))&gt;= 0) {5 h9 U) `" S5 v. a4 z
    //out.write(buf, 0, len);0 x% O: `( k/ U
    System.out.println("the length is"+len);
2 W6 a# d4 f; F! _- n+ b. j- t1 }    }
" G' q3 K' s8 D6 J/ V    reader.close();# f. z8 m* F! d4 k
    String ts=new String(buf);9 r; d- G' j9 V6 B. h$ s
    System.out.println("the str is"+ts);
: x- l% [& n% [6 ]  }) V  y3 b/ Q# J/ w/ l+ Y7 Y$ ^6 t
}& Z: z) l5 x) Z! ~# F4 ~
</CODE></PRE></TD></TR></TABLE></P><!-- RESOURCES--><!-- AUTHOR BIOS--><!-- Make author heading singular or plural as needed-->
zan
转播转播0 分享淘帖0 分享分享1 收藏收藏0 支持支持0 反对反对0 微信微信
如果我没给你翅膀,你要学会用理想去飞翔!!!
39133120 实名认证       

10

主题

4

听众

1045

积分

  • TA的每日心情
    开心
    2014-9-6 09:56
  • 签到天数: 209 天

    [LV.7]常住居民III

    自我介绍
    希望和大家交流学习!

    群组: 小草的客厅

    群组: 数学专业考研加油站

    群组: 数学建摸协会

    群组: 数学建模培训课堂2

    回复

    使用道具 举报

    3#
    无效楼层,该帖已经被删除
    您需要登录后才可以回帖 登录 | 注册地址

    fastpost qq
    收缩
    • 电话咨询

    • 04714969085

    关于我们| 联系我们| 诚征英才| 对外合作| 产品服务| QQ

    手机版|Archiver| |繁體中文 手机客户端  

    蒙公网安备 15010502000194号

    Powered by Discuz! X2.5   © 2001-2013 数学建模网-数学中国 ( 蒙ICP备14002410号-3 蒙BBS备-0002号 )     论坛法律顾问:王兆丰

    GMT+8, 2026-11-1 12:47 , Processed in 0.558899 second(s), 63 queries .

    回顶部