QQ登录

只需要一步,快速开始

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

[转帖]java抽取word,pdf的四种武器

[复制链接]
字体大小: 正常 放大
god        

206

主题

2

听众

882

积分

升级  70.5%

该用户从未签到

新人进步奖

跳转到指定楼层
#
发表于 2005-3-31 01:15 |只看该作者 |正序浏览
|招呼Ta 关注Ta
<BLOCKQUOTE>很多人用java进行文档操作时经常会遇到一个问题,就是如何获得word,excel,pdf等文档的内容?我研究了一下,在这里总结一下抽取word,pdf的几种方法。</BLOCKQUOTE>9 O$ P; K, B4 H$ R, Y4 B; U
<><A>1 .用jacob</A>
0 p3 e4 W0 a1 B& Y7 x9 l) _' M5 e其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>; W9 `1 A) S+ ]/ H' O
<>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 x( D" ?4 u! u8 J
<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>
4 \- N7 F8 [, u5 M<>6 v) n0 N, H; E
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">/ w. J% C; t2 R# i" z
) C! [  i; x6 K4 h; i0 |; u) g% a
<TR>
+ D9 O; [* ^- {& v( u( R" [; u<TD><RE><CODE>$ Q6 \1 o1 \6 J8 p" u- [5 Y
import java.io.File;
7 b5 X7 h& E. ~5 M6 L# ^import com.jacob.com.*;% h# p# z/ ]* O) ]! c) V. e
import com.jacob.activeX.*;% ^7 e' S# ^  q' z
/**
) F! b% l# `+ b" t0 E! I' s4 s * <>Title: pdf extraction</P>0 D: |: b0 N* Y
* <>Description: email:chris@matrix.org.cn</P>1 `; J& R7 u1 m# f0 j+ B+ e: s5 P
* <>Copyright: Matrix Copyright (c) 2003</P>
* r  L1 M% M$ K8 A6 w, E6 V; L * <>Company: Matrix.org.cn</P>
+ S4 R7 j2 Q$ i1 e: I: \0 l1 M * @author chris% W3 X3 L7 l& G! x
* @version 1.0,who use this example pls remain the declare
, m. `: s* R5 ]. E/ Z */
4 r; F. }4 A: X7 `6 p! Spublic class FileExtracter{4 K* A) Z. @7 g) A& B0 O: t
public static void main(String[] args) {$ D9 s" ]( t+ y, e4 j0 X
  ActiveXComponent component = new ActiveXComponent("Word.Application");- s  A* p' O" C
  String inFile = "c:\\test.doc";
  v) g8 L5 r  r String tpFile = "c:\\temp.htm";
$ f3 q5 z# S* P! `* H. k# t  String otFile = "c:\\temp.xml";
5 d7 o( b; N2 f9 A: X5 w  boolean flag = false;
6 t$ R6 ^* \/ Z$ |7 t  try {4 l& s- T8 ^& s* ~  {: p7 U
   component.setProperty("Visible", new Variant(false));
0 J1 v. c8 v; M  _   Object wordacc = component.getProperty("document.").toDispatch();
( t' V7 [% ^; {   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method,
5 \/ L  v* }. O7 A4 T2 m: `; D. A                                     new Object[]{inFile,new Variant(false), new Variant(true)},
2 F6 g5 a$ V3 W" X1 |, y" ?" s                                     new int[1] ).toDispatch();' {9 P; q+ a+ U2 E$ a) I/ f
   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);8 _0 b) n7 B' @
   Variant f = new Variant(false);9 J! w8 ]  N1 f. K
   Dispatch.call(wordfile, "Close", f);
1 v- U. [( _! I$ W' k8 b# y   flag = true;6 f* M% k, Y  K* {" r3 `3 ]
  } catch (Exception e) {# z+ t, X1 k/ s  f5 X. c  I- r/ \7 H$ m
   e.printStackTrace();
0 \, y! o5 H0 s) k9 y# j/ p  } finally {& N5 Q7 o1 n8 S
   component.invoke("Quit", new Variant[] {});
+ [. g. x5 S- N4 b$ p' P  }2 G* c! z0 b6 Z5 Y; O$ M( x
}
) @- q/ L& Y7 ]}5 a/ K, U, X$ K; h. [8 c9 j
</CODE></PRE></TD></TR></TABLE></P>; O  d5 o& X$ |0 D
<><A>2. 用apache的poi来抽取word,excel。</A>
3 p! x- P  i3 Hpoi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>
; V; ^7 ]3 W$ S* ?$ v/ Y% G<>下载经过封装后的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>8 \, I+ D) I$ k) D9 U; q) `5 {
<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>+ h. n* k8 L) U% C% ^
<>6 w: y! d# Z4 R4 o
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">/ Y2 X/ \$ j' X$ b4 ?$ W% [5 Y

, p0 w- E& ]+ N9 Q0 y) K, \: @4 x2 a<TR>! ^* {' A3 ]0 R
<TD><RE><CODE>
9 U, F$ X6 k! k0 J9 Himport java.io.*;$ a/ l# P% b7 {" A2 Z! u
import  org.textmining.text.extraction.WordExtractor;
* n! ]" ]1 F- [2 {4 G/**, p* {: n. l9 C/ {) @; {9 C3 R, V
* <>Title: word extraction</P>
+ U5 ]3 E* X* z3 H% C9 D! G * <>Description: email:chris@matrix.org.cn</P>1 q- {! P9 ]1 J) z8 @' o
* <>Copyright: Matrix Copyright (c) 2003</P>" t. h9 K" A5 h' Z5 f# K& F& N9 y
* <>Company: Matrix.org.cn</P>
6 j5 l0 \1 \2 S8 s. A * @author chris
3 K4 Q! \" J) @. T * @version 1.0,who use this example pls remain the declare$ d. }# [! ?2 |
*/
" K! W, @) M8 _  b  r! H5 V* D+ n$ \, [
( C# d2 p* \0 v% m7 t! Vpublic class PdfExtractor {
, D. J1 h( F( y. T1 _) Q  public PdfExtractor() {& I( b/ |) i- v
  }
5 a6 ~0 N/ @$ K2 d& ~/ B  public static void main(String args[]) throws Exception
) C, A* [2 w! C- x  {
/ s  M- p# j! J, l9 \8 ^& E" ?# o7 A  FileInputStream in = new FileInputStream ("c:\\a.doc");' N) K  L" T0 |: ], J8 ~, ?' i7 w
  WordExtractor extractor = new WordExtractor();7 P' |% ~$ R+ r
  String str = extractor.extractText(in);& E0 k2 q! r& ]% w5 X* F: d3 w
  System.out.println("the result length is"+str.length());) ]' l$ k# T& S' f1 f3 b
   System.out.println("the result is"+str);
, w7 }$ _6 Q0 {9 f}
7 h; E0 S$ i0 `. f}+ K& f" J* H! O" ^- D; t1 z
</CODE></PRE></TD></TR></TABLE></P>
# F/ C8 f$ K3 b. P! U; X7 q. d<><A>3. pdfbox-用来抽取pdf文件</A># m8 T6 G2 P/ G% [3 ^2 O  Q
但是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>7 y1 ~# x% w  V! l, G+ S" A
<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>; M$ b, _" P. {' f
<>
3 ?/ L' L  B( C9 J: B<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">* T- A/ K  m; F! X5 n/ `

