2012-05-25 36 views
11

Ho cercato di risolvere questo problema per un po 'ora senza alcun risultato. Ho del testo in iTextSharp che sto cercando di mettere su una nuova riga. Ho provato a utilizzare il carattere di escape \n, Environment.NewLine e document.Add(new Phrase(Environment.NewLine)) senza alcun successo. Quindi c'è un modo per farlo? Qui è il pezzo del mio codice che sto cercando di farlo in (notare le righe di commento con //Doesn't work):Aggiunta di una nuova riga in iTextSharp

//Open the reader 
PdfReader reader = new PdfReader(oldFile); 
Rectangle size = reader.GetPageSizeWithRotation(1); 
Document document = new Document(size); 
// open the writer 
FileStream fs = new FileStream(newFile, FileMode.Create, FileAccess.Write); 
PdfWriter writer = PdfWriter.GetInstance(document, fs); 
document.Open(); 

//Configure the content 
PdfContentByte cb = writer.DirectContent; 
// select the font properties 
BaseFont bf = BaseFont.CreateFont("c:\\windows\\fonts\\calibri.ttf", BaseFont.CP1252, BaseFont.NOT_EMBEDDED); 
cb.SetColorFill(BaseColor.BLACK); 
cb.SetFontAndSize(bf, 10); 

//Write the text here 
cb.BeginText(); 
text = "F\n";//Doesn’t work 
document.Add(new Phrase(Environment.NewLine));//Doesn’t work 
text += "o\n"; 
text += Environment.NewLine;//Doesn’t work 
text += "o\n"; 
cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, text, 85, 311, 0); 
cb.EndText(); 

//Create the new page 
PdfImportedPage page = writer.GetImportedPage(reader, 1); 
cb.AddTemplate(page, 0, 0); 

//Close all streams 
document.Close(); 
fs.Close(); 
writer.Close(); 
reader.Close(); 

qualche suggerimento?

Edit One:

Ancora non funziona con document.Add(new Paragraph("\n"));. Ho fatto male?

cb.BeginText(); 
text = "F"; 
document.Add(new Paragraph("\n")); 
text += "o"; 
document.Add(new Paragraph("\n")); 
text += "o"; 
cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, text, 85, 311, 0); 
cb.EndText(); 
+0

Sapete come creare lista RadioButton su pdf utilizzando iTextSharp –

risposta

22

Ci sono due modi principali per lavorare con il testo in iTextSharp, sia attraverso le astrazioni come Paragraph e Phrase o per l'esecuzione di comandi manualmente usando un PdfContentByte. Le astrazioni gestiranno cose come margini, interruzioni di riga e spaziatura mentre il percorso manuale dipende interamente da te. Non puoi davvero mescolare i due che è ciò che stai facendo. Consiglio vivamente di utilizzare le astrazioni invece del percorso manuale a meno che non si abbia una necessità specifica di controllo granulare. Di seguito è riportato un esempio che mostra entrambi fuori.

Ma per rispondere in modo specifico alla tua domanda, i comandi grezzi PDF (che stai utilizzando) disegnano il testo in certe coordinate da sinistra a destra e non supportano il concetto di "resi" o "interruzioni di riga". Per fare questo è necessario spostare manualmente il cursore di testo corrente su una nuova riga. Vedere il codice qui sotto per un esempio di questo.

 string outputFile = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "test.pdf"); 
     using (FileStream fs = new FileStream(outputFile, FileMode.Create, FileAccess.Write, FileShare.None)) { 
      using (Document doc = new Document(PageSize.LETTER)) { 
       using (PdfWriter writer = PdfWriter.GetInstance(doc, fs)) { 
        doc.Open(); 

        //This creates two lines of text using the iTextSharp abstractions 
        doc.Add(new Paragraph("This is Paragraph 1")); 
        doc.Add(new Paragraph("This is Paragraph 2")); 

        //This does the same as above but line spacing needs to be calculated manually 
        PdfContentByte cb = writer.DirectContent; 
        cb.SaveState(); 
        cb.SetColorFill(BaseColor.BLACK); 
        cb.SetFontAndSize(BaseFont.CreateFont(BaseFont.HELVETICA, BaseFont.CP1252, BaseFont.NOT_EMBEDDED), 12f); 
        cb.BeginText(); 
        cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "This is cb1", 20, 311, 0); 
        cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, "This is cb2", 20, 291, 0);//Just guessing that line two should be 20px down, will actually depend on the font 
        cb.EndText(); 
        cb.RestoreState(); 
        doc.Close(); 
       } 
      } 
     } 
