QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4263|回复: 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>6 {8 A* X# }' A! F: q$ g
<><A>1 .用jacob</A>" t, \& S9 L! Y1 a$ h) f. q
其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>$ _, f( i" U1 ?- O% T# P) ]+ T5 t) n8 K
<>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>
0 B1 G+ M* i' I4 V# v; H<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>
+ |+ C0 m  b: Y# P9 W; v<>" g' }3 \. A8 A5 {
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">
( {  r- S& R7 O. k) @" N2 O( ~0 Q% }0 |. a7 |7 a# t; p$ d& [3 D
<TR>- O  b. {' r" \
<TD><RE><CODE>
' z9 g1 a: w/ P9 e7 |6 i/ p1 E4 Fimport java.io.File;
* l0 O! R2 n3 t2 O& m7 Dimport com.jacob.com.*;  {$ H" P) J( T+ q+ y, w0 _6 `9 X" G: D
import com.jacob.activeX.*;
7 H* S2 L9 Q5 E6 o/**
' {$ K# ]( \4 `: F6 ` * <>Title: pdf extraction</P>4 `! B% @' G, K! n
* <>Description: email:chris@matrix.org.cn</P># V2 Q8 o. p& q; I& E
* <>Copyright: Matrix Copyright (c) 2003</P>: ^  k9 t3 T+ q  c9 `% r
* <>Company: Matrix.org.cn</P>
& y% S6 U: U6 X' C7 V4 f* P$ N * @author chris
5 F: b7 @* c8 Q2 Q! M * @version 1.0,who use this example pls remain the declare
9 e5 \4 `0 D5 y$ q$ R- y */
$ A* K" H! k* A/ ?* {; kpublic class FileExtracter{0 p5 z& i% M* b8 v5 s9 i
public static void main(String[] args) {5 B! J+ P5 p7 `
  ActiveXComponent component = new ActiveXComponent("Word.Application");" C, o1 p' ]/ j7 p
  String inFile = "c:\\test.doc";9 x1 {# \" n/ B- }
String tpFile = "c:\\temp.htm";
1 a* _. ^: g$ a/ B4 h  String otFile = "c:\\temp.xml";* C8 y1 `" d* s& ~  J
  boolean flag = false;
; v; \3 ~" }  Y4 s9 p# h( s* G% X  try {
) M$ O! ?0 W. O, K7 _8 N   component.setProperty("Visible", new Variant(false));
( y2 Q* g& c3 _" ?+ n0 _* x$ D   Object wordacc = component.getProperty("document.").toDispatch();& A! w/ S3 P4 z2 F$ r. |# |
   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method, ! i* M6 z" A2 O( {
                                     new Object[]{inFile,new Variant(false), new Variant(true)},
# ]$ R" P$ U: p/ f9 q, i. A                                     new int[1] ).toDispatch();8 Z$ ?, a( f: h2 S
   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);, m% c; `* k) I, g  o2 ?
   Variant f = new Variant(false);
/ O0 Y, p- m& y   Dispatch.call(wordfile, "Close", f);
4 t! t0 S9 R9 U$ ?4 R& U3 {   flag = true;
- S7 x( G; l6 b  } catch (Exception e) {
3 ?* T4 Y; ~( x! x& m, K   e.printStackTrace();
  {: K- t  v0 I3 ?9 z  } finally {
5 ], A! A1 s/ a. R3 R' \   component.invoke("Quit", new Variant[] {});
2 |, d  I2 \  K; t% T* |8 T0 K  }9 ?9 f3 g2 u! r! P5 j) R
}
$ u: f, I3 }/ r3 `; i8 m}
. V. C( |! j8 j7 y  y" F</CODE></PRE></TD></TR></TABLE></P>* R8 G: r* v6 e  X, @
<><A>2. 用apache的poi来抽取word,excel。</A>+ q2 ^  D9 w+ a# j: W
poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>) o, k4 I% a) J7 y$ U
<>下载经过封装后的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>
; l6 {7 ?1 l  `7 A<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>
+ ~+ w' X5 q: B<>1 G4 y# s( D, a$ A5 _: Q. e. U
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
  I% X$ j+ i% r8 }2 ^
; Y/ W7 u1 @. \6 p+ f9 J- ~' Z<TR>
4 ?, q1 o: d" d# b+ C* ?<TD><RE><CODE>7 D7 X  ~. V8 D3 j0 [+ i% i4 X
import java.io.*;! T0 O9 U' c' L, z
import  org.textmining.text.extraction.WordExtractor;
9 \3 |5 H8 N# Q& g8 p7 a9 t/**
0 ?% s  t5 r5 k* }2 R- M * <>Title: word extraction</P>7 g* I' u0 s2 Z4 e4 C( q9 u
* <>Description: email:chris@matrix.org.cn</P>
3 b( l, w, }& J * <>Copyright: Matrix Copyright (c) 2003</P># a. \+ _- n1 t# B3 `( o0 Y2 j
* <>Company: Matrix.org.cn</P>
; Q' J) |$ ?+ s. X * @author chris
- U4 j' ~4 X9 k# f6 k# ?! N4 g3 x * @version 1.0,who use this example pls remain the declare9 e. I$ c9 A& z2 u' A
*/' j. z# H8 }! @. Q
+ c6 F+ R2 [$ h& C9 v" F/ [6 Y3 C
public class PdfExtractor {
; J6 E0 i1 B$ i3 O  public PdfExtractor() {/ {" f+ U6 c+ i( x; I( _
  }
8 ?0 S( S0 z# X. J  E  public static void main(String args[]) throws Exception
  G! W9 z4 V0 u, ]  {4 l2 F. k" V4 Y6 T  O" |
  FileInputStream in = new FileInputStream ("c:\\a.doc");: {; Y9 k0 ~5 b1 `# @
  WordExtractor extractor = new WordExtractor();
/ r( r0 \. _4 c) \" g- u7 K: t  String str = extractor.extractText(in);9 [9 r( w2 ?  v& E( v+ i" a  N
  System.out.println("the result length is"+str.length());* K  n& ~- F, d& G/ u* ]  ]
   System.out.println("the result is"+str);
; H/ z/ |  \% x" _7 V}8 T* p4 Q5 b- _1 K
}6 G1 T3 i% i' z  k3 p
</CODE></PRE></TD></TR></TABLE></P>
7 O4 s& ]) y* k<><A>3. pdfbox-用来抽取pdf文件</A>9 V2 K1 C, b% ]  Q4 \6 ^3 A
但是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! i2 _4 v- b<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>
. ^: o5 y  S4 f* @. X<>
9 @8 _" h- f! Q<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">6 J8 @6 n1 J2 g8 F
5 M( b& @; f2 v  T( u, T
<TR>9 B) B2 N% X6 `: S7 S# _; c( m
<TD><RE><CODE>+ X9 `8 R; `4 C- D: K, Y/ K
import org.pdfbox.pdmodel.PDdocument.) {) a: R# X! ^1 t9 X3 ~
import org.pdfbox.pdfparser.PDFParser;
3 O) Q' C5 Z' g$ Limport java.io.*;8 P$ B5 O0 P: p! ^, E
import org.pdfbox.util.PDFTextStripper;8 E9 I; f; c2 W2 `
import java.util.Date;; j( ]! f! j" o
/**
7 D& U0 g. l1 d$ i- F% z * <>Title: pdf extraction</P>
8 ^2 l. J) \0 X) S3 p: _3 c * <>Description: email:chris@matrix.org.cn</P>1 d8 u/ A  I+ n7 w+ {5 t- K
* <>Copyright: Matrix Copyright (c) 2003</P>+ E6 R" |4 K, i! L8 X
* <>Company: Matrix.org.cn</P>, o( H' }% `# O2 F
* @author chris
5 [+ Z1 d) d6 i; i * @version 1.0,who use this example pls remain the declare1 i% B( g- X1 A) O9 g
*/
( Q3 [3 E& R; I. {% G4 b* B2 @
7 F9 c, A! Y3 z) Epublic class PdfExtracter{
) J% t) U5 X6 Y: I7 m
9 l7 N4 a5 Z8 R. ]! R3 i1 {( K8 npublic PdfExtracter(){2 [$ v+ @* ?8 X3 Q8 ~) D2 a1 w
  }, }# T+ e5 E8 }5 Y- V& X8 x9 q# a
public String GetTextFromPdf(String filename) throws Exception( C, _* w  z: H6 Q* l3 D0 P' y, N
  {
* Y2 t$ u  d# D; |  String temp=null;9 H7 @5 j% D$ `: l- D0 e4 @& N) K7 v
  PDdocument.nbsppdfdocument.null;; T* v4 V- v/ i$ ^! E
  FileInputStream is=new FileInputStream(filename);. |0 x! L# i, r
  PDFParser parser = new PDFParser( is );+ Z8 i( f9 }' H: N* g0 h) L6 T
  parser.parse();
0 c1 Q% C" O# A: ]8 @& L  pdfdocument.nbsp= parser.getPDdocument.);( Y7 t- u  Z( F
  ByteArrayOutputStream out = new ByteArrayOutputStream();+ H, {. V" O! w- f8 z4 R- Y8 f
  OutputStreamWriter writer = new OutputStreamWriter( out );
4 }. K, l9 P- m- ]* v  PDFTextStripper stripper = new PDFTextStripper();
, B/ e. v9 j# C8 e* Y  stripper.writeText(pdfdocument.getdocument.), writer );
4 Z; L. O. o. {8 @5 Y  writer.close();: A9 v) W$ O/ {; I
  byte[] contents = out.toByteArray();
/ L, V+ y% ?, M: n0 H/ X9 w% _/ I2 d+ [) K4 g. _& y8 U  }& O
  String ts=new String(contents);6 \( ]! E# R# v  a
  System.out.println("the string length is"+contents.length+"\n");
3 U' E+ H* |# Y$ p+ l/ b3 n  return ts;6 z/ U# f" y) }5 d+ v
}
+ s& M+ M2 x( X, @; {public static void main(String args[])
4 ?9 K9 q5 F5 w/ J2 T- i) Y{
+ Q$ W! v5 ^) W8 kPdfExtracter pf=new PdfExtracter();
) w* k+ {, `& Z; GPDdocument.nbsppdfdocument.nbsp= null;
; F+ O! A( z9 L% U* u  n) a: _! z3 n+ b3 m  X9 i6 o
try{/ w, |5 Q  K) v6 _( ]" C
String ts=pf.GetTextFromPdf("c:\\a.pdf");
7 e5 k3 |; S/ Y, i- O4 k" M' M1 sSystem.out.println(ts);# S4 S1 I; w. S2 O3 z; n, F% L
}+ g% T9 P/ X1 j3 z) J% s
catch(Exception e)& Y0 l5 b0 i0 s# K. I+ \1 [- y
  {/ P) F8 Y8 Z  }$ y1 J5 U4 F
  e.printStackTrace();7 i/ t+ H, o# n" T7 ^% y' j7 |$ y4 O
  }5 C# x% c, \, }4 z
}* I( R9 I$ y0 D( \! T$ J, ^

) ~) X: p$ a8 O' Q1 T& t9 R}
4 m7 L& h, Z2 _2 T8 l- l# {8 H</CODE></PRE></TD></TR></TABLE></P>
* ?! S2 M! _& D+ J; w: g- c6 |; f<><A>4. 抽取支持中文的pdf文件-xpdf</A>
3 X5 E4 d, h. J7 b) J3 Hxpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P>* D& T. j2 `2 }
<>下载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>3 Y' f& P3 r0 P# W( Z
<>同时需要下载支持中文的补丁包: <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( ]) ]3 m# r; H2 W+ I
<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>
; g5 \, O! I( j* Z0 F1 F! l<P>下面是一个如何调用的例子: </P>: G; f& x6 ]' l* p. J
<P>
; j2 L+ L2 f4 P/ \) ^: P) K0 D<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">( K1 C/ T5 o* R) D

% d; J! K1 R1 ?<TR>! M( }/ [+ q0 _% H, G8 o5 b
<TD><PRE><CODE>
" J$ i6 w" g! }0 r$ U) dimport java.io.*;
# P- f- k4 f6 y3 ~6 z5 X/**3 Y* T: y2 I4 A$ q$ ~5 M+ T& u
* <P>Title: pdf extraction</P>, S1 F& c8 i/ h# d* S; a& D
* <P>Description: email:chris@matrix.org.cn</P>
0 l) j, f( @/ O * <P>Copyright: Matrix Copyright (c) 2003</P>: X+ R( Q+ W. {$ c" l9 l, a# g
* <P>Company: Matrix.org.cn</P>
7 F8 g3 w8 Q% V6 q& I * @author chris
  \( @0 ?* o/ T$ h; |, J, k+ c# o * @version 1.0,who use this example pls remain the declare1 [$ I  O! B9 z" Q/ l5 l( ]  C
*/
; c1 y# y3 J. f+ K+ g$ f0 \
- v9 k8 D! f$ q3 n
% J  w( A5 |' m0 ?+ O* }! z" [public class PdfWin {: u: }9 p  y  J! \* H( @0 Z! r2 H5 P3 Q
  public PdfWin() {
( K7 [  B7 p1 k- J) b5 w0 x; Z  }
) O/ h. d6 p$ G: G, @/ O* H  public static void main(String args[]) throws Exception
& {- |: s- I$ _+ j  {- i) J! E0 k/ z! o. A' i2 h- L* T
    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";
& z4 r7 g) g) }6 c. c% c  |    String filename="c:\\a.pdf";  H" a3 i9 Q7 i7 F+ M4 i
    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};
5 V* m5 J' Y# t2 j  ?+ U: N    Process p = Runtime.getRuntime().exec(cmd);* d7 T" A0 G8 j9 ^" |
    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());
  U6 M% P' L% G    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");
" p! n% i% O4 N% R% e1 ~. N    StringWriter out = new StringWriter();
- L/ ~; k  f  r$ R" j2 W: ]. k/ o    char [] buf = new char[10000];7 T% S  O* M+ F  G" G
    int len;
& n0 v- `* \2 a8 w' L! Q4 o4 \; ?    while((len = reader.read(buf))&gt;= 0) {+ v* L9 F5 w# j* y' B4 v# ]. B
    //out.write(buf, 0, len);
& G6 x6 t; D7 }3 p5 i$ Y4 r    System.out.println("the length is"+len);6 ]4 L0 G" N5 ?9 J4 f+ u
    }& Y( }' k% d1 Y& h, B- B6 j
    reader.close();. w2 M( m5 O6 e) p& J2 C9 m
    String ts=new String(buf);6 |+ u- X# K7 ?! r4 v
    System.out.println("the str is"+ts);
# ]: p* u6 L; Y  }+ r4 h2 R. D$ `) c
}
. `7 g6 x9 ?8 e2 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

    回复

    使用道具 举报

    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-8-2 00:48 , Processed in 0.526292 second(s), 56 queries .

    回顶部