QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4235|回复: 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>
8 U& i: `/ A+ X) ^<><A>1 .用jacob</A>3 v+ o! ]- G8 @
其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>
# H! \5 o# Y4 [: j, D( o<>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>
  }8 o) H9 h" Q0 O9 n$ _; v  y  @<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>3 V, q$ [3 K) d0 E' ?- Z
<>
2 T: [: \2 w4 y<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">( c4 I. z2 U0 x8 X9 p7 ]

0 H8 n! _$ t0 P<TR>
+ o$ F' W+ I+ \<TD><RE><CODE>0 O: Z. S& }' r2 x1 }3 w3 I
import java.io.File;7 t4 a7 Q' T( O* F/ M% \  m4 a9 \+ D
import com.jacob.com.*;% ~9 M+ x- V! g7 r/ L( Q3 Y
import com.jacob.activeX.*;
  F, a  e3 U2 o) M+ X/**
  Z* Q: w% _  G0 H( g  Z" y# K * <>Title: pdf extraction</P>
# g. x' t. ^! X" F3 ? * <>Description: email:chris@matrix.org.cn</P>5 o% \( H7 [, r* f; N% K
* <>Copyright: Matrix Copyright (c) 2003</P>
! b1 z. X- x1 u5 d# B * <>Company: Matrix.org.cn</P>9 |* v5 f  {7 Q9 q( Y  C9 w
* @author chris/ @; w; P) Z0 u" h. g  Z/ ?
* @version 1.0,who use this example pls remain the declare5 e) C+ a% r! ?9 O  b, t. C
*/
$ r5 X* r3 X; Y7 Spublic class FileExtracter{' I% H( ^# W5 b. T, H
public static void main(String[] args) {
) p4 j: E, T8 _% K  ActiveXComponent component = new ActiveXComponent("Word.Application");# k9 E( y/ |' D+ F- q. D( C
  String inFile = "c:\\test.doc";& q. c  d" \* a. [7 {% w* O
String tpFile = "c:\\temp.htm";  R; D" y7 G( C1 D: l0 b3 U! V5 v! w
  String otFile = "c:\\temp.xml";
. O) h  x. r/ W  `0 u% _1 Q* |  boolean flag = false;
  F- t5 f; t" q  try {' O0 U2 E* O) p/ i1 c
   component.setProperty("Visible", new Variant(false));. F& r& w6 o" \; y/ M9 \. P& I5 D
   Object wordacc = component.getProperty("document.").toDispatch();
  w) }; q' S& m/ i/ ~! H   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method,
3 d. o5 n5 M+ [0 B- ~9 O                                     new Object[]{inFile,new Variant(false), new Variant(true)},
3 }# u, B; P2 T. n- }  P; m9 b                                     new int[1] ).toDispatch();* z+ T. D2 `8 J6 ^4 `+ |! x4 S; J
   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);
% W- k& ]! `- [3 F   Variant f = new Variant(false);4 P8 v9 I$ ?  A$ _) V! `
   Dispatch.call(wordfile, "Close", f);9 _' o2 t$ S3 f" T( c& g
   flag = true;
, G/ d9 ]0 K( N  } catch (Exception e) {3 p9 z: h3 m' K$ Z
   e.printStackTrace();
* i8 Q# d3 A5 I  } finally {
1 }) E' E/ T# t! |3 q   component.invoke("Quit", new Variant[] {});
; C( P# v" @+ c  }, `  X& R* w0 w: h( [) ]
}1 J+ O9 C/ K9 Y1 H8 z
}* f+ e+ \! G- T- t' k
</CODE></PRE></TD></TR></TABLE></P>
- ~) N7 j9 K. c! O" K! f- m( ?) G<><A>2. 用apache的poi来抽取word,excel。</A>  W9 a0 |0 [% h
poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>
5 f2 z& M4 ]+ i7 s9 ^" {* M<>下载经过封装后的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>
+ z: W+ x+ O4 g* B, B" J<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>
1 W* p! M. F! p0 D8 I  @<>
" w$ }  x4 X/ y& j<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">: b! C1 ^& \+ F1 ~! n
4 ^7 w! |5 n" L8 |9 x5 `" \
<TR>: S7 ?6 f% F* {" o+ p( j
<TD><RE><CODE>) G, B% }5 [8 _, K
import java.io.*;1 j( k! S6 N6 D! t9 g
import  org.textmining.text.extraction.WordExtractor;
% K4 U# `* C  B; m& W/**& D" h; A1 Y$ r4 p$ _
* <>Title: word extraction</P>
! W6 C1 y9 F. @; E& S * <>Description: email:chris@matrix.org.cn</P>
) X5 ~/ j) p0 @1 |6 z * <>Copyright: Matrix Copyright (c) 2003</P>+ ~: Z1 {9 p- A6 L
* <>Company: Matrix.org.cn</P>
* u8 b' \1 w  t1 y  z * @author chris
3 q# A# Z( u6 T- C- s * @version 1.0,who use this example pls remain the declare, q/ C2 H- }) t. A3 E3 b
*/
# u2 {. A' v% [& ?, J* s- @  r
2 D' |% O2 A; _, ~- P, spublic class PdfExtractor {
, F) z- V$ Z) T* M  public PdfExtractor() {
/ d, w. m1 S: E4 q" F" T/ q  }
/ H/ e2 P6 S; k7 t6 m  public static void main(String args[]) throws Exception
7 p8 A# i$ ~5 S- A6 ]$ ]) W  {' ?, J$ D/ ]6 R7 ]; _( z+ ~+ r
  FileInputStream in = new FileInputStream ("c:\\a.doc");: a6 \" u9 H! W* h+ ^& }
  WordExtractor extractor = new WordExtractor();4 E0 a7 F$ u* a. G9 y% p
  String str = extractor.extractText(in);
