QQ登录

只需要一步,快速开始

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

[转帖]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>2 D1 r" m" B- s5 I7 k
<><A>1 .用jacob</A>
/ E: _4 [, A: D# a+ s- _" }其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>2 L9 ^+ F  E! q7 A0 J( C
<>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>+ |' S5 j2 ]/ r/ Y5 b8 N
<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>* d5 A+ E$ K9 q2 x' ?% n. f
<>6 c; c3 {  @$ Z, i7 _
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">7 j6 @- G( R4 O. o3 D' y% N( |) ^
3 [$ q2 l% B; W$ q# e  O2 x1 y
<TR>
: n3 |# K/ r% s& T9 M% p# z<TD><RE><CODE>! W  o) H0 _6 Z: Q" b3 i
import java.io.File;5 J6 }! }* O" Z& n9 M  J$ X
import com.jacob.com.*;
" \1 D. Y! n! W* ~) f0 o& d% Wimport com.jacob.activeX.*;1 H$ x$ G, h7 x- S6 z7 n. @/ P1 r
/**
* A! a: [( F5 d: X. A. F; W9 c * <>Title: pdf extraction</P>2 d) N$ N$ T/ K/ \0 g
* <>Description: email:chris@matrix.org.cn</P>
( e- s" Q% j/ A4 S * <>Copyright: Matrix Copyright (c) 2003</P>
! j  p0 ^  Z) n * <>Company: Matrix.org.cn</P>
7 z9 j: ?8 H# ~. {7 t * @author chris
6 @7 }8 r  f4 f: F: Q; N5 Y * @version 1.0,who use this example pls remain the declare8 ~9 y0 O' R, S0 Q8 K1 t7 ^
*/* h$ }' k2 I" W8 ]. J) z
public class FileExtracter{" N8 X- R9 d' b2 L. R
public static void main(String[] args) {
9 E  a5 b" `# S  ActiveXComponent component = new ActiveXComponent("Word.Application");" {. ^% l4 T4 J2 [1 h6 T$ r
  String inFile = "c:\\test.doc";
3 @/ e% Y6 \, K4 K, O String tpFile = "c:\\temp.htm";
4 c; V; U7 i' U5 R2 c5 w+ ?  String otFile = "c:\\temp.xml";# s0 S" A- I6 @( }5 h9 S
  boolean flag = false;
5 R) R  \& g7 m; v2 M2 g  try {9 I5 L4 ?: W2 l3 N% O1 y
   component.setProperty("Visible", new Variant(false));% |/ K; O  |  A; X! F2 J
   Object wordacc = component.getProperty("document.").toDispatch();8 R9 Z* V4 F+ ]4 w5 B- w! J
   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method,
! V1 y+ C$ i, ~+ @: d& r+ h) x                                     new Object[]{inFile,new Variant(false), new Variant(true)},  o9 S, s/ ~- M: L; `1 B$ I
                                     new int[1] ).toDispatch();
& }8 D6 \0 g2 }. Y- w5 z; X   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);
; J0 o, ^+ m; T# q& _8 B: T2 v   Variant f = new Variant(false);
- B: G% ?) a- i& m4 q   Dispatch.call(wordfile, "Close", f);
# @/ ]% F8 _) Z5 z. G! H2 n3 z9 F* }   flag = true;: w+ p" U( s" G+ _5 b
  } catch (Exception e) {, S; \5 |' W+ b/ A" N  ]
   e.printStackTrace();2 p9 e- [8 y4 Q+ v6 \
  } finally {! N0 R# ]& T& `2 E" G  O/ ?7 r
   component.invoke("Quit", new Variant[] {});  p3 w& S- B! P8 [/ G
  }/ @6 i% ]& F, A6 H
}" h/ H4 T* X% k% ~
}0 A! {) Z+ D2 @: V+ [5 Z# E& d
</CODE></PRE></TD></TR></TABLE></P>) z4 V$ K* x; i. e; l
<><A>2. 用apache的poi来抽取word,excel。</A>  v( R7 Y2 T0 ?" A6 e6 p# a5 Y( }
poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>, Y% i* h3 c6 M/ W7 o  V
<>下载经过封装后的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>
+ ^" w9 E7 ]3 x6 n1 E2 W<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>
4 u( X5 v  @' x<>* G7 Q" N1 r3 L2 R2 m- k
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">7 Z" P! l  p3 I

0 r3 W, B$ J, l4 r, B4 O! U<TR>$ D7 d0 l7 Q* d. W! X1 J; c
<TD><RE><CODE>
- E. B8 K% N; Jimport java.io.*;" r, c& p8 b" S; W" R3 _2 C
import  org.textmining.text.extraction.WordExtractor;$ }0 j1 y8 [7 V/ M* ?) d
/**; S7 J7 A3 u, T4 M
* <>Title: word extraction</P>
- q) V- v7 a; f" E) D * <>Description: email:chris@matrix.org.cn</P>
$ ~" R' s7 ~  f( v+ R% R: _ * <>Copyright: Matrix Copyright (c) 2003</P>1 Q: z/ K8 L5 n" ^( K1 w3 m
* <>Company: Matrix.org.cn</P>
4 J" ^/ m) D/ L- ^7 k1 A& E * @author chris
* G+ J. H# ?0 W * @version 1.0,who use this example pls remain the declare
3 L2 |& n& C& a+ ^$ `' r+ { */
/ Q% M+ Q0 Q# H( F/ u
. O* r2 \5 c1 `% O1 l1 q' dpublic class PdfExtractor {
4 M8 J- W  e4 C. d  public PdfExtractor() {
  X: ?# \4 L+ R; Q9 W  }; R( C- a; X3 A1 ]
  public static void main(String args[]) throws Exception; m& K  |* q8 b5 t3 ?' d5 F, k
  {
7 d; ^% t# T9 R8 b  FileInputStream in = new FileInputStream ("c:\\a.doc");# z# [+ y: Q6 y$ r! \; |+ l
  WordExtractor extractor = new WordExtractor();+ e! y; {; W- Z' q
  String str = extractor.extractText(in);+ H% d! ^& v9 O0 n$ R
  System.out.println("the result length is"+str.length());
# M( ^8 A8 f! D  a   System.out.println("the result is"+str);' O1 c2 u7 y; |  m! H
}
- @- O9 r0 j6 u3 W( O- |}
" _* i& G; k& _8 a! N</CODE></PRE></TD></TR></TABLE></P>
( H$ R; U: f  F& b; h7 L- v<><A>3. pdfbox-用来抽取pdf文件</A>- K: A3 ?' T! c) D5 _! e
但是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>
- O5 h  H" u. @0 X8 j<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>& N# F8 G; n5 d( W) u2 }! P1 K: \
<>3 i' _( `7 z! T# \6 R  s, _
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
, T' P! s2 l" f, a9 g" r6 K) a+ L* v
! Y9 g$ ?, P# N) a' p$ a. I/ z0 }<TR>+ p8 U$ ]" c( W  X
<TD><RE><CODE>. y8 h4 n% C8 O4 C2 o' G1 p# x( s
import org.pdfbox.pdmodel.PDdocument.
, P) Z8 v; h) H+ mimport org.pdfbox.pdfparser.PDFParser;3 Q# g0 }- s, H' h+ c/ Z. e
import java.io.*;
5 H7 K4 }8 G% o$ dimport org.pdfbox.util.PDFTextStripper;
7 N: r& j6 Y" P- y5 T; `3 Vimport java.util.Date;  e1 {7 [4 M: Q; E3 `1 T
/**
$ l$ Z2 j: c2 t- \# C# R * <>Title: pdf extraction</P>
' X- S. X6 a0 n$ S: @1 k" _ * <>Description: email:chris@matrix.org.cn</P>3 m7 s: D* Q6 v
* <>Copyright: Matrix Copyright (c) 2003</P>
( K1 S4 O6 g7 ?/ @( H6 A5 X * <>Company: Matrix.org.cn</P>* E. t! f, u- p, h+ w1 C; R
* @author chris- U+ g; Z3 T5 |  O4 z( S. O$ t; N
* @version 1.0,who use this example pls remain the declare
: M2 z) f! U1 J! \$ _$ u */
- l/ |# h3 F9 v+ c3 }* }2 G5 ^' m- v& V! a9 r3 ]
public class PdfExtracter{
, g+ B' F2 W+ V1 ^1 J3 Q. t& M
# S3 z( G5 L  Q8 g1 l" \) Vpublic PdfExtracter(){/ ^  B( X# e& E4 K6 E
  }5 C8 o! S1 [+ `5 u. E& A8 f6 Z& {4 _
public String GetTextFromPdf(String filename) throws Exception
2 V( i0 y/ L5 ?! N4 f) s  {% A- K+ `- i4 @/ n' E5 Z! r: u5 @
  String temp=null;, N! n% f$ h7 K$ K. ]0 n" _$ q
  PDdocument.nbsppdfdocument.null;
