QQ登录

只需要一步,快速开始

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

[转帖]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># U5 q" ?1 \' B6 U, ]
<><A>1 .用jacob</A>
# g' R( r; W, W8 G其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>
2 U/ D, t" F8 i5 R- d7 P<>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>
5 z+ p' j: |1 N<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>
3 f  K' {% v* n# ]1 J- U<>
1 f$ Y' H2 ~. F5 j1 u8 X* R+ |6 X<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">
3 N+ O. S: ]3 Z4 ]2 P$ F, L& _" C% k  d( o1 h+ p/ L. v
<TR>$ [! @: l: C7 r" \$ M
<TD><RE><CODE>- v0 I9 k" |# b4 ?- G
import java.io.File;
# W: w9 W4 i( qimport com.jacob.com.*;8 e8 `( p4 d3 D% B# l. [' a6 p
import com.jacob.activeX.*;; u- J0 @! K' l: n, X% p! K0 ~: A
/**
/ |# A8 l: i& _$ b3 m * <>Title: pdf extraction</P>
' r- A5 m& T) I3 ? * <>Description: email:chris@matrix.org.cn</P>
" D# }& d  X, Y  N * <>Copyright: Matrix Copyright (c) 2003</P>
4 |/ f/ W  J5 _- n7 [4 O * <>Company: Matrix.org.cn</P>
/ g9 P" {  [3 v3 s5 y( @8 B, ^! s * @author chris, \) w8 w2 e" R, V) j; |/ Q
* @version 1.0,who use this example pls remain the declare/ d* e' S, {, a
*/
  X+ N' H; Z: D; H# G+ R# u6 `public class FileExtracter{4 R' W8 B1 K$ o' X9 l! {# }2 f; ?
public static void main(String[] args) {9 r( ?8 J. P; D$ f9 {. k# i$ T* h; l
  ActiveXComponent component = new ActiveXComponent("Word.Application");
: w9 b- P: \9 ]8 Q  String inFile = "c:\\test.doc";
3 f+ R- I2 a& V; o9 U6 z String tpFile = "c:\\temp.htm";
4 B9 W& q/ ~, B' I! E  String otFile = "c:\\temp.xml";
5 [0 B6 R+ R. @' n  boolean flag = false;
* F3 u  i) v" i5 z3 j  try {
6 `3 W8 S4 h& ]$ g' Z. ]   component.setProperty("Visible", new Variant(false));& {; N2 e2 W2 m4 u# u  i8 d
   Object wordacc = component.getProperty("document.").toDispatch();
* c+ G. f  ~; k6 `- f   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method, " U& C3 k8 u2 D8 K. H! W, R6 z" S
                                     new Object[]{inFile,new Variant(false), new Variant(true)},3 q' q0 {+ a, M3 @6 z7 l- c
                                     new int[1] ).toDispatch();
6 T& v" A8 U( n   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);" @- P& n! d7 i/ v4 n, b
   Variant f = new Variant(false);& z% [0 u( O' a
   Dispatch.call(wordfile, "Close", f);
3 N: L8 O5 Z  x" r   flag = true;3 X8 N) @4 l- \( n$ g0 h' M* ]
  } catch (Exception e) {! |! t. W3 z& h8 R
   e.printStackTrace();
+ R8 ^) `4 V+ S  q0 G2 @) m  } finally {# }# \* S" M! h0 R- c' s" A
   component.invoke("Quit", new Variant[] {});
1 T) Y5 u8 l) o9 R, @" `9 O; `) P  }; O$ S* l! Z. S8 w4 Y6 g
}
; ^! K+ p1 R& c) w: m  N}; {1 Q2 j* v& h" y
</CODE></PRE></TD></TR></TABLE></P>
# Y& T9 L( [: c6 B' a<><A>2. 用apache的poi来抽取word,excel。</A>
+ i; _' i4 W. g: l8 Lpoi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>
; J/ ~' x) A1 I, B<>下载经过封装后的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>
# W& T7 `5 a$ j# k9 m4 }+ V5 N3 C<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>
. m1 x0 T( `9 k1 R9 z<>5 b; o1 i; _# i/ h9 ^" ]7 Z' w, A
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
" ^8 a: Y+ |/ E& V: G! v- p
. V0 p; ^3 ~% P+ R1 V<TR>& a8 f: o( P  g
<TD><RE><CODE>9 E6 A* e8 l8 k% i! z" [
import java.io.*;/ B! o! C0 Y4 `6 W5 X0 i/ _
import  org.textmining.text.extraction.WordExtractor;. B' q1 I; C9 Y2 B) B2 ~/ I
/**  Z! y) ?- R9 ~+ z
* <>Title: word extraction</P>
& G+ Y6 A! S$ |5 d$ K. q0 U: V * <>Description: email:chris@matrix.org.cn</P>
0 f9 n$ x" h3 |# L, I; W * <>Copyright: Matrix Copyright (c) 2003</P>
' L( [7 {3 l3 t' ] * <>Company: Matrix.org.cn</P>) F9 z$ V4 `! m% Y: @
* @author chris
4 k; J' j9 @1 G- @# z * @version 1.0,who use this example pls remain the declare
0 o9 s0 j5 c$ \% j1 j$ V */
. [  k& y" P+ H0 G$ ]; o
7 t4 a# K* h' h& Z3 j" f" ?public class PdfExtractor {
, ^) F/ C8 p/ g* O$ [$ b2 B" c  public PdfExtractor() {  c. @4 ~4 I$ k( c9 Z
  }
1 Z! w% _$ j5 K7 m4 s  public static void main(String args[]) throws Exception
+ U; i& k+ n5 ]% \/ `$ X% ^  {. o4 o1 ~! N" ]: {; X
  FileInputStream in = new FileInputStream ("c:\\a.doc");  w$ p- y8 w* d# }: t
  WordExtractor extractor = new WordExtractor();
" q: O& q4 N& A* N' I  String str = extractor.extractText(in);6 s% A3 |0 ^3 j9 }( S+ S9 K
  System.out.println("the result length is"+str.length());
8 c4 a5 j, u# [" r! E5 z% H5 n   System.out.println("the result is"+str);
: g+ L9 I! {4 y2 J! b}( y7 a# d3 k. g) ]% N# O4 v# \1 f' D
}
. Q% s7 i# Z7 X</CODE></PRE></TD></TR></TABLE></P>
, V; L# y0 r( Y" n8 N4 _<><A>3. pdfbox-用来抽取pdf文件</A>
( e. ]+ M. B# X8 {0 ~' H( ?! M0 E但是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>! t8 V+ d3 g5 H
<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>
; A' f7 x7 z* E  H. F<>
5 ]" ^% i1 N' A/ D$ Y2 k1 E<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
0 n# l8 J: J% L, J4 A. u6 ?4 ^; _
3 t+ i& x/ c* i; U& E4 A<TR>
% U! }# Q# l6 c/ _( {9 Q! \<TD><RE><CODE>+ I3 {9 d+ a1 ~1 r9 Q8 W3 f
import org.pdfbox.pdmodel.PDdocument.
6 d" |& h/ c7 n  k, y# W# s- M' Simport org.pdfbox.pdfparser.PDFParser;
3 r% I. i$ q  U6 F' g, Gimport java.io.*;; m# ]; I6 W$ h) E' e
import org.pdfbox.util.PDFTextStripper;
, p- }( c3 S) Rimport java.util.Date;
3 W1 P) y( \- l- [" Z; j. j/**& S; `# V& a& k2 c6 D' {$ J5 }
* <>Title: pdf extraction</P>( v% k( Z) }7 X$ [
* <>Description: email:chris@matrix.org.cn</P>
! ?& E( B, i7 |; H  L7 Z/ ? * <>Copyright: Matrix Copyright (c) 2003</P>0 M3 H/ x0 {5 u: V- w# l& B. p& O
* <>Company: Matrix.org.cn</P>+ ~! i4 y: A3 l% r: x* s& ?
* @author chris4 E+ H" e0 C" D
* @version 1.0,who use this example pls remain the declare# ]# r$ t! R% N9 D; A5 j) P
*/
# `6 f+ L! [2 X5 }, \) W6 d& }7 a+ N& b5 G' L7 k- i
public class PdfExtracter{% [6 M* y% A4 A9 Z3 k. P

* r" }1 w/ U; l0 F  o, V. Hpublic PdfExtracter(){3 N: r1 D6 f" g9 ~, L% g5 ^
  }1 b( e$ a3 ~) b- j2 M: n6 \! `
public String GetTextFromPdf(String filename) throws Exception
: {* b& v$ q; Y3 K  {
1 E* X/ l* f1 e$ A3 n  String temp=null;& _5 A% h1 l! y3 t1 U
  PDdocument.nbsppdfdocument.null;
% c2 ^0 |4 ^. }) |8 }8 N  ]  FileInputStream is=new FileInputStream(filename);
( B- k" H" V! g5 Q# A9 A  PDFParser parser = new PDFParser( is );' M, X0 E% I) i
  parser.parse();5 a$ m& n0 O& x8 E6 s$ m6 L' R
  pdfdocument.nbsp= parser.getPDdocument.);3 F$ v5 w( }8 r  ]: e) b
  ByteArrayOutputStream out = new ByteArrayOutputStream();
3 q$ o0 E1 v$ ~  |% a& S  OutputStreamWriter writer = new OutputStreamWriter( out );
# L0 V/ C. s: w' g5 J+ @0 d  PDFTextStripper stripper = new PDFTextStripper();
4 J& z7 \9 j0 N* p/ @; ]. O  stripper.writeText(pdfdocument.getdocument.), writer );6 U( k" a8 `" Q/ B" C$ N' @) d6 M
  writer.close();. w% i# J: J+ i
  byte[] contents = out.toByteArray();# Z7 Q1 C. q$ }  K* G6 |5 |( w8 z( e

$ W. n) o. p5 R  String ts=new String(contents);8 {& U8 W8 `! V5 n
  System.out.println("the string length is"+contents.length+"\n");
$ J# I( ^! I# M5 c# |  return ts;
" I# Z: v5 m# M  h8 ^9 v2 F}9 ~  X4 h* s* ?+ I! [; f
public static void main(String args[])( N+ c8 z) D, x7 J, r
{, L: \# h& x7 m6 g1 N2 e' u
PdfExtracter pf=new PdfExtracter();
6 d4 q: X1 f" z  ~7 `. tPDdocument.nbsppdfdocument.nbsp= null;
% g1 t5 o; m( z: K0 B
( O3 C. Z7 W  I' T6 ^% k! J2 C' itry{  G% [* Z& _1 [: _* b! Y* c
String ts=pf.GetTextFromPdf("c:\\a.pdf");# ~. r" m0 Z( e4 O6 ]( U
System.out.println(ts);! Q3 Y+ ]8 j5 n
}1 W$ A' }$ v8 x* @; G  D" J
catch(Exception e)+ z  a  }7 U- U4 D- l4 P: H
  {
8 e- v0 O! Q2 l( i  e.printStackTrace();! w. @6 n# }& }% @$ x
  }
# h9 {, d" ?" x6 r5 b' D7 T( A% O* a. \}& E) F9 s: q3 ^, a1 y. n; e

( @" G% G. i6 V2 Z  O}
8 P5 R& v# d; b5 {( R</CODE></PRE></TD></TR></TABLE></P>) T4 u2 z. r- h1 w9 n: b( p% H
<><A>4. 抽取支持中文的pdf文件-xpdf</A>6 X& h1 |3 V$ Z7 Z/ ~
xpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P>
. m; G  C7 f7 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>
' y9 ^( L' _- ?" @<>同时需要下载支持中文的补丁包: <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>! _# L) X' f7 Y) D' `$ m' A' ^. `: b
<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>7 J% A5 \; c6 C% B: l" d, g$ H" A& }  ~
<P>下面是一个如何调用的例子: </P>0 u) z, i  e* O0 a) e
<P>
  u# E0 G* s& V, T<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
9 L/ h! G. V  Y( q1 y$ R* H/ W9 |& r9 [* n
<TR>
, |% ]' K! c" U7 c# [<TD><PRE><CODE>
4 T: z7 w, W' Eimport java.io.*;
& w: }0 U  ^% k% Y- s/**: ?3 c: H: ]. e: L
* <P>Title: pdf extraction</P>+ }  s( ]# ?  H* [: L. e+ v
* <P>Description: email:chris@matrix.org.cn</P>
1 Z+ p: g1 V! z  E1 |9 b* U' V) w * <P>Copyright: Matrix Copyright (c) 2003</P>) W" @6 S  L* [* G  s4 D% h
* <P>Company: Matrix.org.cn</P>: f7 i0 a+ n( X% b3 i
* @author chris
! R8 [* N4 J+ {1 S7 F8 w * @version 1.0,who use this example pls remain the declare
( A# j5 m, ]9 y5 X3 B; p( \ */8 N% G; I$ c: M! F+ j# l

  r, B; H9 I2 ?3 G0 y1 O% A7 g, L) m5 U, t* t2 s8 d* Q: C; T9 Z
public class PdfWin {: i) f' v5 t$ l6 W
  public PdfWin() {: J4 }2 L; p7 _7 b) g  o% c( `+ [
  }  @2 @6 [/ t7 w( b6 u( }
  public static void main(String args[]) throws Exception
5 i* H" |$ W7 U# e/ a  {
8 c4 n) k) H( c4 e. D0 d    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";) w' m- V3 [3 C: p0 |) I: ^
    String filename="c:\\a.pdf";) v. E1 {8 S1 u, n
    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};
# e9 O1 v+ b  G$ M. o: s0 ?9 b# y- [    Process p = Runtime.getRuntime().exec(cmd);9 X: z8 j% m$ c; Q3 b3 _
    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());( D. \. y5 u/ }  o9 n/ Z5 L# Z/ T0 \
    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");! L. \* H! m3 y4 Z
    StringWriter out = new StringWriter();5 B4 D, g6 C/ p
    char [] buf = new char[10000];
, o0 K% P/ c$ ~    int len;( Y+ _$ u5 M. b
    while((len = reader.read(buf))&gt;= 0) {+ ]9 t: _0 e& y3 d
    //out.write(buf, 0, len);( v$ n7 V1 K# L9 R3 O% ~
    System.out.println("the length is"+len);, T) H7 k3 e4 Z5 M2 c
    }
. f$ k6 R  e& C5 f- W0 M    reader.close();
& y. P/ ]8 t/ k    String ts=new String(buf);
2 d) W& S8 I% d! o1 a$ r3 \' n    System.out.println("the str is"+ts);
8 J# x) `, q$ z! d2 k& L1 ~% y8 C  }' ~8 {1 |" |" \; _* t
}
! i! }5 |' g& L" N+ |</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

    回复

    使用道具 举报

    3#
    无效楼层,该帖已经被删除
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-17 08:39 , Processed in 0.405155 second(s), 64 queries .

    回顶部