Manipular Documento PDF en C#

Manipular Documento PDF en C#

Validar Documento PDF para el Estándar PDF A (A 1A y A 1B)

Para validar un documento PDF para la compatibilidad PDF/A-1a o PDF/A-1b, utiliza el método Validate de la clase Document. Este método te permite especificar el nombre del archivo en el que se guardará el resultado y el tipo de validación requerido en la enumeración PdfFormat: PDF_A_1A o PDF_A_1B.

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

El siguiente fragmento de código te muestra cómo validar un documento PDF para PDF/A-1A. El siguiente fragmento de código te muestra cómo validar un documento PDF para PDF/A-1A.

// Para ejemplos completos y archivos de datos, por favor visita https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// La ruta al directorio de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();

// Abrir documento
Document pdfDocument = new Document(dataDir + "ValidatePDFAStandard.pdf");

// Validar PDF para PDF/A-1a
pdfDocument.Validate(dataDir + "validation-result-A1A.xml", PdfFormat.PDF_A_1A);

El siguiente fragmento de código te muestra cómo validar un documento PDF para PDF/A-1B.

// Para ejemplos completos y archivos de datos, por favor visita https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// La ruta al directorio de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();

// Abrir documento
Document pdfDocument = new Document(dataDir + "ValidatePDFAStandard.pdf");

// Validar PDF para PDF/A-1a
pdfDocument.Validate(dataDir + "validation-result-A1A.xml", PdfFormat.PDF_A_1B);

Trabajando con TOC

Agregar TOC a un PDF Existente

La API de Aspose.PDF le permite agregar una tabla de contenido ya sea al crear un PDF o a un archivo existente. La clase ListSection en el espacio de nombres Aspose.Pdf.Generator le permite crear una tabla de contenidos al crear un PDF desde cero. Para agregar encabezados, que son elementos del TOC, use la clase Aspose.Pdf.Generator.Heading.

Para agregar un TOC a un archivo PDF existente, use la clase Heading en el espacio de nombres Aspose.Pdf. Para agregar un TOC a un archivo PDF existente, utilice la clase Heading en el espacio de nombres Aspose.Pdf.

// Para ejemplos completos y archivos de datos, por favor vaya a https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// La ruta al directorio de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();

// Cargar un archivo PDF existente
Document doc = new Document(dataDir + "AddTOC.pdf");

// Obtener acceso a la primera página del archivo PDF
Page tocPage = doc.Pages.Insert(1);

// Crear objeto para representar la información de TOC
TocInfo tocInfo = new TocInfo();
TextFragment title = new TextFragment("Índice de Contenidos");
title.TextState.FontSize = 20;
title.TextState.FontStyle = FontStyles.Bold;

// Establecer el título para TOC
tocInfo.Title = title;
tocPage.TocInfo = tocInfo;

// Crear objetos de cadena que se utilizarán como elementos de TOC
string[] titles = new string[4];
titles[0] = "Primera página";
titles[1] = "Segunda página";
titles[2] = "Tercera página";
titles[3] = "Cuarta página";
for (int i = 0; i < 2; i++)
{
    // Crear objeto Heading
    Aspose.Pdf.Heading heading2 = new Aspose.Pdf.Heading(1);
    TextSegment segment2 = new TextSegment();
    heading2.TocPage = tocPage;
    heading2.Segments.Add(segment2);

    // Especificar la página de destino para el objeto de encabezado
    heading2.DestinationPage = doc.Pages[i + 2];

    // Página de destino
    heading2.Top = doc.Pages[i + 2].Rect.Height;

    // Coordenada de destino
    segment2.Text = titles[i];

    // Añadir encabezado a la página que contiene TOC
    tocPage.Paragraphs.Add(heading2);
}
dataDir = dataDir + "TOC_out.pdf";
// Guardar el documento actualizado
doc.Save(dataDir);

Establecer diferentes tipos de TabLeader para diferentes niveles de TOC

Aspose.PDF también permite establecer diferentes tipos de TabLeader para diferentes niveles de TOC. Necesitas configurar la propiedad LineDash de FormatArray con el valor apropiado del enumerado TabLeaderType como sigue.

 string outFile = "TOC.pdf";

