Manipular Documento PDF en Python a través de .NET

Manipular Documento PDF en Python

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

Para validar un documento PDF para la compatibilidad con 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 requerida enumeración PdfFormat: PDF_A_1A o PDF_A_1B.

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


    import aspose.pdf as ap

    # Abrir documento
    document = ap.Document(input_pdf)

    # Validar PDF para PDF/A-1a
    document.validate(output_xml, ap.PdfFormat.PDF_A_1A)

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


    import aspose.pdf as ap

    # Abrir documento
    document = ap.Document(input_pdf)

    # Validar PDF para PDF/A-1b
    document.validate(output_xml, ap.PdfFormat.PDF_A_1B)

Trabajando con TOC

Agregar TOC a un PDF Existente

TOC en PDF significa “Tabla de Contenidos”. Es una característica que permite a los usuarios navegar rápidamente a través de un documento proporcionando una visión general de sus secciones y encabezados.

Para agregar un TOC a un archivo PDF existente, use la clase Heading en el espacio de nombres aspose.pdf. El espacio de nombres aspose.pdf puede tanto crear nuevos archivos PDF como manipular archivos PDF existentes. Para agregar un TOC a un PDF existente, use el espacio de nombres Aspose.Pdf. El siguiente fragmento de código muestra cómo crear una tabla de contenidos dentro de un archivo PDF existente usando Python a través de .NET.


    import aspose.pdf as ap

    # Cargar un archivo PDF existente
    doc = ap.Document(input_pdf)

    # Acceder a la primera página del archivo PDF
    tocPage = doc.pages.insert(1)

    # Crear objeto para representar la información del TOC
    tocInfo = ap.TocInfo()
    title = ap.text.TextFragment("Tabla de Contenidos")
    title.text_state.font_size = 20
    title.text_state.font_style = ap.text.FontStyles.BOLD

    # Establecer el título para el TOC
    tocInfo.title = title
    tocPage.toc_info = tocInfo

    # Crear objetos de cadena que se usarán como elementos del TOC
    titles = ["Primera página", "Segunda página", "Tercera página", "Cuarta página"]
    for i in range(0, 2):
        # Crear objeto Heading
        heading2 = ap.Heading(1)
        segment2 = ap.text.TextSegment()
        heading2.toc_page = tocPage
        heading2.segments.append(segment2)

        # Especificar la página de destino para el objeto heading
        heading2.destination_page = doc.pages[i + 2]

        # Página de destino
        heading2.top = doc.pages[i + 2].rect.height

        # Coordenada de destino
        segment2.text = titles[i]

        # Agregar encabezado a la página que contiene el TOC
        tocPage.paragraphs.add(heading2)

    # Guardar el documento actualizado
    doc.save(output_pdf)

Establecer diferentes TabLeaderType para diferentes niveles de TOC

Aspose.PDF para Python también permite establecer diferentes TabLeaderType para diferentes niveles de TOC. Necesitas establecer la propiedad line_dash de TocInfo.


    import aspose.pdf as ap

    doc = ap.Document()
    tocPage = doc.pages.add()
    toc_info = ap.TocInfo()

    # establecer LeaderType
    toc_info.line_dash = ap.text.TabLeaderType.SOLID
    title = ap.text.TextFragment("Tabla de Contenidos")
    title.text_state.font_size = 30
    toc_info.title = title

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

    toc_info.format_array_length = 4
    toc_info.format_array[0].margin.left = 0
    toc_info.format_array[0].margin.right = 30
    toc_info.format_array[0].line_dash = ap.text.TabLeaderType.DOT
    toc_info.format_array[0].text_state.font_style = ap.text.FontStyles.BOLD | ap.text.FontStyles.ITALIC
    toc_info.format_array[1].margin.left = 10
    toc_info.format_array[1].margin.right = 30
    toc_info.format_array[1].line_dash = 3
    toc_info.format_array[1].text_state.font_size = 10
    toc_info.format_array[2].margin.left = 20
    toc_info.format_array[2].margin.right = 30
    toc_info.format_array[2].text_state.font_style = ap.text.FontStyles.BOLD
    toc_info.format_array[3].line_dash = ap.text.TabLeaderType.SOLID
    toc_info.format_array[3].margin.left = 30
    toc_info.format_array[3].margin.right = 30
    toc_info.format_array[3].text_state.font_style = ap.text.FontStyles.BOLD

    # Crear una sección en el documento Pdf
    page = doc.pages.add()

    # Añadir cuatro encabezados en la sección
    for Level in range(1, 5):
        heading2 = ap.Heading(Level)
        segment2 = ap.text.TextSegment()
        heading2.segments.append(segment2)
        heading2.is_auto_sequence = True
        heading2.toc_page = tocPage
        segment2.text = "Encabezado de Ejemplo" + str(Level)
        heading2.text_state.font = ap.text.FontRepository.find_font("Arial")

        # Añadir el encabezado en la Tabla de Contenidos.
        heading2.is_in_list = True
        page.paragraphs.add(heading2)

    # guardar el Pdf
    doc.save(output_pdf)

Ocultar Números de Página en el TOC

