QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4228|回复: 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>
/ f' H! |7 g0 H5 F0 g  j8 y# N9 ]<><A>1 .用jacob</A>
2 L. X1 L' _& s1 j* I- Z其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>) g: G, m, ?; J+ r2 n9 m
<>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>
$ d4 P1 N* s% C1 S& R. w; E( c' \<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>7 w1 W5 b# y* F, b
<>0 M" F( M6 V9 A. H2 x
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">3 G3 r- B6 h: L1 U

# M9 e: u. e5 D2 a<TR>. h( U& I( R8 `( K
<TD><RE><CODE>
  Z' T* T0 D( F* j0 z* Dimport java.io.File;
5 v2 i8 i9 ~* J4 k5 nimport com.jacob.com.*;0 Y0 a  w! _# p5 X
import com.jacob.activeX.*;
* u4 k  ^1 K+ Z/**+ o+ ^8 x: W( f6 x2 e- S
* <>Title: pdf extraction</P>& {6 l/ u6 e4 A- r
* <>Description: email:chris@matrix.org.cn</P>9 j+ E9 C9 D/ r4 z. G
* <>Copyright: Matrix Copyright (c) 2003</P>
8 N: {9 N# I# p+ z# n * <>Company: Matrix.org.cn</P>
+ v- l" Z. N) T% F( o1 _$ h& ? * @author chris
5 k3 E' U4 X. p6 [" ? * @version 1.0,who use this example pls remain the declare
' d+ z6 r: j2 x */2 m. d, L; G9 _$ N
public class FileExtracter{, u+ l$ e: [* H4 z5 E" I: D
public static void main(String[] args) {
4 S3 F4 h2 t7 w* W; B" L6 o% l: ]& H  ActiveXComponent component = new ActiveXComponent("Word.Application");5 v/ J* `) R& f) w( W7 d$ n
  String inFile = "c:\\test.doc";
/ v+ I  x# U0 M- B0 t( X String tpFile = "c:\\temp.htm";
( U' ~9 z/ t/ d8 {! D: a$ [  String otFile = "c:\\temp.xml";" ]* e/ _$ D4 d$ V9 P9 U7 X7 Z
  boolean flag = false;
) X" u; a' i6 I$ u3 f+ s4 ?3 o  try {
6 b- f6 w  Q: Z   component.setProperty("Visible", new Variant(false));% }0 N& \2 C+ P
   Object wordacc = component.getProperty("document.").toDispatch();+ R2 p- K5 L0 T+ N$ P- X* H
   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method,
3 C5 s. J* S1 o3 E# C                                     new Object[]{inFile,new Variant(false), new Variant(true)},
' ?9 G* w9 [6 e1 j; D                                     new int[1] ).toDispatch();
1 w  Y: V1 ]8 Z" }3 d4 _, P9 O+ d   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);! L  u+ N6 d/ v7 w) Y
   Variant f = new Variant(false);& I4 m7 u& b8 q
   Dispatch.call(wordfile, "Close", f);
7 t! F3 P, o& z* Y  S0 D2 U( i   flag = true;: K0 s( ]  F( |9 j0 p
  } catch (Exception e) {$ ]& L& O  ~( y- H, D
   e.printStackTrace();; ^9 s$ g2 W3 z' h9 j0 v8 Y
  } finally {
8 F5 R2 E2 |/ i$ m! H# d: R* w   component.invoke("Quit", new Variant[] {});7 y5 [0 E( `; d5 q8 A( ~
  }4 q; m/ ~6 F* f, g
}
/ a2 v9 N( a  `3 ?2 [: I9 j}
7 a" u5 i1 v9 u: }</CODE></PRE></TD></TR></TABLE></P>- y( u! Z# G  h, {# N" O- e
<><A>2. 用apache的poi来抽取word,excel。</A>" D" A- A) G1 W+ |! s8 q
poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>/ y6 B8 m2 H3 f
<>下载经过封装后的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>
! C8 c; I. M6 f, s<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>
+ s1 |7 M2 v! y8 r" ^<>0 l! W: ~8 o- d( I: s: g) Z
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
+ d+ o2 w9 J1 t+ @1 W( b, u; l! M+ \* a- F! L+ l$ \9 S
<TR>
5 M, k' Z6 s, |9 l/ G<TD><RE><CODE>
1 T, h; ^7 d# F1 f' \" F5 _! A  T* R$ Bimport java.io.*;8 ~/ M5 _6 g% k4 Y
import  org.textmining.text.extraction.WordExtractor;
: O- n$ t/ U6 s" [8 D2 [/**6 V2 {2 P; e5 u
* <>Title: word extraction</P>7 H; M; @% W7 l; V/ J
* <>Description: email:chris@matrix.org.cn</P>$ u& W$ G# i0 H! ?2 j( ?
* <>Copyright: Matrix Copyright (c) 2003</P>* K) I5 K1 f* {2 b0 |/ z2 d
* <>Company: Matrix.org.cn</P>
: i! z& L2 a- h8 S' g. c* I$ @) d * @author chris
; T* V8 k5 w+ D! g% o8 v( F: M * @version 1.0,who use this example pls remain the declare
- o" u% [' s) D2 Q) l) e */
0 E& n3 B0 d0 Y; r6 I! ^0 S' r2 I/ V$ d
public class PdfExtractor {2 S* e( R8 ~( m' _' q8 ]( s9 h- j; ]
  public PdfExtractor() {
& n) B. n: T  W3 R  }
4 d, Y0 N, l  M; B# i- H  public static void main(String args[]) throws Exception# Y- E# t. L% ]
  {
9 I% P$ t& B) o3 y+ j, K, l  O, j  FileInputStream in = new FileInputStream ("c:\\a.doc");
( ^* b: m) j0 [  WordExtractor extractor = new WordExtractor();$ M" R( L1 b. R! q2 y; @
  String str = extractor.extractText(in);; }- C. ?# S* O/ k: j' g
  System.out.println("the result length is"+str.length());
% V9 Y6 `8 G$ k5 F$ J, O# c; Y   System.out.println("the result is"+str);3 z/ P/ u! y. B0 Y+ {/ |- B
}2 q* i4 T- |" g" g- o  ]" e2 Q
}
0 T% [  A! T9 f6 I+ Q0 V% i</CODE></PRE></TD></TR></TABLE></P>1 N8 C! n7 i3 R  |: y
<><A>3. pdfbox-用来抽取pdf文件</A>4 ?) T' K/ x: a* ^' R6 H9 J$ k
但是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>
; s% [4 ~; _& u& l* y4 S* \2 C/ k: e! T- I' X<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>3 h5 ]1 [7 n! E
<>
3 Y" Q: y  L/ A. N6 `6 ~. ?<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">3 Y) k, S" R5 }/ B

