QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4229|回复: 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>: ?5 U$ `/ i& H8 T
<><A>1 .用jacob</A>) G- Y0 O3 f( |/ p& M1 o# W# [/ B6 z
其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>! u: \  u; I. i2 w  \! M3 F
<>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' z' r3 Q4 F' @<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>$ Y5 c! m7 O# `! ^9 y4 H4 E
<>
$ v. {8 o$ J8 z' F( Y2 J: X<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">3 F0 P& \6 M9 K

& i% j0 a- Y. t- J; T3 r" v/ w<TR>
: H$ U  A0 n/ t4 a! v2 @<TD><RE><CODE>
' I; D$ ^2 J2 ]import java.io.File;
/ x) e' `( i; G; t+ @; Ximport com.jacob.com.*;, W" I* L; ~" q8 G
import com.jacob.activeX.*;
6 z. }- v: f- Q7 i" P! P/**
: Y* q' w: Y' J) ` * <>Title: pdf extraction</P>
0 t+ C6 c1 Y) A  I * <>Description: email:chris@matrix.org.cn</P>' q" ]9 c- i' Q5 v4 I4 H3 p
* <>Copyright: Matrix Copyright (c) 2003</P>
: W: W; ?% [' h4 r0 x$ h * <>Company: Matrix.org.cn</P>
' O9 E; r6 Q7 J3 T * @author chris
/ [5 A* y' ~9 W& S0 m! w: \) o  M * @version 1.0,who use this example pls remain the declare
8 x" C, R, N1 ] */* t; q8 }* ]7 Z8 q* @
public class FileExtracter{- d- ~8 k$ T" g) j3 T: S& ]) J  n
public static void main(String[] args) {$ ~3 G. Y3 m. T# B, u
  ActiveXComponent component = new ActiveXComponent("Word.Application");9 _- y# I" K9 j" i+ @
  String inFile = "c:\\test.doc";
! q" q8 l! n6 K7 ]+ ]6 J& g: o String tpFile = "c:\\temp.htm";7 K" V" ^5 e0 y: P, ~
  String otFile = "c:\\temp.xml";
6 q/ c& C( [2 H* f  boolean flag = false;% C4 [) r. `8 N' P6 @
  try {: b2 w) l; G5 z7 s# x8 g" R2 m
   component.setProperty("Visible", new Variant(false));
