Reemplazar Texto en PDF

Reemplazar Texto en todas las páginas del documento PDF

Para reemplazar texto en todas las páginas de un documento PDF usando Aspose.PDF for Java:

  1. Primero use TextFragmentAbsorber para encontrar la frase particular que se va a reemplazar.

  2. Luego, revise todos los TextFragments para reemplazar el texto y cambiar cualquier otro atributo.

  3. Finalmente, guarde el PDF de salida utilizando el método save de la clase Document.

package com.aspose.pdf.examples;

import com.aspose.pdf.*;

public class ExampleReplaceText {
    
    private static String _dataDir = "/home/admin1/pdf-examples/Samples/";
    public static void ReplaceTextOnAllPages() {
        Document pdfDocument = new Document(_dataDir+"sample.pdf");

        // Crear objeto TextAbsorber para encontrar todas las instancias de la frase de búsqueda de entrada
        TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("Web");
        
        // Aceptar el absorber para la primera página del documento
        pdfDocument.getPages().accept(textFragmentAbsorber);
        
        // Obtener los fragmentos de texto extraídos en la colección
        TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();
        
        // Recorrer los fragmentos
        for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection) {
            // Actualizar texto y otras propiedades
            textFragment.setText("World Wide Web");
            textFragment.getTextState().setFont(FontRepository.findFont("Verdana"));
            textFragment.getTextState().setFontSize(12);
            textFragment.getTextState().setForegroundColor(Color.getBlue());
            textFragment.getTextState().setBackgroundColor(Color.getGray());
        }
        // Guardar el archivo PDF actualizado
        pdfDocument.save(_dataDir+"Updated_Text.pdf");
    }
}

Reemplazar texto en una región particular de la página

Para reemplazar texto en una región particular de la página, primero necesitamos instanciar el objeto TextFragmentAbsorber, especificar la región de la página usando TextSearchOptions.setRectangle y luego iterar a través de todos los TextFragments para reemplazar el texto. Una vez que estas operaciones se completen, solo necesitamos guardar el PDF de salida usando el método save del objeto Document.

El siguiente fragmento de código te muestra cómo reemplazar texto en todas las páginas del documento PDF.

 public static void ReplaceTextInParticularRegion(){
    // cargar archivo PDF
    Document pdfDocument = new Document(_dataDir+"sample.pdf");

    // instanciar objeto TextFragment Absorber
    TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("PDF");

    // buscar texto dentro de los límites de la página
    textFragmentAbsorber.getTextSearchOptions().setLimitToPageBounds(true);

    // especificar la región de la página para las opciones de búsqueda de texto
    textFragmentAbsorber.getTextSearchOptions().setRectangle(new Rectangle(100, 700, 400, 770));

    // buscar texto desde la primera página del archivo PDF
    pdfDocument.getPages().get_Item(1).accept(textFragmentAbsorber);

    // iterar a través de cada TextFragment
    for(TextFragment tf : textFragmentAbsorber.getTextFragments())
    {
        // reemplazar texto con "---"
        tf.setText("---");
    }

    // Guardar el archivo PDF actualizado
    pdfDocument.save(_dataDir+"Updated_Text.pdf");
}

Reemplazar Texto Basado en una Expresión Regular

Si deseas reemplazar algunas frases basadas en una expresión regular, primero necesitas encontrar todas las frases que coincidan con esa expresión regular en particular usando TextFragmentAbsorber. Tendrás que pasar la expresión regular como un parámetro al constructor de TextFragmentAbsorber. También necesitas crear un objeto TextSearchOptions que especifique si se está utilizando la expresión regular o no. Una vez que obtengas las frases coincidentes en TextFragments, necesitas iterar a través de todas ellas y actualizar según sea necesario. Finalmente, necesitas guardar el PDF actualizado utilizando el método Save del objeto Document.

El siguiente fragmento de código te muestra cómo reemplazar texto basado en una expresión regular.

