Substituir Texto em PDF
Substituir Texto em todas as páginas de um documento PDF
Para substituir texto em todas as páginas de um documento PDF usando Aspose.PDF para Java:
-
Primeiro use TextFragmentAbsorber para encontrar a frase específica a ser substituída.
-
Em seguida, percorra todos os TextFragments para substituir o texto e alterar quaisquer outros atributos.
-
Por fim, salve o PDF de saída usando o método save da classe 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");
// Criar objeto TextAbsorber para encontrar todas as instâncias da frase de busca de entrada
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("Web");
// Aceitar o absorvedor para a primeira página do documento
pdfDocument.getPages().accept(textFragmentAbsorber);
// Obter os fragmentos de texto extraídos na coleção
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();
// Percorrer os fragmentos
for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection) {
// Atualizar texto e outras propriedades
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());
}
// Salvar o arquivo PDF atualizado
pdfDocument.save(_dataDir+"Updated_Text.pdf");
}
}
Substituir Texto em uma Região Específica da Página
Para substituir texto em uma região específica da página, primeiro precisamos instanciar o objeto TextFragmentAbsorber, especificar a região da página usando TextSearchOptions.setRectangle e então iterar por todos os TextFragments para substituir o texto. Uma vez que essas operações são concluídas, só precisamos salvar o PDF de saída usando o método save do objeto Document.
O trecho de código a seguir mostra como substituir texto em todas as páginas de um documento PDF.
public static void ReplaceTextInParticularRegion(){
// carregar arquivo PDF
Document pdfDocument = new Document(_dataDir+"sample.pdf");
// instanciar objeto TextFragment Absorber
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("PDF");
// buscar texto dentro dos limites da página
textFragmentAbsorber.getTextSearchOptions().setLimitToPageBounds(true);
// especificar a região da página para as Opções de Busca de Texto
textFragmentAbsorber.getTextSearchOptions().setRectangle(new Rectangle(100, 700, 400, 770));
// buscar texto na primeira página do arquivo PDF
pdfDocument.getPages().get_Item(1).accept(textFragmentAbsorber);
// iterar por cada TextFragment
for(TextFragment tf : textFragmentAbsorber.getTextFragments())
{
// substituir texto por "---"
tf.setText("---");
}
// Salvar o arquivo PDF atualizado
pdfDocument.save(_dataDir+"Updated_Text.pdf");
}
Substituir Texto com Base em uma Expressão Regular
Se você deseja substituir algumas frases com base em uma expressão regular, primeiro precisa encontrar todas as frases que correspondem a essa expressão regular específica usando o TextFragmentAbsorber. Você terá que passar a expressão regular como um parâmetro para o construtor do TextFragmentAbsorber. Você também precisa criar um objeto TextSearchOptions que especifique se a expressão regular está sendo usada ou não. Assim que obter as frases correspondentes em TextFragments, você precisará percorrer todas elas e atualizar conforme necessário. Por fim, você precisa salvar o PDF atualizado usando o método Save do objeto Document.
O snippet de código a seguir mostra como substituir texto com base em uma expressão regular.
public static void ReplaceTextWithRegularExpression() {
// carregar arquivo PDF
Document pdfDocument = new Document(_dataDir + "sample.pdf");
// Criar objeto TextAbsorber para encontrar todas as instâncias da frase de pesquisa de entrada
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("\\d{4}-\\d{4}");
// como 1999-2000
// Definir opção de pesquisa de texto para especificar o uso de expressão regular
TextSearchOptions textSearchOptions = new TextSearchOptions(true);
textFragmentAbsorber.setTextSearchOptions(textSearchOptions);
// Aceitar o absorvedor para a primeira página do documento
pdfDocument.getPages().accept(textFragmentAbsorber);
// Obter os fragmentos de texto extraídos na coleção
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();
// Percorrer os fragmentos
for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection) {
// Atualizar texto e outras propriedades
textFragment.setText("ABCD-EFGH");
textFragment.getTextState().setFont(FontRepository.findFont("Verdana"));
textFragment.getTextState().setFontSize(12);
textFragment.getTextState().setForegroundColor(Color.getBlue());
textFragment.getTextState().setBackgroundColor(Color.getGray());
}
// Salvar o arquivo PDF atualizado
pdfDocument.save(_dataDir + "Updated_Text.pdf");
}
Substituir fontes em arquivo PDF existente
O Aspose.PDF para Java suporta a capacidade de substituir texto em documento PDF. No entanto, às vezes é necessário apenas substituir a fonte que está sendo usada dentro do documento PDF. Assim, em vez de substituir o texto, apenas a fonte em uso é substituída. Uma das sobrecargas do construtor TextFragmentAbsorber aceita um objeto TextEditOptions como argumento e podemos usar o valor RemoveUnusedFonts da enumeração TextEditOptions.FontReplace para atender nossos requisitos.
O seguinte trecho de código mostra como substituir a fonte dentro do documento PDF.
public static void ReplaceFonts() {
// Instanciar objeto Documento
Document pdfDocument = new Document(_dataDir + "sample.pdf");
// Pesquisar fragmentos de texto e definir opção de edição como remover fontes não utilizadas
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber(
new TextEditOptions(TextEditOptions.FontReplace.RemoveUnusedFonts));
// Aceitar o absorvente para todas as páginas do documento
pdfDocument.getPages().accept(textFragmentAbsorber);
// percorrer todos os TextFragments
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();
for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection)
{
String fontName = textFragment.getTextState().getFont().getFontName();
// se o nome da fonte for ArialMT, substituir o nome da fonte por Arial
if (fontName.equals("ArialMT")) {
textFragment.getTextState().setFont(FontRepository.findFont("Arial"));
}
}
// Salvar o arquivo PDF atualizado
pdfDocument.save(_dataDir + "Updated_Text.pdf");
}
Use Non-English (Japanese) Font When Replacing Text
O seguinte trecho de código mostra como substituir texto por caracteres japoneses. Observe que, para adicionar texto em japonês, você precisa usar uma fonte que suporte caracteres japoneses (por exemplo, MSGothic).
public static void UseNonEnglishFontWhenReplacingText() {
// Instanciar objeto Document
Document pdfDocument = new Document(_dataDir + "sample.pdf");
// Vamos mudar cada palavra "page" para algum texto japonês com fonte específica
// TakaoMincho que pode estar instalada no sistema operacional
// Além disso, pode ser outra fonte que suporte hieróglifos
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("page");
// Criar instância de opções de pesquisa de texto
TextSearchOptions searchOptions = new TextSearchOptions(true);
textFragmentAbsorber.setTextSearchOptions(searchOptions);
// Aceitar o absorvedor para todas as páginas do documento
pdfDocument.getPages().accept(textFragmentAbsorber);
// Obter os fragmentos de texto extraídos na coleção
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();
// Percorrer os fragmentos
for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection) {
// Atualizar texto e outras propriedades
textFragment.setText("ファイル");
textFragment.getTextState().setFont(FontRepository.findFont("MSGothic"));
textFragment.getTextState().setFontSize(12);
textFragment.getTextState().setForegroundColor(Color.getBlue());
textFragment.getTextState().setBackgroundColor(Color.getGray());
}
// Salvar o documento atualizado
pdfDocument.save(_dataDir + "Japanese_Text.pdf");
}
A Substituição de Texto deve reorganizar automaticamente o Conteúdo da Página
O Aspose.PDF para Java suporta o recurso de buscar e substituir texto dentro do arquivo PDF. No entanto, recentemente, alguns clientes encontraram problemas durante a substituição de texto quando um determinado TextFragment é substituído por conteúdos menores e alguns espaços extras são exibidos no PDF resultante ou, caso o TextFragment seja substituído por uma string mais longa, as palavras se sobrepõem aos conteúdos existentes da página. Portanto, a exigência era introduzir um mecanismo para que, uma vez que o texto dentro de um documento PDF seja substituído, os conteúdos sejam reorganizados.
Para atender aos cenários mencionados acima, o Aspose.PDF para Java foi aprimorado para que tais problemas não apareçam ao substituir texto dentro do arquivo PDF. O trecho de código a seguir mostra como substituir texto dentro do arquivo PDF e o conteúdo da página deve ser reorganizado automaticamente.
public static void RearrangeContent() {
// Carregar arquivo PDF de origem
Document pdfDocument = new Document(_dataDir + "sample.pdf");
// Criar objeto TextFragment Absorber com expressão regular
TextFragmentAbsorber textFragmentAbsorber = new TextFragmentAbsorber("[PDF,Web]");
TextSearchOptions textSearchOptions = new TextSearchOptions(true);
textFragmentAbsorber.setTextSearchOptions(textSearchOptions);
// Você também pode especificar a opção ReplaceAdjustment.WholeWordsHyphenation para quebrar o texto na próxima ou atual linha
// se a linha atual se tornar muito longa ou curta após a substituição:
// textFragmentAbsorber.getTextReplaceOptions().setReplaceAdjustmentAction(TextReplaceOptions.ReplaceAdjustment.WholeWordsHyphenation);
// Aceitar o absorber para todas as páginas do documento
pdfDocument.getPages().accept(textFragmentAbsorber);
// Obter os fragmentos de texto extraídos na coleção
TextFragmentCollection textFragmentCollection = textFragmentAbsorber.getTextFragments();
// Substituir cada TextFragment
for (TextFragment textFragment : (Iterable<TextFragment>) textFragmentCollection) {
// Definir fonte do fragmento de texto sendo substituído
textFragment.getTextState().setFont(FontRepository.findFont("Arial"));
// Definir tamanho da fonte
textFragment.getTextState().setFontSize(10);
textFragment.getTextState().setForegroundColor(Color.getBlue());
textFragment.getTextState().setBackgroundColor(Color.getGray());
// Substituir o texto por uma string maior que o espaço reservado
textFragment.setText("Esta é uma string maior para o teste deste recurso");
}
// Salvar PDF resultante
pdfDocument.save(_dataDir + "RearrangeContentsUsingTextReplacement_out.pdf");
}
Renderização de Símbolos Substituíveis durante a criação de PDF
Símbolos substituíveis são símbolos especiais em uma string de texto que podem ser substituídos pelo conteúdo correspondente em tempo de execução. Os símbolos substituíveis atualmente suportados pelo novo Document Object Model do namespace Aspose.PDF são $P
, $p
, \n
, \r
. O $p
e $P
são usados para lidar com a numeração de páginas em tempo de execução. $p
é substituído pelo número da página onde a classe Paragraph atual está. $P
é substituído pelo número total de páginas no documento. Ao adicionar TextFragment à coleção de parágrafos dos documentos PDF, ele não suporta quebra de linha dentro do texto. No entanto, para adicionar texto com quebra de linha, por favor use TextFragment com TextParagraph:
- use “\r\n” ou Environment.NewLine em TextFragment em vez de um único “\n”;
- crie um objeto TextParagraph. Ele adicionará texto com divisão de linha;
- adicione o TextFragment com TextParagraph.AppendLine;
- adicione o TextParagraph com TextBuilder.AppendParagraph.
public static void RenderingReplaceableSymbols() {
// carregar arquivo PDF
Document pdfDocument = new Document(_dataDir + "sample.pdf");
Page page = pdfDocument.getPages().add();
// Inicializar novo TextFragment com texto contendo marcadores de nova linha necessários
TextFragment textFragment = new TextFragment("Nome do Candidato: " + System.lineSeparator() + " Joe Smoe");
// Definir propriedades do fragmento de texto, se necessário
textFragment.getTextState().setFontSize(12);
textFragment.getTextState().setFont(FontRepository.findFont("TimesNewRoman"));
textFragment.getTextState().setBackgroundColor(Color.getLightGray());
textFragment.getTextState().setForegroundColor(Color.getRed());
// Criar objeto TextParagraph
TextParagraph par = new TextParagraph();
// Adicionar novo TextFragment ao parágrafo
par.appendLine(textFragment);
// Definir posição do parágrafo
par.setPosition (new Position(100, 600));
// Criar objeto TextBuilder
TextBuilder textBuilder = new TextBuilder(page);
// Adicionar o TextParagraph usando TextBuilder
textBuilder.appendParagraph(par);
_dataDir = _dataDir + "RenderingReplaceableSymbols_out.pdf";
pdfDocument.save(_dataDir);
}
Símbolos substituíveis na área de Cabeçalho/Rodapé
Símbolos substituíveis também podem ser colocados na seção de Cabeçalho/Rodapé do arquivo PDF. Por favor, veja o trecho de código a seguir para detalhes sobre como adicionar um símbolo substituível na seção de rodapé.
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);
// Atribuir a instância de marginInfo à propriedade Margin de sec1.PageInfo
page.getPageInfo().setMargin(marginInfo);
HeaderFooter hfFirst = new HeaderFooter();
page.setHeader(hfFirst);
hfFirst.getMargin().setLeft(50);
hfFirst.getMargin().setRight(50);
// Instanciar um parágrafo de texto que armazenará o conteúdo a ser exibido como cabeçalho
TextFragment t1 = new TextFragment("título do relatório");
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("Nome_Relatório");
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);
// Criar um objeto HeaderFooter para a seção
HeaderFooter hfFoot = new HeaderFooter();
// Definir o objeto HeaderFooter para rodapé ímpar e par
page.setFooter(hfFoot);
hfFoot.getMargin().setLeft(50);
hfFoot.getMargin().setRight(50);
// Adicionar um parágrafo de texto contendo o número da página atual do número total de páginas
TextFragment t3 = new TextFragment("Gerado em data de teste");
TextFragment t4 = new TextFragment("nome do relatório ");
TextFragment t5 = new TextFragment("Página $p de $P");
// Instanciar um objeto de tabela
Table tab2 = new Table();
// Adicionar a tabela na coleção de parágrafos da seção desejada
hfFoot.getParagraphs().add(tab2);
// Definir a largura das colunas da tabela
tab2.setColumnWidths("165 172 165");
// Criar linhas na tabela e depois células nas linhas
Row row3 = tab2.getRows().add();
row3.getCells().add();
row3.getCells().add();
row3.getCells().add();
// Definir o alinhamento vertical do texto como centralizado
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);
// Adicionar a tabela na coleção de parágrafos da seção desejada
page.getParagraphs().add(table);
// Definir o contorno padrão das células usando o objeto BorderInfo
table.setDefaultCellBorder(new BorderInfo(BorderSide.All, 0.1f));
// Definir o contorno da tabela usando outro objeto BorderInfo personalizado
table.setBorder(new BorderInfo(BorderSide.All, 1f));
table.setRepeatingRowsCount(1);
// Criar linhas na tabela e depois células nas linhas
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 para Java é uma compilação de todos os componentes Java oferecidos pela Aspose. É compilado em uma"
+ CRLF
+ "base diária para garantir que contenha as versões mais atualizadas de cada um dos nossos componentes Java. "
+ CRLF
+ "base diária para garantir que contenha as versões mais atualizadas de cada um dos nossos componentes Java. "
+ CRLF
+ "Usando Aspose.Total para Java, os desenvolvedores podem criar uma ampla gama de aplicações.");
else
c1 = row.getCells().add("item1" + 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);
}
Remover Todo o Texto do Documento PDF
Remover Todo o Texto usando Operadores
Em algumas operações de texto, é necessário remover todo o texto de um documento PDF e, para isso, geralmente é preciso definir o texto encontrado como um valor de string vazio. O ponto é que alterar o texto para uma multitude de fragmentos de texto invoca uma série de operações de verificação e ajuste de posição do texto. Elas são essenciais nos cenários de edição de texto. A dificuldade é que você não pode determinar quantos fragmentos de texto serão removidos no cenário em que eles são processados em um loop.
Portanto, recomendamos usar outra abordagem para o cenário de remoção de todo o texto das páginas PDF. Por favor, considere o seguinte trecho de código que funciona muito rapidamente.
public static void RemoveAllTextUsingOperators() {
// Abrir documento
Document pdfDocument = new Document(_dataDir + "sample.pdf");
// Loop através de todas as páginas do 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());
// Selecionar todo o texto da página
page.getContents().accept(operatorSelector);
// Excluir todo o texto
page.getContents().delete(operatorSelector.getSelected());
}
// Salvar o documento
pdfDocument.save(_dataDir + "RemoveAllText_out.pdf");
}