2013-03-14 21 views
10

Ho un sito Web in cui gli utenti caricano foto e creano fotolibri. Inoltre, possono aggiungere testo in posizioni assolute, rotazioni e allineamenti. Il testo può avere nuove linee.Ruota paragrafi o celle un numero arbitrario di gradi - Itext

Ho utilizzato la libreria di Itext per automatizzare la creazione dei Pdf di alta qualità dei fotolibri su cui sono stampati questi ultimi.

Aggiungere le immagini caricate dall'utente ai PDF è stato davvero semplice, il problema si presenta quando provo ad aggiungere il testo.

In teoria, ciò che dovrei fare è definire un paragrafo di larghezza e altezza definite, impostare il testo, il font, lo stile del carattere, l'allineamento (centro, sinistra, destra, giustificazione) e infine impostare il rotazione.

Per ciò che ho letto su Itext, è possibile creare un paragrafo per impostare le proprietà dell'utente e utilizzare un oggetto ColumnText per impostare la posizione assoluta, la larghezza e l'altezza. Tuttavia non è possibile impostare la rotazione di qualcosa di più grande della singola linea.

non posso usare celle sia, perché il metodo rotazione consentire solo gradi che sono multipli di 90.

C'è un modo per aggiungere un paragrafo con una certa rotazione (ad esempio 20 gradi) senza dover aggiungere il testo riga per riga usando il metodo ColumnText.showTextAligned() e tutta la matematica che comporta?

---- Edit: 08-Ago-2013 ----

Se aiuta nessuno, questo è il codice che ho usato per risolvere questo problema (grazie a Bruno):

//Create the template that will contain the text 
PdfContentByte canvas = pdfWriter.getDirectContent(); 
PdfTemplate textTemplate = canvas.createTemplate(imgWidth, imgHeight); //The width and height of the text to be inserted 

ColumnText columnText = new ColumnText(textTemplate); 

columnText.setSimpleColumn(0, 0, imgWidth, imgHeight); 
columnText.addElement(paragraph); 

columnText.go(); 

//Create de image wraper for the template 
Image textImg = Image.getInstance(textTemplate); 

//Asign the dimentions of the image, in this case, the text 
textImg.setInterpolation(true); 
textImg.scaleAbsolute(imgWidth, imgHeight); 
textImg.setRotationDegrees((float) -textComp.getRotation()); //Arbitrary number of degress 
textImg.setAbsolutePosition(imgXPos, imgYPos); 

//Add the text to the pdf 
pdfDocument.add(textImg); 
+1

curato la questione con il codice che ho usato. – BernalCarlos

risposta

10
  • Creare un oggetto PdfTemplate; solo un rettangolo.
  • Disegna il tuo ColumnText su questo PdfTemplate; non preoccuparti della rotazione, basta riempire il rettangolo con qualsiasi contenuto tu voglia aggiungere alla colonna.
  • Avvolgere il PdfTemplate all'interno di un oggetto Image; questo è solo per comodità, per evitare la matematica. Questo non significa che il tuo testo sarà rasterizzato.
  • Ora applicare una rotazione e una posizione assoluta a Image e aggiungerlo al documento.

Il tuo problema è ora risolto ;-)

PS: Sono l'autore del iText nei libri di azione.

+0

Hai ragione! Problema risolto. Grazie mille. – BernalCarlos

+0

@BrunoLowagie, questo è anche il modo migliore per ruotare il testo quando si usa 'ColumnText.setSimpleColumn()' e '.setText (myPhrase)' come da capitolo 3.3.1 di iText in Action (2nd Ed.)? – Ben

+0

Dai un'occhiata a come viene data risposta a questa domanda in [Le migliori domande su iText su StackOverflow] (https://leanpub.com/itext_so). In realtà, alla tua domanda viene data risposta nella MODIFICA fatta a questa domanda.L'unica differenza è che BernalCarlos usa 'ColumnText' in modalità composita, mentre stai usando la modalità testo. La differenza è spiegata nell'ebook gratuito. –

1

grazie a entrambi i nostri amici (Bruno & BernalCarlos) il mio codice finale per gli utenti che utilizzano "RTL" nei loro progetti è qui:

// step 1 
Document document = new Document(); 
document.setPageSize(PageSize.A4); 

// step 2 
PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(destination_file)); 
CreateBorder event = new CreateBorder(); 
writer.setPageEvent(event); 

// step 3 
document.open(); 

// step 4 
int imgWidth=400; 
int imgHeight=50; 
//Create the template that will contain the text 
PdfContentByte canvas = writer.getDirectContent(); 
PdfTemplate textTemplate = canvas.createTemplate(imgWidth, imgHeight); 
//The width and height of the text to be inserted 

ColumnText columnText = new ColumnText(textTemplate); 
columnText.setSimpleColumn(0, 0, imgWidth, imgHeight); 
columnText.setRunDirection(PdfWriter.RUN_DIRECTION_RTL); 
columnText.addElement(new Paragraph("محاسبه بار غیر متعادل", font_IranSemiBold)); 
columnText.go(); 

//Create de image wraper for the template 
Image textImg = Image.getInstance(textTemplate); 

//Asign the dimentions of the image, in this case, the text 
textImg.setInterpolation(true); 
textImg.scaleAbsolute(imgWidth, imgHeight); 
textImg.setRotationDegrees(90); //Arbitrary number of degress 
textImg.setAbsolutePosition(50, 200); 

//Add the text to the pdf 
document.add(textImg); 

// step 5 
document.close();