En caso de que no desees mostrar los números de página, junto con los encabezados en el TOC, puedes usar la propiedad is_show_page_numbers de la Clase TocInfo como falso. Por favor, revisa el siguiente fragmento de código para ocultar los números de página en la tabla de contenidos:


    import aspose.pdf as ap

    doc = ap.Document()
    toc_page = doc.pages.add()
    toc_info = ap.TocInfo()
    title = ap.text.TextFragment("Tabla de Contenidos")
    title.text_state.font_size = 20
    title.text_state.font_style = ap.text.FontStyles.BOLD
    toc_info.title = title
    # Agregar la sección de la lista a la colección de secciones del documento Pdf
    toc_page.toc_info = toc_info
    # Definir el formato de la lista de cuatro niveles configurando los márgenes
    # a la izquierda y la configuración del formato del texto de cada nivel

    toc_info.is_show_page_numbers = False
    toc_info.format_array_length = 4
    toc_info.format_array[0].margin.right = 0
    toc_info.format_array[0].text_state.font_style = ap.text.FontStyles.BOLD | ap.text.FontStyles.ITALIC
    toc_info.format_array[1].margin.left = 30
    toc_info.format_array[1].text_state.underline = True
    toc_info.format_array[1].text_state.font_size = 10
    toc_info.format_array[2].text_state.font_style = ap.text.FontStyles.BOLD
    toc_info.format_array[3].text_state.font_style = ap.text.FontStyles.BOLD
    page = doc.pages.add()
    # Agregar cuatro encabezados en la sección
    for Level in range(1, 5):
        heading2 = ap.Heading(Level)
        segment2 = ap.text.TextSegment()
        heading2.toc_page = toc_page
        heading2.segments.append(segment2)
        heading2.is_auto_sequence = True
        segment2.text = "este es el encabezado de nivel " + str(Level)
        heading2.is_in_list = True
        page.paragraphs.add(heading2)
    doc.save(output_pdf)

Personalizar los Números de Página al Agregar un Índice

Es común personalizar la numeración de las páginas en el índice al agregarlo en un documento PDF. Por ejemplo, puede ser necesario añadir algún prefijo antes del número de página como P1, P2, P3, etc. En tal caso, Aspose.PDF para Python proporciona la propiedad page_numbers_prefix 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.


    import aspose.pdf as ap

    # Cargar un archivo PDF existente
    doc = ap.Document(input_pdf)
    # Acceder a la primera página del archivo PDF
    toc_page = doc.pages.insert(1)
    # Crear objeto para representar la información del índice
    toc_info = ap.TocInfo()
    title = ap.text.TextFragment("Tabla de Contenidos")
    title.text_state.font_size = 20
    title.text_state.font_style = ap.text.FontStyles.BOLD
    # Establecer el título para el índice
    toc_info.title = title
    toc_info.page_numbers_prefix = "P"
    toc_page.toc_info = toc_info
    for i in range(len(doc.pages)):
        # Crear objeto de encabezado
        heading2 = ap.Heading(1)
        segment2 = ap.text.TextSegment()
        heading2.toc_page = toc_page
        heading2.segments.append(segment2)
        # Especificar la página de destino para el objeto de encabezado
        heading2.destination_page = doc.pages[i + 1]
        # Página de destino
        heading2.top = doc.pages[i + 1].rect.height
        # Coordenada de destino
        segment2.text = "Página " + str(i)
        # Añadir encabezado a la página que contiene el índice
        toc_page.paragraphs.add(heading2)

    # Guardar el documento actualizado
    doc.save(output_pdf)

Cómo establecer la fecha de vencimiento de un PDF

Aplicamos privilegios de acceso a archivos PDF para que un cierto grupo de usuarios pueda acceder a características/objetos particulares de documentos PDF. Para restringir el acceso al archivo PDF, usualmente aplicamos cifrado y podemos tener el requerimiento de establecer la expiración del archivo PDF, de modo que el usuario que accede/visualiza el documento reciba un aviso válido sobre la expiración del archivo PDF.


    import aspose.pdf as ap

    # Instanciar objeto Document
    doc = ap.Document()
    # Agregar página a la colección de páginas del archivo PDF
    doc.pages.add()
    # Agregar fragmento de texto a la colección de párrafos del objeto página
    doc.pages[1].paragraphs.add(ap.text.TextFragment("Hola Mundo..."))
    # Crear objeto JavaScript para establecer la fecha de vencimiento del PDF
    javaScript = ap.annotations.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 expirado. Necesitas uno nuevo.');"
    )
    # Establecer JavaScript como acción de apertura del PDF
    doc.open_action = javaScript

    # Guardar Documento PDF
    doc.save(output_pdf)

Aplanar PDF Rellenable en Python

Los documentos PDF a menudo incluyen formularios con widgets interactivos rellenables como botones de opción, casillas de verificación, cuadros 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 Python con solo unas pocas líneas de código:


    import aspose.pdf as ap

    # Cargar el formulario PDF de origen
    doc = ap.Document(input_pdf)

    # Aplanar PDF Rellenable Aplanado
    if len(doc.form.fields) > 0:
        for item in doc.form.fields:
            item.flatten()

    # Guardar el documento actualizado
    doc.save(output_pdf)