QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4259|回复: 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>4 b% W3 X6 |! A! l! b
<><A>1 .用jacob</A>1 ]1 N5 a5 w: B8 H* L
其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>
' c/ z2 K- B3 W! 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># P* v/ |+ d( c8 i! R: M
<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>9 B% ]6 b+ e5 M) h/ E) S
<>0 o% s; `" w4 D- K# V
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">
9 X7 b1 u7 Q1 T$ f  |) x1 ?) c5 e+ ^/ }; }# ^
<TR>
& j- v( ^' O/ x, i<TD><RE><CODE>; m8 b5 o* p& b$ i; i3 W/ Y1 R' ^
import java.io.File;% V& n5 l/ p+ y; L& G
import com.jacob.com.*;# }7 y% U) k% {
import com.jacob.activeX.*;
+ d+ [$ i" e% L' N: }/ b/**) x5 P" d* F- n0 o' f
* <>Title: pdf extraction</P>6 Y7 @+ [' m5 v) U4 Y2 G5 H9 f
* <>Description: email:chris@matrix.org.cn</P>" T! a6 V+ \/ @: S  B  g+ a
* <>Copyright: Matrix Copyright (c) 2003</P>9 n3 i/ b9 ~; }: l  M& ~; v/ \. x
* <>Company: Matrix.org.cn</P>& B7 O8 D2 ~, ?* p; F6 b
* @author chris. X& c% B& W5 G/ D* E/ ]$ J. w2 ?: I$ f
* @version 1.0,who use this example pls remain the declare
7 b% @* c; {$ X& t+ x+ W */. z4 F' T9 X: J' a& ~0 N- i
public class FileExtracter{7 u4 ?! R" F% H
public static void main(String[] args) {8 I8 z% x0 Y# N- W8 T% y" L
  ActiveXComponent component = new ActiveXComponent("Word.Application");
* z  U8 X/ k1 j9 o& @: {  String inFile = "c:\\test.doc";
6 f6 p# X$ }. ?( g5 S String tpFile = "c:\\temp.htm";% p& t* r* r; ~
  String otFile = "c:\\temp.xml";6 s, N: {& u- `8 S* {( W
  boolean flag = false;
. v5 K7 K; }- I5 Z# L  try {- ], b! _! }3 e9 K
   component.setProperty("Visible", new Variant(false));
6 ^9 ?( U3 d5 K3 S   Object wordacc = component.getProperty("document.").toDispatch();
8 |$ P2 _0 |4 l$ T# r4 o# H+ {! h( ~   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method,
5 w! d; e" u8 y* R                                     new Object[]{inFile,new Variant(false), new Variant(true)},
; r# c9 B. n1 o3 G+ V/ F/ r                                     new int[1] ).toDispatch();
3 @7 A" n3 T! }2 C8 Y   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);9 S5 A: r& M! N4 X2 f
   Variant f = new Variant(false);
0 V) N0 B% k1 l   Dispatch.call(wordfile, "Close", f);
$ F) I. K$ ~8 r, V8 }+ h2 D8 \+ A   flag = true;: k( ]) ~+ k  d/ ^" I
  } catch (Exception e) {, I' Q$ [) v( d7 u9 d8 z/ u
   e.printStackTrace();
. K7 O) @& n* ?: ?  } finally {. B% s3 k- G: Z5 ]( X' [+ B+ \
   component.invoke("Quit", new Variant[] {});
! `5 V  I4 ~9 R: c  }& K; l1 t* ?# ~) z; d  t
}6 ]9 A" r1 v/ r: w3 _+ D
}
* H3 P) V0 c9 t1 L</CODE></PRE></TD></TR></TABLE></P>
4 W: x& F3 L" K% e, i- F<><A>2. 用apache的poi来抽取word,excel。</A>1 d8 }% E- M7 x) {1 x; i
poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>
9 [0 F8 b) w! U, |! L  S/ Z% m) z6 o<>下载经过封装后的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>
4 X3 M  q; x8 z' y<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>- N: C7 S/ I" O
<>
  k/ w0 S% Y6 [2 k6 p3 b# l5 M2 N<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">% W6 q0 C, j- k0 S/ ~4 _
3 w3 b3 u+ H/ {9 M
<TR>
: {+ M7 t2 v3 X. K<TD><RE><CODE>! T! T0 ~1 Z* a5 x* D+ J* V
import java.io.*;
7 g/ Z1 w6 [  e  F$ T) Simport  org.textmining.text.extraction.WordExtractor;7 R9 D9 C2 p: @' ?
/**
! L% ?0 P" {, Z& V% C3 L+ L: q * <>Title: word extraction</P>$ a9 q- k" B, `/ x. l; u2 q. Y' F
* <>Description: email:chris@matrix.org.cn</P>
& F5 @8 C# w( {3 A1 D6 J1 ~ * <>Copyright: Matrix Copyright (c) 2003</P>
$ f3 N$ }0 |5 |% _9 [$ A * <>Company: Matrix.org.cn</P>
( h) z) q" e$ p' P1 B- D' `  w * @author chris
0 `& k' u4 C( l! k+ g. v * @version 1.0,who use this example pls remain the declare
. q0 P. s+ G/ p# p7 n. P* H */
# x- z9 W0 N! d" t9 I5 \( `5 n. n: ]/ ]% ~3 N, F& S
public class PdfExtractor {8 w; X2 G& |# m
  public PdfExtractor() {; H8 K" Z/ i- z; g
  }3 a. f! w; i- p9 U
  public static void main(String args[]) throws Exception
: i8 g/ N2 L, g- X  {9 z& v' Y& ]/ r. C
  FileInputStream in = new FileInputStream ("c:\\a.doc");
1 W; w8 Y! J7 h" B/ e8 S  WordExtractor extractor = new WordExtractor();/ Q$ D( ~: u, v" C2 E! f
  String str = extractor.extractText(in);/ Z4 Z( x# c) s: u: u  S% n3 \: F
  System.out.println("the result length is"+str.length());7 k" A% B; j! ^5 q" a, I# g# P
   System.out.println("the result is"+str);
- j0 z+ U+ H6 s% }}
/ ?/ Q! v4 K8 X. }}
0 l% z+ y9 Q5 U2 T7 b' i- O</CODE></PRE></TD></TR></TABLE></P>6 S( O- I# n+ \6 T1 b" D
<><A>3. pdfbox-用来抽取pdf文件</A>
0 J. x6 C9 f4 k+ Q( C但是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: [3 m7 U0 \. f3 C" Y: `4 z
<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>
  f: ?& t3 G- c, N$ c<>& N/ m7 y" h) Q$ l* W
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
' T; m7 ^6 L; J7 {2 u+ q# R/ B  [0 M" [( l
<TR>
; S8 a9 A, R5 @7 ?) I: |# v6 M<TD><RE><CODE>
0 N( }) ^! A* \: g+ v* Kimport org.pdfbox.pdmodel.PDdocument.. |8 p' O4 T% S9 [
import org.pdfbox.pdfparser.PDFParser;
1 ?" t7 a4 O+ C9 t& |/ R  qimport java.io.*;
; j; A5 E1 s6 {' g$ _8 y- ]import org.pdfbox.util.PDFTextStripper;: a+ b1 T+ b, T6 h* G  O
import java.util.Date;
) m5 ?1 T4 g' z- ?% M7 ^! Y/**
8 ~4 ]  L# }7 v9 A. j * <>Title: pdf extraction</P>
7 F4 H2 p6 R5 ~6 z' I * <>Description: email:chris@matrix.org.cn</P>6 W$ ?/ ~1 {. [) g
* <>Copyright: Matrix Copyright (c) 2003</P>, W: b; d5 m9 d
* <>Company: Matrix.org.cn</P>* Q7 a8 Z- ?5 e3 _4 Z  k
* @author chris2 O1 F5 R$ k1 `7 h7 q2 k
* @version 1.0,who use this example pls remain the declare
- c# G( X5 \$ A: Z0 ^3 w# F0 } */3 l7 t  Q0 `% J) c2 H8 `# H

, k! f9 X0 I, O+ Hpublic class PdfExtracter{: f  o" I% E8 {2 r+ q4 ^

+ L  r$ ?% N$ D9 b- hpublic PdfExtracter(){( s1 D) n0 J2 y( ?* M3 h
  }
4 X1 Q6 ]; r) e, i. z8 zpublic String GetTextFromPdf(String filename) throws Exception/ W$ q4 R. b- q4 q8 V$ p( K
  {
& j8 Q+ a9 D  L: C4 p  String temp=null;
/ g2 h( N2 A* @1 H  PDdocument.nbsppdfdocument.null;* I3 D0 J( Y' M9 ^
  FileInputStream is=new FileInputStream(filename);* s; {0 `+ Z+ @6 ^5 W$ e# D4 _
  PDFParser parser = new PDFParser( is );
) H5 H4 y* Z. C. `  parser.parse();
4 v6 x! U. w; b/ Y3 k( N+ Z' B3 o  pdfdocument.nbsp= parser.getPDdocument.);- P3 \3 z; {& }
  ByteArrayOutputStream out = new ByteArrayOutputStream();
' R' W$ ^! T8 D$ }8 v  OutputStreamWriter writer = new OutputStreamWriter( out );( v- K# p" o; p' S1 |' T. s, |
  PDFTextStripper stripper = new PDFTextStripper();
8 v1 W! v* x# V2 V  stripper.writeText(pdfdocument.getdocument.), writer );, W% {: V$ T" p
  writer.close();
  w( m* C; ?  u, J0 P3 E' E  byte[] contents = out.toByteArray();" i0 m2 r* e# |! E, w) i

1 t, _) P) N2 J1 J( Y, h2 w5 X9 A' W  String ts=new String(contents);) v/ B& e: K2 w2 l' V
  System.out.println("the string length is"+contents.length+"\n");
, R3 E" [* w. \0 y. S% I) O2 i7 t  return ts;
" }5 A% ^  s& X6 t- j- J3 v}
( |7 k- t4 H- |7 l9 lpublic static void main(String args[]): a3 R8 p' m. [5 I! _
{
) O8 R: {* i1 J8 n% E6 iPdfExtracter pf=new PdfExtracter();
: H! q1 U! ~$ P0 z$ wPDdocument.nbsppdfdocument.nbsp= null;
: Q3 v$ m9 q$ P& }8 c+ A4 {# q5 `
: K6 [' y* \, _$ S3 A/ f- Atry{9 H; h( n0 s9 z, d* N
String ts=pf.GetTextFromPdf("c:\\a.pdf");2 y! \  W, [( F7 v# ?5 T; {: ^
System.out.println(ts);3 ]# w8 e5 h7 [) _' b% E; x
}
1 |! e! D) x" ~) S: `catch(Exception e); S+ F  l4 k. O; {2 J
  {- T  ~  i. R* W
  e.printStackTrace();
% c# U; ^3 o9 L. w: O7 ?2 a. A  }
1 H' Q1 s  s7 p2 z& N}
1 h( a* H( p* \0 _4 i, X/ m  r8 _# H  ]& c# ~3 {2 E* [
}& }1 T; c/ b1 Q* C- z( \
</CODE></PRE></TD></TR></TABLE></P>1 a5 h; z# K( t! }, Z0 r$ R+ H
<><A>4. 抽取支持中文的pdf文件-xpdf</A>8 h4 t, F" @; L
xpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P># s. \. o9 `5 d9 m. y- m* G4 J! F
<>下载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>6 l8 o& D" r7 r$ Z% i) ~5 w2 [  E
<>同时需要下载支持中文的补丁包: <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>$ m+ Y$ e# o4 m4 B) S! _+ i
<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>
' i4 T  o- W$ s* n$ |9 f<P>下面是一个如何调用的例子: </P>
2 {; Y) V- l6 x0 u- v4 k  ~<P>& l( k% X: K7 p1 N
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
1 F* f# }9 j8 ?4 g# v6 H0 o' u$ y! r: ^2 z9 g; A3 I3 l2 H% h; A7 P
<TR>
7 z( l% A7 i1 r: a" M! E) i1 Y<TD><PRE><CODE>) `* a, H* z  W+ E+ g( b
import java.io.*;
2 X' B4 c; G6 _/ i7 h( U/ `" D2 O/**. N$ F7 H1 b3 Z/ m6 ~" K
* <P>Title: pdf extraction</P>) U( l$ r6 y$ Z" i+ ?9 j; F& d
* <P>Description: email:chris@matrix.org.cn</P>- m* l- H0 ~- |' Q6 R
* <P>Copyright: Matrix Copyright (c) 2003</P>2 ]+ `% x- B2 o2 W) G
* <P>Company: Matrix.org.cn</P>
7 x# f' G# x+ Y  K8 W * @author chris
  o7 Y+ m: B2 v" V+ W5 ^- U9 X * @version 1.0,who use this example pls remain the declare8 F; ~* L5 H' ]. h8 ~+ f" }* r
*/
7 H/ q! a; c5 J1 c8 p
$ h7 R, n: s9 R- f* Z; m) ?6 ?7 X& _; P
public class PdfWin {3 I2 B$ k+ W9 S! H
  public PdfWin() {
9 ?: p* A1 K  A1 j  }
1 j' n8 }( f0 Q9 U. o  public static void main(String args[]) throws Exception: `1 R( u- s. x' G5 }
  {9 m7 F" h, G9 Y( R
    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";5 v7 |  D2 b5 V9 Y9 r; a/ {
    String filename="c:\\a.pdf";
$ R5 t9 C# t/ P+ \8 d% ?. \    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};
7 W' O& ]  \+ {4 C    Process p = Runtime.getRuntime().exec(cmd);. a% X* F* L0 n/ T& s* J' R
    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());% @/ u5 m4 R/ i8 E
    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");
  E# B7 z' A. j$ K    StringWriter out = new StringWriter();
* \- J/ X/ v  A    char [] buf = new char[10000];
! o0 S: [8 [: B2 P8 u/ b    int len;, l! N5 |4 M. x! N# y* ?
    while((len = reader.read(buf))&gt;= 0) {3 V# k& A( l3 d
    //out.write(buf, 0, len);" r: a# E4 u! F% r/ \
    System.out.println("the length is"+len);. u% @) B* K: e7 u/ W* p
    }
/ L2 I! E, U7 ~1 V: c    reader.close();
, l4 T# o5 g9 ?) ]) U' Y    String ts=new String(buf);
! R) Y5 o0 X9 r% a0 c& I4 A    System.out.println("the str is"+ts);
" @9 A; G' I" X4 s6 o  }' t% S: f+ J% {/ \" s' h
}
; |$ S& t! R& }! I( ^( Q</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-7-31 15:28 , Processed in 0.522383 second(s), 56 queries .

    回顶部