Manipule o conteúdo de PDF com a nova API ONLYOFFICE PDF Editor
A ONLYOFFICE lançou recentemente uma nova API PDF, introduzindo suporte a macros no PDF. Com esses novos métodos, você pode interagir com documentos PDF por meio de programação — automatizando tarefas que, de outra forma, exigiriam trabalho manual. Nesta postagem do blog, exploraremos três macros práticas que demonstram o que você pode fazer com a nova API.

Novos métodos da API do PDF
Aqui está uma visão geral dos novos métodos utilizados em três exemplos de macro:
- GetPagesCount() — retorna o número total de páginas do documento PDF.
- GetPage(index) — recupera um objeto de página específico pelo seu índice, retornando um objeto ApiPage.
- GetAllAnnots() — retorna uma matriz com todos os objetos de anotação de uma determinada página.
- GetContents() — recupera o conteúdo de texto de uma anotação.
- GetAllDrawings() — retorna uma matriz com todos os objetos de desenho (formas, gráficos, imagens).
- SetPosition(x, y) — posiciona um objeto de desenho diretamente na página usando coordenadas absolutas.
- AddObject(object) — insere um objeto de desenho (figura, gráfico, imagem) em uma página específica
- Delete() — remove o objeto especificado do documento.
Esses métodos pertencem a classes ApiDocument, ApiPage, ApiBaseAnnotation, e ApiDrawing . Eles podem ser combinados com os métodos da API do Office já existentes, com os quais você talvez já esteja familiarizado.
Exemplo 1: Remover anotações por palavra-chave
Nossa primeira macro localiza e exclui todas as anotações que contenham uma palavra-chave específica. Vamos ver como funciona, passo a passo.
Configurando a palavra-chave e o documento
const KEYWORD = "example";
const doc = Api.GetDocument();
const pagesCount = doc.GetPagesCount();
let deletedCount = 0;
Primeiro, definimos a palavra-chave alvo — qualquer anotação cujo conteúdo inclua essa palavra será removida. Em seguida, recuperamos o documento atual e obtemos o número total de páginas com GetPagesCount(). A variável deletedCount vai registrar quantas anotações excluímos.
for (let i = 0; i < pagesCount; i++) {
const page = doc.GetPage(i);
const annots = page.GetAllAnnots();
if (!annots || annots.length === 0) continue;
Um loop “for” percorre todas as páginas. Para cada página, usamos GetPage() para obter o ApiPage objeto e GetAllAnnots() para recuperar todas as anotações dessa página. Se uma página não tiver anotações, a ignoramos e seguimos em frente.
Correspondência e exclusão de anotações
for (let j = annots.length - 1; j >= 0; j--) {
const annot = annots[j];
const contents = (annot.GetContents() || "").toLowerCase();
Dentro de cada página, percorremos as anotações na ordem inversa. É importante iterar de trás para frente porque excluir itens de uma matriz enquanto se avança pode causar deslocamentos nos índices e elementos pulados. Para cada anotação, extraímos seu texto usando GetContents() e convertê-lo para letras minúsculas para uma comparação que não diferencie maiúsculas de minúsculas.
if (contents.includes(KEYWORD.toLowerCase())) {
annot.Delete();
deletedCount++;
}
Se o texto da anotação incluir a palavra-chave alvo, chamamos Delete() para removê-lo do documento e aumentar o contador.
console.log("Deleted annotations containing keyword:", KEYWORD);
console.log("Total deleted:", deletedCount);
No final, a macro registra no console a palavra-chave pesquisada e o número total de anotações excluídas.
O código completo da macro:
(function () {
const KEYWORD = "example";
const doc = Api.GetDocument();
const pagesCount = doc.GetPagesCount();
let deletedCount = 0;
for (let i = 0; i < pagesCount; i++) {
const page = doc.GetPage(i);
const annots = page.GetAllAnnots();
if (!annots || annots.length === 0) continue;
for (let j = annots.length - 1; j >= 0; j--) {
const annot = annots[j];
const contents = (annot.GetContents() || "").toLowerCase();
if (contents.includes(KEYWORD.toLowerCase())) {
annot.Delete();
deletedCount++;
}
}
}
console.log("Deleted annotations containing keyword:", KEYWORD);
console.log("Total deleted:", deletedCount);
})();
Assim que a macro for executada, todas as anotações que contenham a palavra-chave especificada serão removidas do documento. Para selecionar uma palavra diferente, basta atualizar a variável KEYWORD no início do código.

Exemplo 2: Remover todos os desenhos
Esta macro analisa todas as páginas e exclui todos os objetos de desenho — ou apenas um tipo específico. Ela utiliza GetAllDrawings() para recuperar todos os elementos visuais em cada página, e GetClassType() para verificar o tipo antes de excluir.
A variável targetType na parte superior controla o que será removido. Defina-a como “all” para remover tudo, ou use “shape”, “image” ou “chart” para selecionar um tipo específico de desenho.
(function () {
const doc = Api.GetDocument();
const pagesCount = doc.GetPagesCount();
let totalDeleted = 0;
const targetType = "all";
for (let i = 0; i < pagesCount; i++) {
const page = doc.GetPage(i);
const drawings = page.GetAllDrawings();
for (let j = 0; j < drawings.length; j++) {
if (targetType === "all" || drawings[j].GetClassType() === targetType) {
drawings[j].Delete();
totalDeleted++;
}
}
}
console.log("Deleted " + totalDeleted + " drawing(s) from " + pagesCount + " page(s).");
})();
Seja para preparar um documento para impressão, remover diagramas desatualizados ou eliminar imagens antes da redistribuição — esta macro cuida de tudo. Ao ajustar a variável targetType, você pode alternar entre uma limpeza completa e uma limpeza seletiva sem precisar modificar nenhuma outra parte do código.

Exemplo 3: Adicionar uma marca d’água a todas as páginas
Nossa última macro cria uma marca d’água personalizável e a insere em todas as páginas do documento. Ela utiliza SetPosition() para posicionar a forma em coordenadas exatas na página e AddObject() para adicioná-lo a cada página.
Todas as propriedades principais são definidas como variáveis no início do código, facilitando o ajuste do texto, das cores, do tamanho da fonte, da posição e do ângulo de rotação da marca d’água.
(function () {
const doc = Api.GetDocument();
const pagesCount = doc.GetPagesCount();
const watermarkText = "DRAFT";
const bgColor = Api.CreateRGBColor(200, 200, 200);
const textColor = Api.CreateRGBColor(255, 255, 255);
const fontSize = 72;
const positionX = 1200000;
const positionY = 4000000;
const rotation = -45;
for (let i = 0; i < pagesCount; i++) {
const page = doc.GetPage(i);
const fill = Api.CreateSolidFill(bgColor);
const stroke = Api.CreateStroke(0, Api.CreateNoFill());
const watermark = Api.CreateShape("rect", 160 * 36000, 20 * 36000, fill, stroke);
watermark.SetPosition(positionX, positionY);
watermark.SetRotation(rotation);
const content = watermark.GetContent();
const para = content.GetElement(0);
para.SetJc("center");
const run = para.AddText(watermarkText);
run.SetFontSize(fontSize);
run.SetBold(true);
run.SetFill(Api.CreateSolidFill(textColor));
page.AddObject(watermark);
}
})();
A marca d’água é criada a partir de uma forma padrão com conteúdo de texto, oferecendo a você controle total sobre sua aparência — desde subtis legendas de fundo até carimbos em negrito que ocupam toda a página. Você também pode experimentar diferentes tamanhos de forma, estilos de fonte ou ângulos de rotação para encontrar o visual que melhor se adapta aos seus documentos.

Essas três macros são apenas um ponto de partida — a nova API de PDF abre muitas outras possibilidades para automatizar seus fluxos de trabalho com PDF. Você pode combinar esses métodos para criar macros mais avançadas, adaptadas às suas necessidades específicas. Explore a documentação da API e os exemplos de macros nos links abaixo para obter mais ideias. Se tiver alguma dúvida ou quiser compartilhar o que criou, sinta-se à vontade para entrar em contato conosco!
Crie sua conta gratuita no ONLYOFFICE
Visualize, edite e colabore em documentos, planilhas, slides, formulários e arquivos PDF online.