Aspose.Pdf.Document doc = new Aspose.Pdf.Document();
Page tocPage = doc.Pages.Add();
TocInfo tocInfo = new TocInfo();

//establecer LeaderType
tocInfo.LineDash = TabLeaderType.Solid;
TextFragment title = new TextFragment("Tabla de Contenidos");
title.TextState.FontSize = 30;
tocInfo.Title = title;

//Añadir la sección de lista a la colección de secciones del documento Pdf
tocPage.TocInfo = tocInfo;
//Definir el formato de los cuatro niveles de lista configurando los márgenes izquierdos
//y
//configuraciones de formato de texto de cada nivel

tocInfo.FormatArrayLength = 4;
tocInfo.FormatArray[0].Margin.Left = 0;
tocInfo.FormatArray[0].Margin.Right = 30;
tocInfo.FormatArray[0].LineDash = TabLeaderType.Dot;
tocInfo.FormatArray[0].TextState.FontStyle = FontStyles.Bold | FontStyles.Italic;
tocInfo.FormatArray[1].Margin.Left = 10;
tocInfo.FormatArray[1].Margin.Right = 30;
tocInfo.FormatArray[1].LineDash = TabLeaderType.None;
tocInfo.FormatArray[1].TextState.FontSize = 10;
tocInfo.FormatArray[2].Margin.Left = 20;
tocInfo.FormatArray[2].Margin.Right = 30;
tocInfo.FormatArray[2].TextState.FontStyle = FontStyles.Bold;
tocInfo.FormatArray[3].LineDash = TabLeaderType.Solid;
tocInfo.FormatArray[3].Margin.Left = 30;
tocInfo.FormatArray[3].Margin.Right = 30;
tocInfo.FormatArray[3].TextState.FontStyle = FontStyles.Bold;

//Crear una sección en el documento Pdf
Page page = doc.Pages.Add();

//Añadir cuatro encabezados en la sección
for (int Level = 1; Level <= 4; Level++)
{

    Aspose.Pdf.Heading heading2 = new Aspose.Pdf.Heading(Level);
    TextSegment segment2 = new TextSegment();
    heading2.Segments.Add(segment2);
    heading2.IsAutoSequence = true;
    heading2.TocPage = tocPage;
    segment2.Text = "Encabezado de Muestra" + Level;
    heading2.TextState.Font = FontRepository.FindFont("Arial Unicode MS");

    //Añadir el encabezado en la Tabla de Contenidos.
    heading2.IsInList = true;
    page.Paragraphs.Add(heading2);
}

// guardar el Pdf

doc.Save(outFile);

Ocultar Números de Página en el TOC

En caso de que no desee mostrar los números de página, junto con los encabezados en el TOC, puede usar la propiedad IsShowPageNumbers de la Clase TOCInfo como false. Por favor, consulte el siguiente fragmento de código para ocultar los números de página en la tabla de contenidos:

// Para ejemplos completos y archivos de datos, por favor vaya a https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// La ruta al directorio de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();
string outFile = dataDir + "HiddenPageNumbers_out.pdf";
Document doc = new Document();
Page tocPage = doc.Pages.Add();
TocInfo tocInfo = new TocInfo();
TextFragment title = new TextFragment("Tabla de Contenidos");
title.TextState.FontSize = 20;
title.TextState.FontStyle = FontStyles.Bold;
tocInfo.Title = title;
//Añadir la sección de lista a la colección de secciones del documento Pdf
tocPage.TocInfo = tocInfo;
//Definir el formato de los cuatro niveles de lista ajustando los márgenes izquierdos y
//configuraciones de formato de texto de cada nivel

tocInfo.IsShowPageNumbers = false;
tocInfo.FormatArrayLength = 4;
tocInfo.FormatArray[0].Margin.Right = 0;
tocInfo.FormatArray[0].TextState.FontStyle = FontStyles.Bold | FontStyles.Italic;
tocInfo.FormatArray[1].Margin.Left = 30;
tocInfo.FormatArray[1].TextState.Underline = true;
tocInfo.FormatArray[1].TextState.FontSize = 10;
tocInfo.FormatArray[2].TextState.FontStyle = FontStyles.Bold;
tocInfo.FormatArray[3].TextState.FontStyle = FontStyles.Bold;
Page page = doc.Pages.Add();
//Añadir cuatro encabezados en la sección
for (int Level = 1; Level != 5; Level++)

