Qué hay de nuevo

Qué hay de nuevo en Aspose.PDF 23.12

A partir de Aspose.PDF 23.12, se agregó soporte a las nuevas características de conversión:

  • Implementar conversión de PDF a Markdown

    import aspose.pdf as ap

    input_pdf_path = DIR_INPUT + "input.pdf"
    markdown_output_file_path = DIR_OUTPUT + "output_md_file.md"

    doc = ap.Document(input_pdf_path)
    save_options = ap.pdftomarkdown.MarkdownSaveOptions()
    save_options.resources_directory_name = "images"
    doc.save(markdown_output_file_path, save_options)
  • Implementar conversión de OFD a PDF

    import aspose.pdf as ap

    input_path = DIR_INPUT + "input.ofd"
    output_path = DIR_OUTPUT + "output.pdf"
    document = ap.Document(input_path, ap.OfdLoadOptions())
    document.save(output_path)

El soporte para Python 3.6 ha sido descontinuado.

Novedades en Aspose.PDF 23.11

Desde la versión 23.11 es posible eliminar el texto oculto. Se puede usar el siguiente fragmento de código:


    import aspose.pdf as ap

    document = ap.Document(input_file)
    text_absorber = ap.text.TextFragmentAbsorber()
    # Esta opción se puede usar para evitar que otros fragmentos de texto se muevan después de la sustitución del texto oculto.
    text_absorber.text_replace_options = ap.text.TextReplaceOptions(ap.text.TextReplaceOptions.ReplaceAdjustment.NONE)
    document.pages.accept(text_absorber)

    for fragment in text_absorber.text_fragments:
        if fragment.text_state.invisible:
            fragment.text = ''

    document.save(output_file)

Novedades en Aspose.PDF 23.8

Desde la versión 23.8 se admite añadir la detección de Actualizaciones Incrementales.

Se ha añadido la función para detectar Actualizaciones Incrementales en un documento PDF. Esta función devuelve ’true’ si un documento fue guardado con actualizaciones incrementales; de lo contrario, devuelve ‘false’.


    import aspose.pdf as ap

    doc = ap.Document(file_path)
    updated = doc.has_incremental_update()
    print(updated)

Además, la versión 23.8 admite formas de trabajar con campos de casillas de verificación anidadas. Muchos formularios PDF rellenables tienen campos de casillas de verificación que actúan como grupos de radio:

  • Crear campo de casilla de verificación de múltiples valores:

    import aspose.pdf as ap

    document = ap.Document()
    page = document.pages.add()
    checkbox = ap.forms.CheckboxField(page, ap.Rectangle(50, 50, 70, 70, True))
    # Establecer el valor de la primera opción del grupo de casillas
    checkbox.export_value = "option 1"
    # Añadir nueva opción justo debajo de las existentes
    checkbox.add_option("option 2")
    # Añadir nueva opción en el rectángulo dado
    checkbox.add_option("option 3", ap.Rectangle(100, 100, 120, 120, True))
    document.form.add(checkbox)
    # Seleccionar la casilla añadida
    checkbox.value = "option 2"
    document.save(DIR_OUTPUT + "checkbox_group.pdf")
  • Obtener y establecer el valor de un checkbox de múltiples valores:

    import aspose.pdf as ap

    doc = ap.Document("example.pdf")
    form = doc.form
    checkbox = cast(ap.forms.CheckboxField, form.fields[0])

    # Los valores permitidos pueden ser recuperados de la colección AllowedStates
    # Establecer el valor del checkbox usando la propiedad Value
    checkbox.value = checkbox.allowed_states[0]
    checkbox_value = checkbox.value  # el valor previamente establecido, por ejemplo, "opción 1"
    # El valor debe ser cualquier elemento de AllowedStates
    checkbox.value = "opción 2"
    checkbox_value = checkbox.value  # opción 2
    # Desmarcar las cajas estableciendo Value en "Off" o estableciendo Checked en falso
    checkbox.value = "Off"
    # o, alternativamente:
    # checkbox.checked = False
    checkbox_value = checkbox.value  # Off
  • Actualizar el estado del checkbox al hacer clic el usuario:

    import aspose.pdf as ap
    from aspose.pycore import cast

    input_file = DIR_INPUT + "input.pdf"
    document = ap.Document(input_file)
    point = ap.Point(62,462)  # por ejemplo, las coordenadas de un clic del ratón
    # Opción 1: revisar las anotaciones en la página
    page = document.pages[5]
    for annotation in page.annotations:
        if(annotation.rect.contains(point)):
            widget = cast(ap.annotations.WidgetAnnotation, annotation)
            checkbox = cast(ap.forms.CheckboxField, widget.parent)
            if(annotation.active_state == "Off"):
                checkbox.value = widget.get_checked_state_name()
            else:
                checkbox.value = "Off"
        break
    # Opción 2: revisar los campos en el AcroForm
    for widget in document.form:
        field = cast(ap.forms.Field, widget)
        if(field == None):
            continue
        checkBoxFound = False
        for annotation in field:
            if(annotation.rect.contains(point)):
                checkBoxFound = True
                if(annotation.active_state=="Off"):
                    annotation.parent.value = annotation.get_checked_state_name()
                else:
                    annotation.parent.value = "Off"
            if(checkBoxFound):
                break

