QQ登录

只需要一步,快速开始

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

[转帖]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>; L% W% s5 v9 S" f# c1 }% |, W
<><A>1 .用jacob</A>
& s# E" T4 C+ O# F* s其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>$ o, s! G- g8 T# \1 x
<>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>2 h& P. k8 ~* G% e, c- m
<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>
5 f7 K) [) M  Z# |<>+ Z# s, v. n  D. `  ~9 w/ n. I
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">0 Z7 T  C( V4 b8 Y
2 a/ K- v, N" y! F
<TR>" H: k- Q/ @( o! \6 R
<TD><RE><CODE>' l' [  C: P/ v& N1 a4 Q; R8 W
import java.io.File;
, e) R, e8 [; B- Pimport com.jacob.com.*;
) ^) [% v7 a1 R4 ^9 ^% ]import com.jacob.activeX.*;! e8 D6 _" o/ |
/**# n/ M# i7 M: Z# l. R
* <>Title: pdf extraction</P>
% W" F+ X: w& I* @: S4 u% D * <>Description: email:chris@matrix.org.cn</P>
- K/ Y% n- O3 K" } * <>Copyright: Matrix Copyright (c) 2003</P>9 T: c( d; c5 x
* <>Company: Matrix.org.cn</P>( R: F( \0 N% \# m7 n/ [7 v
* @author chris
5 [' e: Y" }( v8 f0 n; g3 r1 y: Y * @version 1.0,who use this example pls remain the declare
! U& w4 M: G, o7 _3 E2 R0 _# o */6 o: o. J! r1 H7 M/ z: O" ~7 Q7 E
public class FileExtracter{: C6 h8 T# A1 B9 ~: u3 n6 N% a
public static void main(String[] args) {
( J5 B" T) T) H4 n  ActiveXComponent component = new ActiveXComponent("Word.Application");
- \- t, s3 G$ L  c# k0 T  String inFile = "c:\\test.doc";
& B2 g# A5 K* M2 p# N0 r String tpFile = "c:\\temp.htm";
  a* a0 L" ]/ \) l- i/ d  String otFile = "c:\\temp.xml";( T# R# S$ w* g; Z4 Z7 [& f8 B( a
  boolean flag = false;$ q9 n- y- m! l8 K9 B7 y+ O
  try {9 {' ]  H2 N- B* C0 x. W# g& B
   component.setProperty("Visible", new Variant(false));
  x% ?% {9 |8 s# K7 s  }# W+ o* ^4 q   Object wordacc = component.getProperty("document.").toDispatch();
9 o7 U) u6 @5 ^4 `+ x  P2 B   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method, . [0 U! d+ v; {3 C
                                     new Object[]{inFile,new Variant(false), new Variant(true)},
% q! y2 [9 Y/ p2 v! O                                     new int[1] ).toDispatch();
) ^4 t2 S- j+ @) u   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);2 j: c, r: W' s/ M1 Y
   Variant f = new Variant(false);
1 j# |7 i: }* |8 F: _  ]   Dispatch.call(wordfile, "Close", f);
- g- U% `  c% S# V* r   flag = true;* C5 W6 k; ?9 H1 V
  } catch (Exception e) {
# F( [. x" l2 `$ Z   e.printStackTrace();
2 h. S. p: a$ ?6 m  } finally {( _; `1 E8 G8 @" p/ H& d
   component.invoke("Quit", new Variant[] {});
  _& Z5 I. \% p) v  }9 W( N( R# _6 m% o
}* G2 b8 m  o$ `( ^, `  f4 W
}
5 J5 a# E& ^' [8 i+ d</CODE></PRE></TD></TR></TABLE></P>9 I8 o. m& v' x0 v1 Q
<><A>2. 用apache的poi来抽取word,excel。</A>
9 N  @0 ^6 j! P6 T% i8 @: ?8 A# gpoi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>
1 Q- C  L3 y( ?7 y. P<>下载经过封装后的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>
" F9 [5 \9 c5 U  n$ {8 D<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>$ R( O/ y1 d2 s8 {2 O* N- |- h
<>
; ?) b: x! a1 Z  t( ~2 E<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
& U. u) A/ c3 k: T0 E
1 A6 |+ x8 V- u7 @7 a<TR>- o/ l1 I6 L& m4 G
<TD><RE><CODE>; T) W9 ~) h$ E3 s# Y
import java.io.*;% j3 e1 t2 |1 g# i; Z* Z/ ?
import  org.textmining.text.extraction.WordExtractor;. b  u1 @: N- k! X* N
/**
& t& B. F1 y  E+ H9 V; Y' u * <>Title: word extraction</P>0 x; [7 J0 T6 j5 }8 C
* <>Description: email:chris@matrix.org.cn</P>' V0 I& ?# J/ S" [- P  o/ D
* <>Copyright: Matrix Copyright (c) 2003</P>
% q: ^* V2 y  r4 k * <>Company: Matrix.org.cn</P>9 A! o( S  O4 Y
* @author chris- C, a; \) |2 C8 b# T
* @version 1.0,who use this example pls remain the declare
0 U$ l. b6 l8 T  {8 m  ]$ C */
1 N7 _  I* _) E2 }
9 k( B1 G2 A* r% npublic class PdfExtractor {
) a- Z3 o* j$ k5 W. f. k9 i# g: ]  public PdfExtractor() {
" v8 K% H. e$ B* b6 D5 j  }
/ i7 J- n5 H% u  public static void main(String args[]) throws Exception' l) I% B- M, q4 V- y7 T1 K- m
  {7 K2 t$ c/ m$ t
  FileInputStream in = new FileInputStream ("c:\\a.doc");
) M3 `; w* w2 R% ^. k$ p  WordExtractor extractor = new WordExtractor();  Z: u. ~+ Z, }1 ]6 @( M
  String str = extractor.extractText(in);, F# i" S/ l" a8 c2 S
  System.out.println("the result length is"+str.length());; Q, U# N4 v4 h/ `& J! w- t
   System.out.println("the result is"+str);& [8 q% T5 V7 H0 {
}4 s0 o" O2 R( ?9 d0 y
}0 ^3 B' |# @9 Q9 K- x0 k
</CODE></PRE></TD></TR></TABLE></P>2 [1 y( s( S  i! X
<><A>3. pdfbox-用来抽取pdf文件</A>
6 x7 U5 v' {8 E& v/ w4 J但是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>
' @0 q7 B* J+ K: W$ l) F5 g<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>6 d, @1 j* s' z. I/ R* f
<>
; q; W) E7 w* Q. n; P: P. f<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">/ y  e9 t: m( D+ N  Q" ]
  q) I: @. J' J4 W6 Q7 j
<TR>
1 m! W! t8 n; s9 I2 j<TD><RE><CODE>
+ I! m' F' s% F' F5 iimport org.pdfbox.pdmodel.PDdocument.2 f& h; ?7 j3 o
import org.pdfbox.pdfparser.PDFParser;
+ Q7 v6 b; o5 c! z- Iimport java.io.*;
6 T- t4 s; Y% F+ @) q0 d; t& simport org.pdfbox.util.PDFTextStripper;1 f8 P' i. g3 t" O1 w' i
import java.util.Date;0 v9 [) v! |  E( F# \
/**
; c9 |0 e$ K& E# S( J, o4 B * <>Title: pdf extraction</P>9 o3 j6 D+ t8 |0 t$ c) X# q
* <>Description: email:chris@matrix.org.cn</P>
- b8 T& O. C$ S * <>Copyright: Matrix Copyright (c) 2003</P>
! r$ h  g" @1 b3 I- l& u; \ * <>Company: Matrix.org.cn</P>3 p! }( L% i% U0 t- j
* @author chris
6 V+ h0 {1 f  `" [2 _6 F * @version 1.0,who use this example pls remain the declare
" E5 `3 N+ a. a: F, b4 h */4 p% z$ b6 c8 o* X3 z; C

. p8 |0 {" W, t( dpublic class PdfExtracter{0 Z7 k) B& L. L3 B2 r' |5 x

0 i/ u$ i, {3 z- w. dpublic PdfExtracter(){
% Q4 Q) Y. V+ Y; P  }
, k  `; Z/ j" D2 opublic String GetTextFromPdf(String filename) throws Exception
# @  A. q6 R+ F3 a9 p  {
8 Q9 z# i% p5 g" K( x8 {  String temp=null;5 q# S# {! _+ c
  PDdocument.nbsppdfdocument.null;( C* x# T6 p. S: h. ~
  FileInputStream is=new FileInputStream(filename);
! A$ y3 s" u- z5 }( |  PDFParser parser = new PDFParser( is );+ n2 M! t9 I5 D* s. q4 s' z
  parser.parse();
, W9 ~( T5 `9 a* f5 H  pdfdocument.nbsp= parser.getPDdocument.);# C  e, `  P, v0 i0 f
  ByteArrayOutputStream out = new ByteArrayOutputStream();, K6 q) O+ l9 F! \3 z, D
  OutputStreamWriter writer = new OutputStreamWriter( out );0 f3 d3 M- P+ G. H7 j1 G3 C
  PDFTextStripper stripper = new PDFTextStripper();
2 ^. ?" }: e  ~! V' F/ L  stripper.writeText(pdfdocument.getdocument.), writer );8 d, ]3 O" Q) G* k
  writer.close();
9 f* D2 X$ q* J8 T  byte[] contents = out.toByteArray();
) s0 h5 L7 P3 c+ a; }, O1 B
9 ]# M& ]: J% y1 B, Q3 `  String ts=new String(contents);
* c) e' \0 Y- w7 V  System.out.println("the string length is"+contents.length+"\n");
1 b# H6 ~6 Q& c% a8 b  return ts;$ ?) C/ U' {' c$ Y
}0 z1 ?0 I. ^7 E4 J5 g/ u
public static void main(String args[])
6 o6 z8 o" }8 o$ w7 D: f& e{" {  ^5 X4 c0 W: a" H& l0 q
PdfExtracter pf=new PdfExtracter();2 A" z  V3 B* w# M0 M
PDdocument.nbsppdfdocument.nbsp= null;
$ r! e  G1 @  J
2 R3 s0 O6 R2 D* M8 e% etry{) D; ~% D) }2 x3 W, o
String ts=pf.GetTextFromPdf("c:\\a.pdf");
; n6 `6 e9 s! D! t; w( lSystem.out.println(ts);
( p5 C0 U4 q& h  H}4 R  f$ o! r0 E" x) f3 e. F
catch(Exception e)8 ?! _/ [% j2 [, P* ~9 \$ V
  {; ?8 @0 P; f( c
  e.printStackTrace();
; v6 n1 t* K$ t% C( S  C/ H& P  }
+ l' u6 b$ w+ T2 g* d- D- u! f}
( m% ?/ H- I$ x8 u! v5 T0 v* }* V% `# e3 D5 v4 a
}
% z2 @9 h, d( e</CODE></PRE></TD></TR></TABLE></P>9 g& v. w! }5 ^' y8 S
<><A>4. 抽取支持中文的pdf文件-xpdf</A>: v% E8 J1 g$ a; }% y
xpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P>, D6 E8 Y- X" d' u
<>下载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>
9 K  M! @2 t8 S<>同时需要下载支持中文的补丁包: <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>5 R7 q1 b0 X, g( _) u
<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>
: k3 N' v6 `& [% g7 l9 W<P>下面是一个如何调用的例子: </P>
' f. \! _( u( I<P>/ U7 N0 V: a# J4 w
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">8 I! Y: s' }. V" @- c
$ I2 W* y4 X! t7 b5 f' O' k' P
<TR>, U$ _9 f- m( m. K% |- Q  P
<TD><PRE><CODE>
' P2 n* T$ U2 C. S" e! |, {& Z2 b' |% Pimport java.io.*;7 h+ J8 g$ t6 z( B" j
/**
. _4 ^3 T$ ]8 o1 ~ * <P>Title: pdf extraction</P>* r, S. K# L" B, u+ `( M& h4 g5 c
* <P>Description: email:chris@matrix.org.cn</P>/ R5 @' a: v. F  {& [
* <P>Copyright: Matrix Copyright (c) 2003</P>
, I' K+ e5 q- O& G * <P>Company: Matrix.org.cn</P>
1 k) t8 ]2 r$ I8 m% O6 W * @author chris
; i9 L1 i- q" }8 g( `8 B * @version 1.0,who use this example pls remain the declare. ]. V* F3 b8 ~( p. \: D" H! y
*/
9 n. \6 g# I4 G5 G; p  Z! b
- Z* O, K; H5 `) R& a4 F1 H
+ k# u- U' [1 t! a2 N. o, ~public class PdfWin {
! m& l' W/ x% @% _6 u# N( j  public PdfWin() {
. e3 l  E9 j; M* g, f, Z  }
. _* L3 S' @2 P3 P1 ?3 E  public static void main(String args[]) throws Exception% x6 w1 [8 |3 j) i8 c
  {
4 m+ K0 V& z7 H) u! Y9 L( y    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";, t, ~. X* C; l. D
    String filename="c:\\a.pdf";
! \% R; `) O. G    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};
1 f4 _# h5 Y/ P7 {, k    Process p = Runtime.getRuntime().exec(cmd);3 V2 |# V0 h; G9 j  M; }" S, N
    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());+ A3 ~2 f0 C0 H8 o7 h" ?) {& y
    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");; ?, d, h3 B+ v
    StringWriter out = new StringWriter();
) e# W8 r9 r- [8 l% n# c# I    char [] buf = new char[10000];! m6 \! Q0 X; e: S4 K
    int len;  |, g% O/ o- ^& B
    while((len = reader.read(buf))&gt;= 0) {' z5 Y% x! Z9 D& j8 q! z8 [3 G( Y
    //out.write(buf, 0, len);) Y& W0 E6 |! {% f; b5 E- W( l
    System.out.println("the length is"+len);, a$ `/ `. C0 K# |' N
    }( ?' c  O6 y9 P* ^1 M) c
    reader.close();$ k9 }+ j9 D7 v' Y
    String ts=new String(buf);+ v$ t* i$ S: r; G* X+ y
    System.out.println("the str is"+ts);
- H$ y5 A" S+ K( l5 T' `  }; j$ F. O+ V- t0 J! ?
}9 B0 v# z4 c3 v8 v& f
</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

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-21 15:07 , Processed in 0.369659 second(s), 56 queries .

    回顶部