QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 3311|回复: 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>; M% h  b: n1 q4 y. _
<><A>1 .用jacob</A>
( |( ]  k2 m4 o/ s) Q0 O其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>- K7 m6 C* d2 v- W( _6 x- A
<>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>6 r# y+ X7 B$ Q5 e9 Z8 s, o. R
<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>
9 Z4 j8 e* s" @8 N8 P# e<>  b" f1 h. v7 C2 n/ b& V
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">4 y9 j# C- v" L4 G4 }0 P2 I* _

9 g. @- Y* i: _3 v, \7 p7 Y<TR>4 m6 |* D. u% |5 h6 \7 L
<TD><RE><CODE>
/ H: t0 K3 C$ l8 Y$ aimport java.io.File;1 [' Q2 D8 J3 m5 w2 c9 g) t3 ^6 m
import com.jacob.com.*;
9 n* H+ v4 R' A" w4 J4 N) y$ `import com.jacob.activeX.*;
* y7 g; k' \& |+ U/**
! C$ W9 W0 A9 L8 f * <>Title: pdf extraction</P>
$ J7 h; R; F3 f/ n, L( w% n  J9 O * <>Description: email:chris@matrix.org.cn</P>
: E: C- ~, M- g1 z, Z * <>Copyright: Matrix Copyright (c) 2003</P>, W& w& P$ V# a+ d2 `* i% r" K
* <>Company: Matrix.org.cn</P>! x, `0 v7 F! D4 }
* @author chris/ h* k4 j, I" ]% P: x
* @version 1.0,who use this example pls remain the declare
0 A* P6 u' `* X3 m# S1 k */
7 ~' I7 k, \0 ?8 W5 ]public class FileExtracter{  W; M# X; e. ^. R, U) ^
public static void main(String[] args) {
2 K, d# r4 x0 W$ d% [' C4 t8 h  ActiveXComponent component = new ActiveXComponent("Word.Application");
/ ?1 k5 M# V' H  String inFile = "c:\\test.doc";$ t) A4 P3 b# D. G& n: q
String tpFile = "c:\\temp.htm";- M9 U6 N! }) t) p6 @
  String otFile = "c:\\temp.xml";