{ Heading heading2 = new Heading(Level); TextSegment segment2 = new TextSegment(); heading2.TocPage = tocPage; heading2.Segments.Add(segment2); heading2.IsAutoSequence = true; segment2.Text = "este es un encabezado de nivel " + Level; heading2.IsInList = true; page.Paragraphs.Add(heading2); }
doc.Save(outFile);

Personalizar Números de Página al agregar TOC

Es común personalizar la numeración de páginas en el TOC al agregar un TOC en un documento PDF. Por ejemplo, podemos necesitar agregar algún prefijo antes del número de página como P1, P2, P3, etc. En tal caso, Aspose.PDF para .NET proporciona la propiedad PageNumbersPrefix de la clase TocInfo que se puede utilizar para personalizar los números de página como se muestra en el siguiente ejemplo de código.

// Para ejemplos completos y archivos de datos, por favor vaya a https://github.com/aspose-pdf/Aspose.PDF-for-.NET
string inFile = RunExamples.GetDataDir_AsposePdf_WorkingDocuments() + "42824.pdf";
string outFile = RunExamples.GetDataDir_AsposePdf_WorkingDocuments() + "42824_out.pdf";
// Cargar un archivo PDF existente
Document doc = new Document(inFile);
// Acceder a la primera página del archivo PDF
Aspose.Pdf.Page tocPage = doc.Pages.Insert(1);
// Crear objeto para representar la información de TOC
TocInfo tocInfo = new TocInfo();
TextFragment title = new TextFragment("Índice de Contenidos");
title.TextState.FontSize = 20;
title.TextState.FontStyle = FontStyles.Bold;
// Establecer el título para TOC
tocInfo.Title = title;
tocInfo.PageNumbersPrefix = "P";
tocPage.TocInfo = tocInfo;
for (int i = 1; i<doc.Pages.Count; i++)
{
    // Crear objeto Heading
    Aspose.Pdf.Heading heading2 = new Aspose.Pdf.Heading(1);
    TextSegment segment2 = new TextSegment();
    heading2.TocPage = tocPage;
    heading2.Segments.Add(segment2);
    // Especificar la página de destino para el objeto de encabezado
    heading2.DestinationPage = doc.Pages[i + 1];
    // Página de destino
    heading2.Top = doc.Pages[i + 1].Rect.Height;
    // Coordenada de destino
    segment2.Text = "Página " + i.ToString();
    // Agregar encabezado a la página que contiene TOC
    tocPage.Paragraphs.Add(heading2);
}

// Guardar el documento actualizado
doc.Save(outFile);

Cómo establecer la fecha de caducidad del PDF

Aplicamos privilegios de acceso en archivos PDF para que un cierto grupo de usuarios pueda acceder a características/objetos particulares de documentos PDF. Con el fin de restringir el acceso al archivo PDF, generalmente aplicamos encriptación y podemos tener el requisito de establecer una fecha de caducidad del archivo PDF, de modo que el usuario que acceda/visualice el documento reciba un aviso válido respecto a la caducidad del archivo PDF.

Para lograr el requisito mencionado anteriormente, podemos usar el objeto JavascriptAction. Por favor, eche un vistazo al siguiente fragmento de código.

// Para ejemplos completos y archivos de datos, por favor vaya a https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// La ruta al directorio de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();

// Instanciar objeto Document
Aspose.Pdf.Document doc = new Aspose.Pdf.Document();
// Añadir página a la colección de páginas del archivo PDF
doc.Pages.Add();
// Añadir fragmento de texto a la colección de párrafos del objeto de página
doc.Pages[1].Paragraphs.Add(new TextFragment("Hola Mundo..."));
// Crear objeto JavaScript para establecer la fecha de caducidad del PDF
JavascriptAction javaScript = new JavascriptAction(
"var year=2017;"
+ "var month=5;"
+ "today = new Date(); today = new Date(today.getFullYear(), today.getMonth());"
+ "expiry = new Date(year, month);"
+ "if (today.getTime() > expiry.getTime())"
+ "app.alert('El archivo ha caducado. Necesitas uno nuevo.');");
// Establecer JavaScript como acción de apertura de PDF
doc.OpenAction = javaScript;

