VintaSoft Imaging .NET SDK 15.1: Документация для .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