Qué hay de nuevo en Aspose.PDF 23.7

Desde la versión 23.7 se admite agregar la extracción de formas:


    import aspose.pdf as ap

    input1_file = DIR_INPUT + "input_1.pdf"
    input2_file = DIR_INPUT + "input_2.pdf"

    source = ap.Document(input1_file)
    dest = ap.Document(input2_file)

    graphic_absorber = ap.vector.GraphicsAbsorber()
    graphic_absorber.visit(source.pages[1])
    area = ap.Rectangle(90, 250, 300, 400, True)
    dest.pages[1].add_graphics(graphic_absorber.elements, area)

También se admite la capacidad de detectar desbordamiento al agregar texto:


    import aspose.pdf as ap

    output_file = DIR_OUTPUT + "output.pdf"
    doc = ap.Document()
    paragraph_content = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras nisl tortor, efficitur sed cursus in, lobortis vitae nulla. Quisque rhoncus, felis sed dictum semper, est tellus finibus augue, ut feugiat enim risus eget tortor. Nulla finibus velit nec ante gravida sollicitudin. Morbi sollicitudin vehicula facilisis. Vestibulum ac convallis erat. Ut eget varius sem. Nam varius pharetra lorem, id ullamcorper justo auctor ac. Integer quis erat vitae lacus mollis volutpat eget et eros. Donec a efficitur dolor. Maecenas non dapibus nisi, ut pellentesque elit. Sed pellentesque rhoncus ante, a consectetur ligula viverra vel. Integer eget bibendum ante. Pellentesque habitant morbi tristique senectus et netus et malesuada fames ac turpis egestas. Curabitur elementum, sem a auctor vulputate, ante libero iaculis dolor, vitae facilisis dolor lorem at orci. Sed laoreet dui id nisi accumsan, id posuere diam accumsan."
    fragment = ap.text.TextFragment(paragraph_content)
    rectangle = ap.Rectangle(100, 600, 500, 700, False)
    paragraph = ap.text.TextParagraph()
    paragraph.vertical_alignment = ap.VerticalAlignment.TOP
    paragraph.formatting_options.wrap_mode = ap.text.TextFormattingOptions.WordWrapMode.BY_WORDS
    paragraph.rectangle = rectangle
    is_fit_rectangle = fragment.text_state.is_fit_rectangle(paragraph_content, rectangle)

    while is_fit_rectangle == False:
        fragment.text_state.font_size -= 0.5
        is_fit_rectangle = fragment.text_state.is_fit_rectangle(paragraph_content, rectangle)

    paragraph.append_line(fragment)
    builder = ap.text.TextBuilder(doc.pages.add())
    builder.append_paragraph(paragraph)
    doc.save(output_file)

Qué hay de nuevo en Aspose.PDF 23.6

Soporte para la capacidad de establecer el título de la página HTML, Epub:


    import aspose.pdf as ap

    input_pdf = DIR_INPUT + "input.pdf"
    output_html = DIR_OUTPUT + "output_title.html"
    options = ap.HtmlSaveOptions()
    options.fixed_layout = True
    options.raster_images_saving_mode = ap.HtmlSaveOptions.RasterImagesSavingModes.AS_EMBEDDED_PARTS_OF_PNG_PAGE_BACKGROUND
    options.parts_embedding_mode = ap.HtmlSaveOptions.PartsEmbeddingModes.EMBED_ALL_INTO_HTML
    options.title = "NUEVA PÁGINA Y TÍTULO"  # <-- esto se añadió

    document = ap.Document(input_pdf)
    document.save(output_html, options)

Qué hay de nuevo en Aspose.PDF 23.5