+0

Grazie per il chiarimento! –

+0

Buona spiegazione Chris, grazie. – Kashif

+0

Grazie per la buona risposta –

3
document.Add(new Paragraph("\n")); 

EDIT:

cb.BeginText(); 
string text = ""; 
text = "F\n";   
text += "o\n";    
text += "o"; 
cb.ShowTextAligned(PdfContentByte.ALIGN_LEFT, text, 85, 311, 0); 
cb.EndText(); 


//Create the new page 
PdfImportedPage page = writer.GetImportedPage(reader, 1); 
cb.AddTemplate(page, 0, 0); 

Paragraph p = new Paragraph(text); 
document.Add(p); 

//Close all streams 
document.Close(); 
fs.Close(); 
writer.Close(); 
reader.Close(); 
+0

Ancora mostrando una sola riga, vedere Modifica ... forse sto facendo male? –

+1

Andrew prova adesso. – Kashif

+0

Ancora sulla stessa linea, anche se se si controlla la risposta di Chris, questa potrebbe essere una limitazione tecnica del software iText. Apprezzo comunque il tuo aiuto! –

4

document.Add(new Paragraph(" ")); funziona bene per me. Ricorda, l'istruzione Paragraph aggiunge automaticamente un avanzamento riga. Tutto quello che devi fare è dargli qualcosa da rendere. In questo caso, uno spazio andrà bene.

+0

questo funziona bene anche per me. Grazie – SajuPK

9

provare qualcosa di simile:

document.Add(new Chunk("\n")); 
+1

Ti va di spiegarti che cosa fa la tua soluzione? Questo è un post di qualità molto bassa. – thomaux

+2

@Anzeno Lo fa a guarda e aggiunge un nuovo chuck() con un nuovo carattere di linea da documentare. Non c'è molto da spiegare. – JSON

0

Sto solo cercando questo strumento e per l'aggiunta di nuova linea ho solo aggiunto '\ r \ n' e lo ha fatto il lavoro. Come questo qui sotto.

String content01 = "Nulla condimentum dui lobortis risus viverra, eu pellentesque sem blandit.\r\nUt congue turpis quis sapien mollis, vitae rutrum mi consectetur. Integer maximus nisl sed tellus pharetra pharetra."; 
Phrase contentPhrase = new Phrase(content01); 
Paragraph contentPr = new Paragraph(); 
contentPr.Add(contentPhrase); 

Quindi aggiunto il paragrafo contentPtr all'istanza del documento.

0

So che questo è un po 'vecchio, ma c'è ancora un altro modo. Ecco un po 'di un rapporto che ho usato.

  var contents = new Paragraph(); 
      contents.Alignment = Element.ALIGN_CENTER; 

      contents.Add(new Chunk(string.Format("{0} {1}\n", emp.FirstName, emp.LastName), new Font(baseFont, 11f, Font.BOLD))); 
      contents.Add(new Chunk(string.Format("Dept: {0}\n", emp.Departments.Title), new Font(baseFont, 9f))); 
      contents.Add(new Chunk(string.Format("Wk Ending: {0}\n", _date), new Font(baseFont, 9f))); 

Come potete vedere, quello che ho fatto è stato creare blocchi. Questo ti permette di usare "\ n" per preformare le interruzioni di riga.

0

Con l'aggiunta degli attributi di spaziatura, è possibile impostare con precisione l'altezza dell'interruzione ...

var spacerParagraph = new Paragraph(); 
spacerParagraph.SpacingBefore = 4f; 
spacerParagraph.SpacingAfter = 0f; 
document.Add(spacerParagraph); 
Problemi correlati