QQ登录

只需要一步,快速开始

 注册地址  找回密码
查看: 4258|回复: 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>, N' V2 @5 K' N* n! ^
<><A>1 .用jacob</A>, Z& D3 b7 z! a- _- y9 p( \
其实jacob是一个bridage,连接java和com或者win32函数的一个中间件,jacob并不能直接抽取word,excel等文件,需要自己写dll哦,不过已经有为你写好的了,就是jacob的作者一并提供了。 </P>) {1 B( i/ C" D- J( @* W
<>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>
& k+ y! ]. H6 x% E<>下载了jacob并放到指定的路径之后(dll放到path,jar文件放到classpath),就可以写你自己的抽取程序了,下面是一个简单的例子: </P>8 w7 G$ I: ]( R
<>
0 u/ ]1 A  o4 m: T) }0 K3 _<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="80%">
& G% E/ q7 K; m7 e# |
* k7 B. e6 W$ _<TR>6 d" v- ^2 h' P
<TD><RE><CODE>
7 _% W! K  U4 O( _( Mimport java.io.File;# A' v5 s1 T% b- I/ r0 w2 {
import com.jacob.com.*;
) [& T$ X8 o% R5 C- ?4 Z4 cimport com.jacob.activeX.*;% F; }8 X; j8 T2 l( Q/ O
/**% ?9 n1 H( o; `, f
* <>Title: pdf extraction</P>8 t& Q9 v7 C2 [2 Z8 ?% ]! P9 ~
* <>Description: email:chris@matrix.org.cn</P>4 b# b) H# }% k
* <>Copyright: Matrix Copyright (c) 2003</P>
  k$ I+ r$ v5 o3 i9 r+ Y% ^ * <>Company: Matrix.org.cn</P>' F  w! V' m: D. _
* @author chris0 U1 m: I& g) A, q& q
* @version 1.0,who use this example pls remain the declare
" I& _# {4 l# p3 d; `4 ` */4 H! x2 n& s# |9 k1 {9 t6 C
public class FileExtracter{$ G" R( s7 E. Z& `; W) m6 n
public static void main(String[] args) {
6 l( y8 c, g( _) Q6 I. @  ActiveXComponent component = new ActiveXComponent("Word.Application");" g8 ?4 ?/ n: g
  String inFile = "c:\\test.doc";7 r7 K6 W8 G7 F
String tpFile = "c:\\temp.htm";' [9 N/ a9 M2 t& C, x; T
  String otFile = "c:\\temp.xml";
2 _' r$ c+ ^' T7 {  boolean flag = false;$ S9 P5 D7 s) [# Y! s, k5 K
  try {2 d$ _/ n6 E/ L+ v9 V* d
   component.setProperty("Visible", new Variant(false));7 @( a) d" W( j9 W7 I( U1 j7 D
   Object wordacc = component.getProperty("document.").toDispatch();
$ Q8 ], G0 ~& I# x   Object wordfile = Dispatch.invoke(wordacc,"Open", Dispatch.Method,
5 p; C( k9 u- F7 y+ H                                     new Object[]{inFile,new Variant(false), new Variant(true)},5 H+ D! r5 l8 [' \' F" \/ l
                                     new int[1] ).toDispatch();
/ z. d& e0 Q: w4 `   Dispatch.invoke(wordfile,"SaveAs", Dispatch.Method, new Object[]{tpFile,new Variant(8)}, new int[1]);  W% ]- j5 t* u4 V5 C0 g6 W7 \
   Variant f = new Variant(false);
. @: |9 J  C  F2 P+ q9 ]# _4 E   Dispatch.call(wordfile, "Close", f);
2 L/ ~9 F* M7 z   flag = true;8 e! b3 a8 t* }4 d. j9 w) E
  } catch (Exception e) {
) r3 [$ C* L- R- Z5 |( K. ~' S   e.printStackTrace();
- o- Y& V* e* w6 A8 Q8 Z  } finally {
3 }  o# _; T6 f   component.invoke("Quit", new Variant[] {});( T) v7 v4 [( o2 K5 y
  }5 z4 W3 x- B/ u* u0 \; m3 N
}' d. @6 j, M! w# E, U. i
}
' _7 d9 O5 M- }! S5 M2 N8 ~: `  E</CODE></PRE></TD></TR></TABLE></P>
, O% o$ y' N' X3 T0 j6 S<><A>2. 用apache的poi来抽取word,excel。</A>
) {( [# }9 |( S, I8 J( a" B7 Vpoi是apache的一个项目,不过就算用poi你可能都觉得很烦,不过不要紧,这里提供了更加简单的一个接口给你: </P>
3 R8 O8 W" p+ L0 C+ w6 L1 X7 I<>下载经过封装后的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 j' r! }2 P+ J0 r* N, Y
<>下载之后,放到你的classpath就可以了,下面是如何使用它的一个例子: </P>/ t4 e$ H3 X/ V' i
<>9 j& R# L/ S4 B0 r$ y2 R
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">) `8 v. p: Z8 _( a7 }

/ n8 T/ p! k) b# A: ]; F& G! C<TR>
1 c/ V  ]8 ~* A. u4 {; i<TD><RE><CODE>& {. T) n+ \+ _- F" g: ]3 l% P$ E
import java.io.*;
% Y- }3 g3 s/ {- @# S' ?6 L" ?import  org.textmining.text.extraction.WordExtractor;7 q: {5 W% @+ z5 y* J8 r" t* b
/**3 Q/ @7 J/ A9 `8 x+ E4 y5 ^
* <>Title: word extraction</P>3 a2 b: z! X. V
* <>Description: email:chris@matrix.org.cn</P>* S: J' @' ^3 i
* <>Copyright: Matrix Copyright (c) 2003</P>) [# r9 U" J  O: S6 A0 [3 B
* <>Company: Matrix.org.cn</P>
9 }6 ]- x( s8 s * @author chris
+ T  ~8 P/ w' @, ?/ u( A * @version 1.0,who use this example pls remain the declare
/ I- y3 B8 g: q2 E& i */! x' B5 y/ t/ J8 c1 t
2 R1 X; y/ d% Z9 u
public class PdfExtractor {
8 m. f7 L# q$ R. d( h$ v( C7 m& J  public PdfExtractor() {
2 |* b) F, t+ V. y3 W7 A' ^  }& K: c1 v5 q6 L4 R6 O5 T/ v( j
  public static void main(String args[]) throws Exception/ x; A7 w1 v- A& U8 F* |  r1 P5 a
  {
# e6 G! r' x$ d  FileInputStream in = new FileInputStream ("c:\\a.doc");6 R8 w' b: ~# z0 d% t
  WordExtractor extractor = new WordExtractor();' n) I4 c; D' F& L& {; g0 ~
  String str = extractor.extractText(in);
( Z% `. C  {# G. b5 D6 J" g  System.out.println("the result length is"+str.length());
# L) O: @# T  S- c" p   System.out.println("the result is"+str);
/ j* n" A( {7 r( U3 ?/ Z}
/ `6 x+ o  Y& r+ ?}
4 ~8 c8 p6 A4 ^! N</CODE></PRE></TD></TR></TABLE></P>
; t+ K0 X' S% ]6 t8 v- m* G<><A>3. pdfbox-用来抽取pdf文件</A>
; v$ T2 a9 R" B但是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>/ E- A2 M  q8 o8 O3 H! C! J
<>下面是一个如何使用pdfbox抽取pdf文件的例子: </P>& \, L2 n5 ?: _# z
<>' r) D: F2 I' a4 I5 p& A% q/ X. ?
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">9 q2 b# Z+ T. t! W3 I' d! f
1 m: F: M0 s) c- D- A* o* _
<TR>0 {" l1 }; D7 }# l4 W3 z
<TD><RE><CODE>& S4 i; U5 a* z# P# J$ r# }5 N
import org.pdfbox.pdmodel.PDdocument.9 ^2 S5 O& L2 H, m* ?
import org.pdfbox.pdfparser.PDFParser;; y7 a  U* r# a
import java.io.*;1 Q* q$ K: O% U' w" h
import org.pdfbox.util.PDFTextStripper;
: h+ R: \4 |; T7 R' ~# O) mimport java.util.Date;
9 u" c* p; n% h: j( r& \9 a/**
# w9 v% c8 l" t* R * <>Title: pdf extraction</P>
* Z0 m' {+ n6 \+ f1 K$ T) ] * <>Description: email:chris@matrix.org.cn</P>
2 e. M1 {8 W  i; K8 R * <>Copyright: Matrix Copyright (c) 2003</P>
+ C8 d, L3 \$ Z% X" T4 _ * <>Company: Matrix.org.cn</P>5 n& V" t  G+ z) o* W
* @author chris8 i) I( G2 N. T' @: {' N
* @version 1.0,who use this example pls remain the declare$ h0 E  t+ k+ T+ T4 l
*/, k# d8 |  i+ `  \

& f8 L( C, h1 m- Mpublic class PdfExtracter{4 H1 E" i# s6 s, o/ ~
  u* v$ \2 U  N5 s
public PdfExtracter(){
" t/ D, G( a5 P" K9 E  }
. s. K9 |* `$ \8 \' Lpublic String GetTextFromPdf(String filename) throws Exception6 I% A0 h' m  `) G
  {! \9 `/ p  o2 ?+ m+ ]
  String temp=null;
7 g+ Y' E+ T) w  PDdocument.nbsppdfdocument.null;( V5 s, }5 k, n1 g9 K7 n
  FileInputStream is=new FileInputStream(filename);: j; ~! h: K9 T% {1 |# [
  PDFParser parser = new PDFParser( is );$ x) e$ A, E6 R$ j' k% V5 Q
  parser.parse();
* g# |# F2 w8 @/ ~8 M! ~  pdfdocument.nbsp= parser.getPDdocument.);/ a! a- \$ x2 o* e: k. c
  ByteArrayOutputStream out = new ByteArrayOutputStream();4 i& c# o* U5 C/ G" I
  OutputStreamWriter writer = new OutputStreamWriter( out );9 Q& n' o: {$ F" M! E# N4 x! r
  PDFTextStripper stripper = new PDFTextStripper();3 H! d, ?+ j7 r' d
  stripper.writeText(pdfdocument.getdocument.), writer );! \5 p3 I6 V5 P$ V
  writer.close();) I# f2 U; K+ {$ h) d/ u$ Q. l
  byte[] contents = out.toByteArray();- C( q- X. }! f
' I8 B; {( {* `8 [1 `
  String ts=new String(contents);- X$ T3 p$ s1 f% q3 Q# ]5 Q8 a# R
  System.out.println("the string length is"+contents.length+"\n");
' r  ?/ F8 o: v" C  return ts;
6 C. v! L0 L! k: I% K9 Y9 d- L}: T" Q1 {8 v9 {, q$ Q/ h6 T+ x1 ^
public static void main(String args[])+ A( w0 J+ e' S" L+ j; j
{
: U: R; o9 [& Q0 k# XPdfExtracter pf=new PdfExtracter();
; g2 ~$ G2 S. FPDdocument.nbsppdfdocument.nbsp= null;# s3 T/ T4 c* \) U

0 f. j2 N! M% e/ \, qtry{
3 A0 a" Q4 }/ Z' `+ }- _1 S/ K( KString ts=pf.GetTextFromPdf("c:\\a.pdf");
# a0 g9 `8 b5 b1 w; G. D5 i- S. pSystem.out.println(ts);
; Q. Y, o* P% S6 Z9 g* e}
+ D! n" }8 Y" B4 N% ^7 y( G' N( [catch(Exception e)% ~- ?; g' n4 V6 \# d
  {: G  L; Z3 r3 S- R  U# ?2 r
  e.printStackTrace();
' o% L( i, v: ^7 R  }$ I; F3 }* g; c6 v6 i. Z7 M0 v6 A
}
4 O$ t1 u  W# f% Q" L6 o5 }: F. T  X. e% X
}
5 y$ R$ \. z, U4 |</CODE></PRE></TD></TR></TABLE></P>( Z, G( q. E5 K& J1 e
<><A>4. 抽取支持中文的pdf文件-xpdf</A>* r# O5 |+ d  H9 [( l" l
xpdf是一个开源项目,我们可以调用他的本地方法来实现抽取中文pdf文件。 </P>
2 Z% \: E; Q) {  Y/ q<>下载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>
: Z, ]2 J8 @2 n# U& Z<>同时需要下载支持中文的补丁包: <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>! A" T8 b3 H" F! S$ c% E) x. f
<>按照readme放好中文的patch,就可以开始写调用本地方法的java程序了 </P>
# E- H4 M3 C" A0 {8 r<P>下面是一个如何调用的例子: </P>% |( A5 c4 J, G* Z7 X- p4 {  L
<P>. D: f' M# D3 r! q$ d+ Z8 T+ j
<TABLE bgColor=#cccccc border=1 cellPadding=5 cellSpacing=0 width="100%">
' o2 p/ G* w% X5 J) A) p" V* ^- x% D& C3 T- F9 V
<TR>7 s1 T- e' w4 c% U' t% v. y6 b
<TD><PRE><CODE>$ R' s- B  E& ?7 e0 |, t7 S
import java.io.*;
5 J$ ]( y3 O/ Z& d/**
! R$ ]! @. c6 }: v4 \5 x * <P>Title: pdf extraction</P>  ~3 `7 Z) ~, {+ I
* <P>Description: email:chris@matrix.org.cn</P>6 F- O: M. Y, f$ d. B& D
* <P>Copyright: Matrix Copyright (c) 2003</P>9 M6 L) J9 {7 r% p. R& Y
* <P>Company: Matrix.org.cn</P>. A* c& Y0 j+ z4 N
* @author chris
2 j1 o: B/ b0 G/ f, U2 m * @version 1.0,who use this example pls remain the declare
9 ?9 A3 @; X" Q0 { */" M+ t+ g6 ~/ q
. O5 t4 h2 N& |' i+ q7 ~
; C0 p, u, W7 k9 J9 R9 _$ S
public class PdfWin {" y+ A" s* o% @! x( u- h" C
  public PdfWin() {  I# S, q7 u' |# E! W, ~3 W8 h$ c6 x
  }7 y7 Y4 R5 K7 T: D/ P, b! p
  public static void main(String args[]) throws Exception9 I: B6 T3 N  {5 U8 F5 O' K
  {
& v8 k2 I- m& ?% [* n- w; `: A    String PATH_TO_XPDF="C:\\Program Files\\xpdf\\pdftotext.exe";8 c; f3 O- |% E) E' k; r+ j
    String filename="c:\\a.pdf";" R$ P  o2 G6 b3 Y
    String[] cmd = new String[] { PATH_TO_XPDF, "-enc", "UTF-8", "-q", filename, "-"};0 d3 n5 ^$ z% U" |
    Process p = Runtime.getRuntime().exec(cmd);
" K9 c% \, ]5 \/ I" K1 p* i& p    BufferedInputStream bis = new BufferedInputStream(p.getInputStream());
! S% N4 p1 l& M- c- q5 `5 T    InputStreamReader reader = new InputStreamReader(bis, "UTF-8");
  |6 F/ f, S. B6 N7 I    StringWriter out = new StringWriter();# Q1 [( d: Z0 m
    char [] buf = new char[10000];4 v9 L$ e; E  _" j) Q
    int len;& w8 Y, k& c& H& w* {
    while((len = reader.read(buf))&gt;= 0) {
7 h: {" H# V( f& k: g% l2 F" H' _" J7 `    //out.write(buf, 0, len);  o! \' K; k8 E8 S$ {: M
    System.out.println("the length is"+len);
/ D& q- b3 I* P! x0 d4 p) P    }# {/ S4 c" D2 z0 Y7 q
    reader.close();
1 l( V" j- K8 D    String ts=new String(buf);
- V- z& N5 y! P8 V& P& F, i; V+ B  F    System.out.println("the str is"+ts);
+ K; ]* [% O" g2 s- \  }
( Q$ L6 e; G; Q1 x/ Q: ~  Q3 P6 m}: g9 M% w& G) d: N
</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-31 09:05 , Processed in 0.431843 second(s), 64 queries .

    回顶部