Cómo crear PDF usando C#

Siempre estamos buscando una manera de generar documentos PDF y trabajar con ellos en proyectos de C# de manera más exacta, precisa y efectiva. Tener funciones fáciles de usar de una biblioteca nos permite concentrarnos más en el trabajo y menos en los detalles que consumen tiempo al intentar generar PDFs, ya sea en .NET.

El siguiente fragmento de código también trabaja con la biblioteca Aspose.PDF.Drawing.

Crear (o generar) documento PDF usando el lenguaje C#

La API de Aspose.PDF for .NET te permite crear y leer archivos PDF usando C# y VB.NET. La API se puede utilizar en una variedad de aplicaciones .NET, incluyendo WinForms, ASP.NET y varias otras. En este artículo, vamos a mostrar cómo usar la API de Aspose.PDF for .NET para generar y leer archivos PDF fácilmente en aplicaciones .NET.

Cómo crear un archivo PDF simple

Para crear un archivo PDF usando C#, se pueden seguir los siguientes pasos.

  1. Crear un objeto de la clase Document.
  2. Agregar un objeto Page a la colección Pages del objeto Document.
  3. Agregar TextFragment a la colección Paragraphs de la página.
  4. Guardar el documento PDF resultante.
// 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");
    }
}

Cómo crear un documento PDF buscable

Aspose.PDF for .NET proporciona la función para crear y manipular documentos PDF existentes. Al agregar elementos de texto dentro del archivo PDF, el PDF resultante es buscable. Sin embargo, si estamos convirtiendo una imagen que contiene texto a un archivo PDF, el contenido dentro del PDF no es buscable. Sin embargo, como solución alternativa, podemos usar OCR sobre el archivo resultante, para que se vuelva buscable.

Esta lógica especificada a continuación reconoce texto para imágenes PDF. Para el reconocimiento, puedes usar soportes externos de OCR que cumplan con el estándar HOCR. Para fines de prueba, hemos utilizado un OCR gratuito de Google Tesseract. Por lo tanto, primero necesitas instalar Tesseract-OCR en tu sistema, y tendrás la aplicación de consola de Tesseract.

El siguiente es el código completo para cumplir con este requisito:

// 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");
        }
    }
}

Cómo crear un PDF accesible usando funciones de bajo nivel

Este fragmento de código trabaja con un documento PDF y su contenido etiquetado, utilizando una biblioteca Aspose.PDF para procesarlo.

El ejemplo crea un nuevo elemento span en el contenido etiquetado de la primera página de un PDF, encuentra todos los elementos BDC y los asocia con el span. El documento modificado se guarda luego.

Puedes crear una declaración bdc especificando mcid, lang y texto de expansión usando el objeto BDCProperties:

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

Después de crear el árbol de estructura, es posible vincular el operador BDC al elemento especificado de la estructura con el método Tag en el objeto del elemento:

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

Pasos para crear un PDF accesible:

  1. Cargar el documento PDF.
  2. Acceder al contenido etiquetado.
  3. Crear un elemento Span.
  4. Agregar Span al elemento raíz.
  5. Iterar sobre el contenido de la página.
  6. Verificar elementos BDC y etiquetarlos.
  7. Guardar el documento modificado.
// 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");
    }
}

Este código modifica un PDF creando un elemento span dentro del contenido etiquetado del documento y etiquetando contenido específico (operaciones BDC) de la primera página con este span. El PDF modificado se guarda luego en un nuevo archivo.