! w* {0 r* U# r3 h. ?  @! n<TR>
  s6 }8 O0 K0 [3 y, t, Y% z<TD><RE><CODE>4 Q! ~: A5 {/ ]8 q
import org.pdfbox.pdmodel.PDdocument.# n+ Z0 A( z- l% q% j7 B
import org.pdfbox.pdfparser.PDFParser;. x" T4 v3 ^$ h
import java.io.*;
% p: W# E, J- }* Z2 _# C, h$ }' bimport org.pdfbox.util.PDFTextStripper;
6 b9 T6 X% ?- c+ Wimport java.util.Date;& q5 }" T9 F% M# f, D3 A
/**5 i' z. b2 O( C1 C
* <>Title: pdf extraction</P>9 j. A* `/ @# h5 Q. f9 y# |- G9 i
* <>Description: email:chris@matrix.org.cn</P>
5 M6 e& [$ t$ M( o: u9 H1 t6 Y * <>Copyright: Matrix Copyright (c) 2003</P>
1 U% O" P0 a* c( F, K) Z2 w * <>Company: Matrix.org.cn</P>
  _" w, p5 I/ L0 ?, e * @author chris
3 _* U' @3 z) j: T2 \ * @version 1.0,who use this example pls remain the declare
5 N0 h" v5 x+ e5 L */
9 T& j2 L! O% k' d; I& T& G- l% ^) ~5 k1 R4 m
public class PdfExtracter{
5 |: A/ A6 B5 C; n: M
1 |( ?8 k6 C& j, lpublic PdfExtracter(){" C, D. j3 v0 M* V
  }
. P% h$ ?; F8 m& e. W! ~8 h4 D1 tpublic String GetTextFromPdf(String filename) throws Exception8 \* I+ L4 a8 u) V: d8 i
  {* R& m0 ~  X0 m& [
  String temp=null;7 y$ r1 V0 o2 n  J! N5 w; m- e
  PDdocument.nbsppdfdocument.null;
6 Z" c" }# v" M' f. N  FileInputStream is=new FileInputStream(filename);* Q. Z9 ?% \' ?: I& s
  PDFParser parser = new PDFParser( is );% v5 f. j% W% c: G: f
  parser.parse();
/ l) b  k5 k" k% H  pdfdocument.nbsp= parser.getPDdocument.);, `9 Q2 z  t6 b3 W1 {# t$ X
  ByteArrayOutputStream out = new ByteArrayOutputStream();% }5 S0 @2 g; ], n
  OutputStreamWriter writer = new OutputStreamWriter( out );
