QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4341|回复: 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>! _# }( c1 }* k2 ^/ y
<><A>1 .用jacob</A>/ t0 Y" E( ^$ ]7 c
其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>
% w4 |2 L5 g: v, P1 b<>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 w6 ?% w- N5 {% [1 s  s2 `
<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>
9 H) N: e& Q7 V+ M6 [" N8 `2 `<>2 z/ l: W/ j; X/ D& t$ ]0 }# k0 w  W
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">
0 v/ H$ d0 u! }5 r: E  P/ g2 q, c8 P2 e& k
<TR>
0 U% c6 P0 H5 O. B- h( l8 V# \8 w<TD><RE><CODE>
( j! v: T$ u/ H; c1 x5 Bimport java.io.File;
* O& x1 G' Y) d! f0 N5 l5 jimport com.jacob.com.*;
$ I- e$ r/ b( D4 z2 u! G- rimport com.jacob.activeX.*;
+ Q! ^4 ?. [4 h+ g' M! u0 d5 _/**9 K0 L, z8 m6 _, r
* <>Title: pdf extraction</P>& }/ r" M6 A" k1 `0 |
* <>Description: email:chris@matrix.org.cn</P>
! G1 C8 d7 e3 i9 z( ` * <>Copyright: Matrix Copyright (c) 2003</P>
; L8 p$ H" E+ I/ @. ]& E* L  W * <>Company: Matrix.org.cn</P>
# _- L% o+ V/ B; |2 k * @author chris& h$ N$ A) g9 h  F/ K* g
* @version 1.0,who use this example pls remain the declare' \  s) @: k/ H* K
*/9 W( F6 o7 O& `9 R; p$ C
public class FileExtracter{
& w; e  P3 I- I2 ^/ J+ t! \ public static void main(String[] args) {% m- }4 R; Q: r) W8 o( k9 p# T0 f" n
  ActiveXComponent component = new ActiveXComponent("Word.Application");
$ z- A) F+ G( i& F9 K6 t  String inFile = "c:\\test.doc";- z- x4 i- [4 K$ Q* \% R+ @: W* F
String tpFile = "c:\\temp.htm";& N$ H& l0 y- U) r/ D( a* F
  String otFile = "c:\\temp.xml";
% K& o: K; i. m, F! i  boolean flag = false;5 b9 m0 ]% W+ Z; i  x$ j' [
  try {
7 H" z$ Q  Q# X' F. S2 n   component.setProperty("Visible", new Variant(false));# G* ?8 \; r9 G0 ]
   Object wordacc = component.getProperty("document.").toDispatch();
( C% G4 }/ h' H! {5 W# r& q3 X   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method, 4 t( X8 O, x! q, k
                                     new Object[]{inFile,new Variant(false), new Variant(true)},
8 q, M. j0 Q$ D+ s8 R                                     new int[1] ).toDispatch();6 m4 r' {! `7 T  |1 q1 r& e
   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);
' T+ ~" K3 k( `, F   Variant f = new Variant(false);
1 q1 S8 ~+ ^6 J# I8 i   Dispatch.call(wordfile, "Close", f);
( {: G& S1 [' ]8 ~, n6 R& U7 K6 Q   flag = true;/ f( B. V( f& v2 |' v
  } catch (Exception e) {) M8 W0 J  y# B+ L3 k' n
   e.printStackTrace();, I+ |7 Z+ v7 R
  } finally {
, M5 p  I- m: l   component.invoke("Quit", new Variant[] {});- T9 _, y  Q$ b+ h& a. _$ w
  }- I0 C. |+ X4 |6 y, o- v# W/ Z
}8 U" b* m) z" b1 K! E) D( M  l
}7 H; k4 j1 e  R/ M0 q% O6 B
</CODE></PRE></TD></TR></TABLE></P>  i8 o1 Y4 t# @5 u1 r& _- O+ r
<><A>2. 用apache的poi来抽取word,excel。</A>
- P# \- h* ^; K& S3 I! R) X% Bpoi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>
' S& X) F7 ?. A4 B; ^* J<>下载经过封装后的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>) c( @- J% f9 |7 ~- O
<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>2 A* u/ H" K* p; ~# }) @
<>
% _4 r) K" r2 g/ B<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">( k. |# O# @% K3 V8 P7 s

" Q& }& \+ X6 n, n4 J<TR>5 x% L9 v5 [  H7 [& k
<TD><RE><CODE>" I5 c# N: z# }. k7 `6 h
import java.io.*;
# [% b3 }& D: V& N  Pimport  org.textmining.text.extraction.WordExtractor;% H* k  {: F3 B+ N6 G/ M
/**
- t( n. \' c! y' |" U; u& Z * <>Title: word extraction</P>
' `% {4 S3 F1 q3 ?# i * <>Description: email:chris@matrix.org.cn</P>/ c4 @/ Q: v, ^3 P
* <>Copyright: Matrix Copyright (c) 2003</P>
/ W2 V  O& X6 ?# m4 x% k9 P" d * <>Company: Matrix.org.cn</P>1 W7 N0 T/ I$ y5 R) g( i9 ?
* @author chris( L( O8 `" h& w" o1 @, q
* @version 1.0,who use this example pls remain the declare! Q" F" c! @  n# s, Y+ z
*/4 u( [0 k0 M: L, s
9 K" O3 U0 Y0 ~6 L2 \
public class PdfExtractor {1 u$ x) e) L/ ^2 D- F9 Y* x9 @) W
  public PdfExtractor() {0 ~( S' z& u: M$ z" |  n
  }
* J& {6 `( [5 I3 J- C' A  public static void main(String args[]) throws Exception, P8 F" W8 t5 `1 s* w
  {- ]$ O( g0 p1 x1 N' H3 }" x. A
  FileInputStream in = new FileInputStream ("c:\\a.doc");
" l: F3 X3 \9 ~1 i4 f$ B- Y  WordExtractor extractor = new WordExtractor();" o6 t# ~' S, s# t4 y
  String str = extractor.extractText(in);
* T- E1 H/ e$ g7 T" V# l  System.out.println("the result length is"+str.length());
; G6 S( M9 I* k5 R+ I7 \% P2 s   System.out.println("the result is"+str);
/ c/ N& ?: O! `/ I. D: P% V- C" m}) n6 G* U: Y' H4 Q9 v# x
}6 A6 ~  |0 Q/ \5 [! R! A
</CODE></PRE></TD></TR></TABLE></P>$ c+ s8 K' W1 k% }& A
<><A>3. pdfbox-用来抽取pdf文件</A>
; C3 n4 @# @/ @+ {但是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>
2 k; D6 \" @! \  s<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>
7 h* ~& l) ?6 x$ m  \<>
& w$ u% Q  j9 p" I( M# [<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">9 w, b3 [: x6 h5 E

: q0 b; W8 m! o4 o+ o  s; v6 j" f$ i<TR>
# O3 e5 ^) l2 {<TD><RE><CODE>
4 }8 |' R0 U4 h3 l! iimport org.pdfbox.pdmodel.PDdocument.
, R* R; `# e% X% H+ w0 j' n- @import org.pdfbox.pdfparser.PDFParser;: D# R9 ]! L$ N' C
import java.io.*;- J' q9 K& O6 C: b. v- w
import org.pdfbox.util.PDFTextStripper;
5 p3 _4 w* b6 K! w* wimport java.util.Date;0 x; k: M) g; Z
/**& m* _8 q$ M$ K. x* t! q( p" ~
* <>Title: pdf extraction</P>! i& G2 I- K; K! r
* <>Description: email:chris@matrix.org.cn</P>2 W5 @/ X  a  C: o2 s; Q4 q
* <>Copyright: Matrix Copyright (c) 2003</P>
3 t5 n8 Q. A7 m( f/ ? * <>Company: Matrix.org.cn</P>1 \4 s0 o, O3 C
* @author chris
& e' Z. e' c0 v9 L+ | * @version 1.0,who use this example pls remain the declare
6 o( W- N3 T  u% \$ s1 t  T */! X  c' a8 ?+ ]; W+ z8 u
! f; {) v  d3 ]6 i, m
public class PdfExtracter{7 l" h9 ^- l$ Y" B7 K' Q, Y. }4 m

+ D6 |* V) ?% P, z; f3 i8 Q2 Spublic PdfExtracter(){5 z5 p! h' g' Z" t% P$ Y
  }" v* q. J. G' A
public String GetTextFromPdf(String filename) throws Exception) l0 ^( n0 ?) k, X6 t+ h
  {" _8 `1 @1 h2 C# u
  String temp=null;% R" U& i" h2 j
  PDdocument.nbsppdfdocument.null;
8 i: O6 x3 z) V7 g" }  FileInputStream is=new FileInputStream(filename);
1 _( J3 A5 K9 V: D* P  PDFParser parser = new PDFParser( is );  F/ ~5 z+ A8 {, W& V7 |; B
  parser.parse();
$ |: Z; f. D; I  pdfdocument.nbsp= parser.getPDdocument.);# E+ A+ z8 d. L4 e5 p
  ByteArrayOutputStream out = new ByteArrayOutputStream();
$ H7 l, F) d$ V- Y2 S1 l% \  OutputStreamWriter writer = new OutputStreamWriter( out );0 y- d6 _$ U1 j$ r
  PDFTextStripper stripper = new PDFTextStripper();  L* g) H. {: H/ ^# k. C
  stripper.writeText(pdfdocument.getdocument.), writer );
$ j( s2 `& Z" `/ S9 s2 _  writer.close();
1 Y+ Z% ~. N& k  byte[] contents = out.toByteArray();
6 m0 t; F" ]! h  f6 ]$ P* R4 Q
; z- {# J! O3 @1 G  String ts=new String(contents);6 ~% ]9 o9 d! e: Z6 R% o
  System.out.println("the string length is"+contents.length+"\n");3 g* \+ u! t0 H9 q7 Y3 v
  return ts;$ A5 V9 ~  u) S9 I8 m2 y
}
( ]; e$ d4 H& }2 w! r9 E/ u: ipublic static void main(String args[]), X+ F, `& u) [+ x) }, {! H$ P
{0 Q: u5 ^$ M6 z
PdfExtracter pf=new PdfExtracter();
# A9 g/ ?1 B0 T: s% A6 APDdocument.nbsppdfdocument.nbsp= null;
) u, X: ]' }9 }# ?- n% d; R  n7 s. N2 Y' k- Y8 |6 M
try{9 R2 Y4 ]$ W! G1 E% L' l
String ts=pf.GetTextFromPdf("c:\\a.pdf");$ u5 }! J' q) j0 h% R2 ]
System.out.println(ts);& ~4 Q9 C2 v: j5 v5 O4 V
}
2 g7 ]9 z0 Y# G* ~catch(Exception e)
6 Y2 ]9 n* p- c  {
% x3 x; M2 j* k6 L7 l  e.printStackTrace();
1 P  z' Z2 G% u) [6 ]  }0 q& @3 O& L6 g6 L2 g2 q) Q' E( H
}
; [" ?% G3 W( q  W; ~1 w5 B; j' P) b# `3 M2 e% b
}
3 M8 r; x/ h0 w2 v0 u' n</CODE></PRE></TD></TR></TABLE></P>
. ]( b4 @& @$ S5 \4 b<><A>4. 抽取支持中文的pdf文件-xpdf</A>  D$ l, x3 J4 B% a
xpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P>
9 t6 j; ?- [# x8 U' v3 d7 q6 O<>下载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>
. A  C. Q5 m8 x7 S/ U( M<>同时需要下载支持中文的补丁包: <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>3 d7 z+ c  `, ?8 M1 Z6 o+ y# `
<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>
+ g, ?  U. M5 h1 _* k# [5 ^# S<P>下面是一个如何调用的例子: </P>
( n/ O) Z& q/ S) d<P>% }+ M* s+ C6 ~; Z- X& J  Z: p4 v
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
; B4 r. P; _$ Y* g& Q/ F# i# r% ?/ O1 E" d  Z) A/ z
<TR>& d  U8 C( C- ~$ M3 q6 A
<TD><PRE><CODE>
+ ~+ I3 N4 M! C% j5 L5 Zimport java.io.*;
) `# C  C& o8 B" Z% C6 _- f/**
5 M4 X3 W, m  A! B. I% @3 V7 A * <P>Title: pdf extraction</P>
. i2 p7 w5 b& z2 d( Q: k' p * <P>Description: email:chris@matrix.org.cn</P># B8 d! c$ ]; U  c  B
* <P>Copyright: Matrix Copyright (c) 2003</P>
& H. S3 L+ O9 f4 [ * <P>Company: Matrix.org.cn</P>- c8 R: t/ Z0 ^% f2 [& h7 z9 D
* @author chris
) w1 D! D% v+ M. O * @version 1.0,who use this example pls remain the declare4 c/ D  K7 y) p
*/  B* W; n4 _& M2 h* y+ T
* D* w# Z* Y2 P( T6 m
4 E$ o0 n  l& w/ Y$ T$ J' [
public class PdfWin {0 ^- X' U4 M3 X& x+ P
  public PdfWin() {) u  L# o9 V% C
  }
9 Z. L5 b1 ^( m- q0 ~  public static void main(String args[]) throws Exception7 P; J9 A2 V0 D% b
  {; @; Z5 K' o/ i4 _1 L
    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";
. n4 E! }( H- @$ ?" A5 a6 i    String filename="c:\\a.pdf";
8 O+ F+ c" d6 y0 V    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};% A1 |# V- k! A2 U* ~3 L
    Process p = Runtime.getRuntime().exec(cmd);1 _; M" \' c$ q$ M4 r2 r$ ^+ H8 g& X
    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());: `. I  X! z4 B3 K% i
    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");/ q! h# B2 x, X: |. ]3 L6 G# V
    StringWriter out = new StringWriter();" n+ j( s/ a( f
    char [] buf = new char[10000];7 I( Q, ^9 Z9 h2 b6 Q5 a) b" r5 Q
    int len;
- O0 ^2 G! v* d7 N% m& K" o3 O" s    while((len = reader.read(buf))&gt;= 0) {
+ c/ @& W9 k- |) d  o6 Q, F    //out.write(buf, 0, len);" E6 X# \- D( o4 F* U2 D# _. I
    System.out.println("the length is"+len);
% m( c! ^; w7 Q4 C$ e    }& f: E) A# K2 q
    reader.close();
1 K  s+ P, u% I& J. N    String ts=new String(buf);9 u/ }; `+ k" _, `! C
    System.out.println("the str is"+ts);3 _" b) j# e* N  n9 N8 n1 H
  }
1 H3 ~5 g# u* r" E# E* Z}; K# ]; I  q  L" V
</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

    回复

    使用道具 举报

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

    fastpost qq
    收缩
    • 电话咨询

    • 04714969085

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-11-1 13:40 , Processed in 0.195161 second(s), 56 queries .

    回顶部