public static void ReplaceTextWithRegularExpression() {
    // cargar archivo PDF
    Document pdfDocument = new Document(_dataDir + "sample.pdf");
    // Crear objeto TextAbsorber para encontrar todas las instancias de la frase de búsqueda de entrada
    TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("\\d{4}-\\d{4}"); 
    // como 1999-2000

    // Establecer opción de búsqueda de texto para especificar el uso de expresión regular
    TextSearchOptions textSearchOptions = new TextSearchOptions(true);
    textFragmentAbsorber.setTextSearchOptions(textSearchOptions);

    // Aceptar el absorbedor para la primera página del documento
    pdfDocument.getPages().accept(textFragmentAbsorber);

    // Obtener los fragmentos de texto extraídos en la colección
    TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();

    // Iterar a través de los fragmentos
    for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection) {
        // Actualizar texto y otras propiedades
        textFragment.setText("ABCD-EFGH");
        textFragment.getTextState().setFont(FontRepository.findFont("Verdana"));
        textFragment.getTextState().setFontSize(12);
        textFragment.getTextState().setForegroundColor(Color.getBlue());
        textFragment.getTextState().setBackgroundColor(Color.getGray());
    }

    // Guardar el archivo PDF actualizado
    pdfDocument.save(_dataDir + "Updated_Text.pdf");
}

Reemplazar fuentes en un archivo PDF existente

Aspose.PDF para Java admite la capacidad de reemplazar texto en un documento PDF. Sin embargo, a veces tienes el requisito de reemplazar solo la fuente que se utiliza dentro del documento PDF. Así que en lugar de reemplazar el texto, solo se reemplaza la fuente utilizada. Una de las sobrecargas del constructor de TextFragmentAbsorber acepta un objeto TextEditOptions como argumento y podemos usar el valor RemoveUnusedFonts de la enumeración TextEditOptions.FontReplace para cumplir con nuestros requisitos.

El siguiente fragmento de código muestra cómo reemplazar la fuente dentro del documento PDF.

public static void ReplaceFonts() {
    // Instanciar objeto Document
    Document pdfDocument = new Document(_dataDir + "sample.pdf");

    // Buscar fragmentos de texto y establecer opción de edición como eliminar fuentes no usadas
    TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(
            new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts));

    // Aceptar el absorbedor para todas las páginas del documento
    pdfDocument.getPages().accept(textFragmentAbsorber);

    // recorrer todos los TextFragments
    TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();
    for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection)
    {
        String fontName = textFragment.getTextState().getFont().getFontName();
        // si el nombre de la fuente es ArialMT, reemplazar el nombre de la fuente con Arial
        if (fontName.equals("ArialMT")) {
            textFragment.getTextState().setFont(FontRepository.findFont("Arial"));
        }
    }

    // Guardar el archivo PDF actualizado
    pdfDocument.save(_dataDir + "Updated_Text.pdf");
}

Usar Fuente No Inglesa (Japonesa) Al Reemplazar Texto

El siguiente fragmento de código muestra cómo reemplazar texto con caracteres japoneses. Tenga en cuenta que para agregar texto japonés, necesita usar una fuente que soporte caracteres japoneses (por ejemplo, MSGothic).

public static void UseNonEnglishFontWhenReplacingText() {

    // Instanciar objeto Documento
    Document pdfDocument = new Document(_dataDir + "sample.pdf");

    // Vamos a cambiar cada palabra "page" por algún texto en japonés con una fuente específica
    // TakaoMincho que podría estar instalada en el SO
    // Además, puede ser otra fuente que soporte ideogramas
    TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("page");

    // Crear instancia de opciones de búsqueda de texto
    TextSearchOptions searchOptions = new TextSearchOptions(true);
    textFragmentAbsorber.setTextSearchOptions(searchOptions);

    // Aceptar el absorbedor para todas las páginas del documento
    pdfDocument.getPages().accept(textFragmentAbsorber);

    // Obtener los fragmentos de texto extraídos en una colección
    TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();
    
    // Recorrer los fragmentos
    for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection) {
        // Actualizar texto y otras propiedades
        textFragment.setText("ファイル");
        textFragment.getTextState().setFont(FontRepository.findFont("MSGothic"));
        textFragment.getTextState().setFontSize(12);
        textFragment.getTextState().setForegroundColor(Color.getBlue());
        textFragment.getTextState().setBackgroundColor(Color.getGray());
    }
    // Guardar el documento actualizado
    pdfDocument.save(_dataDir + "Japanese_Text.pdf");
}

