QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4252|回复: 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>
* ]) `, h  T7 I4 ]! F" K<><A>1 .用jacob</A>6 e' s' h* i: b2 \) w/ R
其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>4 H- z- T0 _  F
<>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, n4 e' C7 u+ P9 Q$ u7 n
<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>
7 B, j- S, S' F! d<>
! o8 p& D, D: ?8 u<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">) H; n6 j1 a$ W# R' `1 h

& v( _" W  r1 e# c9 y# A<TR>
1 j% A5 {6 a+ B2 `. P! P( Y. b2 Z<TD><RE><CODE># [" [0 n) ^7 I- z
import java.io.File;
2 J4 z3 o" M3 K' O8 pimport com.jacob.com.*;  c- d( ]" ?' o' {0 I! F! Y% w
import com.jacob.activeX.*;3 i# G! X9 ?( g/ p* [# H
/**; L) R1 r& L2 ^
* <>Title: pdf extraction</P>: p2 S. [1 s! `  M* ~+ e
* <>Description: email:chris@matrix.org.cn</P>7 ]1 X4 O3 ?7 Y6 Z/ _
* <>Copyright: Matrix Copyright (c) 2003</P>2 c3 g. {! P" c: L8 l
* <>Company: Matrix.org.cn</P>' J' M0 ]% y. v0 ~7 T: h$ v7 }
* @author chris6 p  v6 N5 @1 W; Q& b
* @version 1.0,who use this example pls remain the declare5 O/ ~+ u* w7 c1 ]0 _
*/+ \$ C! q9 E3 Z1 {/ c+ T7 e
public class FileExtracter{
) N& W3 Z' b. y public static void main(String[] args) {
6 \, ^( L: v9 Z8 I  ActiveXComponent component = new ActiveXComponent("Word.Application");7 R+ w7 c4 ]7 R2 U. I( d$ n
  String inFile = "c:\\test.doc";
; `) N0 l& ]: v( ?$ S String tpFile = "c:\\temp.htm";
/ J9 N' j  T; }8 x$ X8 r0 P" D  String otFile = "c:\\temp.xml";
# m9 n+ B0 }# ]/ Y6 H2 g! t  boolean flag = false;$ O. W+ n" G, \" a
  try {
1 S- ~# T( t: V2 Y% n2 X  g   component.setProperty("Visible", new Variant(false));( b) w4 H% s3 N' H
   Object wordacc = component.getProperty("document.").toDispatch();
, F3 a* M; I1 Q' Q+ |3 p1 T9 T+ v   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method,
3 {) F1 v0 j+ S7 F) b7 F$ r                                     new Object[]{inFile,new Variant(false), new Variant(true)},
0 C) L* q' F( e8 Y. ^4 }0 ^3 y) A                                     new int[1] ).toDispatch();$ Q. h0 p6 n* s8 m4 |
   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);" o0 s: z- Z; N. _3 `* @
   Variant f = new Variant(false);1 F6 y  c$ m: O
   Dispatch.call(wordfile, "Close", f);- ]( ]$ R6 j; ]' y% {
   flag = true;
9 ^' `8 [0 H( ^* P- R- L. X  } catch (Exception e) {
% [# f3 E/ o4 K& u' [   e.printStackTrace();6 T% _4 u2 B; o, o# F/ D
  } finally {
; t# ^- X5 S8 u- b0 N7 B   component.invoke("Quit", new Variant[] {});
3 }4 ]3 {, v! b% L4 V  }- C0 x: |9 ]" r
}+ o- F' C, L# X9 L6 M) Z0 R
}2 O! r* n- h7 p+ F5 [% D
</CODE></PRE></TD></TR></TABLE></P>
& ?" `2 Q4 Q% E$ V! \<><A>2. 用apache的poi来抽取word,excel。</A>
" Y; ?! A9 Y7 H2 T+ npoi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>
3 H5 T1 K2 T1 @: _8 ~  \; {<>下载经过封装后的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>
3 s* p/ A# |1 f9 S2 }# N  C<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>
: S. g& x" n/ \4 r9 Z& M- t<>5 b* a7 {/ e4 d5 P
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">4 G. W' U* w, E

* ~" c% g4 w% H1 i+ _0 `<TR>( f0 c* ?5 v3 X; i! q
<TD><RE><CODE>2 H! ?4 K+ Z8 \; w( T; C9 b
import java.io.*;* x3 L8 Q- Y0 Y+ t: B
import  org.textmining.text.extraction.WordExtractor;
0 K* f; }' C! M: E/**+ O: l+ C% ~2 z$ |9 g
* <>Title: word extraction</P>  z7 v* J) h5 e3 e' \4 w
* <>Description: email:chris@matrix.org.cn</P>
2 `$ a- X- K) Z5 l) H2 y * <>Copyright: Matrix Copyright (c) 2003</P>
9 l3 V- y" K. V* J5 ?' G0 H: v * <>Company: Matrix.org.cn</P>* i$ R, u! |8 y8 ~0 s
* @author chris  N; I+ U/ I  |% t4 {1 D
* @version 1.0,who use this example pls remain the declare$ M6 Q" O, F7 }' n; V6 _
*/
6 G7 W7 r& k# s+ k
% e6 E9 V8 ?- L+ Tpublic class PdfExtractor {7 a8 x) ^, \' _$ ?/ v
  public PdfExtractor() {
) a& C. |' ~4 P  }& J- U: ], P! N) W; H5 [9 O
  public static void main(String args[]) throws Exception
# b# P; u* L: `8 H# @2 y3 I  {
* G; e3 J1 E! Q! n  FileInputStream in = new FileInputStream ("c:\\a.doc");2 ^$ L6 K& _+ I5 Y3 H1 }
  WordExtractor extractor = new WordExtractor();