1 p! [  n7 j+ Y- @$ L3 H* z7 }) O  boolean flag = false;
2 H9 H' t2 @+ B7 x  try {
# ~/ W: v! H. l7 W/ f) u2 z, B" O   component.setProperty("Visible", new Variant(false));
7 J: n" @, k- a+ p   Object wordacc = component.getProperty("document.").toDispatch();
* a$ v$ N* v/ ^2 y5 ^1 l+ Y. Q   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method,
4 u) U- @/ G( s; c( \1 J) J                                     new Object[]{inFile,new Variant(false), new Variant(true)},
2 x" s. q: Z& J, T: b0 b1 o6 E                                     new int[1] ).toDispatch();
/ V/ S- E0 f0 f0 r8 J- I% m2 j   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);
, n# k8 W% \6 V( i) q; b$ A   Variant f = new Variant(false);
  t' {6 G, ^: [% m" r8 J( }   Dispatch.call(wordfile, "Close", f);/ u0 Z! q0 {7 c$ \8 Z" p
   flag = true;  `5 h* z+ R; I: G- q4 b; r8 y5 ~
  } catch (Exception e) {
# s& l9 S1 F7 D3 v8 ~$ K7 J   e.printStackTrace();
7 b3 P( U: ]  D8 C$ i* h# ~  } finally {6 Y5 u; d& J' x& q# H+ n7 |
   component.invoke("Quit", new Variant[] {});
- ]# l  o. m' q9 p+ l6 m  }
- _7 `: [, ]8 D! X5 D }! ^/ o$ M. M0 h2 v( Q9 K
}
2 O$ q+ h1 z7 |  i2 {</CODE></PRE></TD></TR></TABLE></P>5 q0 g  m! }7 V0 E" }4 F
<><A>2. 用apache的poi来抽取word,excel。</A>7 W1 x# J, [3 ?5 P5 ~0 S9 D7 Y
poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>
# `9 E& G' P* n2 ~: g<>下载经过封装后的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>6 U+ t' E# \+ a$ W) W' \
<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>* A8 `: |3 Z  J; G& ?" V
<>6 x3 [0 n3 j8 t* \; ?2 B& j8 H
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">+ Q6 l4 ~4 k, ]' k" ?
  {% Y9 l3 S+ M' ~
<TR>) e9 X3 c* `' l$ Y' B' @
<TD><RE><CODE>
' E* N$ T: }. W5 ~import java.io.*;1 M/ @& E7 o9 F
import  org.textmining.text.extraction.WordExtractor;
* v1 M3 M1 b. L" v  `& M) ^/**
" ~% z. h% X% w' z- G! V9 O% O * <>Title: word extraction</P>
8 }& u$ p6 R- j4 ]8 O; u * <>Description: email:chris@matrix.org.cn</P>) n) d7 f% l, `$ J2 `# y% b. L
* <>Copyright: Matrix Copyright (c) 2003</P>, e  f3 }( F7 H; L4 s9 E! y$ g- c
* <>Company: Matrix.org.cn</P>
, E% Z+ Z, r- T1 S4 a9 w; w  H * @author chris
9 S- l3 n2 b0 a, v4 { * @version 1.0,who use this example pls remain the declare; r  d8 I5 w2 q' Y: Z5 @# F
*/1 }/ O- Y" Z+ j

! X- Y1 Q" \' t* O3 S; lpublic class PdfExtractor {
2 |! i) }, u, C# ~- T  public PdfExtractor() {
" M- W  U3 k/ N. I% ]  }3 M% l  u; h. v* I
  public static void main(String args[]) throws Exception- P' ]; [& W& U
  {& D5 ?5 o7 ^' y* `
  FileInputStream in = new FileInputStream ("c:\\a.doc");
% Y# T( q( C; N+ e2 h  WordExtractor extractor = new WordExtractor();
0 X2 z; m+ x5 l% c" A7 p( Z  String str = extractor.extractText(in);
- H6 c  L$ [$ y" F/ {  System.out.println("the result length is"+str.length());, v# L% x, o' T" C9 k
   System.out.println("the result is"+str);; }5 y" z6 `8 I8 t6 q
}
! `4 O$ L) b* u( k8 B' k}4 W9 ^' ^1 L. c) x* F
</CODE></PRE></TD></TR></TABLE></P>
: v$ A8 w1 w5 i' {: o<><A>3. pdfbox-用来抽取pdf文件</A>
; j7 V6 F# {* o4 m* E! 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>
, P- J( w( o8 X<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>
0 y" C, H6 [3 ?3 m<>9 O1 s' ^; k0 b9 A/ b# M
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">9 P: j. M# f) U

: u% G  H  G% a# X7 a6 X+ {. b, n<TR>1 ]3 g% s  ^2 p( E7 l
<TD><RE><CODE>) b8 ?& l+ V3 ^9 _: _5 z
import org.pdfbox.pdmodel.PDdocument.
, k" k7 l% A/ d$ e4 h$ l) \import org.pdfbox.pdfparser.PDFParser;
, ]( b; a& W3 b# h! y+ S* z" nimport java.io.*;
! m' ~/ [" t( o1 r2 K" \* eimport org.pdfbox.util.PDFTextStripper;
; o. k& d) y! R$ j) _& t' S* Vimport java.util.Date;, y( t( k1 @  T* C3 K4 K
/**
  P% G* a- f  [2 O * <>Title: pdf extraction</P>  e( \$ W& U7 H; o4 d4 O
* <>Description: email:chris@matrix.org.cn</P>. D4 V/ u. m( n' E) L5 m& ~; H
* <>Copyright: Matrix Copyright (c) 2003</P>3 Y6 L) Y% I, j* p. X8 v' }3 ]; a( L6 d( X
* <>Company: Matrix.org.cn</P>
" H( s+ g. f: c7 v * @author chris; B, V7 \8 z9 J. g, u! j: W
* @version 1.0,who use this example pls remain the declare
/ T& Q' H. `+ q1 A */0 \: I( a4 `7 G+ Z7 g. M

6 F1 r# U9 E4 j# f. |7 Ppublic class PdfExtracter{
  H/ {; ?( x# U6 v
5 K: @1 w+ `; E$ j3 Zpublic PdfExtracter(){% e6 F9 j* H3 b1 U: G6 O0 @
  }4 m+ @1 |2 T( T7 J& s4 z( q
public String GetTextFromPdf(String filename) throws Exception
& L* |! \$ ^- H+ a7 P8 G9 ?  {
8 g; B+ m' z* d  a  String temp=null;
- c: p) @; O' G  r  \% x! q' X) N" F8 o  PDdocument.nbsppdfdocument.null;
' M% g- K$ W4 M; K  r6 t- ?4 y3 u+ W0 F  FileInputStream is=new FileInputStream(filename);7 Q9 `, n) l3 T  d  v7 h! V4 q% H3 f/ z
  PDFParser parser = new PDFParser( is );
: A# N6 Q8 N/ t. m. o7 p1 _8 G  parser.parse();
% ~, M7 O" j( e. }  pdfdocument.nbsp= parser.getPDdocument.);
  R. x* E/ u: T. p% b! E  ByteArrayOutputStream out = new ByteArrayOutputStream();. |3 ~: F/ ^  \3 M3 d
  OutputStreamWriter writer = new OutputStreamWriter( out );
; G. ^/ q7 v% _2 u  PDFTextStripper stripper = new PDFTextStripper();
, G6 u: F, r& ?  stripper.writeText(pdfdocument.getdocument.), writer );3 O0 X! T* R. a& T: `1 f
  writer.close();# O% t3 h" y1 d0 j+ U6 H
  byte[] contents = out.toByteArray();* j& x( v' I- M1 F3 J

5 [' R0 p  _5 `  String ts=new String(contents);
- Z: x. X3 E! ~- Z5 `1 N5 h, S  v  System.out.println("the string length is"+contents.length+"\n");  t5 }7 u) i, n. k+ c. e6 F
  return ts;8 M! a3 j# @1 _, {
}
. _: {4 v& e8 [/ |! K2 Bpublic static void main(String args[])( e/ R/ [+ T. }% Q4 V1 b. j$ j  r
{% k( l7 P8 D! |$ a% ~
PdfExtracter pf=new PdfExtracter();
8 g" Z! O) H1 e2 M( LPDdocument.nbsppdfdocument.nbsp= null;) F* M$ d& H: o' R/ h3 R7 j

' R, |; @' ^' L; Stry{
5 ?! v/ z- U% q+ X/ C  kString ts=pf.GetTextFromPdf("c:\\a.pdf");5 b& Q: z3 r' _
System.out.println(ts);2 Q- f3 N  R  Z3 K& l% V
}- j2 i; ^5 c1 |7 F! [6 l
catch(Exception e): p# h# q: A: g$ {
  {
9 H1 k- r9 n- C( F( Q6 u5 S  e.printStackTrace();4 ~  c, k8 l) i. }/ ]' i
  }8 r3 z; l& G0 |) f
}6 l0 G/ p: T, W; v' T$ F) w/ c
- E* j! }0 I+ P* m- T8 X
}
1 V* x2 g1 L. l& Y2 ^& ]0 s+ E</CODE></PRE></TD></TR></TABLE></P>
% {/ ^" e9 G6 z0 C<><A>4. 抽取支持中文的pdf文件-xpdf</A>
- y1 Y  n+ j0 axpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P>+ v1 w8 ~' |0 m
<>下载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 N1 i  M$ H" |- y2 }" w
<>同时需要下载支持中文的补丁包: <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' t# O& o* O0 C3 ?
<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>8 V" Y% e; c& n) X# |6 ?
<P>下面是一个如何调用的例子: </P>: N6 k7 I2 T2 |
<P>0 Q9 @; A2 |# F7 ?5 X- e' s% R
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
1 U4 U; |+ `$ ?9 u; _7 ^+ J5 S4 m. B' d4 S, |& `
<TR>
9 e) |3 V9 s( ?) I% h2 p3 d<TD><PRE><CODE>
  H8 \+ m4 F7 o: }# @& X& V+ l, y& [import java.io.*;! z1 @/ M' k, b
