Trabalhar com Ações de PDF em Python
Ações em um PDF são tarefas predefinidas que são acionadas por interação do usuário ou eventos do documento. Elas podem ser usadas para:
- Navegue até uma página específica ou um arquivo externo
- Abrir um link da web
- Reproduzir conteúdo multimídia
- Executar JavaScript
- Enviar ou redefinir um formulário
- Mostrar/ocultar campos
- Alterar nível de zoom ou modo de visualização
Quase todas as ações utilizam parâmetros integrados, mas há algumas que podem ser personalizadas. Por exemplo – Ações JavaScript.
Adicionar Ações de Lançamento de PDF
Adicione ações de lançamento baseadas em JavaScript a um documento PDF usando Python e Aspose.PDF. Ele atribui ações a eventos chave do documento, como abertura, salvamento e impressão, permitindo que URLs sejam abertas automaticamente quando esses eventos ocorrerem em visualizadores de PDF compatíveis.
import aspose.pdf as ap
from aspose.pycore import is_assignable
from aspose.pdf import Rectangle
from aspose.pdf.forms import ButtonField, CheckboxField
from aspose.pdf.annotations import (
NamedAction,
PredefinedAction,
HideAction,
SubmitFormAction,
)
from os import path
import sys
def add_launch_actions(infile, outfile):
"""Add JavaScript launch actions for document events.
Adds JavaScript actions that launch URLs when specific document events occur:
- On document open: launches http://localhost:3000/open
- Before saving: launches http://localhost:3000/save
- Before printing: launches http://localhost:3000/print
Args:
infile (str): Path to the input PDF file.
outfile (str): Path to save the output PDF with document actions.
Returns:
None
Example:
>>> add_launch_actions("sample_data/input/add_launch_actions_in.pdf", "sample_data/output/add_launch_actions_out.pdf")
Notes:
- Uses `ap.annotations.JavascriptAction` with `app.launchURL()`.
- URLs are opened in the default browser depending on viewer support.
"""
document = ap.Document(infile)
# Add JavaScript actions for document events
document.open_action = ap.annotations.JavascriptAction(
"app.launchURL('http://localhost:3000/open');"
)
document.actions.before_saving = ap.annotations.JavascriptAction(
"app.launchURL('http://localhost:3000/save');"
)
document.actions.before_printing = ap.annotations.JavascriptAction(
"app.launchURL('http://localhost:3000/print');"
)
document.save(outfile)
Removendo Ações do PDF Document
Para limpar (ou remover) ações, basta definir o manipulador para None.
import aspose.pdf as ap
from aspose.pycore import is_assignable
from aspose.pdf import Rectangle
from aspose.pdf.forms import ButtonField, CheckboxField
from aspose.pdf.annotations import (
NamedAction,
PredefinedAction,
HideAction,
SubmitFormAction,
)
from os import path
import sys
def remove_page_actions(infile, outfile):
document = ap.Document(infile)
if len(document.pages) < 3:
print("Error: The document does not have at least 3 pages.")
return
page = document.pages[3]
page.actions.remove_actions()
document.save(outfile)
Adicionando Ações à página no Documento PDF
Os gatilhos semelhantes são fornecidos para páginas: on_open, on_close.
import aspose.pdf as ap
from aspose.pycore import is_assignable
from aspose.pdf import Rectangle
from aspose.pdf.forms import ButtonField, CheckboxField
from aspose.pdf.annotations import (
NamedAction,
PredefinedAction,
HideAction,
SubmitFormAction,
)
from os import path
import sys
def add_page_actions(infile, outfile):
document = ap.Document(infile)
if len(document.pages) < 3:
print("Error: The document does not have at least 3 pages.")
return
page = document.pages[3]
# Add GoTo action on page open - navigate to top of page
action = ap.annotations.GoToAction(page)
action.destination = ap.annotations.XYZExplicitDestination(
page, 0, page.page_info.height, 1
)
page.actions.on_open = action
# Add JavaScript action on page close
page.actions.on_close = ap.annotations.JavascriptAction(
"app.launchURL('http://localhost:3000/page/3');"
)
document.save(outfile)
Ações em AcroForms
Usando ações de navegação
O padrão PDF prevê um determinado conjunto de ações nomeadas. O significado dessas ações é determinado pelo seu nome. No código a seguir, usaremos ações para navegações.
import aspose.pdf as ap
from aspose.pycore import is_assignable
from aspose.pdf import Rectangle
from aspose.pdf.forms import ButtonField, CheckboxField
from aspose.pdf.annotations import (
NamedAction,
PredefinedAction,
HideAction,
SubmitFormAction,
)
from os import path
import sys
def add_navigation_buttons(infile, outfile):
# Configuration for each navigation button
button_config = [
("First Page", 10.0, PredefinedAction.FIRST_PAGE, lambda p, t: p == 1),
("Previous Page", 120.0, PredefinedAction.PREV_PAGE, lambda p, t: p == 1),
("Next Page", 230.0, PredefinedAction.NEXT_PAGE, lambda p, t: p == t),
("Last Page", 340.0, PredefinedAction.LAST_PAGE, lambda p, t: p == t),
]
document = ap.Document(infile)
total_pages = len(document.pages)
# Add navigation buttons to each page
for page in document.pages:
for name, x_pos, action, is_readonly_fn in button_config:
# Create button rectangle
rect = Rectangle(x_pos, 10.0, x_pos + 100, 40.0, True)
button = ButtonField(page, rect)
button.partial_name = name
button.value = name
button.characteristics.border = ap.Color.red.to_rgb()
button.characteristics.background = ap.Color.orange.to_rgb()
# Disable button when not applicable
button.read_only = is_readonly_fn(page.number, total_pages)
button.actions.on_release_mouse_btn = NamedAction(action)
document.form.add(button)
document.save(outfile)
Este código adiciona botões de navegação a cada página de um documento PDF, facilitando para os usuários moverem‑se entre as páginas. Ele começa determinando os caminhos completos dos arquivos de entrada e saída usando um método auxiliar. A lista button_config define quatro tipos de botões de navegação —Primeira Página, Página Anterior, Próxima Página e Última Página— juntamente com suas posições horizontais, as ações de navegação predefinidas que eles acionam e uma função lambda que determina se cada botão deve ser somente leitura em uma determinada página (por exemplo, os botões “Primeira Página” e “Página Anterior” são somente leitura na primeira página).
O código então carrega o PDF e itera por cada página. Para cada página, ele percorre as configurações de botões, criando uma área retangular para cada botão e instanciando um ButtonField naquele local. Cada botão recebe um nome, seu status somente‑leitura é definido com base na página atual, e sua ação de clique é atribuída à ação de navegação correspondente. O botão é então adicionado aos campos de formulário do PDF.
Depois que todos os botões são adicionados a todas as páginas, o documento modificado é salvo. Se ocorrerem erros durante esse processo, eles são capturados e impressos. Essa abordagem garante que cada página tenha um conjunto consistente de controles de navegação, melhorando a usabilidade de PDFs de várias páginas. Uma sutileza é o uso da lambda is_readonly_fn para desativar os botões de navegação quando não fizer sentido (por exemplo, “Next Page” na última página), o que ajuda a prevenir a confusão do usuário.
Usando ações de impressão
Ao usar formulários PDF, frequentemente há a necessidade de imprimir esses documentos PDF. Essa ação pode ser realizada usando um leitor de PDF, mas às vezes é mais conveniente fazê‑la diretamente a partir do documento usando um botão especial.
Na verdade, este é mais um exemplo de como usar ações nomeadas. Nós usaremos PredefinedAction.FILE_PRINT (simulando o uso do item de menu File‑>Print), mas você também pode usar PredefinedAction.PRINT ou PredefinedAction.PRINT_DIALOG, dependendo dos seus próprios propósitos.
import aspose.pdf as ap
from aspose.pycore import is_assignable
from aspose.pdf import Rectangle
from aspose.pdf.forms import ButtonField, CheckboxField
from aspose.pdf.annotations import (
NamedAction,
PredefinedAction,
HideAction,
SubmitFormAction,
)
from os import path
import sys
def add_named_action_print(infile, outfile):
document = ap.Document(infile)
page = document.pages[1]
# Create print button with specific dimensions and position
rect = Rectangle(10, 10, 100, 40, True)
print_button = ButtonField(page, rect)
print_button.partial_name = "printButton"
print_button.value = "Print"
print_button.actions.on_release_mouse_btn = NamedAction(PredefinedAction.FILE_PRINT)
# Add border for better visibility
border = ap.annotations.Border(print_button)
border.width = 1
print_button.border = border
# Add button to the form on page 1
document.form.add(print_button, 1)
document.save(outfile)
Este trecho de código demonstra como adicionar um botão “Print” à primeira página de um documento PDF. Ele começa carregando o PDF a partir do caminho de arquivo de entrada especificado e selecionando a primeira página (document.pages[1]).
Uma área retangular é definida para a posição e tamanho do botão na página. Um ButtonField é então criado nessa localização, recebe o nome “printButton,” e seu valor de exibição é definido como “Print.” O botão é configurado para que, quando for clicado (especificamente, quando o botão do mouse for liberado), ele acione a ação predefinida “Print File,” solicitando ao visualizador de PDF que abra a caixa de diálogo de impressão.
Para melhorar a aparência do botão, cria-se uma borda e atribui‑se ao botão, definindo sua largura como 1 unidade. O botão é então adicionado aos campos de formulário do PDF na primeira página. Finalmente, o documento modificado é salvo no caminho do arquivo de saída. Essa abordagem oferece aos usuários uma maneira conveniente de imprimir o documento diretamente a partir do PDF. Observe que a eficácia desse recurso depende do suporte do visualizador de PDF a campos de formulário interativos e ações predefinidas.
Usando a ação Ocultar
import aspose.pdf as ap
from aspose.pycore import is_assignable
from aspose.pdf import Rectangle
from aspose.pdf.forms import ButtonField, CheckboxField
from aspose.pdf.annotations import (
NamedAction,
PredefinedAction,
HideAction,
SubmitFormAction,
)
from os import path
import sys
def add_named_action_hide(infile, outfile):
document = ap.Document(infile)
# Collect all checkbox fields in the document
checkboxes = [
field for field in document.form if is_assignable(field, CheckboxField)
]
# Create the hide button
rect = Rectangle(10, 410, 140, 440, True)
hide_button = ButtonField(document.pages[1], rect)
hide_button.partial_name = "HideButton"
hide_button.value = "Hide Checkboxes"
# Add HideAction to button - will hide all checkboxes when clicked
hide_button.actions.on_release_mouse_btn = HideAction(checkboxes, True)
# Add button to the form on page 1
document.form.add(hide_button, 1)
# Save the modified PDF
document.save(outfile)
Este trecho de código adiciona um botão à primeira página de um PDF que, ao ser clicado, oculta todos os campos de caixa de seleção no documento. Ele começa resolvendo os caminhos completos dos arquivos de entrada e saída usando um método auxiliar. O PDF é carregado, e todos os campos de caixa de seleção são coletados filtrando os campos de formulário por instâncias de ap.CheckboxField.
Uma área retangular é definida para a posição do novo botão próximo ao topo da página. Um ButtonField é criado neste local, chamado “HideButton”, e rotulado “Hide Checkboxes”. O botão está configurado de modo que, quando clicado (ao liberar o botão do mouse), ele aciona uma HideAction que oculta todas as caixas de seleção coletadas.
O botão é então adicionado aos campos de formulário na primeira página, e o PDF modificado é salvo no arquivo de saída. Se ocorrerem erros durante este processo, eles são capturados e exibidos. Esse recurso oferece aos usuários uma maneira de ocultar rapidamente todas as caixas de seleção no PDF, o que pode ser útil para personalizar a aparência ou o fluxo de trabalho do documento.
Aplicando Ação de Envio
import aspose.pdf as ap
from aspose.pycore import is_assignable
from aspose.pdf import Rectangle
from aspose.pdf.forms import ButtonField, CheckboxField
from aspose.pdf.annotations import (
NamedAction,
PredefinedAction,
HideAction,
SubmitFormAction,
)
from os import path
import sys
def add_submit_action(infile, outfile):
document = ap.Document(infile)
# Create the submit action
submit_action = SubmitFormAction()
submit_action.url = ap.FileSpecification("http://localhost:3000/submit")
submit_action.flags = (
SubmitFormAction.EXPORT_FORMAT | SubmitFormAction.SUBMIT_COORDINATES
)
# Create the submit button
rect = Rectangle(10, 10, 100, 40, True)
submit_button = ButtonField(document.pages[1], rect)
submit_button.partial_name = "SubmitButton"
submit_button.value = "Submit"
submit_button.actions.on_release_mouse_btn = submit_action
# Add the button to the form on page 1
document.form.add(submit_button, 1)
# Save the document
document.save(outfile)
Esta função adiciona um botão “Submit” à primeira página de um formulário PDF, permitindo que os usuários enviem os dados do formulário para um endpoint web especificado. Ela começa construindo os caminhos completos para os arquivos PDF de entrada e saída, depois carrega o PDF de entrada usando a biblioteca Aspose.PDF.
A SubmitFormAction é criado para definir o comportamento quando o botão é clicado. O URL da ação é definido usando um FileSpecification apontando para http://localhost:3000/submit, o que significa que os dados do formulário serão enviados para esta URL. A propriedade flags combina EXPORT_FORMAT e SUBMIT_COORDINATES, garantindo que os dados do formulário sejam exportados em um formato padrão e que as coordenadas do clique do botão sejam incluídas na submissão.
Uma área retangular é definida para a posição e o tamanho do botão na página. Um ButtonField é criado neste local na primeira página, com o nome “SubmitButton,” e seu valor de exibição é definido como “Submit.” A ação de envio é atribuída ao evento de liberação do mouse do botão, de modo que a ação é acionada quando o usuário clica no botão.
Por fim, o botão é adicionado aos campos de formulário na primeira página, e o PDF modificado é salvo no arquivo de saída. Se ocorrerem erros durante este processo, eles são capturados e impressos. Essa abordagem fornece uma maneira amigável ao usuário para que os usuários de PDF enviem os dados do formulário diretamente para um endpoint de servidor.