QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4203|回复: 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>
( D7 l( K# Q# w+ ?2 l! F<><A>1 .用jacob</A>
* }. T( P% M' |3 z8 m; n其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>
8 V1 t$ P2 E4 Z3 x9 R3 D, @$ P<>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 ?1 ~6 r: h: G- k0 R<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>0 F/ F2 i/ l: X6 h
<>$ V" i' E; r) a4 z1 n3 [; n( l8 q
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">
) B5 V# z& r- w0 A5 R6 p$ {+ ]9 Z- [, V! m# I- c6 s  z  |
<TR>
) N; H0 s0 a* ?<TD><RE><CODE>( O8 Y2 n  K" O1 Z, V0 Z8 O; t3 n
import java.io.File;
  K/ k# M4 s. Yimport com.jacob.com.*;
/ g8 K  v; ]4 W# p, ~, p  ~- ^1 kimport com.jacob.activeX.*;
* y9 B  Y  y1 ]" U. }) i, N9 ]/**8 ]2 Q! ]5 ?) u; J
* <>Title: pdf extraction</P># d3 I1 X' T4 {- v5 u0 I) a1 a& ~
* <>Description: email:chris@matrix.org.cn</P>' J, Z0 c- I. e  m" q/ {" Z8 |' ^
* <>Copyright: Matrix Copyright (c) 2003</P>* L% F1 x( @0 H. g7 ^
* <>Company: Matrix.org.cn</P>* o( G/ s% X! S6 x/ b$ S4 W7 X
* @author chris6 v! f4 |) E3 ?
* @version 1.0,who use this example pls remain the declare! Y: O/ a: j2 c- A; y
*/; w1 ]3 Z: o6 t0 L$ i
public class FileExtracter{
3 Y& p( @% n6 z* {. ?0 D  X5 Z' ^& E public static void main(String[] args) {: B& Y) v, E) T7 G2 }
  ActiveXComponent component = new ActiveXComponent("Word.Application");! Z9 l! k0 y! l
  String inFile = "c:\\test.doc";9 N3 p2 K9 E, E) i
String tpFile = "c:\\temp.htm";# Z! I6 R& o, e4 X) K
  String otFile = "c:\\temp.xml";
3 _4 Y  o5 A$ T8 q) l4 H  boolean flag = false;
- m, E$ P, J% S- f2 n$ z  try {
' C) C9 N. O% i* R4 f/ k! B# P   component.setProperty("Visible", new Variant(false));
  G! B% D, @. E9 A2 b5 Z$ u, w   Object wordacc = component.getProperty("document.").toDispatch();
' @4 W& Q; [/ e9 F+ C6 g   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method,
1 M; J# m4 X! b, c+ J2 P: j                                     new Object[]{inFile,new Variant(false), new Variant(true)},8 H) ~* S9 N* B: b9 `
                                     new int[1] ).toDispatch();9 B  U6 c) r, W9 Z0 l  A7 h  a
   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);
+ q$ {, |1 H* O2 L   Variant f = new Variant(false);
5 z  D# i  h, a+ `' N& m9 F. C   Dispatch.call(wordfile, "Close", f);
- Z2 }1 H( S( L4 y   flag = true;0 m, K+ S- I* F+ C+ H/ e$ v0 R
  } catch (Exception e) {
0 O. V0 S  O+ H- o; v$ S   e.printStackTrace();4 @4 g$ }% T: s* i
  } finally {
( y+ d9 p5 C- o2 k/ ~8 s   component.invoke("Quit", new Variant[] {});
. f) x* I1 k4 V6 t2 g/ ^) X9 \# R) q  }! g3 `5 I- v) r0 k$ L- ^
}# o* X2 v' c1 X' y+ u! _
}
1 l  Q5 `0 E) M2 U# k/ E; ^* g: ^</CODE></PRE></TD></TR></TABLE></P>
3 Y. f3 e3 P) x- S! e- T: Q<><A>2. 用apache的poi来抽取word,excel。</A>; @: L: C" U, R1 q
poi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>$ n* D0 F- S8 s' J6 p4 k
<>下载经过封装后的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>
7 i9 z  G& Z2 ?) x% I' ~! a, m<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>8 y& B4 d# m+ y  U- @/ k% ]! S
<>
/ j- x) y0 K- N; t* d  F8 J/ t7 B, S; k<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
- ~  k0 l7 r# _' t. ]# t* e
" M- @7 o0 d% g& H2 ^1 e7 Q) \<TR>
; a* t* r6 ^7 D5 n! R/ S<TD><RE><CODE>: o  m# L/ c' S; t  ]# C! z7 e
import java.io.*;( }+ p1 @0 N; T7 W# k8 H# \6 [
import  org.textmining.text.extraction.WordExtractor;
' P: |. h# u1 E- H* X) p7 p/**" y. `7 O- T# t
* <>Title: word extraction</P>
( @' g' D' `) s * <>Description: email:chris@matrix.org.cn</P>! k5 p: o9 I# ?$ t' {  E8 M
* <>Copyright: Matrix Copyright (c) 2003</P>$ p. d8 w- ?: j2 R) x4 k" B
* <>Company: Matrix.org.cn</P>
2 y) b+ ^& z. j, K) L% o5 x! b * @author chris
7 T/ B7 }5 z; K: T" ?8 @ * @version 1.0,who use this example pls remain the declare
$ M0 s2 j8 S/ Q9 Q. [( X5 j$ |3 R9 _& B */
4 u$ B1 b& F. A$ v. ^" @+ A5 |* ]
public class PdfExtractor {
% Q: ]5 W3 g' B( Y! B  public PdfExtractor() {. u& c# W% M9 U$ `- b1 u% m
  }. q5 ?3 }$ A2 o% M
  public static void main(String args[]) throws Exception
