QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4183|回复: 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>
0 U. r* ?$ ]$ C% B% V<><A>1 .用jacob</A>
3 T6 [# p$ b  \: ?) X# J其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>
  m7 R0 T# f, M7 Q) y<>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>* \( z6 O, h$ Z6 ^. [* h# ~' t7 q
<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>* V& }% u. I7 N! D
<>+ {# W9 e2 A4 d$ n- q
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">
6 f: h' ^4 e7 e" R; `
# F6 F" y  E' A: v& D/ z  Y<TR>
2 J; c9 B* s: g+ N2 \4 e<TD><RE><CODE>- i5 z3 N- v1 |+ d) j1 j& y0 H
import java.io.File;
$ A1 p% r" h. M" O! X0 Cimport com.jacob.com.*;
  n0 L" _; C# P+ A1 e: u5 Y1 q/ O* Q& Vimport com.jacob.activeX.*;& y" g: f! ~0 |
/**: w) m7 E( U) {
* <>Title: pdf extraction</P>
; y' O7 \( i& A( @1 ?8 y. U& k * <>Description: email:chris@matrix.org.cn</P>
2 Q6 a( [. k2 M3 x4 w$ S * <>Copyright: Matrix Copyright (c) 2003</P>( ?. @# F7 |( ?% ]
* <>Company: Matrix.org.cn</P>: S3 ~) ?$ m+ a2 a
* @author chris
; E8 w6 E6 k' o8 Y- W% x4 B+ o * @version 1.0,who use this example pls remain the declare7 W( L% m, C" k% @5 o3 w
*/3 K1 X7 U2 V/ T  d; @* j
public class FileExtracter{1 I% _- a. H. }( Z+ t- A
public static void main(String[] args) {6 c  N: v0 P7 z  {8 f+ Q
  ActiveXComponent component = new ActiveXComponent("Word.Application");# Y# t) V4 V% [+ O
  String inFile = "c:\\test.doc";- E* j* e- q/ l( K
String tpFile = "c:\\temp.htm";
/ y( A7 X" t8 V# \8 @  String otFile = "c:\\temp.xml";
# E+ A9 x6 S2 @$ i  boolean flag = false;
% u0 j9 U. r6 A. Q6 W( G& |  try {6 k- d. N+ o$ y5 u  P
   component.setProperty("Visible", new Variant(false));
9 p. h6 }0 T- F2 }* f9 ^& K2 e   Object wordacc = component.getProperty("document.").toDispatch();! P- a9 i' i, I
   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method,
: r( v& Q" S$ Q" |" g4 \' X                                     new Object[]{inFile,new Variant(false), new Variant(true)},
: X4 R. [0 D1 Z$ c+ o6 y4 Y- L9 t                                     new int[1] ).toDispatch();
! s; ]" J, s7 K+ p/ N+ A+ h   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);, h# n/ U* |* s9 {) }/ w  R
   Variant f = new Variant(false);
" e( M1 k& V( J- z   Dispatch.call(wordfile, "Close", f);" k$ p  `1 U# u9 K
   flag = true;
" Y; K' {2 ?! x4 Z! j  } catch (Exception e) {4 l+ X! K) K  Q6 L4 }; B
   e.printStackTrace();
/ N9 R' W- h" z3 i  f8 ~  } finally {
6 D" d0 P( Y( J7 B) A1 t! Z, \   component.invoke("Quit", new Variant[] {});6 ?) ^* ^5 c( z/ C, o' {. |
  }
( M, m% j8 p; z+ j* I, o8 f }
, J+ d* l+ |2 K; \% N- [}8 q, E) x# ~, J
</CODE></PRE></TD></TR></TABLE></P>$ L: L9 M" h) m- o( W( e+ p/ R; u4 k
<><A>2. 用apache的poi来抽取word,excel。</A>
  ]. [0 @: G( f  I9 W5 G/ C. c& O) Q, Gpoi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>
! s5 V9 [$ t1 X. d! f5 y<>下载经过封装后的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>; H- U5 M0 [( W7 }
<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>
! d8 G% j+ h: z& {+ p* b& J<>
, O9 z1 c9 `5 \  K3 E<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
, l3 e  |& p9 p  v8 F8 `  l% n; ^* f; n5 o( `4 v7 G7 B
<TR>
3 L) Q* G" C0 P* C% P" o<TD><RE><CODE>3 A2 _0 {5 p* L# L6 a
import java.io.*;$ p/ Y4 J! w/ x; ?2 v% A$ x
import  org.textmining.text.extraction.WordExtractor;
! o) |0 u7 u) @' ^0 `. B, [+ P/**2 ]* r) g( S" b' `4 ?
* <>Title: word extraction</P>' A3 c: q; y9 g! T" w5 z6 d/ V
* <>Description: email:chris@matrix.org.cn</P>1 d2 M; T+ r6 s6 D* E( F- v
* <>Copyright: Matrix Copyright (c) 2003</P>9 p  H' h) |1 P$ t) P, j3 y
* <>Company: Matrix.org.cn</P># |& Z( ~5 B+ K
* @author chris
7 w) T: e! H/ w# Y6 ? * @version 1.0,who use this example pls remain the declare  z: x( c7 {1 v' Z
*/
' Q  `$ Z5 E, ~, |1 ~% T$ A# P1 R. n
public class PdfExtractor {
+ F. I  }  X. w. z8 w, u2 b7 R' w; s  public PdfExtractor() {# ^1 s2 L# ?" F5 P
  }* G; E' I+ t1 `4 r! y* S
  public static void main(String args[]) throws Exception
4 N/ v3 Y6 I" n  {. _# y5 C: H7 z: S4 W: k& A% e
  FileInputStream in = new FileInputStream ("c:\\a.doc");
$ i# O4 d) J1 i$ o* C$ W, O% d  WordExtractor extractor = new WordExtractor();
1 p$ e% d$ u2 O/ `: r3 x  String str = extractor.extractText(in);; g" p# m6 s5 k! p' q
  System.out.println("the result length is"+str.length());
; y4 C; x& N  _$ k   System.out.println("the result is"+str);# \. C- v- G, q( x" r
}
- [+ g! I0 f/ c}
) ?8 w1 w  {0 T+ N8 k4 l! C</CODE></PRE></TD></TR></TABLE></P>
" C, G8 W  R' I, O1 j; Y2 y9 e<><A>3. pdfbox-用来抽取pdf文件</A>
3 D4 e7 E9 {- D6 b8 g( _- |4 s但是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>1 N7 Z) h; X& o8 N! A& F5 S
<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>
5 j2 G( i" g0 G5 u3 B# n<>
# c* ~0 d& D  k% o- t% n<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
: b. p1 j* f" y: `5 ~, Y- P  y4 R' r7 A. O. J
<TR>
) V6 g" y9 o) Z<TD><RE><CODE>
7 P  L% k! {3 D7 {& Zimport org.pdfbox.pdmodel.PDdocument.) |! w7 F* c! O+ [9 o
import org.pdfbox.pdfparser.PDFParser;# E" e- `6 ?1 T/ h) @
import java.io.*;
- E  U! x( Q; R$ X) Qimport org.pdfbox.util.PDFTextStripper;  A3 P$ x& i$ ~6 }8 t3 P
import java.util.Date;
6 l2 }" @  L- e: b/**
1 S6 o/ h+ [. c$ r5 y% E4 q * <>Title: pdf extraction</P>, y+ e( ^/ {2 G
* <>Description: email:chris@matrix.org.cn</P>
! m0 a7 h0 C$ o) D3 J  g * <>Copyright: Matrix Copyright (c) 2003</P>
$ L, g& c) z! h! T2 O  C * <>Company: Matrix.org.cn</P># J6 u+ S) \% _1 z% }4 U, Q
* @author chris" g. K& q' C8 u( |6 E: v8 g; Y
* @version 1.0,who use this example pls remain the declare3 f3 ]) s, E6 i& X/ I- y
*/
/ I% }  H% Z3 x+ b, r4 B* B3 Q" ?4 {
public class PdfExtracter{# j: T  j* @$ y- m

5 o1 P9 |0 p% K2 Gpublic PdfExtracter(){
! J2 ?+ ]5 D- f  }2 @2 g, ^% D2 ]8 i9 B3 G. T0 _; J
public String GetTextFromPdf(String filename) throws Exception
' l, B% o, J- y3 l1 X5 ]7 q  {8 o* y! o; f7 }( s
  String temp=null;9 f! R6 H0 M+ g; t" ~
  PDdocument.nbsppdfdocument.null;