El Reemplazo de Texto debería reordenar automáticamente los Contenidos de la Página

Aspose.PDF para Java admite la función de buscar y reemplazar texto dentro del archivo PDF. Sin embargo, recientemente algunos clientes encontraron problemas durante el reemplazo de texto cuando un TextFragment particular se reemplaza con contenidos más pequeños y se muestran algunos espacios adicionales en el PDF resultante o en caso de que el TextFragment se reemplace con una cadena más larga, entonces las palabras se superponen con los contenidos existentes de la página. Por lo tanto, se requería introducir un mecanismo que, una vez que el texto dentro de un documento PDF sea reemplazado, los contenidos deben ser reordenados.

Con el fin de abordar los escenarios mencionados, Aspose.PDF para Java ha sido mejorado para que no aparezcan tales problemas al reemplazar texto dentro del archivo PDF. El siguiente fragmento de código muestra cómo reemplazar texto dentro de un archivo PDF y los contenidos de la página deben ser reordenados automáticamente.

public static void RearrangeContent() {
    // Cargar archivo PDF de origen
    Document pdfDocument = new Document(_dataDir + "sample.pdf");

    // Crear objeto TextFragment Absorber con expresión regular
    TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("[PDF,Web]");

    TextSearchOptions textSearchOptions = new TextSearchOptions(true);
    textFragmentAbsorber.setTextSearchOptions(textSearchOptions);
    
    //También puede especificar la opción ReplaceAdjustment.WholeWordsHyphenation para ajustar el texto en la siguiente o actual línea 
    //si la línea actual se vuelve demasiado larga o corta después del reemplazo:
    //textFragmentAbsorber.getTextReplaceOptions().setReplaceAdjustmentAction(TextReplaceOptions.ReplaceAdjustment.WholeWordsHyphenation);

    // Aceptar el absorbedor para todas las páginas del documento
    pdfDocument.getPages().accept(textFragmentAbsorber);

    // Obtener los fragmentos de texto extraídos en la colección
    TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();

    // Reemplazar cada TextFragment
    for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection) {
        // Establecer la fuente del fragmento de texto que se está reemplazando
        textFragment.getTextState().setFont(FontRepository.findFont("Arial"));
        // Establecer tamaño de fuente
        textFragment.getTextState().setFontSize(10);
        textFragment.getTextState().setForegroundColor(Color.getBlue());
        textFragment.getTextState().setBackgroundColor(Color.getGray());
        // Reemplazar el texto con una cadena más grande que el marcador de posición
        textFragment.setText("Esta es una cadena más grande para la prueba de esta función");
    }
    // Guardar PDF resultante
    pdfDocument.save(_dataDir + "RearrangeContentsUsingTextReplacement_out.pdf");
}

Renderización de Símbolos Reemplazables durante la creación de PDF

Los símbolos reemplazables son símbolos especiales en una cadena de texto que pueden ser reemplazados con contenido correspondiente en tiempo de ejecución. Los símbolos reemplazables actualmente soportados por el nuevo Modelo de Objeto de Documento del espacio de nombres Aspose.PDF son $P, $p, \n, \r. El $p y $P se utilizan para manejar la numeración de páginas en tiempo de ejecución. $p se reemplaza con el número de la página donde la clase de Párrafo actual está. $P se reemplaza con el número total de páginas en el documento. Al agregar TextFragment a la colección de párrafos de documentos PDF, no soporta el salto de línea dentro del texto. Sin embargo, para agregar texto con un salto de línea, por favor use TextFragment con TextParagraph:

  • use “\r\n” o Environment.NewLine en TextFragment en lugar de un solo “\n”;
  • cree un objeto TextParagraph. Se añadirá texto con división de líneas;
  • añadir el TextFragment con TextParagraph.AppendLine;
  • añadir el TextParagraph con TextBuilder.AppendParagraph.
