Autore Topic: Creazione PDF con iText  (Letto 7605 volte)

Offline ricky1966

  • Nuovo arrivato
  • *
  • Post: 32
  • Respect: +1
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy Tab
  • Sistema operativo:
    Kubuntu
Creazione PDF con iText
« il: 23 Marzo 2011, 18:22:02 CET »
+1
Livello di difficoltà: facile
Target SDK: 8
Link al file compresso del progetto eclipse: file in allegato

Questo elaborato nasce dopo cortese sollecito da parte di alcuni utenti del Forum Android Developers Italia, alloscopo di illustrare la mia esperienza nello sviluppo di un'applicazione per il mio Galaxy Tab, che producesse unfile PDF da un semplice file CSV (comma-separeted-values).

Avendo poca esperienza di Java, sono solo poche settimane che lo uso, ma avendo già programmato con altrilinguaggi, come il C/C++ e Python, ho fatto un po' di ricerche con Google (e sennò perché cappero usareAndroid?) e alla fine mi sono orientato per usare la libreria iText reperibile partendo da questo sito:

http://itextpdf.com/[/url] il file in mio possesso è iText-5.0.6.jar

Una volta scaricato il file JAR ho iniziato con Eclipse un nuovo progetto che ho chiamato pdf. A titolo puramenteinformativo io uso Eclipse su una macchina Kubuntu 10.10 con installato le varie librerie e gadgets necessari perprodurre applicazioni Android. Una volta aperto il progetto ho aggiunto la libreria, io faccio Alt+Enter → JavaBuild Path → Libreries → Add Jars

Ho postato il codice alla fine del file e farò riferimento a quelle pagine.

Cominciamo, aprite un nuovo progetto, io l'ho chiamato pdf (che fantasia), e come min sdk ho messo 8 che è ilvalore che viene indicato per il mio smartphone. Ora che abbiamo il progetto dobbiamo importare la libreria, iofaccio click tasto destro sul nome del progetto, dal menu seleziono Build Path → Ass External Archivies selezionola libreria e il gioco è fatto. A questo punto passiamo al commento del listato.

Per prima cosa definisco la larghezza delle colonne che andranno a formare il corpo principale della tabella, chepoi opportunamente unite potranno essere utilizzate per formare la testata che verrà ripetuta nelle varie pagine.Definisco inoltre la variabile testata che utilizzerò allo scopo, notate che viene definita come un oggetto PdfTable.In fine definiamo sd che mi da accesso alla scheda esterna SD.

Codice (Java): [Seleziona]
public static float[] colsWidth = {4f, 18f,4.5f,4.5f,4f,7f};
public static PdfPTable testata = new PdfPTable(colsWidth);
final File sd = Environment.getExternalStorageDirectory();

Bene ora passiamo al corpo dell'Applicazione.
Definiamo un nuovo oggetto Document che definisce il formato della pagina

Codice (Java): [Seleziona]
Document document = new Document(PageSize.A4.rotate(),1,1,20,20);
Nella fattispecie è una A4, portrait con margini top = 1, bottom = 1, left = 20 e right = 20, al momento però nonsono riuscito ad ottenere risultati soddisfacenti con tali valori, sicuramente sbaglio in qualcosa io, ma i marginisembrano non funzionare a dovere.

Istanzio un oggetto PdfWriter:

Codice (Java): [Seleziona]
PdfWriter.getInstance(document, new FileOutputStream(new File(sd,"Bollettario.pdf")));
Infine apro il documento:

Codice (Java): [Seleziona]
document.open();
Chiamo il metodo tostapane(), nome che dovrebbe evocare la preparazione di un Toast al quale passo la frase dafar apparire.

In seguito con le linee:

Codice (Java): [Seleziona]
document.addTitle("Bollettario PDF");
document.addAuthor("Riccardo BRAMATI");
document.addCreator("Riccardo BRAMATI");

Inserisco i dati del titolo, autore e creatore.

Il mio problema nasce dal fatto che stampando il pdf una volta al mese, ho bisogno di avere una numerazione deifogli sequenziale, ma non sapendo a priori quanti fogli devo stampare ho creato un file di appoggio, chiamato:
numero_foglio.txt
nel quale trovo il numero del foglio da stampare. Mi sono accorto che non incremento alla fine della procedura ilnumero suddetto in maniera adeguata per cui il mese successivo incorro nell'errore di avere lo stesso numero difoglio iniziale rispetto al numero finale del mese precedente, poco male fino alla prossima revisione farò cheincrementarlo a mano, ma ricordateVi che c'è una modifica da fare.

