QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4197|回复: 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' z+ _+ D+ F
<><A>1 .用jacob</A>
3 r- W* J( x; L2 {0 S3 s其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>
& y7 b) k5 X, _4 M7 r<>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>
' z/ C! @# M; N<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>
! R* ?. P& V. G$ H5 P* k<>
! c! h% O1 l& n  x! v; U- a<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">
! I! X2 y; o$ }3 j; ?& f' f1 S7 A' w% v& Y
<TR>8 L+ o. R$ H4 ~; y
<TD><RE><CODE>
: Z2 ~5 r$ _! Z  j; Z) Kimport java.io.File;
1 G7 K! H3 o2 J& ?import com.jacob.com.*;$ W& w" d/ n" U. U* _* P8 g
import com.jacob.activeX.*;
* P) V5 X3 m! r2 f7 K+ j* ~9 ^3 V, {/**4 K: n# U7 Z# t- @: `" x
* <>Title: pdf extraction</P>
) `; ]0 N' z* z5 r5 w% B3 j* w: l * <>Description: email:chris@matrix.org.cn</P>
, N  k& ~1 \" g7 s# o * <>Copyright: Matrix Copyright (c) 2003</P>
! _3 L- W1 ~% P7 s: p6 T * <>Company: Matrix.org.cn</P>- J! j# v1 Y' c3 l* m( o
* @author chris
3 z1 ?9 P& n# b" }; c. o * @version 1.0,who use this example pls remain the declare. j4 w: C" H- q9 l
*/3 `' G& |- L! \3 T' b
public class FileExtracter{5 p1 n2 i* i) r3 X  J
public static void main(String[] args) {5 P; {, |) ~% k! m6 L: C% b9 }/ X! p
  ActiveXComponent component = new ActiveXComponent("Word.Application");
2 O; ~+ y( Q4 @' B- b* |% f  String inFile = "c:\\test.doc";
7 N. A. \' n/ Q5 b String tpFile = "c:\\temp.htm";' F, Y+ y7 L: ?; x1 E5 c7 h' C: l
  String otFile = "c:\\temp.xml";5 t4 k+ [8 F4 B: L
  boolean flag = false;
0 y  E0 S8 |7 }, F2 y7 w( E  try {" K. R, o4 S6 x% K9 ^
   component.setProperty("Visible", new Variant(false));
1 w- y8 p6 c$ E* b, u# k) W8 ~   Object wordacc = component.getProperty("document.").toDispatch();( ?) }" c) |7 [4 J1 j+ x: G/ t' W
   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method,
+ C. r) f) I$ V" z- u  D6 d$ G6 Y                                     new Object[]{inFile,new Variant(false), new Variant(true)},
0 }9 m/ M+ l3 P9 u% K: \" x* h                                     new int[1] ).toDispatch();
. |6 K4 _. q/ C5 V   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);
  A* t" J& c9 C- T   Variant f = new Variant(false);8 D& c0 L( N. X& t8 F6 C
   Dispatch.call(wordfile, "Close", f);
2 }2 O4 D8 w" H8 b$ J, N! h+ y! Z! N) I   flag = true;
+ V# e, B7 \2 e; O, i1 M& ~! g) O  } catch (Exception e) {6 i5 v$ L$ N4 O3 H' `
   e.printStackTrace();
1 G  m5 @- O+ x% k$ D  } finally {& a; C9 V/ E2 ?1 }6 f; l
   component.invoke("Quit", new Variant[] {});