4 Y% t4 @6 p' {" w7 x3 K  FileInputStream is=new FileInputStream(filename);
* x/ r# {. n5 _: O' e8 z, Y  PDFParser parser = new PDFParser( is );: @& d# s0 ?7 R  E1 e3 g; I) F
  parser.parse();  g8 C+ A1 Z, |
  pdfdocument.nbsp= parser.getPDdocument.);
- E4 g8 k" ]4 r5 b, z" _1 A; Z* o  ByteArrayOutputStream out = new ByteArrayOutputStream();
$ i+ n( Y) D# s0 l$ y! {. L  OutputStreamWriter writer = new OutputStreamWriter( out );: l4 P6 K* Y" S2 a
  PDFTextStripper stripper = new PDFTextStripper();
! d- b  o/ H+ Q  stripper.writeText(pdfdocument.getdocument.), writer );* |! u; F. _  {# z. D
  writer.close();3 R0 `8 X# O# A% ?8 C
  byte[] contents = out.toByteArray();, M# V$ [% a, Z% }4 B
1 F& o" r  h1 x) Z
  String ts=new String(contents);8 C: Y# f5 d# o# ], j8 X
  System.out.println("the string length is"+contents.length+"\n");5 L- T: B8 t  e. K
  return ts;7 i: I* z! G$ f8 ^' Q( d5 |: w; ^  b
}
' G/ F; |7 d3 L6 ?6 Jpublic static void main(String args[])
6 ^, E3 u; ~8 t/ G, @{
. A/ q/ |8 s+ d& b  bPdfExtracter pf=new PdfExtracter();
9 _9 _% |: Y- B6 S. \+ S- PPDdocument.nbsppdfdocument.nbsp= null;# L- p9 k' S& G5 [8 N2 W2 Q1 b
6 [/ D9 s) C2 h
try{
3 V, a4 q! f/ p  ]. eString ts=pf.GetTextFromPdf("c:\\a.pdf");
6 w. _# A$ s" H9 `8 B- D: ESystem.out.println(ts);
( X. w( l- m$ S* v! U0 |1 a}
# l5 s0 z) N) ]# ^catch(Exception e)( N. A4 C1 H1 C# b, U- R4 ^
  {& U" S. Q! O" k
  e.printStackTrace();+ Y! B4 t: B) ~- t5 T; Y
  }
& K5 s: A5 P; E# E5 w) q}2 {. r& p' v0 n/ z; R

6 C) W2 a! _% ^/ Z* [" u$ u}
- d6 `- |7 ~5 W: m: _) h</CODE></PRE></TD></TR></TABLE></P>
0 F0 j; h4 {7 R0 @4 E5 s<><A>4. 抽取支持中文的pdf文件-xpdf</A># |& r1 y7 m8 M0 V% |
xpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P>
# C' \. }# r4 v3 `# t( G<>下载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>! @, K2 c8 F% r6 {
<>同时需要下载支持中文的补丁包: <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>
6 \& e$ p& n$ e+ w<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>: J) p9 P' `" |. y! Q
<P>下面是一个如何调用的例子: </P>
0 F. I  F1 W1 _<P>
: Z8 Y- s/ Z5 A7 p* g* |<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
% h0 _! I; ?3 Q4 r8 W. p
/ E! N: ]; H2 ]* q* h<TR>+ [+ k( O9 {& u6 a' o
<TD><PRE><CODE>1 v" ]- p2 I9 ~. }+ ?
import java.io.*;
4 i1 S! p2 Q, |4 x/**& u% D4 m8 U6 u1 W) Q
* <P>Title: pdf extraction</P>, t8 p* E7 }3 @" |
* <P>Description: email:chris@matrix.org.cn</P>
* G  w7 C; n& @( M; H# { * <P>Copyright: Matrix Copyright (c) 2003</P>
. \! E4 y9 Y/ s1 a * <P>Company: Matrix.org.cn</P>' e# a) ~2 F; r
* @author chris) ^( T2 G. _. s; V; v
* @version 1.0,who use this example pls remain the declare* Z4 P, M: I6 u0 n5 y
*/
6 V, G. k5 z7 h, v9 [; ]/ u- N! p# V/ E; t$ m
% I: K4 Z! e8 F: Q
public class PdfWin {
% I; V& L2 F2 G& c  public PdfWin() {
2 w# a& d. {. P& j0 \% ?  }
9 G9 B; P# _2 ~+ \. |  public static void main(String args[]) throws Exception
! u7 c! m* k3 F6 J+ ?- D; i5 G  {% X/ e1 W- H) |
    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";
* z- ~# o3 b( O+ ?! u! j; Y# T    String filename="c:\\a.pdf";
& ~# A7 `) Z* I. n/ z* Q) b    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};
1 D# O4 K* I$ d* Q( U    Process p = Runtime.getRuntime().exec(cmd);
2 i; E% V+ v* M3 E( Z    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());0 [9 f. N9 P$ i4 w6 Z( I' T
    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");
) ]' d, n1 V/ P- D    StringWriter out = new StringWriter();, T& Y2 Y% a8 J& s! m( L  T
    char [] buf = new char[10000];
: D) n; {5 {. B7 ^    int len;/ \& Y! Z# k4 W( ^
    while((len = reader.read(buf))&gt;= 0) {4 y* b9 g* L4 R8 Q# ?
    //out.write(buf, 0, len);
* b4 ]. Y7 i1 g    System.out.println("the length is"+len);& ^# q0 d0 V2 c5 E6 [
    }
. X6 r8 ?' h- y+ X% N; }    reader.close();/ F5 s) Y, }4 F, e9 f
    String ts=new String(buf);5 }+ j$ P1 o0 C, s, _7 M
    System.out.println("the str is"+ts);6 Q2 j8 l3 i% e; l. t/ Y
  }9 w& A. i/ c, m) w
}! T# w+ P, Q, I; h1 u5 e0 ^: t
</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

    回复

    使用道具 举报

    3#
    无效楼层,该帖已经被删除
    您需要登录后才可以回帖 登录 | 注册地址

    qq
    收缩
    • 电话咨询

    • 04714969085
    fastpost

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

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

    蒙公网安备 15010502000194号

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

    GMT+8, 2026-4-20 07:55 , Processed in 0.422756 second(s), 63 queries .

    回顶部