A questo punto, ottenuto il numero del foglio posso cominciare a caricare i dati da stampare nella tabella. Apro unfile chiamato:
bollettario.txt
nel quale sono contenuti i dati da stampare, chiamo il metodo:
Codice (Java): [Seleziona]
header(numero_pagina);passandogli il numero di foglio (chiamato numero pagina).
Il metodo mi permette di scrivere la parte fissa dellatabella, fissa ad eccezione del numero di pagina ovviamente, analizzeremo in seguito il metodo.Una volta stampata la testata procedo con la lettura delle righe del file bollettario.txt, splittandole al fine diottenere i singoli valori da inserire nelle colonne variabili, in quanto esistono anche delle colonne a valore fissoche non necessitano della lettura del file. La struttura dei dati nel file è la seguente:
Codice: [Seleziona]
data inserimento,intestazione,numero bolla,data bollagli altri dati che sono fissi sono i numero dei giorni di viaggio, nel mio caso sempre 1 e l'importo in detrazione chelascio libero.

Molto utili sono le due linee seguenti:

Codice (Java): [Seleziona]
PdfPCell contenuticell1 = new PdfPCell(new Paragraph(items[0]));
contenuticell1.setHorizontalAlignment(Element.ALIGN_RIGHT);

Queste due linee servono per istanziare un'oggetto PdfPCell inservi all'interno un nuovo paragrafo contenete ilprimo dato ottenuto dallo spilt della linea letta dal file bollettario.txt e allinearlo a destra.

Una volta messe appunto le varie celle occorre aggiungerle alla testata:

Codice (Java): [Seleziona]
testata.addCell(contenuticell1);
Alla fine del processo che aggiungerà le varie celle alla testata occorrerà aggiungere quest'ultima al documento:

Codice (Java): [Seleziona]
document.add(testata);
Si noterà che all'inizio del ciclo WHILE ho inserito una IF che controlla di non mettere più di 30 righe per pagina,infatti usando un A4 ruotato, il numero di righe massime sono 30 se contiamo pure la testata, non ho provato maesistono dei metodi legati al Paragrafo, mi pare si chiamino Chunk() uno e l'altro Phrase() che permettono di usarefontsize differenti da quello di default.

Alla fine del ciclo WHILE, chiudo tutto e aggiorno il file numero_foglio.txt in maniera da recuperarlo per laprossima stampata.

Passiamo ora ad analizzare il metodo HEADER(numero pagina).

Le uniche vere novità sono l'utilizzo di Phrase() per attuare il Paragrafo, come detto in precedenza si puòutilizzare Phrase() per impostare i fontsize e i fontstyle l'esempio è il seguente:

Codice (Java): [Seleziona]
Phrase phrase0 = new Phrase("PROSPETTO DELLE DEDUZIONI EX ARTICOLO 79, COMMA 8 D.P.R.917/86 E SUCCESSIVE MODIFICHE E INTEGRAZIONI", FontFactory.getFont(FontFactory.COURIER, 11,Font.BOLD));
Che imposta a 11 il fontsize, a Courier il fontstyle e Bold il font(qualcosa non ricordo come si dice).Per il resto è abbastanza aria fritta, ricalca ne più ne meno i passaggi precedenti.Bene spero di essere stato esaustivo ma soprattutto utile a qualcuno. Ringrazio per la pazienza e vi auguro un buonlavoro.

RICKY

Per motivi di lunghezza file il progetto lo potete scaricare a questo link : [url]http://rapidshare.com/files/454013250/pdf.zip
i due files bollettario.txt e numero_foglio.txt sono invece allegati.

Offline Nicola_D

  • Moderatore
  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Creazione PDF con iText
« Risposta #1 il: 06 Giugno 2011, 00:44:33 CEST »
0
a me non importa la libreria, come la aggiungo mi da errore eclipse: Unable to execute dex: Java heap space
Java heap space

ho provato tutte le versioni di iText, credo sia la dimensione del jar...
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline galvy

  • Nuovo arrivato
  • *
  • Post: 13
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC HERO
  • Play Store ID:
    PARMA
  • Sistema operativo:
    Ubuntu 10.10
Re:Creazione PDF con iText
« Risposta #2 il: 17 Settembre 2012, 16:21:31 CEST »
0
Forse può esserti utile il link,ho scambiato un paio di mail con gli sviluppatori e mi hanno indicato la versione corretta per il robottino.
Artifactory@iText Repository :: Repository Browser

Ciao ciao
« Ultima modifica: 02 Ottobre 2012, 09:54:44 CEST da galvy »

Offline classd2008

  • Nuovo arrivato
  • *
  • Post: 1
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    sansung
  • Sistema operativo:
    android
Re:Creazione PDF con iText
« Risposta #3 il: 19 Febbraio 2013, 15:07:44 CET »
0
Por favor enviar arquivo ZIP novamente. Não esta mais online.

Offline soeca

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Desire
  • Sistema operativo:
    Windows 7 64Bit
Re:Creazione PDF con iText
« Risposta #4 il: 02 Novembre 2013, 01:28:02 CET »
0
Ciao, potresti allegare nuovamente il progetto cortesemente?Perchè il link non risulta più funzionante. Grazie mille