, s7 _# x' w. {/ S! p+ z  {+ o& o3 Q" Q5 K9 Z2 R* H1 {' u
  FileInputStream in = new FileInputStream ("c:\\a.doc");) w: |2 B3 a+ X+ x2 k1 s5 f
  WordExtractor extractor = new WordExtractor();  i" Z0 i7 Q% o9 [5 M
  String str = extractor.extractText(in);/ Y  z& B" B7 V$ M2 T- j
  System.out.println("the result length is"+str.length());' v- Z+ I0 v9 F7 w
   System.out.println("the result is"+str);
( }& ~! F' F: C& _1 _/ _; v; B1 L}
/ G, p0 X* L/ O4 W  P2 x}
3 u$ Z# e3 n! L% U. }</CODE></PRE></TD></TR></TABLE></P>; u5 {" t+ v0 @, g: X
<><A>3. pdfbox-用来抽取pdf文件</A>
; ]5 g6 ^* y7 i1 l( ?- R但是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>
( y( `# f0 r1 s6 I: P" m& @8 D<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>' x- x) S+ P$ N* W2 A
<>5 C3 q, G0 }: \3 L/ m
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
: \$ ~& t2 U' m! Y4 o: n9 w
; v" c- F+ Y: {& B# Z<TR>
) z& J/ b" ~3 ]+ @* Q. c' I<TD><RE><CODE>/ N0 C9 F4 Y( s8 `# @. q
import org.pdfbox.pdmodel.PDdocument./ G  T$ }* i( S9 q# T8 Y  J: Z1 w
import org.pdfbox.pdfparser.PDFParser;
1 v" y; n3 f7 b' L, O* w! ?7 timport java.io.*;
7 J+ v6 l( b. Q( i; aimport org.pdfbox.util.PDFTextStripper;( L/ v0 t& Y! y: w, N( _2 E
import java.util.Date;
6 d- L8 ^" f- x1 g) k$ Y6 F" f: c/**; b! _6 P- \! Q- J8 C; D
* <>Title: pdf extraction</P>7 I  G' ]% b% o" j) Q
* <>Description: email:chris@matrix.org.cn</P>3 y. v% b0 }" c* N: ?- S
* <>Copyright: Matrix Copyright (c) 2003</P>) ?3 l! W1 \* m" p9 v
* <>Company: Matrix.org.cn</P>
0 Z) F3 s' ~: W * @author chris9 r2 `4 y. x. `: y
* @version 1.0,who use this example pls remain the declare+ o" ?" H5 ^) z+ P2 Q6 X! J$ r
*/; q6 s9 t# b9 Z
+ V; w4 t# b9 S
public class PdfExtracter{- }* J( t  {  m3 V- ~: y

/ \- o% \, ^! T& x; ~; k* n7 kpublic PdfExtracter(){' c3 P+ c* d+ {9 _3 s* Y; @/ W5 t9 z: _$ n
  }
5 l, V5 [/ ?$ C3 O; Kpublic String GetTextFromPdf(String filename) throws Exception" p+ ~* r+ w$ q& p* b7 b
  {
/ E) |3 }4 K& ^  D% k  String temp=null;0 O+ U' r; J2 Y5 A% P$ x; y0 z7 s
  PDdocument.nbsppdfdocument.null;" }) C5 ]: a0 i9 m
  FileInputStream is=new FileInputStream(filename);' X5 W5 f) X7 y, z0 `. E" x$ r& C
  PDFParser parser = new PDFParser( is );/ L0 B& w3 E3 H  Y, M/ h
  parser.parse();
& L8 Y) j) |7 Z. P- b  pdfdocument.nbsp= parser.getPDdocument.);
# U  a( W& U. Q! m- {& @  ByteArrayOutputStream out = new ByteArrayOutputStream();, x- _. P9 C/ @& l* E  J
  OutputStreamWriter writer = new OutputStreamWriter( out );
# G% |$ W, B/ P% j% H' R. h6 I8 v  PDFTextStripper stripper = new PDFTextStripper();; q* y8 \# D! s+ F
  stripper.writeText(pdfdocument.getdocument.), writer );! o% p1 }& A& E7 g! e, r
  writer.close();
& s! V- R/ \: c( v5 r' w$ D* L  byte[] contents = out.toByteArray();, ?# k" b# s7 m) t' S! {9 K
/ F) J5 E: c0 p* H' W4 a% M) o
  String ts=new String(contents);
  G& B+ r+ W& W& j  System.out.println("the string length is"+contents.length+"\n");
6 T5 V( N, S4 V% Z" W- c' f  return ts;& ?( D# ^  m8 z0 X3 a$ M. F2 r
}
  G3 z+ Z9 D% V1 X7 h9 _public static void main(String args[])
: B% g: Y8 ?, p{7 j& v7 U! B- Q- B
PdfExtracter pf=new PdfExtracter();% v! H& [5 j) t- K* x, F
PDdocument.nbsppdfdocument.nbsp= null;
9 Y; n) K/ b5 l, A5 ]. i
! p! o. s- C% f: F  u, qtry{! ~$ d: u1 [3 Y8 O+ f8 A
String ts=pf.GetTextFromPdf("c:\\a.pdf");4 r: }9 k% a: d
System.out.println(ts);3 x: b& l" g" u6 O: c: |
}
1 A8 x) w  a7 I% Q) Bcatch(Exception e)' i5 D! f- ?) q+ l
  {1 R9 g) o0 V+ }$ S* o
  e.printStackTrace();
0 I- F$ v3 B& k5 J  }( h6 G' _5 X+ }0 m4 b; S
}2 z! f6 H% c& a) W+ Z. u' H
% ~( J& u% }- o6 F$ ?% }
}
/ |# L5 J  N; L7 C5 O</CODE></PRE></TD></TR></TABLE></P>) Q$ D2 c8 g* z8 k
<><A>4. 抽取支持中文的pdf文件-xpdf</A>
$ S2 G7 ~, Q+ rxpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P>
( _. {+ X2 V8 b: x) m2 Y0 }: Q; k+ C1 e, K<>下载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>
5 O/ a+ T; p. `4 c9 Y8 U1 e9 e0 u<>同时需要下载支持中文的补丁包: <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>
" S9 j# C- Z" @4 A- A  ?: C1 b<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>
) Q8 c- x* k% _6 C  ]<P>下面是一个如何调用的例子: </P>1 T7 @1 c" T  ~
<P>* ?6 b4 b* o2 x& W+ |; j' }9 _: q
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">/ e; ?! a0 z; G
% ^, H% Y& m; G1 w( t9 G/ t! g
<TR>7 k' ~$ ^) B# a* u2 e0 L
<TD><PRE><CODE>& s6 @4 S; E3 E9 {$ c5 r: k4 e& m' T
import java.io.*;
/ Y6 I0 N0 K2 }& `5 m9 s4 {+ J/**
* m& \% _- F9 J0 }% W7 ]) {3 B * <P>Title: pdf extraction</P>  m& f5 {+ s* @: `+ u, G, B$ [
* <P>Description: email:chris@matrix.org.cn</P>/ K, S; G3 Q4 u
* <P>Copyright: Matrix Copyright (c) 2003</P>
, ]& L; f* x: { * <P>Company: Matrix.org.cn</P>! h( A* v1 ~7 N5 c8 Q. j$ m
* @author chris7 f+ N( |, `& s! {2 x5 i# A  x, r% l
* @version 1.0,who use this example pls remain the declare( f) ]0 ^% N0 h* O0 R% C
*/' i2 F( k) C7 N$ [3 o) x

9 M6 I% f, d5 P% l9 [' W& J: q0 _, X; y2 {4 h6 D8 C# k
public class PdfWin {6 H& L6 E. \0 L: E. }" j- `
  public PdfWin() {: Q+ G+ g% [% I, j) m0 T) u* N4 q% _
  }
  E6 x0 b9 M. e: @. i7 B  public static void main(String args[]) throws Exception
! t' s' Y+ T1 @6 L0 t% {+ ^  {
6 l4 E  R0 s1 T) }" _/ ?    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";
  f; T3 q$ J, z) I3 i    String filename="c:\\a.pdf";& k4 F& v& y2 A! N
    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};