Desde la versión 23.5 se soporta añadir la opción RedactionAnnotation FontSize. Use el siguiente fragmento de código para resolver esta tarea:


    import aspose.pdf as ap

    doc = ap.Document(DIR_INPUT + "input.pdf")
    # Crear instancia de RedactionAnnotation para una región específica de la página
    annot = ap.annotations.RedactionAnnotation(doc.pages[1], ap.Rectangle(367, 756.919982910156, 420, 823.919982910156, True))
    annot.fill_color = ap.Color.black
    annot.border_color = ap.Color.yellow
    annot.color = ap.Color.blue
    # Texto a imprimir en la anotación de redacción
    annot.overlay_text = "(Desconocido)"
    annot.text_alignment = ap.HorizontalAlignment.CENTER
    # Repetir texto de superposición sobre la anotación de redacción
    annot.repeat = False
    # ¡Nueva propiedad aquí!
    annot.font_size = 20
    # Añadir anotación a la colección de anotaciones de la primera página
    doc.pages[1].annotations.add(annot, False)
    # Aplana la anotación y redacta el contenido de la página (es decir, elimina texto e imagen
    # Bajo la anotación redactada)
    annot.redact()
    out_file = DIR_OUTPUT + "RedactPage_out.pdf"
    doc.save(out_file)

El soporte para Python 3.5 ha sido descontinuado. Se ha agregado soporte para Python 3.11.

Qué hay de nuevo en Aspose.PDF 23.3

La versión 23.3 introdujo soporte para agregar una resolución a una imagen. Se pueden usar dos métodos para resolver este problema:


    import aspose.pdf as ap

    input_file = DIR_INPUT + "input.jpg"
    table = ap.Table()
    table.column_widths = "600"
    image = ap.Image()
    image.is_apply_resolution = True
    image.file = input_file
    for i in range(0, 2):
        row = table.rows.add()
        cell = row.cells.add()
        cell.paragraphs.add(image)

    page.paragraphs.add(table)

La imagen se colocará con resolución escalada o puede establecer propiedades de AnchoFijo o AltoFijo en combinación con IsApplyResolution

Qué hay de nuevo en Aspose.PDF 23.1

Desde la versión 23.1 se admite la creación de anotaciones PrinterMark.

Las marcas de impresora son símbolos gráficos o texto añadidos a una página para ayudar al personal de producción a identificar componentes de un trabajo de múltiples placas y mantener una salida consistente durante la producción. Ejemplos comúnmente utilizados en la industria de la impresión incluyen:

  • Objetivos de registro para alinear placas
  • Rampas grises y barras de color para medir colores y densidades de tinta
  • Marcas de corte que muestran dónde se debe recortar el medio de salida

Mostraremos el ejemplo de la opción con barras de color para medir colores y densidades de tinta. Hay una clase abstracta básica PrinterMarkAnnotation y de ella una clase hija ColorBarAnnotation, que ya implementa estas franjas. Vamos a ver el ejemplo:


    import aspose.pdf as ap

    out_file = DIR_OUTPUT  + "ColorBarTest.pdf"
    doc = ap.Document()
    page = doc.pages.add()
    page.trim_box = ap.Rectangle(20, 20, 580, 820, True)
    add_annotations(page)
    doc.save(out_file)


def add_annotations(page: ap.Page):
    rect_black = ap.Rectangle(100, 300, 300, 320, True)
    rect_cyan = ap.Rectangle(200, 600, 260, 690, True)
    rect_magenta = ap.Rectangle(10, 650, 140, 670, True)
    color_bar_black = ap.annotations.ColorBarAnnotation(page, rect_black, ap.annotations.ColorsOfCMYK.BLACK)
    color_bar_cyan = ap.annotations.ColorBarAnnotation(page, rect_cyan, ap.annotations.ColorsOfCMYK.CYAN)
    color_ba_magenta = ap.annotations.ColorBarAnnotation(page, rect_magenta, ap.annotations.ColorsOfCMYK.BLACK)
    color_ba_magenta.color_of_cmyk = ap.annotations.ColorsOfCMYK.MAGENTA
    color_bar_yellow = ap.annotations.ColorBarAnnotation(page, ap.Rectangle(400, 250, 450, 700, True), ap.annotations.ColorsOfCMYK.YELLOW)
    page.annotations.add(color_bar_black, False)
    page.annotations.add(color_bar_cyan, False)
    page.annotations.add(color_ba_magenta, False)
    page.annotations.add(color_bar_yellow, False)

También se admite la extracción de imágenes vectoriales. Intenta usar el siguiente código para detectar y extraer gráficos vectoriales:


    import aspose.pdf as ap

    input_pdf = DIR_INPUT + "input.pdf"
    output_pdf = DIR_OUTPUT + "output.svg"
    doc = ap.Document(input_pdf)
    doc.pages[1].try_save_vector_graphics(output_pdf)