3 P2 B3 b+ ], S* M% C  String str = extractor.extractText(in);" X6 M2 t# \; {, p
  System.out.println("the result length is"+str.length());- d3 m5 H: h8 H7 ]: e
   System.out.println("the result is"+str);& j0 L) n# v  \
}
7 N4 j8 K6 P$ A- Z% M}
5 J. K, P  t: |! a4 Q5 @" h, Q</CODE></PRE></TD></TR></TABLE></P>
, k1 y& h  i6 \) a" ?! o3 v/ D<><A>3. pdfbox-用来抽取pdf文件</A>6 [! o- @7 G: t7 S9 F
但是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>' _/ k- t. n" p
<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>
- t  n) ]2 P5 P0 b<>
( m' y) L5 @) G& F4 E<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">- K! b$ X! e( a0 s$ ~
5 f9 D& g, b2 N. d9 {+ E6 V( J1 a1 q
<TR>' G; y" t3 I0 `, ~- K5 Q5 H" M" h7 y
<TD><RE><CODE>
2 C# ?- h+ r( z6 \import org.pdfbox.pdmodel.PDdocument.
/ [: C; Z/ ^: e  B7 i+ r7 nimport org.pdfbox.pdfparser.PDFParser;" s. b: W" Q9 o8 ], S
import java.io.*;% D" Y( w/ B8 \. j, p1 G' V- W
import org.pdfbox.util.PDFTextStripper;
. K: ~' V; T  simport java.util.Date;
( J" M9 Q, ^9 T& u- ?* {/**
( |5 f4 ^: E  T: c, }% T * <>Title: pdf extraction</P>9 R0 ^! M8 |1 {% e  t" f4 z
* <>Description: email:chris@matrix.org.cn</P>
5 O; m; n2 d, E" L4 ?+ z/ F5 ]! ] * <>Copyright: Matrix Copyright (c) 2003</P>
" b; V5 g. r0 g * <>Company: Matrix.org.cn</P>
! [  |$ L- O4 n3 K# q8 C, g- i( w& f * @author chris
& H/ s% E# |8 _, F, Z! X4 U0 w8 `, r& f * @version 1.0,who use this example pls remain the declare5 x- R5 X3 Q% ?! }0 z" L) D3 u
*/9 i# ~6 @1 k. V% p$ Z; n
! O: P1 p) p  b& m/ }
public class PdfExtracter{
" }4 g1 r" _& C" L& O3 r# o. F6 F. \
public PdfExtracter(){
1 I( F1 Z( W# x  }
5 t9 z- l+ a% ~* b& w4 g# I7 Rpublic String GetTextFromPdf(String filename) throws Exception! l. R, q( u( H- y
  {
2 y- y1 A* v  b. l( Y  String temp=null;3 t) k, L% F  C/ i0 L* @
  PDdocument.nbsppdfdocument.null;
/ Z1 @! j' v, w: _: k. d+ J  FileInputStream is=new FileInputStream(filename);; k: l) b7 j% Q1 X: e
  PDFParser parser = new PDFParser( is );4 m+ W7 t# c2 C  u( A8 T+ V$ y3 C; z
  parser.parse();
+ ]7 G  K1 u6 E! s2 v: C  pdfdocument.nbsp= parser.getPDdocument.);# z0 h2 q9 ~7 ?7 c- Y
  ByteArrayOutputStream out = new ByteArrayOutputStream();" I4 l' O# x# T, O0 [6 C
  OutputStreamWriter writer = new OutputStreamWriter( out );
$ i- ^+ ]7 A5 r& j% J# J  PDFTextStripper stripper = new PDFTextStripper();% G0 N$ C2 ^8 i$ a+ A; e
  stripper.writeText(pdfdocument.getdocument.), writer );
! B# Y% Z+ U+ w7 P) U$ L2 h8 f2 h  writer.close();9 x0 J7 L+ s) `; Z2 U
  byte[] contents = out.toByteArray();& H. z6 T1 A8 T9 b$ {

! R; L! i' Z. }% }; t1 ^  String ts=new String(contents);$ z# o& Z2 c7 u9 \" V9 F4 Q9 m
  System.out.println("the string length is"+contents.length+"\n");
8 H& Y0 ~6 q( T4 p. z7 r  return ts;
/ G1 R: I8 |, k% k}
) x- y0 L/ ?- D) O% D7 }1 ]# `public static void main(String args[])
  l$ W0 E6 Y. ?2 m{: q5 l% k; j3 B) x  z
PdfExtracter pf=new PdfExtracter();
  d8 B9 {- R2 ?6 p+ a/ `PDdocument.nbsppdfdocument.nbsp= null;
) Y, n# n! V( x) j" D! \8 g8 p+ w7 G5 Y. T* }/ e
try{
) R0 R, a+ v3 q1 n% j4 E* ~; pString ts=pf.GetTextFromPdf("c:\\a.pdf");9 X/ d( X$ E9 U+ w
System.out.println(ts);3 M6 Y7 a% \  p8 M9 d% z; p
}
# E0 h. Z: b! t; @# e' H4 c4 Rcatch(Exception e)
3 }6 O. s0 I# E2 @9 {8 }: N  {
6 C' {' _0 G# l9 t/ p4 ~8 h5 r  e.printStackTrace();$ T1 O! s% w: I) g3 u9 x
  }
  {) U. ]9 R: ]3 G3 r6 ^0 ?}( v. {) I' u6 z7 Y2 x+ `9 t$ S5 V9 `
: m* c! S5 Q* S
}- {& H, m3 @1 w5 C, }# ]
</CODE></PRE></TD></TR></TABLE></P>
: T( `0 l. w+ }, H) ~: Y<><A>4. 抽取支持中文的pdf文件-xpdf</A>
+ Y: d5 G1 O4 @: x, \- C; R/ vxpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P>1 s/ `& h. A. b+ L! S. n
<>下载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>+ W5 ^, D% c  V  a# S
<>同时需要下载支持中文的补丁包: <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>7 P$ w  U6 |) K9 @
<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>
) u( O) s" ~6 D' R& t! t$ R<P>下面是一个如何调用的例子: </P>" u! f* ]: t: R2 z" {# Y+ K
<P>. `+ _! r6 H5 u5 V7 ?8 R
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">* Y7 v/ {8 r/ j
' i) G( y2 [' H5 W7 H9 v' Q
<TR>
8 K" B4 a1 f: I; R! O<TD><PRE><CODE>
2 Y* r- I% R& ?import java.io.*;
0 L* q* S, Q) a2 V/**5 z) L& \! V% ]. v) {: j
* <P>Title: pdf extraction</P>
* i7 ]8 e3 `5 Q8 l/ Z * <P>Description: email:chris@matrix.org.cn</P>
& i" S6 B& Y3 Q- O( a * <P>Copyright: Matrix Copyright (c) 2003</P>) {) L; U; a& S9 O+ \7 W1 D. U
* <P>Company: Matrix.org.cn</P>
& s; ^1 D$ p3 g * @author chris/ F5 x7 y6 p# ]# B2 m( }* H
* @version 1.0,who use this example pls remain the declare4 _# s9 L! a# {3 w" ^
*/
5 M0 g; u# o8 G1 V4 P/ w$ N: u0 i" Z2 A' C
6 p9 K5 S* y) @3 O1 V7 F: d! D
public class PdfWin {# j2 u# c) X* O8 U& J
  public PdfWin() {8 O3 n0 R+ l1 K; h6 p/ X
  }
7 I% {* k8 P; B- u! k  public static void main(String args[]) throws Exception+ j5 i. i9 y: n
  {
( f  r5 M. a8 ^# r$ f    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";
) s! O( a3 E, P2 U" S' ]0 B    String filename="c:\\a.pdf";9 ?; h" }! o0 ?1 Q/ m( ?
    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};8 U6 L) \! P# p' `; R  c
    Process p = Runtime.getRuntime().exec(cmd);
5 H# K% g* Y9 p/ F    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());* U  J- F7 K% W+ h# M
    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");9 n" J* c/ X0 B/ b' G: w# B4 Y
    StringWriter out = new StringWriter();2 H% T" K  D6 `6 F
    char [] buf = new char[10000];
" _) D) t( V, I% W! l- j    int len;
3 b! a, M# x9 B+ v& A    while((len = reader.read(buf))&gt;= 0) {
% F" Z3 A/ u. r. ~3 l/ {2 y" k    //out.write(buf, 0, len);
9 |0 b0 C, x+ S; L2 e0 N$ f7 s    System.out.println("the length is"+len);5 P5 v& |  ]* k. S  N6 r
    }
) y' e1 P& d) I+ M    reader.close();
3 d1 r5 p( C- v8 c& K( d  J  R    String ts=new String(buf);! H! Y- k( @' H0 R* t4 H$ ~
    System.out.println("the str is"+ts);/ b3 ~" i+ Q( M4 C' b
  }/ @% i- Y$ d: {+ O2 q; h  [
}
/ w$ c8 z: F  Z</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-7-27 01:13 , Processed in 0.314297 second(s), 64 queries .

    回顶部