Bogdan U
Bogdan U

Reputation: 161

Create multiline text in PDF document Xamarin Forms Syncfusion

I have struggled a bit with the official Syncfusion Xamarin Forms PDF Documentation. I have managed to create a table, bind it to values and append it to a PdfDocument.

However odd enough, I cannot seem to draw text strings on separate lines. Each text that I try to draw using graphics.DrawString() or TextElement gets drawn on top of each other in the first line of the document.

All the string are AppResources, concatenating each other to form a report from resx files and class objects that represent my data. Many of them need to be rendered as separate phrases and paragraphs.

Is there a working sample on how to append text line after line and in between them to have tables?

Thank you!

Upvotes: 2

Views: 1653

Answers (1)

Chinnu
Chinnu

Reputation: 614

Drawing text one after another is possible by using Essential PDF. We can draw text by one after another by using PdfTextElement with PdfLayoutResult or specifying its position in PdfGraphics.DrawString method. Please refer the below code snippet and sample for more details.

        //Creates a new PDF document.
        PdfDocument doc = new PdfDocument();

        //Adds a page.
        PdfPage page = doc.Pages.Add();

        //create a new PDF string format
        PdfStringFormat drawFormat = new PdfStringFormat();
        drawFormat.WordWrap = PdfWordWrapType.Word;
        drawFormat.Alignment = PdfTextAlignment.Justify;
        drawFormat.LineAlignment = PdfVerticalAlignment.Top;

        //Set the font.
        PdfFont font = new PdfStandardFont(PdfFontFamily.Helvetica, 10f);

        //Create a brush.
        PdfBrush brush = PdfBrushes.Red;

        //bounds
        RectangleF bounds = new RectangleF(new PointF(10, 10), new SizeF(page.Graphics.ClientSize.Width - 30, page.Graphics.ClientSize.Height - 20));

        //Create a new text elememt
        PdfTextElement element = new PdfTextElement(text, font, brush);

        //Set the string format
        element.StringFormat = drawFormat;

        //Draw the text element
        PdfLayoutResult result =  element.Draw(page, bounds);

        // Draw the string one after another.
        result = element.Draw(result.Page, new RectangleF(result.Bounds.X, result.Bounds.Bottom + 10, result.Bounds.Width, result.Bounds.Height));

        // Creates a PdfLightTable.
        PdfLightTable pdfLightTable = new PdfLightTable();

        //Add colums to light table
        pdfLightTable.Columns.Add(new PdfColumn("Name"));
        pdfLightTable.Columns.Add(new PdfColumn("Age"));
        pdfLightTable.Columns.Add(new PdfColumn("Sex"));

        //Add row        
        pdfLightTable.Rows.Add(new string[] { "abc", "21", "Male" });

        //Includes the style to display the header of the light table.
        pdfLightTable.Style.ShowHeader = true;

        //Draws PdfLightTable and returns the rendered bounds.
        result = pdfLightTable.Draw(page, new PointF(result.Bounds.Left,result.Bounds.Bottom+20));

        //draw string with returned bounds from table
        result =  element.Draw(result.Page, result.Bounds.X, result.Bounds.Bottom + 10);

        //draw string with returned bounds from table
        element.Draw(result.Page, result.Bounds.X, result.Bounds.Bottom + 10);

        MemoryStream stream = new MemoryStream();

        //Saves the document.
        doc.Save(stream);

        doc.Close(true);

Sample link: http://www.syncfusion.com/downloads/support/directtrac/171058/ze/App2938608856

Please let us know if you need any further assistance.

Upvotes: 3

Related Questions