; s- O2 r  i+ Z  PDFTextStripper stripper = new PDFTextStripper();5 m6 S6 F' X1 K7 G, h" @
  stripper.writeText(pdfdocument.getdocument.), writer );
% p) j9 V; n! N6 A7 U  writer.close();4 ^6 I8 [* Z8 e: V
  byte[] contents = out.toByteArray();
( }2 A' M' m$ n
7 i- N  L  F9 g; H+ P% ~  P; Y$ `# P  String ts=new String(contents);/ K* S% {# T6 N7 f& |& B
  System.out.println("the string length is"+contents.length+"\n");
# R5 e: ]- u1 e# @$ I& l+ M  return ts;
& |, J4 F$ s/ G}! t9 a- b3 X) M
public static void main(String args[])  q0 {: W+ Q) y* i) J. f! M
{( f" }# G* n  J+ y+ l& c
PdfExtracter pf=new PdfExtracter();
& |! D; r* v  t# x; KPDdocument.nbsppdfdocument.nbsp= null;# s$ o* r* j7 \: I; y1 e5 s0 V
# L3 t0 L0 O/ j$ u1 J3 R: j1 `: w
try{. _( {. h4 S) ?6 u
String ts=pf.GetTextFromPdf("c:\\a.pdf");2 |+ A' O) a+ w4 I
System.out.println(ts);( Q& U3 z1 t+ ]  y
}$ `: d6 j( q1 I8 r
catch(Exception e)/ T( S5 L; s& ?7 w1 F1 E
  {# p. s+ a  f. X% R  R5 Z
  e.printStackTrace();1 w# m( {# Y7 Z, I7 b$ l
  }* _; l, U8 D/ a/ [3 \& @' Q2 q; \
}+ |0 o2 c, R+ S& E; X7 T

% @( l, Y( ?' }% b# k% P}
3 e6 U2 d: u! \  S# c7 S</CODE></PRE></TD></TR></TABLE></P>! O2 [7 [" M/ _# a. [1 b( c7 [5 w6 V
<><A>4. 抽取支持中文的pdf文件-xpdf</A>
  ]$ k6 [6 z6 w( @0 uxpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P>  w3 }6 x* }( F  O. L
<>下载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>  y( X8 f4 q: C! I4 V; E" L' e! i
<>同时需要下载支持中文的补丁包: <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>) D4 K& i9 h# I
<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>, ?0 {/ s2 o, b- h. n* p% H
<P>下面是一个如何调用的例子: </P>
3 y0 K: o: F( [% S2 C$ R<P>
4 F4 F5 A5 y. C) q4 a<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
! Z% l: t; E& T& N4 P. V; H9 \- ]/ r6 Y
<TR>
6 l$ H% K/ X" ^- K, O<TD><PRE><CODE>8 ~8 x; G) e+ |) Q5 D
import java.io.*;
0 _' g5 |% @. A- Q$ n& [, H/**4 S( O2 ^* k2 O, x' q6 m
* <P>Title: pdf extraction</P>- U3 v3 {! @! h$ `" P1 T3 t
* <P>Description: email:chris@matrix.org.cn</P>/ Z" O, L& j$ r6 W9 Y5 ]! I
* <P>Copyright: Matrix Copyright (c) 2003</P>3 {  [9 X  G6 F7 X6 I1 M
* <P>Company: Matrix.org.cn</P>' t3 R5 f6 D( S* Z- h
* @author chris6 [! ^  ^! f* T/ K; U. s% n
* @version 1.0,who use this example pls remain the declare* V2 i6 \7 Y0 L" e% ^+ M0 H# v
*/
' F5 W; _5 W0 P4 u0 e& A
) v$ G8 W# |. I% ~" d4 t) A; U. j, |2 Z: m, O
public class PdfWin {! ]8 c( l+ ?: w: p. ]
  public PdfWin() {" ~& Q$ @2 _" O9 E  L* p5 i& y
  }6 o3 a$ A& Y& R. X
  public static void main(String args[]) throws Exception1 g7 |9 f) p8 e! E* }7 g8 F
  {- S- |; y0 K/ |  ^$ N
    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";
0 r8 }7 o4 v- d* g, h7 {: V7 A; X    String filename="c:\\a.pdf";
, m" p1 e3 B8 G1 L    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};
  T  ]* o) a- s) r5 W7 n    Process p = Runtime.getRuntime().exec(cmd);
: }+ H& @9 W9 K3 T" S    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());
" l  R+ E! U+ ~4 K# u( T/ ]3 U' `    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");. r$ \7 r5 b4 g5 K6 m7 ]' _
    StringWriter out = new StringWriter();
" u* V/ d# i2 _    char [] buf = new char[10000];' A: J4 [: q- k" `' O. S
    int len;, [' J. n9 D5 s
    while((len = reader.read(buf))&gt;= 0) {
( r# h; g! Y  u    //out.write(buf, 0, len);
5 z3 y9 R2 W4 k2 G+ u1 p) d9 ?    System.out.println("the length is"+len);
+ h0 ^" |4 s+ R) a" v9 \# K& o1 |# s$ f    }
& y9 B2 f  Y9 `    reader.close();
2 X! d& s9 Q; ~2 k- K0 c    String ts=new String(buf);
6 f' I8 a8 N' q/ I    System.out.println("the str is"+ts);
. q) v, |4 Y6 T8 q' P  }
8 i% Y6 k0 {! E$ P8 M) a+ z1 W! E6 O}" ]7 d; `2 S# @9 n+ d: j+ M1 o3 _! |
</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-4-18 19:31 , Processed in 0.438755 second(s), 56 queries .

    回顶部