2012-05-25 13 views
11

Ich habe versucht, dieses Problem für eine Weile jetzt vergebens zu lösen. Ich habe etwas Text in iTextSharp Ich versuche, eine neue Zeile zu setzen. Ich habe versucht, die \n Escape-Zeichen, Environment.NewLine und document.Add(new Phrase(Environment.NewLine)) ohne Erfolg zu verwenden. Gibt es einen Weg, dies zu tun? Hier wird das Stück von meinem Code, den ich versuche, es zu tun in (beachten Sie die Zeilen kommentiert mit //Doesn't work):Hinzufügen einer neuen Zeile 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(); 

Irgendwelche Vorschläge?

bearbeiten One:

immer noch nicht mit document.Add(new Paragraph("\n")); arbeiten. Habe ich es falsch gemacht?

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

wissen Sie, wie Radiobutton-Liste auf pdf –

Antwort

22

ist gibt zwei Möglichkeiten, mit dem Text in iTextSharp zu arbeiten, entweder über die Abstraktionen wie Paragraph und Phrase oder durch manuelles Ausführen von Befehlen eines PdfContentByte verwenden. Die Abstraktionen behandeln Dinge wie Ränder, Zeilenumbrüche und Abstände, während die manuelle Route Ihnen überlassen bleibt. Sie können nicht wirklich die beiden mischen, was Sie tun. Ich empfehle dringend, die Abstraktionen anstelle der manuellen Route zu verwenden, es sei denn, Sie haben eine spezifische Notwendigkeit für eine granulare Kontrolle. Unten ist eine Probe, die beide auszeigt.

Aber um Ihre Frage spezifisch zu beantworten, zeichnen rohe PDF-Befehle (die Sie verwenden) Text bei bestimmten Koordinaten x,y von links nach rechts und sie unterstützen nicht das Konzept von "Returns" oder "Zeilenumbrüche". Dazu müssen Sie den aktuellen Textcursor manuell in eine neue Zeile verschieben. Sehen Sie sich den folgenden Code für ein Beispiel an.

 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

Danke für die Klarstellung! –

+0

Gute Erklärung Chris, Danke. – Kashif

+0

Danke für die gute Antwort –

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

Immer noch mit iTextSharp erstellen bearbeiten zeigt sich eine eine Zeile finden ... vielleicht ist es mache ich falsch? –

+1

Andrew versuche es jetzt. – Kashif

+0

Immer noch in der gleichen Zeile, obwohl, wenn Sie die Antwort von Chris überprüfen, dies eine technische Einschränkung der iText-Software sein könnte. Ich schätze trotzdem Ihre Hilfe! –

4

document.Add(new Paragraph(" ")); funktioniert gut für mich. Denken Sie daran, dass die Anweisung Paragraph automatisch einen Zeilenvorschub hinzufügt. Alles, was Sie tun müssen, ist etwas zu rendern. In diesem Fall reicht ein Leerzeichen aus.

+0

das funktioniert auch gut für mich. Danke – SajuPK

9

versuchen, etwas wie folgt aus:

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

Möchten Sie erklären, was Ihre Lösung tut? Dies ist ein Post mit sehr geringer Qualität. – thomaux

+2

@Anzeno Es ist an sieht und fügt ein neues Chuck() mit einem neuen Linien-Zeichen zu dokumentieren. Nicht viel zu erklären. – JSON

0

Ich bin gerade dieses Tool versucht und neue Linie für das Hinzufügen ich gerade hinzugefügt ‚\ r \ n‘ und es hat funktioniert. Wie folgt.

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); 

Dann den Absatz contentPtr zu meiner Document-Instanz hinzugefügt.

0

Ich weiß, das ist ein wenig alt, aber es gibt noch einen anderen Weg. Hier ist ein wenig von einem Bericht, den ich verwendet habe.

  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))); 

Wie Sie sehen können, was ich getan habe, war Chunks zu erstellen. Auf diese Weise können Sie mit "\ n" Zeilenumbrüche erstellen.

0

Mit den zusätzlichen Abstandsattributen können Sie die Höhe der Unterbrechung präzise einstellen ...

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