VintaSoft Imaging .NET SDK 14.0: Документация для .NET разработчика
В этом разделе
    PDF: Как преобразовать текстовый файл в PDF документ?
    В этом разделе
    Вот C#/VB.NET код, который демонстрирует, как преобразовать текстовый файл в PDF документ:
    /// <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