, n/ ^; k! a% r* P   Object wordacc = component.getProperty("document.").toDispatch();6 G8 u' S) U- L4 Y  P! m- V
   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method, $ h4 i* z$ F  N3 O/ X0 I- y8 `4 ?
                                     new Object[]{inFile,new Variant(false), new Variant(true)},* R. j$ Q9 P: w" ^/ J
                                     new int[1] ).toDispatch();" f! a$ O4 m2 t- w% z" q" Q
   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);
& V- g) y  ^. J   Variant f = new Variant(false);
6 ^* }- H3 w& u2 ?9 e8 [8 X4 }" {   Dispatch.call(wordfile, "Close", f);  X! f3 S( r4 d7 H
   flag = true;
+ \8 O; f& A6 d9 L" Q" U, O  } catch (Exception e) {6 n9 _" E7 m, K* A& J# T3 N+ v4 b5 F$ d
   e.printStackTrace();# ]/ i! \1 d% E, p2 X& m! p
  } finally {
7 q: [  |$ x0 T$ X   component.invoke("Quit", new Variant[] {});1 o7 o3 d* s3 v0 r, {
  }
* [- |# N4 q1 A$ \2 R/ P }$ q: T7 |0 |( ^4 _: p6 b0 |
}
( ^7 g! t) t3 @1 O; u- Z4 U</CODE></PRE></TD></TR></TABLE></P>
% k0 H: B# O. g! L<><A>2. 用apache的poi来抽取word,excel。</A>: ^- ^! h& t( t8 m- r5 \
poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>* @7 m/ Y- Q/ ~0 o0 I1 K
<>下载经过封装后的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>
8 K& Y, P& ^; @0 O- C6 z4 A8 p<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>
5 \! L" D6 J8 m* n0 F6 ~<>
( E. L: w9 X( D/ n# B<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
3 M! }. H  g4 z+ P! @8 r+ c" E& t* |, n! X7 r3 ]$ |! A% |' F' R2 f( G* @2 C
<TR>8 l' }+ P" \% v  F5 z
<TD><RE><CODE>
  F: b: d$ @6 D5 Qimport java.io.*;
0 J8 _' _, P" E; o" d5 d% Zimport  org.textmining.text.extraction.WordExtractor;& y+ R1 Q; X8 w. w$ N
/**
" ~4 u: n* D3 E/ K- r- O * <>Title: word extraction</P>
8 Y$ F) q9 Q3 W * <>Description: email:chris@matrix.org.cn</P>. V2 t5 C+ ?0 o
* <>Copyright: Matrix Copyright (c) 2003</P>1 h# o, U2 |! Q/ m6 A! \
* <>Company: Matrix.org.cn</P>
- R; T7 q3 \8 D( l0 M9 ~% e * @author chris
" [1 k4 j4 |' n, o * @version 1.0,who use this example pls remain the declare
' }7 S1 ^1 K  ~- R& A */: A: G- ]7 C5 m  E: w4 Y3 a

! C  W3 Q0 b3 U+ D; @4 J" q* Jpublic class PdfExtractor {. d/ m6 l: r! ]; G/ B
  public PdfExtractor() {
3 [# N. c1 B+ g/ B: e+ V  }
: z: {- s- J! B! L) E0 w! w  public static void main(String args[]) throws Exception3 X+ v+ c5 o" ^- C7 {7 g$ z( h# J
  {
; d0 N1 i  r3 ^% C  FileInputStream in = new FileInputStream ("c:\\a.doc");
1 h! c$ _+ ?% q! k- ~, n  WordExtractor extractor = new WordExtractor();# r, m- u/ \' q1 t- N
  String str = extractor.extractText(in);) P. M* [0 i7 x( Y: F3 ^
  System.out.println("the result length is"+str.length());
. B1 u( `/ q/ ?# p( c   System.out.println("the result is"+str);
" h7 U  s4 P) p0 t}
$ m0 \% i0 w/ `- c8 x0 b, g  ]/ l: z' n}9 Z3 b  ]8 T" @8 X
</CODE></PRE></TD></TR></TABLE></P>
1 X7 u' f7 G. Q" z<><A>3. pdfbox-用来抽取pdf文件</A>
& U4 T3 b7 i! l# F, g3 i3 X( 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>
" }! k' j/ t  c! f/ r' o<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>5 \: _/ t% a- R$ M/ j! ^# a2 n
<>( h5 L8 ?3 ^( i- W
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">: O( v7 g& g- }
1 Q# `$ `( @+ Q" F# U' e8 z
<TR>9 L: N  u) q/ O
<TD><RE><CODE>3 A, {3 W" r1 S! O
import org.pdfbox.pdmodel.PDdocument.  Y4 K+ ^. p: }5 J/ H1 J! i
import org.pdfbox.pdfparser.PDFParser;
. W% p& h9 L+ \! s1 l& Bimport java.io.*;9 }4 |; B' h/ [! R2 V/ l" {
import org.pdfbox.util.PDFTextStripper;
& K! ]. f; A( E+ b7 b" I9 wimport java.util.Date;
3 y8 t6 M$ D+ B! z/**, H% k# d& v$ H
* <>Title: pdf extraction</P>4 u: r" a% [; g5 h( B$ Q
* <>Description: email:chris@matrix.org.cn</P>  t& j& o; a+ n
* <>Copyright: Matrix Copyright (c) 2003</P>
; a) h; \! ?2 F0 w8 l: U# G  X * <>Company: Matrix.org.cn</P>) {6 s$ i. v6 n, x! ]/ T3 i6 w
* @author chris
" d$ q, e5 E1 P * @version 1.0,who use this example pls remain the declare- m+ t" K" _" S4 i% l  }, T
*/
+ l  p! _: ]' Q5 d8 [
8 G9 j9 m5 y! f9 v8 vpublic class PdfExtracter{
' ]" V, Z5 {0 M& b: ^) Z. T  y: M) ?+ B: ]
public PdfExtracter(){% k; k- z* k8 w- X$ M
  }
, K+ T' I; G* r, v8 B" R) Tpublic String GetTextFromPdf(String filename) throws Exception
( X1 F7 u7 \+ ^5 v6 Z1 \  {7 f8 R" V% c+ ^  b% ~: W
  String temp=null;
! |9 }7 T) S9 y! R- A8 c  PDdocument.nbsppdfdocument.null;
0 q, F0 J+ N# y  x3 m  FileInputStream is=new FileInputStream(filename);: X3 Q  i6 L' a% d8 m+ {
  PDFParser parser = new PDFParser( is );* k2 y" ]2 T. S' K6 `3 @: b
  parser.parse();; K5 W. h3 O4 L# J" H
  pdfdocument.nbsp= parser.getPDdocument.);