4 ~3 T# @* x- I5 w: m    Process p = Runtime.getRuntime().exec(cmd);- b: p  e  F  B# ^2 M
    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());
# e) J6 i+ _2 ^- d8 M    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");
4 F1 G5 A* C" d$ P- _$ e$ e    StringWriter out = new StringWriter();$ q! v7 \5 w2 u- z
    char [] buf = new char[10000];
$ g- d2 e' V: }; [. A, w    int len;
5 c. z! w+ e* P: M" W# A) Y    while((len = reader.read(buf))&gt;= 0) {
2 \$ d% ~) `+ E' M- u2 J    //out.write(buf, 0, len);
1 K5 y" f& v7 t/ W( |' s    System.out.println("the length is"+len);% }0 D: S! }' i" k9 t5 O+ g3 y8 y
    }- D% i! J! x- c5 e0 Z6 a) s) F* T
    reader.close();2 u2 @, z% A$ E% C9 p
    String ts=new String(buf);
: G1 Q+ [# y4 q- N' s    System.out.println("the str is"+ts);' |8 h" Z, |' ~$ R7 t
  }
: T( U8 A3 c$ m& s: N) U& v}
7 B" A* R2 ~' \! l</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-21 12:52 , Processed in 0.330060 second(s), 64 queries .

    回顶部