. f9 h' i( J$ j' D4 p) h4 D* y4 {  }
# D6 W( Q& c% ]0 r, g' J3 ^ }
. d- L2 t6 r- o% F, U' u}
6 L( I9 ?( y( n( A$ S</CODE></PRE></TD></TR></TABLE></P>& g+ p! Z5 N1 T6 L9 j+ V
<><A>2. 用apache的poi来抽取word,excel。</A>" q# S* x0 U6 \4 L% i
poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>0 E2 {& @0 y* d; ?
<>下载经过封装后的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>
. {1 W/ B9 m5 m& Q<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>
, |  [$ z! A& M3 p1 X7 G" Q: E<>
  J6 z" z# Z. ]& L<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
" ]" m! V5 S1 c7 o
0 S4 M! C$ D, a) w0 F1 t<TR>/ f+ z0 \, V* y* W9 Z. l
<TD><RE><CODE>, ]* }' Q' K. o) Q5 T
import java.io.*;
* y( @. J5 t: ?* dimport  org.textmining.text.extraction.WordExtractor;0 J6 ^# f% G! }* h& m: I& X. I' @" T1 J0 h
/**
, y- |3 u  h$ Z: |8 g, w * <>Title: word extraction</P>
/ H4 o) g2 g5 H3 g * <>Description: email:chris@matrix.org.cn</P>
( S) \: S7 T0 x' {" f0 |, H* k * <>Copyright: Matrix Copyright (c) 2003</P>
/ g% I. x1 b8 Y& a" ^9 ?, o * <>Company: Matrix.org.cn</P>5 v& ~8 ?* U. {+ |- S" c
* @author chris6 a6 v& _2 T( O( z, Q
* @version 1.0,who use this example pls remain the declare9 ?1 m: @9 ~  r1 S' ?, m
*/( x# T) a; j" H, `$ D

6 N1 }$ L8 M2 m- S( Spublic class PdfExtractor {
, m: A5 T/ ^1 \) R( ~/ h' B, E$ F  public PdfExtractor() {' e0 Q1 ?, `* O8 h0 [5 u  Z' {! P
  }) u) h2 Z+ ^' y6 Y5 F$ r
  public static void main(String args[]) throws Exception
! X2 ~/ e6 c; w$ x5 ?- x  d( g7 k  {# H; Z# j( b$ a  a+ o( ]  n
  FileInputStream in = new FileInputStream ("c:\\a.doc");' o$ g4 Z' v. ~" k9 {' V" @
  WordExtractor extractor = new WordExtractor();& ?7 e$ _1 g( o# x2 I" k+ t* D
  String str = extractor.extractText(in);
/ u/ g0 u3 A) ?: h. i" W  System.out.println("the result length is"+str.length());, A6 P% U% s0 M9 k) u( u
   System.out.println("the result is"+str);7 @; ?1 e' ?. g3 G
}" @, B9 q" e: `5 C" }9 l0 W/ h
}
4 x9 w( T7 m8 ?' D</CODE></PRE></TD></TR></TABLE></P>
- x! f3 R! u. b6 H, j8 h, {<><A>3. pdfbox-用来抽取pdf文件</A>
' v9 X7 W; j1 L3 h* 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>3 g8 b, x/ R7 y( r
<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>( m6 m5 d# G0 y+ K: ], L
<>' X& }: {, j; `4 a7 L' H
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">; X7 p0 ]! L# N2 q( Y9 V5 z2 B

  V  D1 ~9 q+ [<TR>( D/ a6 k3 }( k; Y
<TD><RE><CODE>
* _$ m7 M7 D6 iimport org.pdfbox.pdmodel.PDdocument.! Y" q6 X0 H& q& ]
import org.pdfbox.pdfparser.PDFParser;
, _2 P, P/ r3 l5 ^: e5 Yimport java.io.*;' Y& _- `$ E& ~1 ^* m, R6 e
import org.pdfbox.util.PDFTextStripper;/ J$ h7 [, K. W; }9 }  Z* f6 _
import java.util.Date;5 l$ `! x+ l: ]7 H+ _; M! O% Z) S
/**
) ?  H; ~/ t# \' a$ o+ K * <>Title: pdf extraction</P>4 c4 o2 H9 {+ C# x$ ^# K
* <>Description: email:chris@matrix.org.cn</P>' I9 S! n6 F9 J1 G: S; j& X
* <>Copyright: Matrix Copyright (c) 2003</P>
  ^; G- b/ s+ J: p8 l1 Q5 F* Y: O * <>Company: Matrix.org.cn</P>
; U2 C% \- |1 @2 o * @author chris
  L) |0 K5 s1 @* L0 Y5 J, Z) ^ * @version 1.0,who use this example pls remain the declare
$ h# @0 `; o- Y& w4 Y- Z3 W */
) F: {( x  n+ v+ k! j% }8 g
& [" X  w8 V  V0 @& n0 Vpublic class PdfExtracter{' o* `$ ]/ \- x# F5 _) W. \

9 \% M7 v) r. [. E0 j- x( a8 bpublic PdfExtracter(){. |# F1 s* {3 W9 `7 a/ x1 y4 z# h
  }
$ C; ~# a* Q' I0 P) n2 k8 apublic String GetTextFromPdf(String filename) throws Exception
0 R, O# \* L1 I) n  {
, Q( s: k. H2 @9 @4 b1 ^& L+ _# l  String temp=null;8 O3 K/ w% n% C& ?. S6 _* ]
  PDdocument.nbsppdfdocument.null;6 m5 G5 @- I0 c/ N& s
  FileInputStream is=new FileInputStream(filename);
: m: t+ O! J7 z7 t2 @9 {  PDFParser parser = new PDFParser( is );6 V. t3 z7 I9 R8 }! s
  parser.parse();7 u0 S% A6 _  x' m+ V' X
  pdfdocument.nbsp= parser.getPDdocument.);0 A, o! b. N7 ]  }3 z
  ByteArrayOutputStream out = new ByteArrayOutputStream();
% g" }$ A0 i0 w, d; H" x  OutputStreamWriter writer = new OutputStreamWriter( out );1 A, o6 U/ \3 ^. x1 i1 G
  PDFTextStripper stripper = new PDFTextStripper();5 d3 f8 M* P( E# t, `: ]1 {
  stripper.writeText(pdfdocument.getdocument.), writer );
! G9 ^) \  m4 F4 g  writer.close();, s0 @6 y8 L9 i
  byte[] contents = out.toByteArray();* ?. ^" N$ {' }: V  L4 N

1 A9 A/ X4 M: b  String ts=new String(contents);% Z  w8 f, j, a9 h/ [- K! z0 @' ~
  System.out.println("the string length is"+contents.length+"\n");! m4 U3 L" B# V8 O' _
  return ts;6 ~) ~3 b' G4 n+ Q
}
$ E( ]" T* G, K! l  N3 Y; W- xpublic static void main(String args[])2 K: N$ I" m" \. u, n9 G
{
2 ?( U" g6 f+ J% MPdfExtracter pf=new PdfExtracter();
1 Y: @# C& D& U* t: h' M% H) }PDdocument.nbsppdfdocument.nbsp= null;
! h- Y4 P+ W1 t1 I' H0 T( t! l7 @- E$ [
try{
' x8 S+ j3 F) d" n- q" m& K) JString ts=pf.GetTextFromPdf("c:\\a.pdf");
7 J: e9 ^: [! O' ESystem.out.println(ts);+ t3 a: y' I9 Q
}( r% a+ l1 v$ y
catch(Exception e)
" z& S# C% M5 c7 T' R. w  {
+ g4 V1 i" l: \4 A. I' I" A* N  e.printStackTrace();
% g# z% U& A' r/ E1 A1 b7 c* m6 v. x  }
1 T6 p; Q1 Y: f6 S% h8 g7 v7 r9 I% [}  p% g2 t: z9 `/ r

, ^$ M( ^3 {# p# J: E% A1 P( b  C}+ }( r! |- ?* p$ q+ `  s: u: O
</CODE></PRE></TD></TR></TABLE></P>
% W7 E  z# O, ~; k( Y* ?<><A>4. 抽取支持中文的pdf文件-xpdf</A>" ~( n9 l) A4 F+ V
xpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P>* A( @' p* g+ B  e, z, g# N! |
<>下载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>
7 y  B, ^4 \4 h* K<>同时需要下载支持中文的补丁包: <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>
8 p3 f. o- A  l, a& B<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>
/ ?, u8 j$ M+ R4 y6 j' r<P>下面是一个如何调用的例子: </P>6 @* C7 ]6 u2 W( \# B8 z' y
<P>
' F% e- ], D8 G# \: g<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">! f  _  T6 `' Y2 q- E
& H" A, e" B5 Q' @6 `: ?& Z: _
<TR>" P: ]0 h) f- ?, O" E1 T
<TD><PRE><CODE>1 b, ~3 V. S# s% r: y. P
import java.io.*;* i& ~4 w( [% |, |
/**2 z6 k9 [! c1 C. q9 G: U
* <P>Title: pdf extraction</P>! [: Z" f' p0 E# g4 @; M
* <P>Description: email:chris@matrix.org.cn</P>
/ R. y9 H% S6 G" j; R5 D% |0 n * <P>Copyright: Matrix Copyright (c) 2003</P>7 _& j8 I* c$ N1 O& T6 W, v9 Q
* <P>Company: Matrix.org.cn</P>; X4 c. V5 G; [$ P! M
* @author chris
' ?" j# k- Z8 G6 h * @version 1.0,who use this example pls remain the declare
# W6 C7 U+ j4 C% z. I  G  i */
/ p& m3 G' i$ m6 B+ E- D! Q- z
' A6 R5 W6 [  {2 |3 y
% ]" P" X% L" E5 b% opublic class PdfWin {. ^1 P0 V! L; O9 I
  public PdfWin() {
' |9 Y% d, F) {  }+ q& ?; v, U1 C! O/ I& ]* c( m
  public static void main(String args[]) throws Exception0 L$ ~& A$ Y7 w% ^8 B. {( K/ b
  {
0 y; K# k1 y3 I, S    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";( i: D4 Q6 ]) \* Z" B
    String filename="c:\\a.pdf";7 H8 q) j& L" r8 J* f2 W2 |* {! F
    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};
/ Q% r( ?3 _# B) e$ q! \    Process p = Runtime.getRuntime().exec(cmd);
+ N7 q" s/ s8 S+ b3 T    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());; ~3 g* t$ s: ?' @4 M: W
    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");
. }% v5 j8 e2 t# L, j7 K    StringWriter out = new StringWriter();. A- a6 A( W# a4 Y
    char [] buf = new char[10000];. x3 f7 k* {3 Y. u: \" f7 j8 s8 H
    int len;
3 ]+ x1 B8 V3 Z! b    while((len = reader.read(buf))&gt;= 0) {2 C9 j8 L% a; w# }  F! k( W$ X
    //out.write(buf, 0, len);
0 W, Q9 A" k3 s/ l& w* m6 I. T    System.out.println("the length is"+len);' |0 `, ]  D3 J5 n  \2 G
    }
3 s* }2 M2 `$ a' d: ~    reader.close();7 Q) C  e& B5 q8 Z$ K
    String ts=new String(buf);- a0 w4 b+ w& W8 s% g+ S5 o
    System.out.println("the str is"+ts);
2 ~! w3 m$ q8 \+ c2 c$ |/ k  }
' G; Y6 y4 b* l* v* O% \}' ]; T# q& y1 y9 A
</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:33 , Processed in 0.348282 second(s), 56 queries .

    回顶部