/ t6 U# b" w* V0 E7 {  ByteArrayOutputStream out = new ByteArrayOutputStream();
7 U0 ~. a. Q- w, F4 |, ?7 T7 R  OutputStreamWriter writer = new OutputStreamWriter( out );
% X  S- w. m) x! A' z& n  X  PDFTextStripper stripper = new PDFTextStripper();; w/ I3 M# k! M* L/ T3 ~  c. y  S
  stripper.writeText(pdfdocument.getdocument.), writer );* z8 {8 i! a8 Y3 \, M
  writer.close();0 ?. `: X$ E' k4 e' e. T
  byte[] contents = out.toByteArray();3 P5 T8 h% r1 W! h
- {' n  d; A: ]& D" {4 }
  String ts=new String(contents);. H, ~, ]8 D( E8 S5 Q
  System.out.println("the string length is"+contents.length+"\n");
: N( u% Z1 f& d: T# }. S- f  return ts;
. n$ u) u3 `, {! y: U* e$ C& r}
. z2 u+ g" h: j$ a! x8 Npublic static void main(String args[])
& k- F& J' }% B; T& g$ _{/ D* j) q! v' \% z" m
PdfExtracter pf=new PdfExtracter();
1 y4 U! ^# a7 oPDdocument.nbsppdfdocument.nbsp= null;: ~' @" c' b. l. z( Y7 w

1 D# E; m" X+ M. S' Etry{
2 |. y4 r+ ]5 v0 E6 F7 cString ts=pf.GetTextFromPdf("c:\\a.pdf");8 k! p2 w* O. e( ?
System.out.println(ts);
0 Z% ^5 `9 p/ m  h" h* K}
- O3 m* U( y9 _; L2 C, Rcatch(Exception e)
( @, X, Q, I; `/ I  {
9 B- e, ?9 D$ F' v4 Q% y7 s  e.printStackTrace();1 C5 ?) g) Q% [0 d7 g8 O7 h4 G9 _1 I
  }
- E) E$ |& J0 A. j% p; z5 {}
& Q! ]8 z+ \0 F7 H2 F! Q
% O4 A3 M" Q/ N}) f' f  c0 L& \, a& i6 \( p
</CODE></PRE></TD></TR></TABLE></P>
$ L9 ^2 a. x; C7 ^<><A>4. 抽取支持中文的pdf文件-xpdf</A>: }# v  G8 O; f: k
xpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P>- i5 |; b% a8 t, J; X
<>下载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>; ]/ I7 v/ P; f% y/ _* W3 H
<>同时需要下载支持中文的补丁包: <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>
, |) R; T' l5 O. D+ S) C# D<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>2 l' |& K) ^1 X; d$ h
<P>下面是一个如何调用的例子: </P>
: H9 W% n5 C5 K<P>5 ~# X$ A( R; x7 X: w+ W* ~- B
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">/ O2 K# i- ]+ Q. i# H8 z; E
( f" q  y* i( e4 }2 d
<TR>
5 F0 z0 o: x, m* E<TD><PRE><CODE>
5 }% u) H9 a5 t- g7 n9 i! gimport java.io.*;  R( @/ E5 K3 v# d# \& C+ d  K  Z
/**! }: o2 M3 C- e# e: C$ A
* <P>Title: pdf extraction</P>1 z+ B# W- j$ m/ y
* <P>Description: email:chris@matrix.org.cn</P>. g# i5 M& e* Y9 b
* <P>Copyright: Matrix Copyright (c) 2003</P>. q$ E0 Y  O: D- {1 ~
* <P>Company: Matrix.org.cn</P>4 V4 u9 k" J) d" W
* @author chris' l) T9 l9 P! p8 m% V
* @version 1.0,who use this example pls remain the declare
+ {, X/ w/ L7 q5 v1 m3 }" D3 `2 x- _' M */5 ~9 W2 [: O& h: W

- W; F: K4 t" ]" S
7 L" R0 G$ K9 b& L' cpublic class PdfWin {
8 y) `/ j1 D7 Y3 S( e8 o$ s  public PdfWin() {) M& Q9 K9 j! c
  }/ q) D% R5 |. q! F
  public static void main(String args[]) throws Exception& K3 T$ S) P& b" M" z9 ~- |
  {
, U: ]5 ]" C$ x- l2 Q    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";) `9 T/ y! j6 x, H' q$ C4 P4 m
    String filename="c:\\a.pdf";
: T6 U* W5 T% ]4 u. c' @% K    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};
: \9 x; N2 ]3 F' r  }, a    Process p = Runtime.getRuntime().exec(cmd);- z! v" F4 X. S+ n0 ]; f8 W
    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());0 |/ n& W% B4 |. J  F8 p0 A
    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");) q& C; z: ^% n' }" i. n
    StringWriter out = new StringWriter();
/ s1 N/ R/ \/ s  T) R$ s6 q    char [] buf = new char[10000];
( N6 V* C9 q5 @& ]3 H' y& ]    int len;
6 Z  v+ _" v* x* D) v6 T+ m    while((len = reader.read(buf))&gt;= 0) {
0 `  B+ Q! g  S# _& j; J9 r    //out.write(buf, 0, len);
% A" c- \2 r; m/ p    System.out.println("the length is"+len);
6 M: K+ V( ?: ]  j    }4 H) |# {* C* {1 Y8 n# D
    reader.close();$ a  C# x8 _1 j( x! U
    String ts=new String(buf);
6 t- R0 \$ V3 f3 j) e$ f2 c  k    System.out.println("the str is"+ts);9 y1 \# N. O& K, s3 F) T
  }
' ], J" M% v; Q3 a- l}
+ t, n) s; t, w. J</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-11 21:33 , Processed in 0.452935 second(s), 64 queries .

    回顶部