Sie sind auf Seite 1von 11

Tutorial PDFBox v1.

0
Ivan Salvadori, ivanls@inf.ufsc.br
Florianpolis, Santa Catarina
0!11!"011
T#$ %pac#$ PDFBox& librar' is an op$n sourc$ (ava tool for )or*in+ )it# PDF
docu,$nts. T#is pro-$ct allo)s cr$ation of n$) PDF docu,$nts, ,anipulation of $xistin+
docu,$nts and t#$ abilit' to $xtract cont$nt fro, docu,$nts. %pac#$ PDFBox also includ$s
s$v$ral co,,and lin$ utiliti$s. %pac#$ PDFBox is publis#$d und$r t#$ %pac#$ .ic$ns$ v".0
Co,o d$scrito aci,a, PDFBox / u,a bibliot$ca 0u$ p$r,it$ ,anipular ar0uivos PDF, s$-a para
cria12o d$ novos docu,$ntos ou ,$s,o d$ docu,$ntos -3 $xist$nt$s, p$r,itindo a $xtra12o d$ s$u
cont$4do. 5 u,a f$rra,$nta d$s$nvolvido p$lo %pac#$ Soft)ar$ Foundation, dispon6v$l no
$nd$r$1o #ttp7!!pdfbox.apac#$.or+! .
8ssa f$rra,$nta possui as s$+uint$s caract$r6sticas7
Features
PDF to t$xt $xtraction
9$r+$ PDF Docu,$nts
PDF Docu,$nt 8ncr'ption!D$cr'ption
.uc$n$ S$arc# 8n+in$ Int$+ration
Fill in for, data FDF and :FDF
Cr$at$ a PDF fro, a t$xt fil$
Cr$at$ i,a+$s fro, PDF pa+$s
Print a PDF
Objetivos
8st$ tutorial d$,onstra o uso do PDFBox, i,pl$,$ntando $x$,plos d$ cada funcionalidad$
dispon6v$l p$la bibliot$ca. ;sar$,os o 8clis$ ID8 Indi+o, co,pilando co, (ava 1.<, -unta,$nt$
co, %pac#$ 9av$,, por/, os $x$,plos pod$, s$r r$ali=ados $, 0ual0u$r outro a,bi$nt$ d$
d$s$nvolvi,$nto, s$, co,pro,$t$r n$n#u,a funcionalidad$.
Co, o ob-$tivo s$cund3rio, busca apr$s$ntar o %pac#$ 9av$n aos d$s$nvolv$dor$s 0u$ $st2o
iniciando co, $ssa f$rra,$nta. Caso voc> -3 con#$1a o ,av$n, pod$ pular $st$s d$tal#$s.
Criando o projeto
%nt$s d$ dar inicio a i,pl$,$nta12o dos $x$,plos, va,os confi+urar o a,bi$nt$ d$
d$s$nvolvi,$nto $ criar o pro-$to no 8clips$, 0u$ s$r3 usado para i,pl$,$ntar todas as
funcionalidad$s do PDFBox.
Criar u, pro-$to 9av$n.
9arcar a op12o Create simple project (skip archetype selection).
Criar$,os u, pro-$to ,av$n si,pl$s, s$, $scol#$r n$n#u, ,od$lo d$ pro-$to -3 d$finido.
Co,pl$tar o ?roup Id $ %rtfact Id da for,a 0u$ -ul+ar ,ais ad$0uado. ?roup Id r$pr$s$nta a
$ntidad$ 0u$ $st3 d$s$nvolv$ndo o soft)ar$, %rtifact Id / o no,$ do sist$,a s$ndo d$s$nvolvido.
@$st$ tutorial, o soft)ar$ s$r3 d$s$nvolvido para s$r $x$cutado co,o u, pro+ra,a, $x$cut3v$l
dir$ta,$nt$ p$lo usu3rio, no sist$,a op$racional, ,as pod$ s$r d$s$nvolvido co,o part$ int$+rant$
d$ u, sist$,a )$b ou )$bs$rvic$. D$ssa for,a usar$,os o $,pacota,$nto jar.
A$ali=ados os passos d$scrito aci,a, t$r$,os o pro-$to criado co, a s$+uint$ $strutura.
@ot$ 0u$ o -ava 1.B $st3 s$l$cionado co,o padr2o, va,os alt$rar para utili=ar o -ava 1.<C
Co, o dir$ito do ,ous$, cli0u$ $, (A8 S'st$, .ibrar',
$scol#a o ,$nu propri$dad$s. %lt$rar para (avaS8 1.<.
D ar0uivo po,.x,l +uarda as confi+ura1E$s do %pac#$ 9av$,. Clicando duas v$=$s sobr$ o
po,.x,l, s$r3 $xibido u, d$tal#a,$nto d$stas confi+ura1E$s.
Clicando na aba pom.xml no canto inf$rior dir$ito,
D cont$4do do po,.x,l s$r3 $xibido.
Para pod$r trabal#ar co, o %pac#$ PDFBox, / n$c$ssario fa=$r o do)nload da bibliot$ca, baixando
o -ar da f$rra,$nta. Por/, co, o %pac#$ 9av$n isso n2o / n$c$ss3rio, basta infor,ar 0u$ o
soft)ar$ 0u$ $st3 s$ndo d$s$nvolvido d$p$nd$ da bibliot$ca do PDFBox. Isso / f$ito no po,.x,l,
adicionando a d$p$nd$ncia do PDFBox. D po,.x,l ficar3 da s$+uint$ for,a7
@a ta+ v$rsion, coloca,os a ulti,a v$rs2o disponiv$l do PDFBox.
<dependency>
<groupId>org.apache.pdfbox</groupId>
<artifactId>pdfbox</artifactId>
<version>1.6.0</version>
</dependency>
%o salvar o po,.x,l, todos os -ar n$c$ss3rios para trabal#ar
co, o PDFBo= s$r2o auto,atica,$nt$ baixados da int$rn$t,
s$, a n$c$ssidad$ d$ fa=$r o do)nload ,anual,$nt$ $
adicion3Flos ao pro-$to.
Co, isso o pro-$to -3 $st3 confi+urado para dar inicio a
i,pl$,$nta12o das funcionalidad$s do PDFBox.
Extrao de textos de documentos !F
% $xtra12o d$ t$xto $, PDF / u,a das principais funcionalidad$s do PDFBox. Para r$ali=ar a
$xtra12o, va,os criar duas Class$s, PDF8xtraction, 0u$ i,pl$,$ntar3 a funcionalidad$ d$ $xtra12o
$ a Class$ 9ain, 0u$ $x$cutar3 os ,/todos i,pl$,$ntados.
Para o $x$,plo, va,os $xtrair o t$xto d$ u, ar0uivo PDF $xist$nt$ no disco.
Ga,os i,pl$,$ntar u, ,$todo 0u$ ir3 $xtrair o t$xto contido $, u, ar0uivo PDF, r$c$b$ndo
co,o parH,$tro o no,$ $ o ca,in#o co,pl$to do ar0uivo d$s$-ado.
1 public String extrairTexto(String cainho!r"uivo# $
%
& String texto'xtraido ( null)
*
+ ,i-e doc ( new ,i-e(cainho!r"uivo#)
6
. /00ocuent pd0oc)
1 try $
2 pd0oc ( /00ocuent.load(doc#)
10 /0,TextStripper stripper ( new /0,TextStripper(#)
11 texto'xtraido ( stripper.getText(pd0oc#)
1%
1& 3 catch (I4'xception e# $
1* e.printStac5Trace(#)
1+ 3
16
1. return texto'xtraido)
11 3
Explicando
"inha #7 Criado u, ,/todo 0u$ r$torna a Strin+ do t$xto $xtra6do d$ u, ar0uivo PDF. D ,/todo
r$c$b$ o no,$ do ar0uivo co, o s$u ca,in#o co,pl$to.
"inha $7 Gari3v$l 0u$ r$c$b$r3 o t$xto $xtra6do.
"inha %7 Fil$ para ac$ssar o ar0uivo na class$.
"inha &7 A$pr$s$nta12o do docu,$nto PDF.
"inha '7 Carr$+a as infor,a1E$s do Fil$ para o ob-$to PDDocu,$nt.
"inha #(7 Cria12o do !F)ext*tripper, 0u$ / o r$spons3v$l p$la $xtra12o do t$xto.
"inha ##7 Gari3v$l r$c$b$ o cont$4do do ar0uivo PDF atrav/s do ,/todo +et)ext().
Executando Exemplo
Para $x$cutar o ,/todo i,pl$,$ntado aci,a, cria,os a class$ 9ain co, o ,$todo ,ain.
package ivansa-vadori.pdfboxtutoria-)
import ivansa-vadori.pdfboxtutoria-.extraction./0,'xtraction)
public class 6ain $
public static void ain(String78 args# $
/0,'xtraction pdf'xtraction ( new /0,'xtraction(#)
String texto ( pdf'xtraction.extrairTexto(9/hoe/ivan/0ocuentos/-ucene:&:tutoria-.pdf9#)
Syste.out.print-n(texto#)
3
3
Ga,os r$ali=ar a $xtra12o do ar0uivo luc$n$FFtutorial.pdf
infor,ando s$u ca,in#o co,pl$to.
I 8, br$v$ $scr$v$r$i arti+os sobr$ .uc$n$.

Para $x$cutar,
dir$ito do ,ous$JAun%sJ(ava %pplication


,esultado-
5 poss6v$l obt$r ,ais infor,a1E$s sobr$ o docu,$nto PDF lido do ar0uivo, obt$r o n4,$ro d$
p3+inas por $x$,plo.
public int get;uero/aginas(String cainho!r"uivo# $
int nu/aginas ( 0)
,i-e doc ( new ,i-e(cainho!r"uivo#)
/00ocuent pd0oc)
try $
pd0oc ( /00ocuent.load(doc#)
numPaginas = pdDoc.getNumberOfPages()
3 catch (I4'xception e# $
e.printStac5Trace(#)
3
return nu/aginas)
3
Execuo e ,esultado
@ot$ 0u$ o docu,$nto PDF
cont/, $xata,$nt$ " p3+inas.
Dutra op12o / $sp$cificar o int$rvalo d$ p3+inas para $xtra12o do t$xto.
public String extrairTexto(String cainho!r"uivo< int paginaInicio< int pagina,ina-# $
String texto'xtraido ( null)
,i-e doc ( new ,i-e(cainho!r"uivo#)
/00ocuent pd0oc)
try $
pd0oc ( /00ocuent.load(doc#)
/0,TextStripper stripper ( new /0,TextStripper(#)
stripper.set!tartPage(pagina"nicio)
stripper.set#ndPage(pagina$inal)
texto'xtraido ( stripper.getText(pd0oc#)
3 catch (I4'xception e# $
e.printStac5Trace(#)
3
return texto'xtraido)
3
3
Execuo e ,esultado
8xtrair t$xto da pri,$ira p3+ina do docu,$nto Pri,$ira p3+ina do ar0uivo
5 i,portant$ apr$s$ntar a font$ do docu,$nto utili=ado no $x$,plo d$ $xtra12o d$ t$xto.
"ucene .ersion $.( )utorial / Bob Carp$nt$r F carp@lin+pip$.co, F .in+Pip$, Inc.
A$sp$itando s$us dir$itos autorais $ r$co,$ndando sua l$itura.
0nexo 1
PDF8xtraction.-ava
package ivansa-vadori.pdfboxtutoria-.extraction)
import =ava.io.,i-e)
import =ava.io.I4'xception)
import org.apache.pdfbox.pdode-./00ocuent)
import org.apache.pdfbox.uti-./0,TextStripper)
public class /0,'xtraction $
public String extrairTexto(String cainho!r"uivo# $
String texto'xtraido ( null)
,i-e doc ( new ,i-e(cainho!r"uivo#)
/00ocuent pd0oc)
try $
pd0oc ( /00ocuent.load(doc#)
/0,TextStripper stripper ( new /0,TextStripper(#)
texto'xtraido ( stripper.getText(pd0oc#)
3 catch (I4'xception e# $
e.printStac5Trace(#)
3
return texto'xtraido)
3
public int get;uero/aginas(String cainho!r"uivo# $
int nu/aginas ( 0)
,i-e doc ( new ,i-e(cainho!r"uivo#)
/00ocuent pd0oc)
try $
pd0oc ( /00ocuent.load(doc#)
nu/aginas ( pd0oc.get;uber4f/ages(#)
3 catch (I4'xception e# $
e.printStac5Trace(#)
3
return nu/aginas)
3
public String extrairTexto(String cainho!r"uivo< int paginaInicio<
int pagina,ina-# $
String texto'xtraido ( null)
,i-e doc ( new ,i-e(cainho!r"uivo#)
/00ocuent pd0oc)
try $
pd0oc ( /00ocuent.load(doc#)
/0,TextStripper stripper ( new /0,TextStripper(#)
stripper.setStart/age(paginaInicio#)
stripper.set'nd/age(pagina,ina-#)
texto'xtraido ( stripper.getText(pd0oc#)
3 catch (I4'xception e# $
e.printStac5Trace(#)
3
return texto'xtraido)
3
3
Int$rfac$ ?r3fica
Co,o o ob-$tivo / d$s$nvolv$r u, soft)ar$ d$s*top, total,$nt$ $x$cut3v$l, va,os $nt2o
i,pl$,$ntar u,a int$rfac$ +r3fica para ,$l#orar a $xp$ri$ncia do usu3rio. % Int$rfac$ consist$ $,
u,a -an$la ap$nas, possui u, ca,po para di+itar o ar0uivo co, ca,in#o co,pl$to, u, bot2o para
r$ali=ar a $xtra12o do t$xto $ u,a ar$a d$ t$xto para $xibir o cont$4do $xtra6do. @2o va,os discutir
os d$tal#$s da i,pl$,$nta12o da -an$la +r3fica, pois $ss$ n2o / ob-$tivo do tutorial, ,as o s$u
cdi+o / apr$s$ntado no %n$xo II.
2erando o Execut3vel
Para +$rar o $x$cut3v$l atrav/s do ,av$n, t$,os 0u$ r$ali=ar al+u,as p$0u$nas confi+ura1E$s,
u,as d$las / $sp$cificar 0ual s$r3 a class$ 0u$ t$r3 s$u ,/todo ,ain $x$cutado, no nosso caso
t$,os ap$nas u,a class$ co, ,/todo ,ain, ,$s,o assi, d$v$,os $sp$cificar. D$v$Fs$ ta,b/,
ori$ntar o ,av$, $,pacotar as d$p$nd>ncias utili=adas -unta,$nt$ co, o -ar final. 8ssas
confi+ura1E$s s2o f$itas no po,.x,l. Foi confi+urado ta,b/, a dir$tiva 0u$ d$t$r,ina o -ava 1.<
co,o o padr2o a s$r utili=ado. %cr$sc$nt$ as infor,a1E$s abaixo no po,.x,l
<bui-d>
<fina-;ae>pdf>oxTutoria-</fina-;ae>
<p-ugins>
<p-ugin>
<groupId>org.apache.aven.p-ugins</groupId>
<artifactId>aven:asseb-y:p-ugin</artifactId>
<executions>
<execution>
<id>pac5age:=ar:?ith:dependencies</id>
<phase>pac5age</phase>
<goa-s>
<goa->sing-e</goa->
</goa-s>
<configuration>
<append!sseb-yId>fa-se</append!sseb-yId>
<descriptor@efs>
<descriptor@ef>=ar:?ith:dependencies</descriptor@ef>
</descriptor@efs>
<archive>
<anifest>
<ainA-ass>ivansa-vadori.pdfboxtutoria-.6ain</ainA-ass>
</anifest>
</archive>
</configuration>
</execution>
</executions>
</p-ugin>
<p-ugin>
<groupId>org.apache.aven.p-ugins</groupId>
<artifactId>aven:copi-er:p-ugin</artifactId>
<configuration>
<source>1.6</source>
<target>1.6</target>
</configuration>
</p-ugin>
</p-ugins>
</bui-d>
Co, o po,.x,l confi+urado corr$ta,$nt$, va,os +$rar o (%A $x$cut3v$l.
Dir$ito do ,ous$ sobr$ o pro-$to, Aun %s J 9av$n pac*a+$.
S$ tudo ocorr$u b$,, a s$+uint$ ,$nsa+$, $star3 no consol$7
D (ar $x$cut3v$l fica dispon6v$l na pasta tar+$t.
%n$xo II
(an$la.-ava
package ivansa-vadori.pdfboxtutoria-.vie?)
import ivansa-vadori.pdfboxtutoria-.extraction./0,'xtraction)
import =ava.a?t.event.!ction'vent)
import =ava.a?t.event.!ctionBistener)
import =avax.s?ing.C>utton)
import =avax.s?ing.C,rae)
import =avax.s?ing.CBabe-)
import =avax.s?ing.CScro--/ane)
import =avax.s?ing.CText!rea)
import =avax.s?ing.CText,ie-d)
public class Cane-a e%tends C,rae $
private static final long seria-DersionEI0 ( :1*+26.11%6&2..&602B)
private CBabe- -abe-Aapo!r"uivo)
private CText,ie-d capo!r"uivo)
private C>utton botao'xtrair)
private CBabe- -abe-AapoTexto'xtraido)
private CText!rea capoTexto'xtraido)
private CScro--/ane scro-AapoTexto'xtraido)
public Cane-a(# $
super.setSiFe(6+0< ++0#)
super.setBayout(null#)
this.-abe-Aapo!r"uivo ( new CBabe-(9!r"uivoG 9#)
this.-abe-Aapo!r"uivo.set>ounds(10< 10< 100< %+#)
add(this.-abe-Aapo!r"uivo#)
this.capo!r"uivo ( new CText,ie-d(#)
this.capo!r"uivo.set>ounds(100< 10< *00< %+#)
add(this.capo!r"uivo#)
this.botao'xtrair ( new C>utton(9'xtrair9#)
this.botao'xtrair.set>ounds(+00< 10< 100< %+#)
add(this.botao'xtrair#)
this.-abe-AapoTexto'xtraido ( new CBabe-(9TextoG9#)
this.-abe-AapoTexto'xtraido.set>ounds(10< +0< 1+0< %+#)
add(this.-abe-AapoTexto'xtraido#)
this.capoTexto'xtraido ( new CText!rea(#)
this.scro-AapoTexto'xtraido ( new CScro--/ane(this.capoTexto'xtraido#)
add(this.scro-AapoTexto'xtraido#)
this.scro-AapoTexto'xtraido.set>ounds(10< 10< 600< *00#)
this.botao'xtrair.add!ctionBistener(new !ctionBistener(# $
public void action/erfored(!ction'vent evt# $
botao'xtrairA-ic5(evt#)
3
3#)
3
private void botao'xtrairA-ic5(=ava.a?t.event.!ction'vent evt# $
String cainho!r"uivo ( this.capo!r"uivo.getText(#)
/0,'xtraction pdf'xtraction ( new /0,'xtraction(#)
this.capoTexto'xtraido.setText(pdf'xtraction.extrairTexto(cainho!r"uivo##)
this.-abe-AapoTexto'xtraido.setText(9TextoG 9 H pdf'xtraction.get;uero/aginas(cainho!r"uivo# H 9
pIginas9#)
3
3
Confi+urando a class$ 9ain para $xibir a -an$la 0uando iniciado o sist$,a.
9ain.-ava
package ivansa-vadori.pdfboxtutoria-)
import ivansa-vadori.pdfboxtutoria-.vie?.Cane-a)
public class 6ain $
public static void ain(String78 args# $
new Cane-a(#.setDisib-e(true#)
3
3
Co, isso t$,os a pri,$ira funcionalidad$ do PDFBox i,pl$,$ntadaK
Dutras funcionalidad$s s$r2o d$,onstradas post$rior,$nt$ $, nova v$rs2o d$st$ tutorial.