QQ登录

只需要一步,快速开始

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

[转帖]java抽取word,pdf的四种武器

[复制链接]
字体大小: 正常 放大
god        

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
#
发表于 2005-3-31 01:15 |只看该作者 |正序浏览
|招呼Ta 关注Ta
<BLOCKQUOTE>很多人用java进行文档操作时经常会遇到一个问题,就是如何获得word,excel,pdf等文档的内容?我研究了一下,在这里总结一下抽取word,pdf的几种方法。</BLOCKQUOTE>
! M4 [+ h/ q  R5 M<><A>1 .用jacob</A>6 g) R% o5 G% G; _; G
其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>; }, F+ |3 r/ F6 W+ e
<>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>7 p# n- O; E' X( ^7 l$ W6 u
<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>& a* u8 h+ ~: @: p& Y
<>
/ B2 b- \5 ?2 {* S, ]/ J1 E<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">7 s, l& l# u4 f

7 q& Z0 U6 |& K/ m7 P<TR>
* J6 B- Z. p+ r2 f2 g3 i  k<TD><RE><CODE>% u) \7 b9 q+ E/ s! H7 n  y
import java.io.File;# _; R4 I- v7 O) u$ p/ [% ^; ?
import com.jacob.com.*;1 B: M; e) @$ j& @# a' C
import com.jacob.activeX.*;
" s0 s* l! x+ A% M. Z4 M5 f/**- l3 d+ ^& ^! h" t( p* o9 R
* <>Title: pdf extraction</P>
' _- l& [; R1 ~1 q/ d* F) s * <>Description: email:chris@matrix.org.cn</P>, ?* |( x/ h& o2 N) Y+ a
* <>Copyright: Matrix Copyright (c) 2003</P>
1 ?1 y9 @# U1 f8 `9 @% G! O, K * <>Company: Matrix.org.cn</P>( D+ }" W4 T% ^0 k
* @author chris1 r2 g6 N# c) A( i" n9 H0 b
* @version 1.0,who use this example pls remain the declare* o; T6 Q6 o2 y- M7 k3 w7 }0 _
*/
/ P" L' J, w2 z5 m6 t& \3 _7 O; N# ~/ Ypublic class FileExtracter{2 y+ Z! ]: ~8 m9 g1 d% p
public static void main(String[] args) {
6 Y7 N1 A- b" a+ K$ ]& n  ActiveXComponent component = new ActiveXComponent("Word.Application");8 z. y* x* T# \( m# m1 j
  String inFile = "c:\\test.doc";
/ x* @) @/ L5 l2 L6 r String tpFile = "c:\\temp.htm";
4 r& w* y5 `# h5 E* E3 n  String otFile = "c:\\temp.xml";9 H$ G# k- ~  Y5 t( ]
  boolean flag = false;' j% W0 c' A, k5 P
  try {$ w; b2 f4 L: y) X3 X# ?
   component.setProperty("Visible", new Variant(false));% c6 M" J5 y* n1 V
   Object wordacc = component.getProperty("document.").toDispatch();& w- f8 T% R( A4 Q; G7 b3 k6 q
   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method, ' r0 y, H  t- ~0 b8 q. G
                                     new Object[]{inFile,new Variant(false), new Variant(true)},5 H: N; l! X) H& I: Q+ y) F
                                     new int[1] ).toDispatch();/ H9 `) ^2 q. Y( c* P- V& v
   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);4 z, e4 l# ]7 r" ], _# T, N
   Variant f = new Variant(false);/ h5 U: U1 X: H  R' {' _1 T
   Dispatch.call(wordfile, "Close", f);- b5 B+ D, d8 _. L1 S- Y% b# H0 w
   flag = true;
7 x" w, b# t& n# |  } catch (Exception e) {  a, i3 m2 e: h. l
   e.printStackTrace();
