2013-03-14 11 views
10

Mam stronę internetową, na której użytkownicy przesyłają zdjęcia i tworzą fotoksiążki. Ponadto mogą dodawać tekst w absolutnych pozycjach, obrotach i wyrównaniach. Tekst może mieć nowe linie.Obracaj akapity lub komórki dowolną liczbą stopni - Itext

Używam biblioteki Itext do automatyzacji tworzenia plików PDF o wysokiej jakości, które są drukowane później.

Dodanie użytkownika do grafik przesłanych przez użytkownika było naprawdę proste, problem pojawia się, gdy próbuję dodać tekst.

Teoretycznie potrzebowałbym zdefiniować akapit o określonej szerokości i wysokości, ustawić tekst użytkownika, czcionkę, styl czcionki, wyrównanie (środek, lewo, prawo, uzasadnienie) i wreszcie ustawić obrót.

Z tego, co przeczytałem o Itext, mógłbym utworzyć paragraf ustawiający właściwości użytkownika i użyć obiektu ColumnText do ustawienia bezwzględnej pozycji, szerokości i wysokości. Jednak nie jest możliwe ustawienie rotacji czegoś większego niż pojedyncza linia.

Nie mogę korzystać z komórki tabeli albo, ponieważ metoda rotacja umożliwiają tylko stopnie, które są wielokrotnością 90.

Czy istnieje sposób, aby dodać paragraf z jakiegoś obrotu (powiedzmy 20 stopni), bez konieczności dodawania tekst linia po linii przy użyciu metody ColumnText.showTextAligned() i całej matematyki, która obejmuje?

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

Jeśli to pomoże każdemu, jest to kod użyłem do rozwiązania tego problemu (dzięki 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

Zmieniano pytanie z kodem i używanych. – BernalCarlos

Odpowiedz

10
  • Utwórz obiekt PdfTemplate; tylko prostokąt.
  • Narysuj swoją ColumnText na tym PdfTemplate; nie martw się rotacją, po prostu wypełnij prostokąt dowolną treścią, którą chcesz dodać do kolumny.
  • Zawiń PdfTemplate wewnątrz obiektu Image; to tylko dla wygody, aby uniknąć matematyki. To nie znaczy, że twój tekst zostanie zrasteryzowany.
  • Teraz zastosuj obrót i absolutną pozycję do Image i dodaj go do swojego dokumentu.

Twój problem jest teraz rozwiązany ;-)

PS: Jestem autor iText w książkach działania.

+0

Masz rację! Problem rozwiązany. Dziękuję bardzo. – BernalCarlos

+0

@BrunoLowagie, czy jest to również najlepszy sposób obracania tekstu podczas używania 'ColumnText.setSimpleColumn()' i '.setText (myPhrase)' zgodnie z rozdziałem 3.3.1 tekstu w działaniu (2 wydanie)? – Ben

+0

Sprawdź, jak odpowiedź na to pytanie znajduje się w [Najlepiej zadbane pytania na temat StackOverflow] (https://leanpub.com/itext_so). Właściwie na twoje pytanie odpowiada EDIT na to pytanie.Jedyną różnicą jest to, że BernalCarlos używa "ColumnText" w trybie złożonym, podczas gdy używasz trybu tekstowego. Różnica jest wyjaśniona w bezpłatnym ebooku. –

1

dzięki obu naszych przyjaciół (Bruno & BernalCarlos) mojego ostatniego kodu dla użytkowników, którzy korzystają z „RTL” w swoich projektach jest tutaj:

// 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(); 
Powiązane problemy