Как создать PDF с помощью C#

Мы всегда ищем способ более точно, аккуратно и эффективно генерировать PDF-документы и работать с ними в проектах C#. Наличие простых в использовании функций из библиотеки позволяет нам больше отслеживать работу и меньше времени уделять сложным деталям создания PDF-файлов, будь то в .NET.

Следующий фрагмент кода также работает с библиотекой Aspose.PDF.Drawing.

Создание (или генерация) PDF-документа с использованием языка C#

API Aspose.PDF for .NET позволяет создавать и читать PDF-файлы с помощью C# и VB.NET. API можно использовать в различных приложениях .NET, включая WinForms, ASP.NET и другие. В этой статье мы покажем, как использовать API Aspose.PDF for .NET для простой генерации и чтения PDF-файлов в приложениях .NET.

Как создать простой PDF-файл

Для создания PDF-файла с помощью C# можно выполнить следующие шаги:

  1. Создайте объект класса Document.
  2. Добавьте объект Page в коллекцию Pages объекта Document.
  3. Добавьте TextFragment в коллекцию Paragraphs страницы.
  4. Сохраните полученный PDF-документ.
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void CreateHelloWorldDocument()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_QuickStart();

    // Create PDF document
    using (var document = new Aspose.Pdf.Document())
    {
        // Add page
        var page = document.Pages.Add();
        // Add text to new page
        page.Paragraphs.Add(new Aspose.Pdf.Text.TextFragment("Hello World!"));
        // Save PDF document
        document.Save(dataDir + "HelloWorld_out.pdf");
    }
}

Как создать доступный для поиска PDF-документ

Aspose.PDF for .NET предоставляет возможность создавать и манипулировать существующими PDF-документами. При добавлении текстовых элементов внутрь PDF-файла полученный PDF становится доступным для поиска. Однако если мы преобразуем изображение, содержащее текст, в PDF-файл, содержимое внутри PDF не будет доступно для поиска. В качестве обходного пути мы можем использовать OCR для полученного файла, чтобы он стал доступным для поиска.

Этот код распознаёт текст для PDF-изображений. Для распознавания вы можете использовать внешнее OCR, поддерживающее стандарт HOCR. Для целей тестирования мы использовали бесплатный Google tesseract OCR. Поэтому сначала вам нужно установить Tesseract-OCR в вашей системе, и у вас будет консольное приложение tesseract.

Ниже приведён полный код для выполнения этого требования:

// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void CreateSearchableDocument()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_QuickStart();
    
    // Open PDF document
    using (var document = new Aspose.Pdf.Document(dataDir + "SearchableDocument.pdf"))
    {
        document.Convert(CallBackGetHocr);

        // Save PDF document
        document.Save(dataDir + "SearchableDocument_out.pdf");
    }
}

private static string CallBackGetHocr(System.Drawing.Image img)
{
    var tmpFile = Path.GetTempFileName();
    try
    {
        using (var bmp = new System.Drawing.Bitmap(img))
        {
            bmp.Save(tmpFile, System.Drawing.Imaging.ImageFormat.Bmp);
        }

        var inputFile = string.Concat('"', tmpFile, '"');
        var outputFile = string.Concat('"', tmpFile, '"');
        var arguments = string.Concat(inputFile, " ", outputFile, " -l eng hocr");
        var tesseractProcessName = RunExamples.GetTesseractExePath();

        var psi = new System.Diagnostics.ProcessStartInfo(tesseractProcessName, arguments)
        {
            UseShellExecute = true,
            CreateNoWindow = true,
            WindowStyle = System.Diagnostics.ProcessWindowStyle.Hidden,
            WorkingDirectory = Path.GetDirectoryName(tesseractProcessName)
        };

        var p = new System.Diagnostics.Process
        {
            StartInfo = psi
        };
        p.Start();
        p.WaitForExit();

        using (var streamReader = new StreamReader(tmpFile + ".hocr"))
        {
            string text = streamReader.ReadToEnd();
            return text;
        }
    }
    finally
    {
        if (File.Exists(tmpFile))
        {
            File.Delete(tmpFile);
        }
        if (File.Exists(tmpFile + ".hocr"))
        {
            File.Delete(tmpFile + ".hocr");
        }
    }
}

Как создать доступный PDF-файл с использованием низкоуровневых функций

Этот фрагмент кода работает с PDF-документом и его размеченным содержимым, используя библиотеку Aspose.PDF для его обработки.

Пример создаёт новый элемент span в размеченном содержимом первой страницы PDF, находит все элементы BDC и связывает их со span. Затем сохраняется изменённый документ.

Вы можете создать оператор bdc, указав mcid, lang и текст расширения, используя объект BDCProperties:

var bdc = new Aspose.Pdf.Operators.BDC("P", new Aspose.Pdf.Facades.BDCProperties(1, "de", "Hallo, welt!"));

После создания дерева структуры можно связать оператор BDC с указанным элементом структуры с помощью метода Tag на объекте элемента:

Aspose.Pdf.LogicalStructure.SpanElement span = content.CreateSpanElement();
span.Tag(bdc);

Шаги по созданию доступного PDF:

  1. Загрузите PDF-документ.
  2. Получите доступ к размеченному содержимому.
  3. Создайте элемент span.
  4. Добавьте span к корневому элементу.
  5. Пройдитесь по содержимому страницы.
  6. Проверьте наличие элементов BDC и пометьте их.
  7. Сохраните изменённый документ.
// For complete examples and data files, visit https://github.com/aspose-pdf/Aspose.PDF-for-.NET
private static void CreateAnAccessibleDocument()
{
    // The path to the documents directory
    var dataDir = RunExamples.GetDataDir_AsposePdf_QuickStart();
    
    // Open PDF document
    using (var document = new Aspose.Pdf.Document(dataDir + "tourguidev2_gb_tags.pdf"))
    {
        // Access tagged content
        Aspose.Pdf.Tagged.ITaggedContent content = document.TaggedContent;
        // Create a span element
        Aspose.Pdf.LogicalStructure.SpanElement span = content.CreateSpanElement();
        // Append span to root element
        content.RootElement.AppendChild(span);
        // Iterate over page contents
        foreach (var op in document.Pages[1].Contents)
        {
            var bdc = op as Aspose.Pdf.Operators.BDC;
            if (bdc != null)
            {
                span.Tag(bdc);
            }
        }
        // Save PDF document
        document.Save(dataDir + "AccessibleDocument_out.pdf");
    }
}

Этот код изменяет PDF, создавая элемент span внутри размеченного содержимого документа и помечая определённый контент (операции BDC) с первой страницы этим span. Изменённый PDF затем сохраняется в новый файл.