public static void RenderingReplaceableSymbols() {
    // cargar archivo PDF
    Document pdfDocument = new Document(_dataDir + "sample.pdf");
    Page page = pdfDocument.getPages().add();

    // Inicializar nuevo TextFragment con texto que contiene los marcadores de nueva línea requeridos
    TextFragment textFragment = new TextFragment("Applicant Name: " + System.lineSeparator() + " Joe Smoe");

    // Establecer propiedades del fragmento de texto si es necesario
    textFragment.getTextState().setFontSize(12);
    textFragment.getTextState().setFont(FontRepository.findFont("TimesNewRoman"));
    textFragment.getTextState().setBackgroundColor(Color.getLightGray());
    textFragment.getTextState().setForegroundColor(Color.getRed());

    // Crear objeto TextParagraph
    TextParagraph par = new TextParagraph();

    // Añadir nuevo TextFragment al párrafo
    par.appendLine(textFragment);

    // Establecer la posición del párrafo
    par.setPosition (new Position(100, 600));

    // Crear objeto TextBuilder
    TextBuilder textBuilder = new TextBuilder(page);
    // Añadir el TextParagraph usando TextBuilder
    textBuilder.appendParagraph(par);

    _dataDir = _dataDir + "RenderingReplaceableSymbols_out.pdf";
    pdfDocument.save(_dataDir);
}

Símbolos reemplazables en el área de Encabezado/Pie de página

Los símbolos reemplazables también se pueden colocar dentro de la sección de Encabezado/Pie de página de un archivo PDF. Por favor, revise el siguiente fragmento de código para obtener detalles sobre cómo agregar un símbolo reemplazable en la sección de pie de página.

public static void ReplaceableSymbolsInHeaderFooterArea() {
    Document doc = new Document();
    Page page = doc.getPages().add();

    MarginInfo marginInfo = new MarginInfo();
    marginInfo.setTop(90);
    marginInfo.setBottom(50);
    marginInfo.setLeft(50);
    marginInfo.setRight(50);

    // Asignar la instancia de marginInfo a la propiedad Margin de sec1.PageInfo
    page.getPageInfo().setMargin(marginInfo);

    HeaderFooter hfFirst = new HeaderFooter();
    page.setHeader(hfFirst);
    hfFirst.getMargin().setLeft(50);
    hfFirst.getMargin().setRight(50);

    // Instanciar un párrafo de texto que almacenará el contenido para mostrar como encabezado
    TextFragment t1 = new TextFragment("título del informe");
    t1.getTextState().setFont(FontRepository.findFont("Arial"));
    t1.getTextState().setFontSize(16);
    t1.getTextState().setForegroundColor(Color.getBlack());
    t1.getTextState().setFontStyle(FontStyles.Bold);
    t1.getTextState().setHorizontalAlignment(HorizontalAlignment.Center);
    t1.getTextState().setLineSpacing(5f);
    hfFirst.getParagraphs().add(t1);

    TextFragment t2 = new TextFragment("Nombre_Informe");
    t2.getTextState().setFont(FontRepository.findFont("Arial"));
    t2.getTextState().setForegroundColor(Color.getBlack());
    t2.getTextState().setHorizontalAlignment(HorizontalAlignment.Center);
    t2.getTextState().setLineSpacing(5f);
    t2.getTextState().setFontSize(12);
    hfFirst.getParagraphs().add(t2);

    // Crear un objeto HeaderFooter para la sección
    HeaderFooter hfFoot = new HeaderFooter();

    // Configurar el objeto HeaderFooter para pie de página par e impar
    page.setFooter(hfFoot);
    hfFoot.getMargin().setLeft(50);
    hfFoot.getMargin().setRight(50);

    // Agregar un párrafo de texto que contenga el número de página actual del total de páginas
    TextFragment t3 = new TextFragment("Generado en la fecha de prueba");
    TextFragment t4 = new TextFragment("nombre del informe ");
    TextFragment t5 = new TextFragment("Página $p de $P");

    // Instanciar un objeto de tabla
    Table tab2 = new Table();

    // Agregar la tabla en la colección de párrafos de la sección deseada
    hfFoot.getParagraphs().add(tab2);

    // Establecer anchos de columna de la tabla
    tab2.setColumnWidths("165 172 165");

    // Crear filas en la tabla y luego celdas en las filas
    Row row3 = tab2.getRows().add();

    row3.getCells().add();
    row3.getCells().add();
    row3.getCells().add();

    // Establecer la alineación vertical del texto como alineado al centro
    row3.getCells().get_Item(0).setAlignment(HorizontalAlignment.Left);
    row3.getCells().get_Item(1).setAlignment(HorizontalAlignment.Center);
    row3.getCells().get_Item(2).setAlignment(HorizontalAlignment.Right);

    row3.getCells().get_Item(0).getParagraphs().add(t3);
    row3.getCells().get_Item(1).getParagraphs().add(t4);
    row3.getCells().get_Item(2).getParagraphs().add(t5);

    Table table = new Table();

    table.setColumnWidths("33% 33% 34%");
    table.setDefaultCellPadding(new MarginInfo());
    table.getDefaultCellPadding().setTop(10);
    table.getDefaultCellPadding().setBottom(10);

    // Agregar la tabla en la colección de párrafos de la sección deseada
    page.getParagraphs().add(table);

    // Establecer borde de celda predeterminado usando un objeto BorderInfo
    table.setDefaultCellBorder(new BorderInfo(BorderSide.All, 0.1f));

    // Establecer borde de tabla usando otro objeto personalizado BorderInfo
    table.setBorder(new BorderInfo(BorderSide.All, 1f));

    table.setRepeatingRowsCount(1);

    // Crear filas en la tabla y luego celdas en las filas
    Row row1 = table.getRows().add();

    row1.getCells().add("col1");
    row1.getCells().add("col2");
    row1.getCells().add("col3");
    String CRLF = "\r\n";

    for (int i = 0; i <= 10; i++) {
        Row row = table.getRows().add();
        row.setRowBroken(true);
        for (int c = 0; c <= 2; c++) {
            Cell c1;
            if (c == 2)
                c1 = row.getCells().add(
                        "Aspose.Total for Java es una compilación de cada componente Java ofrecido por Aspose. Se compila en un"
                                + CRLF
                                + "base diaria para asegurar que contiene las versiones más actualizadas de cada uno de nuestros componentes Java. "
                                + CRLF
                                + "base diaria para asegurar que contiene las versiones más actualizadas de cada uno de nuestros componentes Java. "
                                + CRLF
                                + "Usando Aspose.Total para Java, los desarrolladores pueden crear una amplia gama de aplicaciones.");
            else
                c1 = row.getCells().add("elemento1" + c);
            c1.setMargin(new MarginInfo());
            c1.getMargin().setLeft(30);
            c1.getMargin().setTop(10);
            c1.getMargin().setBottom(10);
        }
    }

    _dataDir = _dataDir + "ReplaceableSymbolsInHeaderFooter_out.pdf";
    doc.save(_dataDir);
}

