数学建模社区-数学中国

标题: [转帖]java抽取word,pdf的四种武器 [打印本页]

作者: god    时间: 2005-3-31 01:15
标题: [转帖]java抽取word,pdf的四种武器
<BLOCKQUOTE>很多人用java进行文档操作时经常会遇到一个问题,就是如何获得word,excel,pdf等文档的内容?我研究了一下,在这里总结一下抽取word,pdf的几种方法。</BLOCKQUOTE>9 r& y8 P; z6 @- r3 o6 E( j" k
<><A>1 .用jacob</A>* S' O4 x4 a) e1 g. b; q
其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>
- J8 |. H. n* ]7 w3 d2 H) x5 }8 B- D  v<>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>
7 ^5 ^9 N" F4 A" {<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P># F: H0 Y' h1 S0 K) i" q
<>' R& f) V$ S3 q/ \) T
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">8 i' z; w+ J* H, v: h* H

; M+ M; U2 c, u3 P  V1 I% ^<TR>0 {- G( [" \8 {( s" O  F
<TD><RE><CODE>8 ]+ t6 V) t9 {# o0 h
import java.io.File;( |' r6 S! q( H0 r
import com.jacob.com.*;
2 b( y4 X3 _" U! Y* {import com.jacob.activeX.*;5 V7 n9 F6 v  V: @5 ~) U
/**
! _4 x9 E- R8 ~) C4 }, ]& V * <>Title: pdf extraction</P>
4 `. o3 M5 ^# D5 K  P. {: v4 O * <>Description: email:chris@matrix.org.cn</P>9 p. `* A. h$ o. B: a
* <>Copyright: Matrix Copyright (c) 2003</P>& V# k- }3 d9 x; ~; j" c1 \
* <>Company: Matrix.org.cn</P>5 P$ V9 M0 [$ K! f7 O( `
* @author chris9 C7 \* l7 o- [4 j' z
* @version 1.0,who use this example pls remain the declare; O# a+ w# O8 w0 }6 w
*/. a4 x3 H1 B& m( W8 |% Q' J
public class FileExtracter{5 c! {: ^! l9 y& P7 p1 E3 M
public static void main(String[] args) {# ~: ~+ D. W5 ~8 ]: ~
  ActiveXComponent component = new ActiveXComponent("Word.Application");
6 H8 K, a  A# o; q8 V1 z$ N$ w  String inFile = "c:\\test.doc";
% v+ f. g" ^- l String tpFile = "c:\\temp.htm";
. W# ^: ~4 I6 p- v7 Y. O# a  String otFile = "c:\\temp.xml";5 x" `' `1 @: [( A7 v
  boolean flag = false;
4 \2 M4 O; g6 w7 k2 I( ?  try {; T9 m7 m( h$ R( V# k& E3 }
   component.setProperty("Visible", new Variant(false));/ E# N1 D% H3 T$ r* B$ t
   Object wordacc = component.getProperty("document.").toDispatch();
9 A+ R- i! z. c! g2 `( }( `   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method, 8 i- r0 ~& R0 t5 b
                                     new Object[]{inFile,new Variant(false), new Variant(true)},* C1 B8 b  E% Q, X
                                     new int[1] ).toDispatch();
5 F1 f: i3 V$ h& E- t   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);
& \. Z* V0 C7 S( {# l   Variant f = new Variant(false);5 H& @. R5 s6 }4 g( z3 U2 [9 x
   Dispatch.call(wordfile, "Close", f);
+ K! {  X0 }) s. \5 D0 b3 i   flag = true;
5 p1 X( ~5 O: Y5 ~  } catch (Exception e) {
; o$ D  k9 l5 ], H. J: ~   e.printStackTrace();
0 l& o# R! d  v" ?7 j* B8 s  } finally {
% ]/ f0 u6 u( r   component.invoke("Quit", new Variant[] {});6 T- z) t1 A, A, b) {' k
  }7 O' O2 _: B2 `8 r
}
4 [$ J/ }8 a# `& o5 r" f1 X}
5 m/ W2 r! a- X, ^</CODE></PRE></TD></TR></TABLE></P>
& E  D8 b: z2 G5 ~<><A>2. 用apache的poi来抽取word,excel。</A>3 ^- B. O' e8 @9 F+ \" e: ], b4 f  m
poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>
$ B- k% r* Y: `% J4 Z( i! f  @/ 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>
) p/ E+ q- ^( T+ g, u+ V) k7 V<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>
% _! Q1 `  ?$ g& v. U6 Z<>" f$ c) V# `: T' I2 O
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
: g& r, ~4 f, u7 D' f5 ]- S
6 z8 M, w4 ?! M% W<TR>
, M& J: z, N9 T, |7 S* r<TD><RE><CODE>4 k7 |3 l, t. s. ]* H
import java.io.*;
# x1 V8 k& m' A* f: A% ^import  org.textmining.text.extraction.WordExtractor;
6 e" [3 o3 {) V+ Y. X) O/**& j  N% {  K& f6 A! ]
* <>Title: word extraction</P>
6 }5 E/ @# @1 \1 w% X * <>Description: email:chris@matrix.org.cn</P>
8 g8 }" z2 p, {+ X7 {$ M * <>Copyright: Matrix Copyright (c) 2003</P>" q4 h2 A, o0 z3 ?- u  i3 u# O5 ^
* <>Company: Matrix.org.cn</P>
" X% l/ O" b8 V) Q * @author chris
$ b- L# X: Q! R( J * @version 1.0,who use this example pls remain the declare9 W7 |- h; |# J( i. p9 \: R
*/
- @4 ^8 P6 y1 C8 S! `1 ?+ K" s' q. Z9 i  p4 |
public class PdfExtractor {
. Q3 {  y4 H: }' Z9 B  public PdfExtractor() {
; n7 n1 Y$ }' ~, K8 A7 ]  }5 s; C3 F' D# g3 I2 R; O. W" L# R5 q6 e
  public static void main(String args[]) throws Exception8 W) y" w5 r8 M
  {
' y) e9 q/ {1 o+ g% [' j  FileInputStream in = new FileInputStream ("c:\\a.doc");8 M$ L% \1 W5 Y* B
  WordExtractor extractor = new WordExtractor();7 C0 y: B) l% B" H0 \
  String str = extractor.extractText(in);7 A7 x* l! M$ Y
  System.out.println("the result length is"+str.length());
* F, P/ h# V  y4 s- v   System.out.println("the result is"+str);6 ]" i& C4 r6 Y% b! X9 x- t1 S  w  s- ]
}& j2 t, R. g" A% J6 _6 }/ ]
}$ l; F% r/ }0 L# J
</CODE></PRE></TD></TR></TABLE></P>; U3 j7 b, n# t4 {8 a
<><A>3. pdfbox-用来抽取pdf文件</A>8 V( t7 c$ Z1 n% D
但是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>
; L$ }# k1 b. B% U) ]<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>
6 y# H* @) P; Q<>
8 Y/ @$ Z) N  T2 B2 u9 c* m) p% R* E<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
8 T; @% I4 b2 I$ G; g$ f. G
2 N( J3 D# j* ?( @7 E( j% m<TR>! z5 p, {3 j1 D" F8 x
<TD><RE><CODE>3 R: i- j9 {& o* Z2 K4 v) P
import org.pdfbox.pdmodel.PDdocument./ f, L; }8 n' b' h
import org.pdfbox.pdfparser.PDFParser;
) }6 Q" ]* T* n0 nimport java.io.*;+ i1 H# N6 t* i6 o9 O) d
import org.pdfbox.util.PDFTextStripper;+ L  R: Q- T( O: N- H) a
import java.util.Date;# {" V8 j0 d7 p! y+ J, v
/**
& P- Z" k$ ]. f * <>Title: pdf extraction</P>  w, Q% [. \# }- P0 C3 B! ]. ^. `2 _
* <>Description: email:chris@matrix.org.cn</P>
# s7 b" V; B: { * <>Copyright: Matrix Copyright (c) 2003</P># z' X! C  ]9 K" i
* <>Company: Matrix.org.cn</P>3 s. p* V$ k/ U' l4 r3 s' I- k5 t- @
* @author chris
; [2 I, q. Y8 a4 i' J1 W9 ~  r * @version 1.0,who use this example pls remain the declare" {4 I7 D* D2 a# J4 W
*/3 S- s: j! j3 T2 Q1 h3 o' ]9 z( T
9 {1 f! T& h* B% T7 q! I1 }
public class PdfExtracter{
( D0 p6 J6 ]) w$ I0 D/ k; K$ |+ Y* m- X  X3 o0 X; }8 `( ^8 I
public PdfExtracter(){3 H% o4 w* N+ {' A/ \! u
  }
% C2 D' u$ \- g: i4 t  z* W$ ]public String GetTextFromPdf(String filename) throws Exception
0 y& p) w+ U7 P7 o' @4 U  s  {
  r+ [# _5 c& j& ]/ n7 n. C  String temp=null;
1 ^7 }+ s! P+ E  PDdocument.nbsppdfdocument.null;4 \5 P1 h( A1 |  u! z% |8 H
  FileInputStream is=new FileInputStream(filename);* f, R! u% B5 `
  PDFParser parser = new PDFParser( is );6 `! v2 S+ d. }& I
  parser.parse();. E, H6 }6 w6 m4 `/ F/ f
  pdfdocument.nbsp= parser.getPDdocument.);
) ~9 H5 v5 X% G( Y  ByteArrayOutputStream out = new ByteArrayOutputStream();
5 P! y# `2 H% o  OutputStreamWriter writer = new OutputStreamWriter( out );) r6 }: J$ X0 ^+ j
  PDFTextStripper stripper = new PDFTextStripper();
0 k* C' |/ S. H7 d/ ^/ z" ^* L  stripper.writeText(pdfdocument.getdocument.), writer );
9 q9 r9 C  n" Q$ M  u1 F  writer.close();; J/ r, ]& E( _4 O8 e: [9 r
  byte[] contents = out.toByteArray();
! X+ {; v, w7 g$ m1 Y0 m
/ |( e# `# O' T' f! n/ |" z: ?  String ts=new String(contents);5 J9 _1 A/ G, Q) Z6 J3 @% _
  System.out.println("the string length is"+contents.length+"\n");0 _  p6 {( I' o. O
  return ts;
. S! {3 a# X! A* z2 ~7 Z}
) W" S/ _2 \$ r4 e! k- Tpublic static void main(String args[])4 c; t. N4 J+ Y! `4 W3 ]  D
{/ p7 ~; m8 r) D- q# n; X
PdfExtracter pf=new PdfExtracter();/ v6 B" y2 n' e2 X  t7 b4 l0 t
PDdocument.nbsppdfdocument.nbsp= null;* j8 [" X: I4 m% i8 T
: z5 T+ r3 e8 G
try{4 {3 u% H: P0 S/ J4 I8 Y
String ts=pf.GetTextFromPdf("c:\\a.pdf");4 Y7 {- L: L" p4 u: _  o
System.out.println(ts);' Z8 C2 B6 S% J6 N5 O0 b
}
4 {2 R3 o7 Q. b8 }' lcatch(Exception e). s: \  P3 h7 d1 W$ k; ~
  {
" N' I$ r! _9 }! b: [% D$ |1 H" j4 ]  e.printStackTrace();
, P- g: Q/ ~$ x9 ~  }
4 j  ^" y& E5 V) f, u$ H% e0 b}- |1 H8 B; ~8 N) Y* ~, m
4 N5 d% h6 N/ f3 w1 k9 _
}8 S6 _0 H2 g. x! F! ~3 h
</CODE></PRE></TD></TR></TABLE></P>
# V8 i2 V1 q8 j1 M- W9 [<><A>4. 抽取支持中文的pdf文件-xpdf</A>
0 j2 U* I, S% L% i# c: G$ x. @xpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P>
' Y" u; d  J' S( b  k4 Y) r<>下载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>
( }5 q0 X; C7 [<>同时需要下载支持中文的补丁包: <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 @2 T% u3 B4 g/ a1 l
<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>( R. M, ]  g% E
<P>下面是一个如何调用的例子: </P>' z: i" }2 G! d
<P>
1 Q) @3 |# E0 B- `8 v9 h1 G) ]( O* S<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
) I1 l* ^" D% [9 ^
- ?' K  ]$ [* C7 j, d# X' K) i<TR>
* d7 w+ x" `& _<TD><PRE><CODE>
# X  x8 R9 s( H: {import java.io.*;9 H1 r2 D. H6 D
/**' s# R) K. U4 X8 v3 ?, N) ]
* <P>Title: pdf extraction</P>8 ?" c( @/ s8 y$ b
* <P>Description: email:chris@matrix.org.cn</P>$ E! \( S' K: @
* <P>Copyright: Matrix Copyright (c) 2003</P>" O/ q+ c: Q* k
* <P>Company: Matrix.org.cn</P>
1 _1 L; r2 |$ M% I+ f4 e * @author chris
# m3 E4 F+ c4 R- L. P/ j  F& m * @version 1.0,who use this example pls remain the declare
6 Q, [  @0 u8 t# _  `% C2 h$ x */* U  W8 p8 T$ m) B% J( t! a

8 b  K+ X6 Y9 U2 f! h& ~
% f* l) |& j" tpublic class PdfWin {$ F" L8 v% c5 o3 W
  public PdfWin() {( N; G/ S0 y# d& ?; L0 ?" z$ _( ?
  }
) f1 L9 c1 L, ^; i# K- a6 U1 K% u5 Y  public static void main(String args[]) throws Exception
; C2 g& {' X. k  w" V# X  {! R3 B0 _3 o: x$ A2 C$ r
    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";+ p, N) P! b! f( |2 w0 X5 C
    String filename="c:\\a.pdf";/ `- D+ M" y+ N3 e! C6 M( p
    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};# |4 t( m! S5 h7 G
    Process p = Runtime.getRuntime().exec(cmd);3 v& E3 O2 D+ k, q# u) u
    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());$ j9 [' N- V% \) l5 a! v
    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");
/ D; I( ^  ?$ F! E* |  N    StringWriter out = new StringWriter();2 F( `1 f* a" A# j
    char [] buf = new char[10000];+ w9 E1 L8 [3 B- m+ f
    int len;8 c$ c$ @3 `1 G3 [  ^! }' G
    while((len = reader.read(buf))&gt;= 0) {2 s  H8 S8 ~8 L+ x2 m' k
    //out.write(buf, 0, len);, R3 X) L6 H9 r8 r4 D* O# \
    System.out.println("the length is"+len);
3 O- L* Y) m. N  R    }
* w4 a/ i1 x7 |7 \2 i; \: G    reader.close();6 P$ y# A2 D6 o( \! l& v. T' A6 E
    String ts=new String(buf);+ e8 ]( G9 Z# ?) {- J  y- I3 ^
    System.out.println("the str is"+ts);) P% I  [4 Q7 j- z  k$ D; C
  }
: m& G5 p, v& j( |6 q. T6 b; O0 B}
0 w: t. z5 N! ?" {2 U</CODE></PRE></TD></TR></TABLE></P><!-- RESOURCES--><!-- AUTHOR BIOS--><!-- Make author heading singular or plural as needed-->
作者: 39133120    时间: 2010-12-10 23:59
看不懂·················




欢迎光临 数学建模社区-数学中国 (http://www.madio.net/) Powered by Discuz! X2.5