4 J5 P1 a2 U$ ^0 W8 l; h  n7 X* W  } finally {
. Q3 J. ]4 m& X% a   component.invoke("Quit", new Variant[] {});
# v: u# H- E! \) W  }7 }% C& y8 |( N
}) C0 P6 w/ [1 C' E
}6 O2 o7 n( {+ X/ t& H
</CODE></PRE></TD></TR></TABLE></P>
$ {4 n( a; g! C4 b<><A>2. 用apache的poi来抽取word,excel。</A>6 `3 m& W, L9 T$ [, S% F9 a9 i+ s
poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>
2 y1 p. b9 @6 I1 t( ?7 R3 D* Q; o1 E<>下载经过封装后的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>" u# ~$ B  l4 A
<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>, l: K8 |0 P2 i1 R
<>( y; Z6 e0 C# x* V1 s9 ^
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">$ v! w8 ?5 e6 @6 f+ Z
4 ?0 C4 i" K2 Q. \- x
<TR>
" t" }9 A" g7 X: m+ A<TD><RE><CODE>0 |3 z" w0 q8 x8 X
import java.io.*;, v  z( u) l' o/ j2 ^
import  org.textmining.text.extraction.WordExtractor;
2 t2 }7 @+ k3 C( M0 z/**, H7 X: I6 [; ], Z8 e
* <>Title: word extraction</P>
# s! k+ C# d  | * <>Description: email:chris@matrix.org.cn</P>
( a3 ^  D: Q# y1 c * <>Copyright: Matrix Copyright (c) 2003</P>. ~8 w9 m; o) Q2 A  Q! b- D3 P
* <>Company: Matrix.org.cn</P>
2 P3 a# j; L* i/ v0 @ * @author chris
0 ]) S1 Y" n6 ~. I * @version 1.0,who use this example pls remain the declare) a& ~& S2 }4 U& @! y
*/
2 o% k$ D5 i# l3 D& s. ~8 N" d& A! e6 o8 J
public class PdfExtractor {
: E0 k) @1 [- u# H$ f  public PdfExtractor() {
2 g5 k: n. `6 s7 R  C+ Q  }/ K; q; u' Z% i7 J
  public static void main(String args[]) throws Exception3 g4 g  A* _% ?% D
  {
9 Y/ f8 ^9 T- e  o3 {" M  FileInputStream in = new FileInputStream ("c:\\a.doc");# d  j' Z1 h  W1 _  ~" b3 B* a
  WordExtractor extractor = new WordExtractor();
$ s& `( j# {* E/ \- ^9 N  String str = extractor.extractText(in);
% a: i5 [. L; {/ }0 b7 e  n  System.out.println("the result length is"+str.length());( a0 ?, u; B6 b9 H) }$ N
   System.out.println("the result is"+str);& e) d5 r7 C1 ~0 U' ^$ i
}: d0 ?" Z0 b. C( ?) q
}; w0 T' x& P/ v: Z- d
</CODE></PRE></TD></TR></TABLE></P>
- `5 T- l  E& f+ w  h<><A>3. pdfbox-用来抽取pdf文件</A>
1 x+ h8 o+ z( x% x( B0 Z+ T. }% T但是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>: t" ^" f7 Y* o6 G5 E' |
<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>
/ N1 a$ l% b" s+ P3 `3 r7 ^<>' K9 T% F3 @. P7 c* W; U7 ~- s) _
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">  q6 t; n; m: [

" s7 a4 C( c* n" K$ s<TR>
) _( `* v% @  s* h<TD><RE><CODE>
% M/ k/ N& g% ?: t$ Y. b5 fimport org.pdfbox.pdmodel.PDdocument.0 S; `3 H2 {7 \
import org.pdfbox.pdfparser.PDFParser;
2 W# E2 p5 d: K2 N9 }" Limport java.io.*;! H' W$ ^: `& b1 v
import org.pdfbox.util.PDFTextStripper;
5 m: I4 v- \; D1 M* v7 zimport java.util.Date;
) h0 @) d! k" I/**
. E. W8 R0 j. r  H8 h2 [% E * <>Title: pdf extraction</P>
  P, T( o! e. H( E/ V * <>Description: email:chris@matrix.org.cn</P>
7 a" V. G0 W* T+ n * <>Copyright: Matrix Copyright (c) 2003</P>* C( ?7 C9 C5 V% e! ^
* <>Company: Matrix.org.cn</P>8 S3 r  U  O6 e9 H! t) d. s
* @author chris0 z2 S: ~2 h8 l
* @version 1.0,who use this example pls remain the declare- p. w' N1 I0 V( ^$ W) V
*/
& m: Z8 e0 G% B. m; F; N7 T1 r* H
! ]& S" g/ n! ]: A- }( Npublic class PdfExtracter{
3 a/ o- p2 a9 ~" B
* M/ }5 W+ ?5 f- R# Bpublic PdfExtracter(){: u; {) J8 x: y, [
  }  T: f+ {) z- _1 f7 U
public String GetTextFromPdf(String filename) throws Exception7 t8 k/ M$ T7 }! k  o
  {
8 Z& S3 y- o7 P- z0 [" Q$ q  String temp=null;" i; M/ X+ x8 b/ `
  PDdocument.nbsppdfdocument.null;" A2 K# h2 n% p6 M% x
  FileInputStream is=new FileInputStream(filename);& y  [/ u' T6 ?) d  J
  PDFParser parser = new PDFParser( is );
% @6 g5 l. o" Z  parser.parse();
* _; R# t- v) s# Z/ e  pdfdocument.nbsp= parser.getPDdocument.);
9 w0 u8 d; c" l0 ?  ByteArrayOutputStream out = new ByteArrayOutputStream();* C8 g6 ~/ J, m
  OutputStreamWriter writer = new OutputStreamWriter( out );
, L/ h' F$ A% D$ l  PDFTextStripper stripper = new PDFTextStripper();& E0 v5 G1 u; ]5 V6 w9 G
  stripper.writeText(pdfdocument.getdocument.), writer );
' U* \" S) g" k( M9 C4 z  writer.close();! `6 Y9 Q5 A6 w' D9 r! i3 ?0 S
  byte[] contents = out.toByteArray();
1 e3 R4 P! X; Q' G, ]
& ~; P+ Q3 ?  u8 j) s( S  String ts=new String(contents);0 y2 w5 n, e) |/ H8 A" L, E
  System.out.println("the string length is"+contents.length+"\n");# D, a0 E" _" ?
  return ts;1 q1 O' w( n3 k1 U3 ^5 }
}
1 K& ^7 X6 g( M- \4 [public static void main(String args[])
+ E' V) @! n; x  @7 n{  R4 l# z5 g4 q5 i( D+ q
PdfExtracter pf=new PdfExtracter();& @, g- E, }+ e% x  k5 h
PDdocument.nbsppdfdocument.nbsp= null;! ]8 I  M0 S% v9 ^, X' S- c

% T  [' s* l4 {try{
9 B9 e) H, p; d& m8 h9 VString ts=pf.GetTextFromPdf("c:\\a.pdf");
1 [; C5 }7 B; P$ K9 K  KSystem.out.println(ts);: C& M& h! b/ }9 T; C7 t0 H
}3 @  d$ I& c' F' S2 V5 z6 x
catch(Exception e)0 z+ F2 {& s9 o& S: b0 u$ M. N' ~
  {
" F: q5 J7 z2 V5 B& ?  e.printStackTrace();
" t; U1 g1 e- {# n1 ?/ H2 U  }
8 I  x, d/ L( p) y; T; v: N* m}
( ~% A5 f- k% |" _0 s) N0 a# _! Q9 }! k0 E4 \8 d. P# I
}
/ Z* r- d' ?9 l* G</CODE></PRE></TD></TR></TABLE></P>, p7 Y0 h# o" F) `& |, f: S
<><A>4. 抽取支持中文的pdf文件-xpdf</A>
: v# Z" ?+ l# K) q% wxpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P>  A4 J) A# R, _+ w" c
<>下载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>5 R7 ?3 F0 r  T' @1 ]! h# 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>* n, W1 q) i8 }5 G
<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>
0 ~( [/ U/ ?- p6 i7 D<P>下面是一个如何调用的例子: </P>
% e- w4 [  u8 x<P>0 P" u# K, [0 D
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">- G% Z- S9 p. U& r1 k! t

' c" C& C/ Q) q6 n' ~$ z" }<TR>
  Q$ Z5 b9 W3 Y; y1 q1 {<TD><PRE><CODE>! n1 ~* w8 I( Z: R
import java.io.*;
5 @2 k" W& ^: p- [3 Y/**
, L/ T* \3 c' [& @: ^! C) f7 Z * <P>Title: pdf extraction</P>% E' i" _8 X# J+ g. d9 g8 b* {
* <P>Description: email:chris@matrix.org.cn</P>
  G0 G% r+ F! s, g+ |$ p0 M * <P>Copyright: Matrix Copyright (c) 2003</P>. S" W7 E( Y, L) h  B% g& y' F) f9 y  ?
* <P>Company: Matrix.org.cn</P>
2 J/ G9 ~1 B* z1 ~5 m5 U * @author chris
" }, D: g7 c. o) Z# \- N# c0 @ * @version 1.0,who use this example pls remain the declare) s' ?+ }" a0 i; E
*/
9 D4 [( [# k; [, b& A: ^- o- n. O& z7 }# r4 e8 T* K1 }! l

, i8 @0 I/ b1 i% X  Jpublic class PdfWin {- y* M5 y6 [0 t( q. {# A$ c* k* T
  public PdfWin() {" `6 v3 o# [+ `3 Z% A$ n
  }
" e2 }9 V0 Z2 ]8 D* ]  public static void main(String args[]) throws Exception
4 F. i! V+ d1 r7 l1 Z! F5 c$ x  {
4 ^& h- v9 t; P0 w1 K    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";
3 E. |6 ]; O' n( Q0 ^' [$ i" g+ q1 ^0 p    String filename="c:\\a.pdf";
2 Q9 b+ l4 L9 B' X# F) U    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};
8 s2 g0 d: F* \0 M9 n    Process p = Runtime.getRuntime().exec(cmd);2 a- }  y' L7 ~
    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());- k4 j  z2 N+ Q  |/ }
    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");4 T- E" l  ?! K' N9 O5 ~
    StringWriter out = new StringWriter();
5 {; ], L! Y* J    char [] buf = new char[10000];' f" |# l5 b3 Y$ o
    int len;
/ @$ Q3 x5 _/ S& \/ e    while((len = reader.read(buf))&gt;= 0) {
% |5 T3 Y) O5 L8 H. H/ S    //out.write(buf, 0, len);
: |' X6 B+ N6 k1 ^$ @6 u% r    System.out.println("the length is"+len);
( Y; ^! `# p( `5 H    }
+ I1 Y8 u4 ^% t) |2 o3 I    reader.close();  M  b3 z$ e0 M/ p$ B& @
    String ts=new String(buf);
8 \( @: O" z% |3 v! h    System.out.println("the str is"+ts);! L& }" d0 h. A" u3 V9 I' v
  }4 ~7 `9 E& n$ h5 `3 R
}3 [% ]5 \- M' h9 I+ J$ f% s( \
</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-6-12 17:04 , Processed in 0.693479 second(s), 57 queries .

    回顶部