Eliminar Todo el Texto del Documento PDF

Eliminar Todo el Texto usando Operadores

En algunas operaciones de texto, necesitas eliminar todo el texto de un documento PDF y para eso, usualmente necesitas establecer el texto encontrado como un valor de cadena vacía. El punto es que cambiar el texto para una multitud de fragmentos de texto invoca una serie de operaciones de comprobación y ajuste de posición de texto. Son esenciales en los escenarios de edición de texto. La dificultad es que no puedes determinar cuántos fragmentos de texto serán eliminados en el escenario donde son procesados en un bucle.

Por lo tanto, recomendamos usar otro enfoque para el escenario de eliminar todo el texto de las páginas PDF. Por favor, considera el siguiente fragmento de código que funciona muy rápido.

public static void RemoveAllTextUsingOperators() {
    // Abrir documento
    Document pdfDocument = new Document(_dataDir + "sample.pdf");

    // Recorrer todas las páginas del Documento PDF
    for (int i = 1; i <= pdfDocument.getPages().size(); i++) {
        Page page = pdfDocument.getPages().get_Item(i);
        OperatorSelector operatorSelector = new OperatorSelector(new com.aspose.pdf.operators.TextShowOperator());
        // Seleccionar todo el texto en la página
        page.getContents().accept(operatorSelector);
        // Eliminar todo el texto
        page.getContents().delete(operatorSelector.getSelected());
    }
    // Guardar el documento
    pdfDocument.save(_dataDir + "RemoveAllText_out.pdf");
}