/// <summary> /// Converts a text file to a PDF document. /// </summary> /// <param name="sourceTextFilename">The filename of source text file.</param> /// <param name="destPdfFilename">The filename of destination PDF document.</param> public static void ConvertTextFileToPdfDocument( string sourceTextFilename, string destPdfFilename) { // font name string fontName = "Arial"; // font size, in points int fontSize = 12; // text padding, in points Vintasoft.Imaging.PaddingF textPadding = new Vintasoft.Imaging.PaddingF(30); // get text from text file string text = System.IO.File.ReadAllText(sourceTextFilename, System.Text.Encoding.UTF8); // set new line to '\n' character text = text.Replace("\r\n", "\n"); text = text.Replace("\n\r", "\n"); text = text.Replace("\r", "\n"); // create PDF document using (Vintasoft.Imaging.Pdf.PdfDocument document = new Vintasoft.Imaging.Pdf.PdfDocument(destPdfFilename, Vintasoft.Imaging.Pdf.PdfFormat.Pdf_14)) { Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFont font; // find TTF font that should be used for drawing a text using (Vintasoft.Imaging.Fonts.FontProgramSearchResult fontProgramSearchResult = document.FontProgramsController.GetTrueTypeFontProgram(new Vintasoft.Imaging.Fonts.FontInfo(fontName))) { // create PDF font based on TTF font program font = document.FontManager.CreateCIDFontFromTrueTypeFont(fontProgramSearchResult.FontProgramFilename); } do { // create page of A4 size Vintasoft.Imaging.Pdf.Tree.PdfPage pdfPage = new Vintasoft.Imaging.Pdf.Tree.PdfPage(document, Vintasoft.Imaging.ImageSize.FromPaperKind(Vintasoft.Imaging.PaperSizeKind.A4)); // add page to the PDF document document.Pages.Add(pdfPage); // get PdfGraphics that is associated with PDF page using (Vintasoft.Imaging.Pdf.Drawing.PdfGraphics graphics = Vintasoft.Imaging.Pdf.Drawing.PdfGraphics.FromPage(pdfPage)) { // create a brush that should be used for drawing a text Vintasoft.Imaging.Pdf.Drawing.PdfBrush brush = new Vintasoft.Imaging.Pdf.Drawing.PdfBrush(System.Drawing.Color.Black); // specify a rectangle where text should be drawn System.Drawing.RectangleF rect = pdfPage.MediaBox; // apply padding rect = textPadding.ApplyTo(rect); // get text that must be drawn on current page string drawnText = GetDrawnText(graphics, font, fontSize, rect.Width, rect.Height, ref text); // draw text on the PDF page graphics.DrawString(drawnText, font, fontSize, brush, rect, Vintasoft.Imaging.Pdf.Drawing.PdfContentAlignment.Left, true); } } while (!string.IsNullOrEmpty(text)); // subset font document.FontManager.PackAllFonts(); // pack PDF document document.Pack(); } } /// <summary> /// Returns the text portion that can be drawn on specified PDF graphics in rectange with specified size. /// </summary> /// <param name="graphics">The PDF graphics.</param> /// <param name="font">The text font.</param> /// <param name="fontSize">The text font size.</param> /// <param name="maxWidth">The width of text rectangle.</param> /// <param name="maxHeight">The height of text rectangle.</param> /// <param name="text">The text.</param> /// <returns>The text portion that can be drawn in rectange.</returns> private static string GetDrawnText( Vintasoft.Imaging.Pdf.Drawing.PdfGraphics graphics, Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFont font, float fontSize, float maxWidth, float maxHeight, ref string text) { float lineHeight = fontSize; System.Text.StringBuilder textToDraw = new System.Text.StringBuilder(); float totalHeight = 0; string line = null; while (text != null || line != null) { // if there is not text line to process if (line == null) // cut next line from source text line = CutTextPart(ref text, '\n'); // add line to the result text textToDraw.Append(GetDrawnLine(graphics, font, fontSize, maxWidth, ref line)); textToDraw.Append("\n"); // increase height of result text totalHeight += lineHeight; // if height of result text is greater than rectangle height if (totalHeight + lineHeight > maxHeight) break; } if (line != null) text = line + '\n' + text; return textToDraw.ToString(); } /// <summary> /// Returns the line portion that must be drawn on specified PDF graphics in rectange with specified size. /// </summary> /// <param name="graphics">The PDF graphics.</param> /// <param name="font">The text font.</param> /// <param name="fontSize">The text font size.</param> /// <param name="maxWidth">The width of text rectangle.</param> /// <param name="line">The text line.</param> /// <returns>The text portion that must be drawn.</returns> private static string GetDrawnLine( Vintasoft.Imaging.Pdf.Drawing.PdfGraphics graphics, Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFont font, float fontSize, float maxWidth, ref string line) { string drawnLine = null; string word = null; while (line != null) { // cut next word from line word = CutTextPart(ref line, ' '); // create next drawn line string nextDrawnLine; if (drawnLine != null) nextDrawnLine = drawnLine.ToString() + ' ' + word; else nextDrawnLine = word; // measure next drawn line float currentWidth, currentHeight; graphics.MeasureString(nextDrawnLine, font, fontSize, float.MaxValue, false, out currentWidth, out currentHeight); // if next draw line width greater than max width if (currentWidth > maxWidth) { // if drawn line is empty if (drawnLine == null) { // add part of word to drawn line drawnLine = word; word = ""; do { word = drawnLine.Substring(drawnLine.Length - 1) + word; drawnLine = drawnLine.Substring(0, drawnLine.Length - 1); graphics.MeasureString(drawnLine.ToString(), font, fontSize, float.MaxValue, false, out currentWidth, out currentHeight); } while (currentWidth > maxWidth); } break; } if (drawnLine != null) drawnLine += ' '; drawnLine += word; word = null; } if (word != null) line = word + ' ' + line; return drawnLine; } /// <summary> /// Cuts a text part from text start to the specified separator. /// </summary> /// <param name="text">The source text.</param> /// <param name="separator">The separator.</param> /// <returns>The result text.</returns> private static string CutTextPart(ref string text, char separator) { int newLineIndex = text.IndexOf(separator); string result; if (newLineIndex < 0) { result = text; text = null; return result; } result = text.Substring(0, newLineIndex); if (newLineIndex == text.Length - 1) text = null; else text = text.Substring(newLineIndex + 1); return result; }
''' <summary> ''' Converts a text file to a PDF document. ''' </summary> ''' <param name="sourceTextFilename">The filename of source text file.</param> ''' <param name="destPdfFilename">The filename of destination PDF document.</param> Public Shared Sub ConvertTextFileToPdfDocument(sourceTextFilename As String, destPdfFilename As String) ' font name Dim fontName As String = "Arial" ' font size, in points Dim fontSize As Integer = 12 ' text padding, in points Dim textPadding As New Vintasoft.Imaging.PaddingF(30) ' get text from text file Dim text As String = System.IO.File.ReadAllText(sourceTextFilename, System.Text.Encoding.UTF8) ' set new line to '\n' character text = text.Replace(vbCr & vbLf, vbLf) text = text.Replace(vbLf & vbCr, vbLf) text = text.Replace(vbCr, vbLf) ' create PDF document Using document As New Vintasoft.Imaging.Pdf.PdfDocument(destPdfFilename, Vintasoft.Imaging.Pdf.PdfFormat.Pdf_14) Dim font As Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFont ' find TTF font that should be used for drawing a text Using fontProgramSearchResult As Vintasoft.Imaging.Fonts.FontProgramSearchResult = document.FontProgramsController.GetTrueTypeFontProgram(New Vintasoft.Imaging.Fonts.FontInfo(fontName)) ' create PDF font based on TTF font program font = document.FontManager.CreateCIDFontFromTrueTypeFont(fontProgramSearchResult.FontProgramFilename) End Using Do ' create page of A4 size Dim pdfPage As New Vintasoft.Imaging.Pdf.Tree.PdfPage(document, Vintasoft.Imaging.ImageSize.FromPaperKind(Vintasoft.Imaging.PaperSizeKind.A4)) ' add page to the PDF document document.Pages.Add(pdfPage) ' get PdfGraphics that is associated with PDF page Using graphics As Vintasoft.Imaging.Pdf.Drawing.PdfGraphics = Vintasoft.Imaging.Pdf.Drawing.PdfGraphics.FromPage(pdfPage) ' create a brush that should be used for drawing a text Dim brush As New Vintasoft.Imaging.Pdf.Drawing.PdfBrush(System.Drawing.Color.Black) ' specify a rectangle where text should be drawn Dim rect As System.Drawing.RectangleF = pdfPage.MediaBox ' apply padding rect = textPadding.ApplyTo(rect) ' get text that must be drawn on current page Dim drawnText As String = GetDrawnText(graphics, font, fontSize, rect.Width, rect.Height, text) ' draw text on the PDF page graphics.DrawString(drawnText, font, fontSize, brush, rect, Vintasoft.Imaging.Pdf.Drawing.PdfContentAlignment.Left, _ True) End Using Loop While Not String.IsNullOrEmpty(text) ' subset font document.FontManager.PackAllFonts() ' pack PDF document document.Pack() End Using End Sub ''' <summary> ''' Returns the text portion that can be drawn on specified PDF graphics in rectange with specified size. ''' </summary> ''' <param name="graphics">The PDF graphics.</param> ''' <param name="font">The text font.</param> ''' <param name="fontSize">The text font size.</param> ''' <param name="maxWidth">The width of text rectangle.</param> ''' <param name="maxHeight">The height of text rectangle.</param> ''' <param name="text">The text.</param> ''' <returns>The text portion that can be drawn in rectange.</returns> Private Shared Function GetDrawnText(graphics As Vintasoft.Imaging.Pdf.Drawing.PdfGraphics, font As Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFont, fontSize As Single, maxWidth As Single, maxHeight As Single, ByRef text As String) As String Dim lineHeight As Single = fontSize Dim textToDraw As New System.Text.StringBuilder() Dim totalHeight As Single = 0 Dim line As String = Nothing While text IsNot Nothing OrElse line IsNot Nothing ' if there is not text line to process If line Is Nothing Then ' cut next line from source text line = CutTextPart(text, ControlChars.Lf) End If ' add line to the result text textToDraw.Append(GetDrawnLine(graphics, font, fontSize, maxWidth, line)) textToDraw.Append(vbLf) ' increase height of result text totalHeight += lineHeight ' if height of result text is greater than rectangle height If totalHeight + lineHeight > maxHeight Then Exit While End If End While If line IsNot Nothing Then text = line & ControlChars.Lf & text End If Return textToDraw.ToString() End Function ''' <summary> ''' Returns the line portion that must be drawn on specified PDF graphics in rectange with specified size. ''' </summary> ''' <param name="graphics">The PDF graphics.</param> ''' <param name="font">The text font.</param> ''' <param name="fontSize">The text font size.</param> ''' <param name="maxWidth">The width of text rectangle.</param> ''' <param name="line">The text line.</param> ''' <returns>The text portion that must be drawn.</returns> Private Shared Function GetDrawnLine(graphics As Vintasoft.Imaging.Pdf.Drawing.PdfGraphics, font As Vintasoft.Imaging.Pdf.Tree.Fonts.PdfFont, fontSize As Single, maxWidth As Single, ByRef line As String) As String Dim drawnLine As String = Nothing Dim word As String = Nothing While line IsNot Nothing ' cut next word from line word = CutTextPart(line, " "C) ' create next drawn line Dim nextDrawnLine As String If drawnLine IsNot Nothing Then nextDrawnLine = drawnLine.ToString() & " "C & word Else nextDrawnLine = word End If ' measure next drawn line Dim currentWidth As Single, currentHeight As Single graphics.MeasureString(nextDrawnLine, font, fontSize, Single.MaxValue, False, currentWidth, _ currentHeight) ' if next draw line width greater than max width If currentWidth > maxWidth Then ' if drawn line is empty If drawnLine Is Nothing Then ' add part of word to drawn line drawnLine = word word = "" Do word = drawnLine.Substring(drawnLine.Length - 1) & word drawnLine = drawnLine.Substring(0, drawnLine.Length - 1) graphics.MeasureString(drawnLine.ToString(), font, fontSize, Single.MaxValue, False, currentWidth, _ currentHeight) Loop While currentWidth > maxWidth End If Exit While End If If drawnLine IsNot Nothing Then drawnLine += " "C End If drawnLine += word word = Nothing End While If word IsNot Nothing Then line = word & " "C & line End If Return drawnLine End Function ''' <summary> ''' Cuts a text part from text start to the specified separator. ''' </summary> ''' <param name="text">The source text.</param> ''' <param name="separator">The separator.</param> ''' <returns>The result text.</returns> Private Shared Function CutTextPart(ByRef text As String, separator As Char) As String Dim newLineIndex As Integer = text.IndexOf(separator) Dim result As String If newLineIndex < 0 Then result = text text = Nothing Return result End If result = text.Substring(0, newLineIndex) If newLineIndex = text.Length - 1 Then text = Nothing Else text = text.Substring(newLineIndex + 1) End If Return result End Function