( X/ i+ a* I( I! x2 S' t9 ^: {3 X2 {  System.out.println("the result length is"+str.length());7 @+ G& f- T6 k7 ~
   System.out.println("the result is"+str);
8 b2 R' K' _& m+ \- c7 N}
+ c. y) q) o, G4 m2 F, k1 S}$ t- l* |/ J4 G0 T: F' n' ^
</CODE></PRE></TD></TR></TABLE></P>0 I( Y+ T% {; t1 g, r7 N
<><A>3. pdfbox-用来抽取pdf文件</A>. y" H$ y0 a6 O; N0 w+ A% {4 S% Y
但是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>
5 I4 N, y9 w$ m0 v4 D8 }<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>; R( r) y5 Q& ?# R7 H0 n
<>
" s/ b$ Q; t' L+ P( X9 v0 t% l5 l/ N, \<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
' x7 X0 o1 Y/ h% T) I8 `" N6 ]2 h' ?& d
<TR>3 k" D  v* N# C$ H
<TD><RE><CODE>1 @; j  w8 O7 _6 p8 a) w1 A) v% x
import org.pdfbox.pdmodel.PDdocument.
: A3 z8 e! ]( K- B/ b# A$ himport org.pdfbox.pdfparser.PDFParser;
7 N( w$ S3 w! u. t2 himport java.io.*;, X, \4 d4 s9 T( V3 U3 l% ?# d
import org.pdfbox.util.PDFTextStripper;, V4 `% W, L# {, z* z
import java.util.Date;" \" w6 x& _2 y" {
/**
; ]+ K0 v+ v! k, g * <>Title: pdf extraction</P>
" X1 y) S3 _6 k * <>Description: email:chris@matrix.org.cn</P>
2 L% _5 ]% r0 X6 _, W * <>Copyright: Matrix Copyright (c) 2003</P>- |! F5 r0 M) s+ J, S* \
* <>Company: Matrix.org.cn</P>
9 j( @* i2 M, q. c2 F * @author chris
2 q) B+ Z, W8 u9 I" {- t * @version 1.0,who use this example pls remain the declare
% O4 z( ?" m* ^! w; ]# _/ C */" f6 ?- T8 i2 P% c: l
3 M" a9 d* @. s, L9 t9 F
public class PdfExtracter{
# i0 v$ V6 M( I3 ?. N2 }3 `1 N4 l* g: [; X: x8 E
public PdfExtracter(){8 U- J2 o3 w7 g5 ]6 F% I
  }2 N4 _/ u4 a+ \9 ?- x
public String GetTextFromPdf(String filename) throws Exception
& k" u7 m( |9 H: `7 L9 N  {6 Y% Y% |3 B/ M. c7 i
  String temp=null;3 d  _' F1 }( N  R' q& W
  PDdocument.nbsppdfdocument.null;
1 i' n: C7 f+ m& ?  FileInputStream is=new FileInputStream(filename);
9 V1 J. e, |; Q8 B! o  PDFParser parser = new PDFParser( is );
* K/ ?" V. k- S  parser.parse();" q2 M- f4 v" `: \& W- ^) O8 p1 [$ q$ B
  pdfdocument.nbsp= parser.getPDdocument.);
+ Q. l3 F) Z: W$ c2 ?3 ?& e  ByteArrayOutputStream out = new ByteArrayOutputStream();) q, N# P% ?: j) q0 g
  OutputStreamWriter writer = new OutputStreamWriter( out );