3 @! ^8 O. S/ J9 t6 Y  FileInputStream is=new FileInputStream(filename);3 n* i# D3 [9 G, J8 j) ^+ B0 d
  PDFParser parser = new PDFParser( is );, x; q6 s; p" q* \( X+ Q% m3 G: J
  parser.parse();! Q& A0 }* j- f; P) Z
  pdfdocument.nbsp= parser.getPDdocument.);
. l2 c; t! X$ ^+ G2 [/ ~! d! L  ByteArrayOutputStream out = new ByteArrayOutputStream();
% u4 g6 K; ]4 q2 p+ c0 _8 J/ v  OutputStreamWriter writer = new OutputStreamWriter( out );
3 Y8 |9 l, G. o) _1 I( c  PDFTextStripper stripper = new PDFTextStripper();' D0 n9 T0 m$ h/ q$ E
  stripper.writeText(pdfdocument.getdocument.), writer );3 O8 S4 o3 p& b! {9 E
  writer.close();% X# p" Q8 H  [5 c9 B" ^
  byte[] contents = out.toByteArray();; c3 w# o4 ?1 m% E0 ?- @
/ |; S9 J; V! \# [7 y
  String ts=new String(contents);' u, b* c. c5 k8 ~3 p
  System.out.println("the string length is"+contents.length+"\n");% b; N6 E+ L% y
  return ts;8 z; e+ [5 a& r) T- x: A
}
2 m( k0 [$ }( |2 `0 Qpublic static void main(String args[])3 Q4 ?& y$ \, a8 R; g  Q
{
, H) U' R1 |3 e% _! k) r) |) ZPdfExtracter pf=new PdfExtracter();1 R* Y* y' ]7 b) s) Z, X
PDdocument.nbsppdfdocument.nbsp= null;3 w) ^' n9 Y( V

  B5 {7 {# ^8 B1 F8 ]2 Ctry{
& A, N/ q; O  T( ^6 VString ts=pf.GetTextFromPdf("c:\\a.pdf");
3 _/ Q  Y# C  V; A1 {8 n0 KSystem.out.println(ts);
% t! s( d4 w2 f4 {, E7 y3 l}- g* p# ~( Z; o- `1 X# \) a
catch(Exception e)+ g) ?' i+ p) p6 T# a+ ]
  {
' ]* y# a# V( O& N  e.printStackTrace();/ \  m6 c& w0 u
  }% I0 L' r% e2 o& z4 ~" z- F
}+ Y: B- k9 `2 v5 j9 h: u

9 R) s$ }+ p2 b, W/ l}
: k* T0 u" ~1 g# d! j* x6 }</CODE></PRE></TD></TR></TABLE></P>. Y4 Y7 b. c9 r- i
<><A>4. 抽取支持中文的pdf文件-xpdf</A>; Q; S% y$ g. ^9 g9 Y+ k
xpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P>7 F1 N0 j0 {8 S! v0 b! c: E
<>下载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>
9 _% ]0 j. ^" J<>同时需要下载支持中文的补丁包: <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>
4 Q; ]* E; A5 K6 K; x/ a2 D2 W<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>8 u# o# o7 }0 N0 K4 ~
<P>下面是一个如何调用的例子: </P>1 R: k/ p0 g9 a* Q9 ?- Y
<P>* M8 m8 @) j, ?; m9 x4 i3 p
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">( `- O4 J- i, N3 M, [
( [; [' b5 ]$ k; g. {, H" j
<TR>5 }9 P4 K* E9 [$ {8 N8 ^5 i
<TD><PRE><CODE>
2 D( {. X: w8 }import java.io.*;
; ^3 G' b% A9 x: l- D& w/**( P$ S, X0 ]' j2 ~
* <P>Title: pdf extraction</P>
* e- Q! a9 ]9 c: O1 e7 V4 b. I * <P>Description: email:chris@matrix.org.cn</P>- c0 Z4 {$ \# Z- j2 |
* <P>Copyright: Matrix Copyright (c) 2003</P>: X: V' ?" [5 p1 _& a" @+ e* l6 Z# }
* <P>Company: Matrix.org.cn</P>- i0 ^: o, Y4 U2 r
* @author chris' t7 ~! E; G5 K, p% g0 g( K) A+ Q4 ~
* @version 1.0,who use this example pls remain the declare
/ k- _/ p4 ?8 h2 | */6 j6 I) b0 d( U/ j9 ^

: I& Q& U# A, @' ^
* |( i7 A4 Y& `public class PdfWin {
$ `! P- Y( t0 ~8 G& |3 }  public PdfWin() {
3 j0 r" j+ V) @- j  }' @( O/ \+ ~% y! U) Q% T" q
  public static void main(String args[]) throws Exception, J& q% ]- E# e) N
  {
! M6 p/ ^5 x% S    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";6 R% P6 P% ~( r& V/ d+ y( [% v
    String filename="c:\\a.pdf";6 ~9 {$ ]) Q- p. n) @
    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};
. {, x8 y- Q& N9 K" J    Process p = Runtime.getRuntime().exec(cmd);5 |/ r3 i4 v& u( B5 s& {2 U
    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());- d0 q" ~; o- |
    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");
- D$ @- n% C2 }8 }( a- m. V+ \+ Z    StringWriter out = new StringWriter();
4 n, J" j. f4 D' ]- P2 S    char [] buf = new char[10000];
, ^$ y. r) [; S* {6 k' ^! a" e% r    int len;
( Q0 x! Z2 }- a8 W- ^3 m! _    while((len = reader.read(buf))&gt;= 0) {
- E4 Y$ E6 w, B1 R  V    //out.write(buf, 0, len);$ ?# Z6 S  S7 ]5 N' G# A
    System.out.println("the length is"+len);
0 e. z* b* B3 K8 f# ~    }
: U; U6 o5 s9 p8 t9 n1 ^    reader.close();
" v0 a1 |# k! q0 T5 T    String ts=new String(buf);' e% e! C7 z( A, a9 b0 Z+ B
    System.out.println("the str is"+ts);
; _+ \( J, t8 ^' [. E, F, X& f1 ?  }
) D6 o. E2 B  A- l) ^; b, u}
, b6 K. F' O8 w7 o</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-1-11 08:21 , Processed in 0.480726 second(s), 55 queries .

    回顶部