% T5 J( o" f! J' w5 I- |3 }3 n8 g<TR># m' s, V* O/ t, \* }+ h
<TD><RE><CODE>
$ R  M' U$ @# ~; B8 {import org.pdfbox.pdmodel.PDdocument.: K8 J) i5 d  Y# v% D  d3 a
import org.pdfbox.pdfparser.PDFParser;9 U. F! \5 o3 B. z* n' G) w
import java.io.*;- ~% F1 n6 m1 G* P( f
import org.pdfbox.util.PDFTextStripper;% ?$ J- y5 e( X8 }: ^4 K# Q' i
import java.util.Date;
. a- m# ?3 ]: N/ O1 O- _' F& q/**
5 v' ~  L+ K  e  N2 |, p" W * <>Title: pdf extraction</P>! l# e' u3 a' U  @& w1 V) A
* <>Description: email:chris@matrix.org.cn</P>2 B! u7 L0 }( E$ k: s: R0 V5 ~
* <>Copyright: Matrix Copyright (c) 2003</P>
7 W/ |$ l2 P+ B( O: U9 ^ * <>Company: Matrix.org.cn</P>
' w0 M: H1 e6 @" q$ Y; d * @author chris
. W+ e- i* D6 G * @version 1.0,who use this example pls remain the declare5 i/ g) ?, N" ?3 G7 B# C, O) H$ q2 N
*/
/ b3 [! i$ ]) p! E/ j2 j- O- G9 _  h# y) f5 v
public class PdfExtracter{
) S, k0 c2 ]7 q" l8 k9 q& n8 V8 u6 Y, T9 h/ a
public PdfExtracter(){
) C* b$ f! B0 S# ]6 [  }9 t9 M. `& x2 e2 a
public String GetTextFromPdf(String filename) throws Exception
' o  J; Z, I3 L& s" r1 G  {
, j% @( a0 j! D2 {7 {4 C5 r  String temp=null;$ {& ?" T: r. ^: p
  PDdocument.nbsppdfdocument.null;9 z' F- Z( @' _2 i( y+ E8 p
  FileInputStream is=new FileInputStream(filename);% W3 e% g/ f- S4 f2 J1 C5 a
  PDFParser parser = new PDFParser( is );8 h0 H% _0 w: c( x( {/ Z  W* K/ o
  parser.parse();
! W4 V: O% h( G' @- s3 x  pdfdocument.nbsp= parser.getPDdocument.);
5 a: e. B4 Y3 Y) N& M) I0 m7 M( h" G  ByteArrayOutputStream out = new ByteArrayOutputStream();
! n& l' T' a9 j7 J  OutputStreamWriter writer = new OutputStreamWriter( out );
7 m: ~6 z: v  D7 c  PDFTextStripper stripper = new PDFTextStripper();
6 h' C9 O: H  l  ^  stripper.writeText(pdfdocument.getdocument.), writer );/ |. T/ ~6 b) z2 J1 Y( Y
  writer.close();
" m8 g; Z0 u* v; @( a) n  byte[] contents = out.toByteArray();
+ U6 d: T8 s, l2 \6 v# ~4 ?% h; D2 q! }
  String ts=new String(contents);
/ [2 y7 |  ^/ l, H  System.out.println("the string length is"+contents.length+"\n");" M/ |* g9 P1 X3 }
  return ts;5 O9 x9 Y/ f* w5 _. n
}
4 a2 e/ Y( ?7 ?9 Ppublic static void main(String args[])
+ b! d+ K4 L9 A6 [. p: H{7 M  ?/ a# S; e& i8 P6 x: }
PdfExtracter pf=new PdfExtracter();
6 \* E, f/ V' P) LPDdocument.nbsppdfdocument.nbsp= null;( U1 X& S: r# ~! ^
' q. Z7 g/ o- ^: |8 x# F
try{
$ ]- ]  G' w' w: @9 U( H0 G1 WString ts=pf.GetTextFromPdf("c:\\a.pdf");$ T! g- n; I+ Q& |/ C# P% t* P0 O
System.out.println(ts);
& F3 o7 T7 ~1 {' {' O% j}! i6 `! V: J6 n# _9 b, P
catch(Exception e)4 L- F: o$ Y' z8 G
  {
6 F) P, R! n/ n1 M. r- `  e.printStackTrace();
2 t1 ]. G; g8 e5 M9 k7 d" Y9 z' N  }6 |; w/ q" E* A2 {; L8 g
}
  @4 c. A6 ]2 d$ y
/ m. s4 v  [/ R& ~}
5 A3 ^/ g- T7 u% E</CODE></PRE></TD></TR></TABLE></P>
& n3 T2 Y3 K0 x) L<><A>4. 抽取支持中文的pdf文件-xpdf</A>: M! O0 M& J8 b4 ]) r/ J
xpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P>9 h. K1 t% G+ I; S
<>下载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>
8 c7 Q) q& i. j+ A/ {+ j8 @6 e<>同时需要下载支持中文的补丁包: <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>
- d& T0 {, t; a<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>
" w4 i( u2 K; A2 _6 T4 l<P>下面是一个如何调用的例子: </P>8 z2 L1 w8 \0 r* _
<P>
8 c- d0 {: L; V! g<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
) k5 j2 y7 Q. i& E' c
/ ~: Y5 j2 e  M. D; {" T% y5 o<TR>
5 p; w; K* z8 i5 a* F6 }<TD><PRE><CODE>% ]$ T& H0 f' J; t, e. [# S8 W
import java.io.*;
/ }! h9 A/ |/ a0 x( x/**
8 E- h! o. W. M& ] * <P>Title: pdf extraction</P>4 M' \9 O9 z. H
* <P>Description: email:chris@matrix.org.cn</P>
/ s; C* i9 \4 c- l+ ^ * <P>Copyright: Matrix Copyright (c) 2003</P>
+ A5 g* w* c3 S  Q7 d+ T * <P>Company: Matrix.org.cn</P>
* {) Q9 L* C; G9 v! b * @author chris$ y  n$ }/ K" U
* @version 1.0,who use this example pls remain the declare, s( I+ f( Q4 N- a3 f4 O  x
*/+ C, Y' i2 G( q
) D0 d% F/ w* E" c  D  z! @" B
1 J) r& l  m$ c
public class PdfWin {& v0 H; r7 B: K. E/ W
  public PdfWin() {6 i3 N0 r, Q5 E+ O
  }) I  [+ b- a# Q; j0 K# E3 S
  public static void main(String args[]) throws Exception0 L% P6 G* _; Z' h( H) p
  {1 B$ J1 s0 k- ~
    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";
, k" `3 `3 K. x* O+ P7 }$ p    String filename="c:\\a.pdf";7 ~5 T# D% r: Z4 I
    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};
0 ^% x5 }! g- j    Process p = Runtime.getRuntime().exec(cmd);
1 W; I1 t+ r7 f6 l    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());
4 ]2 M: j, ?8 p5 X+ M    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");6 ]1 I) c! d4 F/ j
    StringWriter out = new StringWriter();# D  I9 H8 c8 K6 @4 C" {
    char [] buf = new char[10000];6 ~$ W2 J4 k1 i3 x! P0 ~/ d( C
    int len;
1 ]1 ?  Q- Z8 }. H  Q# U! G    while((len = reader.read(buf))&gt;= 0) {
" C- x- }$ t% h4 Z* A    //out.write(buf, 0, len);
8 C% M" c, o; n' Z' K( Y7 t    System.out.println("the length is"+len);' z! ~2 @# V* t
    }  p8 |3 `0 c! X* ~* m
    reader.close();+ Z8 c4 ^' j1 e/ g. m, d0 R7 |
    String ts=new String(buf);/ l! \  |% h, d. p) K  @: d$ r! i8 M
    System.out.println("the str is"+ts);
. a; U9 Y! {; W  }
8 {, K! `( ^- f$ Y$ H- a}
0 v, Z, \8 }6 C! Z3 o) c</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-6-10 21:34 , Processed in 0.436683 second(s), 57 queries .

    回顶部