QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4253|回复: 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>
$ y2 g2 `. r2 q<><A>1 .用jacob</A>% R) A4 i* ~9 X
其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>2 p0 j2 L4 [  f9 {& H  k2 r
<>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>
" B+ F% X* @. N0 Z* N+ z+ ?<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>% M% E- }7 {- t+ L0 ]" i7 @/ Z
<>
& p7 h) F! |9 i% W1 @9 y<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%"># b5 s! |8 J1 @2 j

! e# \  r( Y! j% X<TR># ]: a7 x  w  A2 ^1 A
<TD><RE><CODE>
9 V0 d) [- e! [; v& T7 dimport java.io.File;0 y. @$ i& X: l  d% }5 K: V
import com.jacob.com.*;
: o. Y8 I' D+ V# P; K' ~import com.jacob.activeX.*;
# K) H0 j: S& k- F# ~# T/**
# f# j: r6 i% @$ J2 i: A * <>Title: pdf extraction</P>
8 h6 r" o4 l. K6 ]0 v, |* B * <>Description: email:chris@matrix.org.cn</P>
8 e: X7 _# k- [, W: H% p * <>Copyright: Matrix Copyright (c) 2003</P>5 k7 y4 Y# E  R9 `
* <>Company: Matrix.org.cn</P>
$ O6 s& y4 n" B% l+ ^) r. x * @author chris7 @( s; i* }7 `/ B* ~3 O4 P# q6 L" h, i
* @version 1.0,who use this example pls remain the declare4 m% C, f; k& N: F$ g
*/  z' b5 Y0 M  C
public class FileExtracter{# f" S/ s: n6 F/ B- r
public static void main(String[] args) {
4 k5 [/ p, Z. b% ]+ ?0 J6 f  ActiveXComponent component = new ActiveXComponent("Word.Application");
7 G2 s9 O- d/ f; G3 v  String inFile = "c:\\test.doc";3 b) M. v! Q# ~5 [: V
String tpFile = "c:\\temp.htm";" Z6 g+ U8 h6 Q. q* y# Q3 Y
  String otFile = "c:\\temp.xml";
* W; E" ]2 r) k: O& `  T9 C8 o  boolean flag = false;
7 V# F( d6 T6 q  b/ X  try {
, H" \! @: h9 U" F$ Q+ k   component.setProperty("Visible", new Variant(false));
$ o9 Q8 C# _% g: S' s1 a+ e) A   Object wordacc = component.getProperty("document.").toDispatch();& Y. G2 R# x+ `/ t3 k  `/ E, x
   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method,
. O* Q& E" @" {+ i+ S7 a                                     new Object[]{inFile,new Variant(false), new Variant(true)},
; L" V7 {3 q; W                                     new int[1] ).toDispatch();8 o" `8 ^7 J/ ^' [- ?- K2 R! F/ V
   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);& _, r' H( d8 j- H) ~# g. s6 h
   Variant f = new Variant(false);' V4 O; P. G2 M- x. J& B
   Dispatch.call(wordfile, "Close", f);
  {+ ^+ ~% ~; y: X5 G   flag = true;
1 w% ~: c2 a  V. p  z% F  } catch (Exception e) {
% d* }6 i7 h. n7 a9 h   e.printStackTrace();
; i1 l& I3 N/ P/ R# h6 s  } finally {
; |; D6 }/ W7 M& M% Z   component.invoke("Quit", new Variant[] {});
# u2 O, E2 W. _+ o, {  }
' W; }8 c9 V7 y; c- |5 } }9 m# n. S/ Y( z, V% _
}# v& {5 C3 ~% F, K' D& ^
</CODE></PRE></TD></TR></TABLE></P>9 h3 Z/ K. W, M! `  @5 Z, q6 u
<><A>2. 用apache的poi来抽取word,excel。</A>
! |8 M" o2 U8 Y! d6 U" rpoi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>
5 G9 u% J+ l( Z: q2 z<>下载经过封装后的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>( D3 _5 c% y* k; W
<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>
8 C7 x/ B7 w( g% p* p5 g<># o, U, x# N" Z/ L; Z
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
" I/ M$ o" H9 b  u/ V4 V6 u, n$ w
<TR>8 m1 B/ ~" Z$ R6 B7 g: \+ A2 f# m" y
<TD><RE><CODE>+ k- v* B4 a* X, V1 t
import java.io.*;
& ]6 O' h4 m/ ]# \  q% p! |import  org.textmining.text.extraction.WordExtractor;
# F! F  `1 q4 C  v4 `/**1 D5 B) O4 q# n) c
* <>Title: word extraction</P>
* \: z: Q; s* `+ H: f * <>Description: email:chris@matrix.org.cn</P>* p; L3 m. M! P( p) Z# E
* <>Copyright: Matrix Copyright (c) 2003</P>
9 V  v+ K: T. p4 k) i4 ?0 f * <>Company: Matrix.org.cn</P>7 L! ]- |/ B% s: u0 B# S$ D. b2 j
* @author chris
" J( }: v* a4 @ * @version 1.0,who use this example pls remain the declare
& x8 x6 d) L7 z% L4 y* \: G */
' d7 q6 S! g# b6 C4 M  K2 {
7 k2 M, [# {1 m6 L! V0 @9 X1 Xpublic class PdfExtractor {2 M/ c6 Y3 {$ H0 L9 ?
  public PdfExtractor() {
' f3 k; C& K8 \  ]/ O) R8 q3 r& z  }
8 }  X+ `9 u" m# R5 J$ q  public static void main(String args[]) throws Exception  I5 I3 m, m: Z% q( N
  {
" L  t/ S0 N4 m, D1 E  FileInputStream in = new FileInputStream ("c:\\a.doc");
; @: {. f5 D# m( }5 s5 u2 \# p  WordExtractor extractor = new WordExtractor();4 ?5 r. Y: B4 ?7 C
  String str = extractor.extractText(in);
- R" N) v& l  n0 z  System.out.println("the result length is"+str.length());6 {0 [/ T. v; w
   System.out.println("the result is"+str);
; v3 o% T" ~* N; b/ ]2 [4 T& B8 a}
/ g+ L& W6 P) F8 f5 Y( R3 N}
: ]  H& I9 c8 A7 ?$ w</CODE></PRE></TD></TR></TABLE></P>6 p8 G+ D+ v2 Q( o5 X2 d( Y4 M, F* V. Q
<><A>3. pdfbox-用来抽取pdf文件</A>( h7 Y$ j9 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>
: Q- }9 z% ?4 U0 |<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>4 a. N- ?: v3 C5 S% r2 z
<>* q/ o  ^+ D- y+ o
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
3 J- Z4 P/ P+ ^. \9 p. V
5 K: |8 I( L& m. G" z5 l<TR>: A& j) _6 s( W8 I/ G! z7 ?1 d
<TD><RE><CODE>
, |3 [: C# M0 K, m- D# jimport org.pdfbox.pdmodel.PDdocument.0 a+ f4 w, N2 e+ |6 @
import org.pdfbox.pdfparser.PDFParser;9 L" |3 i& Y! }( U) z9 ]* L& L( E4 g
import java.io.*;, G( r/ P3 B, ?& q
import org.pdfbox.util.PDFTextStripper;7 `0 U3 f  L0 l/ g
import java.util.Date;
- g* ^" W3 k3 t/**$ `: t4 ~- l8 o
* <>Title: pdf extraction</P>2 q2 \" p' w  l4 [
* <>Description: email:chris@matrix.org.cn</P>
; e& w, r$ ~1 k * <>Copyright: Matrix Copyright (c) 2003</P>
% H$ c$ c. F& g" g0 X( T+ N7 S( ^! f- X * <>Company: Matrix.org.cn</P>
% v- n( [; i6 m* f * @author chris- r) D0 o. ]1 h" p  l1 g# \
* @version 1.0,who use this example pls remain the declare' N9 V0 t" n, R" ^' \
*/
  Y" R* X0 J6 E6 |" M0 D8 C4 W3 D7 k; I
public class PdfExtracter{+ b% F, Z. `7 Y4 G  g
' d: I* l' Q/ f& l
public PdfExtracter(){8 C* d6 L  K0 i% o* `' `1 _
  }5 u) L: `( v. {
public String GetTextFromPdf(String filename) throws Exception0 `$ \7 Z. }0 U2 k
  {
; a; R* \/ c6 A0 G1 z  String temp=null;
" o. F) S% g" h4 E; i$ K  PDdocument.nbsppdfdocument.null;
  ^, f0 i5 \. @: E2 e' e: P: I  FileInputStream is=new FileInputStream(filename);$ @1 f2 e4 P9 o+ w% D7 S
  PDFParser parser = new PDFParser( is );5 Q; W. n3 D& A% v3 M* S. L
  parser.parse();) x. g5 F8 i% b! o
  pdfdocument.nbsp= parser.getPDdocument.);& z( U2 u" _. H! r2 m* G
  ByteArrayOutputStream out = new ByteArrayOutputStream();- P& g( r: F8 z9 Q
  OutputStreamWriter writer = new OutputStreamWriter( out );
/ W1 K1 Z4 D8 Y6 u+ t2 O  PDFTextStripper stripper = new PDFTextStripper();$ l& e3 @$ H6 E/ J) S! A
  stripper.writeText(pdfdocument.getdocument.), writer );
4 v! v4 Y: Q+ z) J  writer.close();: i5 {# h. h2 v3 }: K3 f$ N4 W) F
  byte[] contents = out.toByteArray();
: w: G6 Z& |$ r; b0 e+ L6 d8 K# s- A( O& R2 k5 ^8 ~. Q- u5 Z9 S
  String ts=new String(contents);8 g% F0 u# ~( d
  System.out.println("the string length is"+contents.length+"\n");
2 Y+ b1 J6 h8 a6 Q  return ts;0 w7 K- `1 I8 T1 Z
}( z/ j+ F6 p& W% [0 D
public static void main(String args[]). W5 V" C% m3 ?( z9 _
{: o! L! W, c" z& W+ Z% }9 U! D
PdfExtracter pf=new PdfExtracter();
) H- q# @( @4 C4 r  ]3 _PDdocument.nbsppdfdocument.nbsp= null;
- i/ p+ X# u  K4 M8 n1 j' M
" ?; p6 v# D- mtry{
6 x& {6 |6 w  a  {  BString ts=pf.GetTextFromPdf("c:\\a.pdf");
* Y/ E( j6 F5 ]2 I$ b3 V8 V6 `System.out.println(ts);6 c+ K- x: w+ I
}
' G0 J! k  P) z% icatch(Exception e)) o8 m( d* c2 f* N: m: r( ?' B
  {
+ B- A3 E, q( v, m# a  e.printStackTrace();
1 g& r$ z$ ~( O  }
, D* Z4 I6 u. ]  B( r% J! Y}
5 p1 A8 H# ]# S/ X* \- W$ w# {2 ^" z$ b( w
}
" l% f- M: D1 B8 @' \2 o; z</CODE></PRE></TD></TR></TABLE></P>
2 e: Z7 L- J1 P0 s2 Q! U<><A>4. 抽取支持中文的pdf文件-xpdf</A>& r2 x& Q1 ?* D4 \/ ?+ L# Q
xpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P>) _% A1 Y3 x  _
<>下载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>0 ^8 x5 @2 u4 L( _, C8 A
<>同时需要下载支持中文的补丁包: <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 Q# z* V& z7 ?3 p6 t( |
<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>4 P; {# j9 O/ d+ z. S
<P>下面是一个如何调用的例子: </P>' b) K# c4 j0 V0 O
<P>
9 T0 W; L& T* m8 p<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
5 O: O- R) a! g7 T) S' x& Y' U/ {" v$ `5 ^# v
<TR>1 X! f$ W$ M+ d2 x! c4 b
<TD><PRE><CODE>! N6 G/ X& G5 {/ ^7 P
import java.io.*;
2 k5 U# }% B3 f/*** `" @* ?) t" y! J1 w2 E+ e$ R7 y
* <P>Title: pdf extraction</P>
* ^  S: o, k3 @, N* w6 S/ K& Z * <P>Description: email:chris@matrix.org.cn</P>
1 \6 {0 x& F% J, e  F9 r- m- W * <P>Copyright: Matrix Copyright (c) 2003</P>9 c% _. j2 R) Z1 O, `/ q
* <P>Company: Matrix.org.cn</P>
+ {* ?, c( q1 D4 O4 I  P, B& l * @author chris
2 m2 E+ f- s! @9 n$ }8 ?8 H * @version 1.0,who use this example pls remain the declare
/ q3 A7 z$ V7 N4 }9 w! y7 h */$ y' |, s% Q$ ?5 k$ g, v5 P5 w4 s9 ~

$ p4 |$ }( a  h) u5 T
  \8 O, @+ k" F* ]public class PdfWin {& Z+ Q: m* d/ s- D( _6 @' v* D! M
  public PdfWin() {
1 B, {. X4 \/ Q) V! H" P  }0 p! c" {& G* B0 k4 p" v" V0 n, A
  public static void main(String args[]) throws Exception8 f. i5 d6 b( s  ^# E& G9 s
  {: L& b7 f% X6 v
    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";
5 q  d2 `& a* l7 c" b    String filename="c:\\a.pdf";
: a7 Y. D& ^; N; g7 G    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};8 V- x, {. c- I* y
    Process p = Runtime.getRuntime().exec(cmd);
, L9 c1 j  z+ K  C7 _* z  X    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());2 v. t8 d. a+ Y$ v2 F9 V
    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");  h$ b+ \9 W) c7 J8 `+ G
    StringWriter out = new StringWriter();4 B0 a. _" m/ e
    char [] buf = new char[10000];* d" Z) X! y# y
    int len;3 ~/ ]- T1 P1 X5 m
    while((len = reader.read(buf))&gt;= 0) {
) R# e' k8 D0 V2 v& L    //out.write(buf, 0, len);0 Y4 F; |! B) K$ Z
    System.out.println("the length is"+len);
8 U6 l- _% f$ a    }
  R, Y2 u3 ~& S5 A    reader.close();  T6 S( x( Q% J) Q3 g
    String ts=new String(buf);8 M2 u. x, O( ]( i# X4 G6 b
    System.out.println("the str is"+ts);
8 m- E. B. q$ [. ~' I  }
& @$ G/ m8 o; `, N" J& I}
3 l  s1 y" p6 {: _</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-27 02:14 , Processed in 0.637344 second(s), 56 queries .

    回顶部