7 a  s0 U& d2 Z' ~' u9 O/ [  PDFTextStripper stripper = new PDFTextStripper();- \- V$ {8 q5 o' G, W0 _1 C
  stripper.writeText(pdfdocument.getdocument.), writer );2 b, K/ i1 R  ]3 f
  writer.close();, j( C; Z7 q, o: b$ N$ h
  byte[] contents = out.toByteArray();
2 B7 D2 j3 E# Y+ v$ u7 s2 p! Y; s6 G  E  G! A: ]
  String ts=new String(contents);0 h. f1 B* O  e! o
  System.out.println("the string length is"+contents.length+"\n");% W9 T& c1 d( G* A% W7 d
  return ts;
3 _# K! @8 ?$ z, i& l7 t% z; Q}4 t6 S4 Z$ N% n8 N. i; D+ B3 g
public static void main(String args[])
" n. G6 f  J. ^/ X3 ], G5 q{
! ]! @, f- Z4 ZPdfExtracter pf=new PdfExtracter();
1 T# Q" N, B9 PPDdocument.nbsppdfdocument.nbsp= null;+ _4 H2 C( W8 G0 |8 V

' ^+ _# q" r/ j7 Jtry{; g0 T! s0 F" D$ ?, m# d
String ts=pf.GetTextFromPdf("c:\\a.pdf");9 c( g; D1 Z% f5 R% f; s7 A$ o
System.out.println(ts);; V1 n! m' Z" i. h3 ~
}* [8 F& I3 J5 v( F' O0 k
catch(Exception e)5 E2 Y. |4 c6 S0 i
  {
. b0 L# {; X& m4 A+ c; W  e.printStackTrace();/ f3 U  d3 J! Y4 D% ^8 A, o
  }) h* d, m4 X5 G" k8 y7 @4 T
}
$ _# ~5 t5 g: o, l; {" j8 C2 s: a
- |" k# F9 e+ B}
; s. t+ n2 v" w/ I% ]* B! U' p; T+ \, @</CODE></PRE></TD></TR></TABLE></P>6 N/ m+ a  n' }8 p# I) Q( M9 J
<><A>4. 抽取支持中文的pdf文件-xpdf</A>' t, M5 v' }2 C2 J- U
xpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P>
: }! X3 N7 X8 N% 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>  M$ o7 E0 z* T$ ]* R( t
<>同时需要下载支持中文的补丁包: <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>
- E: P( r' R+ i) v<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>
. S; L5 O; e# J& K6 N% p<P>下面是一个如何调用的例子: </P>
2 ?( z5 }- T0 X<P>
  }/ e4 X- Z* C/ n5 s- L# q# D/ a<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">$ C  @5 z: N' i: i. v/ j

- y3 U3 g; W3 A$ v2 z0 g" ~/ I<TR>. H. s1 p) ]% g  Y& J. Y
<TD><PRE><CODE>: B) @- E2 |' Z5 D; a
import java.io.*;
9 u0 @7 Y; M$ x" S- J/**
7 v9 ]/ d# D+ g2 \, G * <P>Title: pdf extraction</P>
* Q6 D) Y' o0 @- @( I * <P>Description: email:chris@matrix.org.cn</P>
& l) _. S( o/ @/ E8 O9 G) A0 Z * <P>Copyright: Matrix Copyright (c) 2003</P>
7 d7 C: q9 P+ `+ @; c' E8 m * <P>Company: Matrix.org.cn</P>( x1 D8 R$ V2 ?" i% l6 I( {' D
* @author chris
( p$ }, E' V# Y7 D( o7 i5 R, L/ S * @version 1.0,who use this example pls remain the declare
: r( e9 I/ r  Z7 c/ q */
/ R( T. s& ?6 G* G( J6 u+ q" F% Z5 H& I! ]/ s4 p2 Z# x: ^. h+ b' o

- a" L/ M- a/ W5 H- vpublic class PdfWin {
' c# y: R5 m% q9 ?( Q2 ^  public PdfWin() {
6 X1 w) A' i( d: R7 o! o: K  }
% J: Z( |+ H  X# c7 G7 u5 v7 D  public static void main(String args[]) throws Exception
. u& E8 A! U% V' T) V  {& O, d( u  a. r( B* o
    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";
9 L$ ~" M: I5 ^( `" u9 w! Q    String filename="c:\\a.pdf";
8 @. Q. ~: M0 f8 ~" I. U  C2 K    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};  H9 e! l* c: S5 F7 E: H4 [5 x/ X
    Process p = Runtime.getRuntime().exec(cmd);
, P& g6 I% r1 g; i& Y. w    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());
8 X5 C7 \% h& R( p7 n    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");% q* }" `1 x/ ]& e, b) A
    StringWriter out = new StringWriter();2 @- h0 `5 z9 D, k4 o; b/ d
    char [] buf = new char[10000];! X( s% Z! T  a; X  g- |( J
    int len;
! e4 T. Q7 \( U: _* E: x8 `    while((len = reader.read(buf))&gt;= 0) {
7 ]3 U, l& s. k* J- \    //out.write(buf, 0, len);
6 p) T) ~8 q- _* n7 Z    System.out.println("the length is"+len);
8 F/ W+ D, v" l2 s) C) M    }
& ^  g7 @& C6 R- R    reader.close();
1 x6 M( Z9 R/ T% N    String ts=new String(buf);9 i( p3 s8 g/ d, g! q
    System.out.println("the str is"+ts);# Z. r6 G0 `* `  v
  }
0 @$ J) t' d! e7 i8 ~}
' A4 {1 g; f1 Y" v. ^% V: d</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-6-14 13:01 , Processed in 0.423213 second(s), 64 queries .

    回顶部