QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4198|回复: 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>1 {; X9 V- O1 Y2 p, k* C
<><A>1 .用jacob</A>- M! |* z" E. J4 S. P5 y" c8 h
其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>
# O' h9 D1 E1 ?1 L2 ^, s7 J<>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>
9 [( o# L: I* `<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>
: ^/ h7 I- R  `' E' N<>
+ Y/ U$ u# k3 i( b. t6 v<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">
: U# F8 g( g( @: o  W
7 O$ u6 {* m4 e$ J" h<TR>
# b! F0 ]; L$ D<TD><RE><CODE>
7 m# z8 ?9 H# o; R" A3 S8 Himport java.io.File;4 b+ M0 j4 H# }8 j
import com.jacob.com.*;1 U# e( t3 D# r7 j- K
import com.jacob.activeX.*;
3 m0 C2 e4 s8 R* o5 h1 a, m/**2 M% N! C& M9 u4 z; q0 t8 i) r) S
* <>Title: pdf extraction</P>
  [, O( ?; ?5 l2 y * <>Description: email:chris@matrix.org.cn</P>" n, W# B) q" q' R
* <>Copyright: Matrix Copyright (c) 2003</P>+ d, I. i' D" F$ A2 z
* <>Company: Matrix.org.cn</P>- p' f0 ]' R; N
* @author chris, p. [' d8 v4 S9 r
* @version 1.0,who use this example pls remain the declare8 W3 K! c9 I% `
*/
- @/ Y2 D$ {1 o" m( p+ fpublic class FileExtracter{" ^+ B0 E" ~* {- y' D1 k& e/ A- ]2 z1 a0 q
public static void main(String[] args) {1 A$ [- \% T8 z, @
  ActiveXComponent component = new ActiveXComponent("Word.Application");
" l5 M; q5 E: |  String inFile = "c:\\test.doc";* |% D$ z% K1 x
String tpFile = "c:\\temp.htm";
2 j0 D# ~7 v* |$ I) p0 @5 w  String otFile = "c:\\temp.xml";! q# h( }/ v7 X2 c) B9 r9 d
  boolean flag = false;
( J" d" c3 }- j4 e6 J( y9 s  try {2 u- z: B+ `) \8 j/ A$ @3 [% T
   component.setProperty("Visible", new Variant(false));
2 `, s/ q$ \! T3 Q; e2 I) s  G   Object wordacc = component.getProperty("document.").toDispatch();* f9 [8 h6 b0 {
   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method, . S/ h# A) `: ?! I2 z& N
                                     new Object[]{inFile,new Variant(false), new Variant(true)},* K% @9 l# d, S( |& @/ E6 p
                                     new int[1] ).toDispatch();3 ]& T) R  H9 d+ B$ w4 c! B
   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);  k" O& ]7 w- o& t# {6 s
   Variant f = new Variant(false);, D2 J: B% e1 _  E
   Dispatch.call(wordfile, "Close", f);  y6 A- I# Z' ]- I  ~
   flag = true;. n+ I% L* ~: \, ?! |
  } catch (Exception e) {
" W* W# G7 h7 X6 n0 b4 {; t   e.printStackTrace();; |. v' y" s) Z( ?7 v( v
  } finally {* }1 t- f  ?, M8 z3 g
   component.invoke("Quit", new Variant[] {});
+ s$ j3 v: v$ Z  }
5 x9 q, I8 V# V9 k3 b  L2 N }' x, w& M+ y0 @2 }! c
}4 T) b9 I4 t/ M6 d: X1 s
</CODE></PRE></TD></TR></TABLE></P>1 \1 @8 s6 A" Y, z1 b+ x
<><A>2. 用apache的poi来抽取word,excel。</A>
' Y! v1 y& t+ Y$ ?; o( Y( O4 Apoi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>
' ?5 R. o9 u' j0 h8 T* l<>下载经过封装后的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>0 L3 g1 |) R4 q: A: X
<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>3 _- i, `4 R, J* `- B9 [
<>" b9 n0 X* {( Z0 }4 m, I
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
  X3 m/ P4 m  f4 s
& f$ y5 i6 r( V  Y<TR>
" ?" \9 c1 K) D, l! n- U# J0 i/ C<TD><RE><CODE>6 b- J3 M( U6 G  m3 W! `- I
import java.io.*;, L  Q# y& ~) D: p* }
import  org.textmining.text.extraction.WordExtractor;0 H0 B2 h+ o4 W. S- _2 z
/**
% ^! c' d4 f3 P% w6 t) i4 Z% } * <>Title: word extraction</P>
7 @# ~& h# ?- G! B6 }8 p * <>Description: email:chris@matrix.org.cn</P>
1 r; Y3 S4 m) e0 J- f2 x * <>Copyright: Matrix Copyright (c) 2003</P>
& K6 e' `, C3 {% m2 N * <>Company: Matrix.org.cn</P>+ Y' w) x5 c0 e0 _# S
* @author chris
2 I7 o0 y0 x8 ` * @version 1.0,who use this example pls remain the declare
" T( n/ t+ x1 d" t* j; @ */
- X6 ]" c! S2 a, _5 f1 c8 B" T, B. `/ N3 K
public class PdfExtractor {0 `( D; X% Z% _4 a" f1 ?- |
  public PdfExtractor() {
6 q7 p. l3 c3 I3 b% |6 Y$ ]/ m  }
7 u/ _2 N7 O/ w0 e1 I3 k  public static void main(String args[]) throws Exception8 v' n& o* o! F/ \* E$ |
  {% D& z. N2 @- K& s- I( ^* i' v: g) `
  FileInputStream in = new FileInputStream ("c:\\a.doc");
0 ~& Z6 I; }* d3 `; n/ w: a  WordExtractor extractor = new WordExtractor();
8 Z) O+ m+ |4 Y  String str = extractor.extractText(in);
1 N; s5 R, A: j$ r  k# ]  System.out.println("the result length is"+str.length());9 y' P4 Z( A$ [' ]6 @% s
   System.out.println("the result is"+str);+ S( r/ r4 E6 R3 {1 ?
}
" E0 O* g" O; L: Q' }* o5 F! u}7 G( W# R8 m- T3 j1 H
</CODE></PRE></TD></TR></TABLE></P>" A" `+ ?- W* `' n* a) O
<><A>3. pdfbox-用来抽取pdf文件</A>6 l" d$ M, @( X& N) y  N
但是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>: w: y8 _0 b+ }8 s1 |$ p
<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P># R* Q+ F+ @+ X0 L. b
<>
( q7 o/ E" |6 F* ^9 B' b<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
: I/ j, N3 n2 I
" ^9 p! U3 Q5 m<TR>
0 ?8 |+ D& Q( m<TD><RE><CODE>( A( R0 d. v+ s0 u  Y
import org.pdfbox.pdmodel.PDdocument.3 a: w! s" l" W5 G- n! O! C% X6 C
import org.pdfbox.pdfparser.PDFParser;
; s4 R: n( |- F/ Himport java.io.*;
1 G* v8 u* x, O6 m; @! u" Nimport org.pdfbox.util.PDFTextStripper;6 {8 Y' c% ?9 ]( r  B( b3 u
import java.util.Date;
6 C$ [9 m/ s$ V8 D1 T2 w" l/**
, [$ I, ]0 m/ H% k * <>Title: pdf extraction</P>+ h% }: {  J. f* v! z
* <>Description: email:chris@matrix.org.cn</P>
  U) P6 S% D- I# [ * <>Copyright: Matrix Copyright (c) 2003</P>
% |: ?# k6 S: H  S* Z0 E8 |/ } * <>Company: Matrix.org.cn</P>
2 e0 Y9 j# s/ F0 K' H- v; M9 C6 g8 D * @author chris0 G. R3 u3 j1 W( y
* @version 1.0,who use this example pls remain the declare
# p5 i$ L0 H3 y  R! D/ n0 L */
  c- @, d5 N: E4 k/ p- z  ~: A! J# L
* W3 t* [( D1 t& kpublic class PdfExtracter{
1 ^. D& {4 s& a3 i7 Q! F& r; b: V0 h: c3 x2 o, R. N8 j
public PdfExtracter(){
# ]0 C  F+ m) C* j, I  }
4 B! }  g( K& x; zpublic String GetTextFromPdf(String filename) throws Exception
) I8 l+ ~2 U8 T9 Y4 D( i  {
! b7 W& [: _1 M. O4 p1 p' t  String temp=null;
- g+ j2 `$ Q8 n' m% F  z" J/ @  PDdocument.nbsppdfdocument.null;
" j& @/ @/ \# I+ q; Z! @+ A! ?  FileInputStream is=new FileInputStream(filename);
1 W! X/ X/ O+ J% Q8 w% Q  PDFParser parser = new PDFParser( is );
. t7 L; \" b2 D5 G0 ~  parser.parse();
  s& n7 A- b, W- X& h8 k! b4 D  pdfdocument.nbsp= parser.getPDdocument.);4 T; x/ W/ [7 `6 C/ ?. ?
  ByteArrayOutputStream out = new ByteArrayOutputStream();
0 F( u  n6 n" ^0 _6 c: a3 q  OutputStreamWriter writer = new OutputStreamWriter( out );
! i: l9 M* s, F5 ~( {; M' x  PDFTextStripper stripper = new PDFTextStripper();- N# {2 o2 y( Z
  stripper.writeText(pdfdocument.getdocument.), writer );
) T) \/ B$ F( d6 ^9 ^* e8 s  writer.close();
- T0 f( z7 K. T+ i9 `+ h0 e" G4 t  byte[] contents = out.toByteArray();$ b* x$ d4 g6 w$ q" A- [- w
. Q2 e, a  Z" n$ Q# q
  String ts=new String(contents);
6 ?% c+ W1 M# H$ z( Y  System.out.println("the string length is"+contents.length+"\n");  m! k/ t* q' }5 U# z( r' G
  return ts;5 c/ H! r& t  m3 e% C- U
}
: W1 c- s! Y  X- ?/ Kpublic static void main(String args[])/ ]) R; h; ]/ a: T
{
% S- j( e+ [: u" e1 j3 g- tPdfExtracter pf=new PdfExtracter();
) s1 t, b  R) q4 j# a0 v$ G' GPDdocument.nbsppdfdocument.nbsp= null;3 o+ A) _+ c2 j" o$ O

! U0 J# H- G6 n2 k* E8 B7 dtry{8 P$ u3 E1 J' m, n1 K# V# W
String ts=pf.GetTextFromPdf("c:\\a.pdf");
0 ~5 S( d! a$ H( s7 oSystem.out.println(ts);
2 w& N: E8 h* u, S' t' `5 `}
3 g( L, A, f- z, A) ^( `% xcatch(Exception e)! W1 X4 n0 D/ T5 J" o
  {
/ a6 @) k5 N2 s9 F  e.printStackTrace();
( T8 c% n' j% R9 r# Y( y3 M5 G, j  }
0 W: X: n) Y9 d! M: Y2 S2 B- h% D}0 @+ Z! D# n- ^+ Y3 ?8 y

7 Z+ ^' q. k0 p) ]  V+ {' [& r}9 I! g7 R7 r! }; p2 K  Y6 C
</CODE></PRE></TD></TR></TABLE></P>
7 ]8 e7 t) ]1 y  \<><A>4. 抽取支持中文的pdf文件-xpdf</A>
0 U$ D; n7 S; _4 B9 R% qxpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P>
# w6 R( I+ O5 }/ }/ k8 b<>下载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>+ r5 V5 e& }7 J2 d8 z
<>同时需要下载支持中文的补丁包: <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>
$ i% L" G( N' |' ~<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>
" L' j  ^) [& X/ F0 x* [<P>下面是一个如何调用的例子: </P>
: Y- q/ y8 L3 N$ p# Y<P>
& X7 A. b  a2 }- B+ v, G" o<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">9 Q2 B8 R. L; D  _# G" Q

) [  H9 T: ~( E! t: ]<TR>
5 e4 L* o" N9 g* E4 l4 S" j<TD><PRE><CODE>
- j. A! c% k5 E1 @: h$ x4 ^; eimport java.io.*;8 ?- P* U" K  X# q  g! {$ l& X
/**4 o/ F$ n5 X  t$ b
* <P>Title: pdf extraction</P># v! T( s- v* U$ z! Q
* <P>Description: email:chris@matrix.org.cn</P>" v8 v+ _; K: I) ]
* <P>Copyright: Matrix Copyright (c) 2003</P>! m  R" Q6 y8 e  \2 v: c  {
* <P>Company: Matrix.org.cn</P>
. q) ]- v1 d1 ]7 T( K( g8 D * @author chris
; f; K7 P) W" i! ?1 O * @version 1.0,who use this example pls remain the declare3 ]9 x6 Q% Q( s* \: ]
*/
5 |* z  y6 M+ }0 |0 _  }3 m% @! o$ p& o. o# w4 s7 C' m
/ L( w/ N* H% c0 R7 f% q
public class PdfWin {9 g! s& ^, _# ~, ~7 W! q3 P
  public PdfWin() {
: j+ F* O4 O& b  }2 _2 q1 [& M$ |5 U
  public static void main(String args[]) throws Exception
: s: Q3 A7 ^. q- w8 C  {
* ]) d# L! N2 A- [- K    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";
8 e$ [  H4 B+ C% e# B' r6 E; I# p; z3 Y    String filename="c:\\a.pdf";
+ _* l$ f; t& d    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};6 ?/ W6 {3 b* g
    Process p = Runtime.getRuntime().exec(cmd);
( S3 M3 B5 M& d% c5 y    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());) Z( {6 j( a- P3 B
    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");% k% m& @2 Y1 M" n
    StringWriter out = new StringWriter();( X7 @4 h  M3 R9 h9 R
    char [] buf = new char[10000];
( a6 b4 f9 {8 Y. G    int len;5 V# }! y# S, y) O% }
    while((len = reader.read(buf))&gt;= 0) {
  a* b/ M$ Q7 _4 T' D    //out.write(buf, 0, len);
4 \, D7 d! u: H) I) K    System.out.println("the length is"+len);
% P1 x& h5 C  G    }
9 _5 I& z9 c1 B! C) W    reader.close();  Z0 x! D4 e( U4 J# r& @# F) A/ `3 m
    String ts=new String(buf);  g) O( u8 |9 O+ B$ a2 ?. b5 R# i( M
    System.out.println("the str is"+ts);
- h% D# L: X, _+ Z# |' }! K0 x  }( E% \$ ?$ ^" K% X+ R# V# e$ i9 B
}2 h; s" j. Q$ h2 D* H4 I0 B
</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-18 13:37 , Processed in 0.621803 second(s), 56 queries .

    回顶部