/**
+ g8 }8 f  Z. {/ i * <P>Title: pdf extraction</P>: T0 _: O# F: m+ d0 u
* <P>Description: email:chris@matrix.org.cn</P>+ G, g6 n3 J+ d
* <P>Copyright: Matrix Copyright (c) 2003</P># Y7 t4 ]' ~  Q6 {4 Z* z- [
* <P>Company: Matrix.org.cn</P>
. R$ A& c, a% ` * @author chris
7 ?9 l* S. l7 F6 M * @version 1.0,who use this example pls remain the declare
) B5 M. t* V  B2 F" V */$ X# j3 L- k* u, _* X

* w. K( \) M* I: Q3 u0 C. H8 |: L4 L! H% a# ^
public class PdfWin {
1 X4 E' A' v( B+ P( M- ]8 p  public PdfWin() {
% E9 s. T/ m5 z8 r2 d  }1 y( h. f9 V, e
  public static void main(String args[]) throws Exception
/ x: o8 r% I& T1 u+ r! d# q0 x  {' |2 X0 F+ r' e  W) D. a, T
    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";4 d/ \) L8 |. j' h
    String filename="c:\\a.pdf";* \. }& K1 ?' h+ t
    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};
6 {. ]& H" H, U0 l    Process p = Runtime.getRuntime().exec(cmd);1 Y8 S5 h9 m$ I) A+ r
    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());0 s3 O4 A# o  R# _- {
    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");* P9 p4 s( [% Z6 @# _* J. n- f
    StringWriter out = new StringWriter();$ A3 D8 Z( ?5 C' Z' c
    char [] buf = new char[10000];; @5 n: {' F* w" I) ?5 w
    int len;
4 M* m/ w: p% k1 L5 y3 p    while((len = reader.read(buf))&gt;= 0) {
3 j  Z! Y7 P& l    //out.write(buf, 0, len);
1 `+ n) d5 O* y+ H) ]5 Y0 e8 E+ C    System.out.println("the length is"+len);
7 L8 Q: J! I6 r+ G' Y; w    }
$ M# r/ n) z+ t    reader.close();
5 U* u* z8 j, d5 m2 N5 q; k9 x4 Q    String ts=new String(buf);$ h# M" B6 `! K  o8 t
    System.out.println("the str is"+ts);) P# m/ T7 V6 H  Q" ]8 P3 [
  }6 y# w% ^( K$ N) u" k6 r; I' t) y4 y
}
0 M9 n  D3 c0 `$ j0 f- r</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, 2024-4-27 23:48 , Processed in 0.308225 second(s), 55 queries .

    回顶部