dataDir = dataDir + "SetExpiryDate_out.pdf";
// Guardar documento PDF
doc.Save(dataDir);

Determinar el Progreso de la Generación de Archivos PDF

Un cliente nos pidió agregar una característica que permita a los desarrolladores determinar el progreso de la generación de archivos PDF. Aquí está la respuesta a esa solicitud.

El campo CustomerProgressHandler de la clase DocSaveOptions le permite determinar cómo va la generación del PDF. El manejador tiene los siguientes tipos:

  • DocSaveOptions.ConversionProgessEventHandler
  • DocSaveOptions.ProgressEventHandlerInfo
  • DocSaveOptions.ProgressEventType

Los fragmentos de código a continuación muestran cómo usar CustomerProgressHandler.

// Para ejemplos completos y archivos de datos, por favor vaya a https://github.com/aspose-pdf/Aspose.PDF-for-.NET
// La ruta al directorio de documentos.
string dataDir = RunExamples.GetDataDir_AsposePdf_WorkingDocuments();

// Abrir documento
Document pdfDocument = new Document(dataDir + "AddTOC.pdf");
DocSaveOptions saveOptions = new DocSaveOptions();
saveOptions.CustomProgressHandler = new UnifiedSaveOptions.ConversionProgressEventHandler(ShowProgressOnConsole);

dataDir = dataDir + "DetermineProgress_out.pdf";
pdfDocument.Save(dataDir, saveOptions);
Console.ReadLine();
// Para ejemplos completos y archivos de datos, por favor visite https://github.com/aspose-pdf/Aspose.PDF-for-.NET
public static void ShowProgressOnConsole(DocSaveOptions.ProgressEventHandlerInfo eventInfo)
{
    switch (eventInfo.EventType)
    {
        case DocSaveOptions.ProgressEventType.TotalProgress:
            Console.WriteLine(String.Format("{0}  - Progreso de conversión: {1}% .", DateTime.Now.ToLongTimeString(), eventInfo.Value.ToString()));
            break;
        case DocSaveOptions.ProgressEventType.SourcePageAnalized:
            Console.WriteLine(String.Format("{0}  - Página fuente {1} de {2} analizada.", DateTime.Now.ToLongTimeString(), eventInfo.Value.ToString(), eventInfo.MaxValue.ToString()));
            break;
        case DocSaveOptions.ProgressEventType.ResultPageCreated:
            Console.WriteLine(String.Format("{0}  - Diseño de página resultado {1} de {2} creado.", DateTime.Now.ToLongTimeString(), eventInfo.Value.ToString(), eventInfo.MaxValue.ToString()));
            break;
        case DocSaveOptions.ProgressEventType.ResultPageSaved:
            Console.WriteLine(String.Format("{0}  - Página resultado {1} de {2} exportada.", DateTime.Now.ToLongTimeString(), eventInfo.Value.ToString(), eventInfo.MaxValue.ToString()));
            break;
        default:
            break;
    }

}

Aplanar PDF Rellenable en C#

Los documentos PDF a menudo incluyen formularios con widgets rellenables interactivos como botones de radio, casillas de verificación, cajas de texto, listas, etc. Para hacerlo no editable para varios propósitos de aplicación, necesitamos aplanar el archivo PDF. Aspose.PDF proporciona la función para aplanar tu PDF en C# con solo unas pocas líneas de código:


// Cargar el formulario PDF fuente
Document doc = new Document(dataDir + "input.pdf");

// Aplanar PDF Rellenable
if (doc.Form.Fields.Count() > 0)
{
    foreach (var item in doc.Form.Fields)
    {
        item.Flatten();
    }
}

dataDir = dataDir + "FlattenForms_out.pdf";
// Guardar el documento actualizado
doc.Save(dataDir);