Blog do foo bar

Dois dedos de prosa e programação

Arquivo para a tag “InDesign”

Indicando progresso de um script no InDesign

A API JavaScript para InDesign provê diversos objetos de controle (control objects, se você for procurar no JavaScript Tools Guide) para criação de formulários e interfaces de usuário.

Quando desenvolvo algum script que efetua operações por muito tempo, deixando o InDesign inacessível, acho de bom tom exibir algum indicador de progresso. Isso evita, por exemplo, que o usuário termine o software prematuramente, acreditando que o processamento travou a máquina.

Num projeto grande, o uso de barras de progresso vai ser comum. Para simplificar a criação e exibição dessa ferramenta, eu criei um objeto prototípico que demanda dois valores somente: até onde contar – end – e a mensagem a ser exibida – message.

A função é a showProgress(end, message). Para utilizá-la, você vai precisar instanciá-la da seguinte maneira (exemplo):


var progresso = new showProgress(50, 'Teste de progresso');

Para exibir e fazer a barrinha se mover é necessário invocar o método pump() do objeto:

progresso.pump()

Cada “bombeada” irá fazer o indicador de progresso se mover um certo percentual adequado ao número de itens a serem contados. Ou seja, se você tiver fornecido o valor quatro para o argumento end, cada pump() ira mover a barra em 25%.

Onde usar a bomba? Dentro de alguma estrutura de controle, a.k.a. for(...). Por exemplo,

for (var i = 0; i < 4; i++)
        progresso.pump();

Escrevi um scriptzinho pra demonstrar isso melhor e pra ser alterado à vontade. Para usá-lo, salve o código mais abaixo num arquivo com extensão .jsx, clique duas vezes e autorize a execução.

O código é esse aqui, ó:

#target 'indesign';
#targetengine 'progress';




progressTest();
function progressTest(){
	
	// VARIABLES
	var end = parseInt(Math.random() * 1000);
	var delay = parseInt(Math.random() * 50);
	var progress = new showProgress(end, 'Teste de progresso');
	
	
	alert('Teste de barra de progresso para InDesign\n\nNúmero (aleatório) de itens: ' + end + '\nDelay (aleatório) entre itens: ' + delay + ' milisec.\n\nDaniel Dutra\nblogdofoobar.wordpress.com');
	
	
	for(var i = 0; i < end; i++){
		progress.pump();
		$.sleep(delay);
	}
	
} // End UI progressTest_UI







/**
 * Show progress
 * @param end
 * @param message
 */
function showProgress(end, message){

	// METHODS
	showProgress.prototype.pump = pump;

	// DIALOG LAYOUT
	this.dlg = new Window('palette', String(message));{
		this.dlg.orientation = 'column';
		this.dlg.alignChildren = 'center';
		this.dlg.alignment = 'center';
	}

	// Extra methods
	this.close = this.dlg.close;

	// CONTROL OBJECTS
	this.dlg.progress = this.dlg.add('progressbar', undefined, 0, end);{
		this.dlg.progress.size = [200, 20];
	}
	this.dlg.status = this.dlg.add('statictext', undefined);{
		this.dlg.status.characters = 15;
	}

	this.dlg.center(); this.dlg.show();



	/**
	 * Increment dialog progress bar
	 * @return
	 */
	function pump(){

		// VARIABLES
		var currentValue = this.dlg.progress.value + 1;
		var currentProgress = (100 * currentValue) / end;

		if(currentValue < end){
			var text = 'Progresso: '+currentProgress.toFixed(1)+'%';
			this.dlg.status.text = text;
			this.dlg.progress.value = this.dlg.progress.value + 1;
		}

		else
			this.dlg.close();

	} // End function pump

} // End function showProgress

Scripts InDesign: executando um script dentro do outro

Novamente, um post nascido numa dúvida enviada para mim. A pergunta é a seguinte:

Como chamar um arquivo ou um script que está na mesma pasta do script ou documento ativo? Preciso fazer isso para não ter que declarar endereços diferentes entre pcs e macs.

Bom, a forma de chamar arquivos depende do tipo de arquivo a ser manipulado. Mas a referência a pastas no InDesign é platform independent, o que significa que a especificação de uma pasta não depende do sistema operacional utilizado. Só avacalha quando é necessário especificar uma unidade (tipo C:), porque eu acho que esse conceito não existe no Mac (que é um primo do Linux).

Mas vamos imaginar que o script-base (o que estiver rodando no momento) se chama main.jsx. Ele está em algum lugar, e a princípio não importa que lugar é esse. Ele está numa pasta chamada trabalho 1, e dentro dessa pasta tem uma outra, chamada subscripts, com scripts a serem eventualmente utilizados pelo script principal.

Deixa eu representar isso que deve ficar melhor:

    • trabalho 1
      • main.jsx
      • subscripts
        • colorir_camadas.jsx

Para chamar o script “colorir_camadas.jsx”, dentro da pasta “subscripts”, o código é o seguinte (uma das maneiras):

var script_colorir = File(‘./subscripts/colorir_camadas.jsx’);
script_colorir.open(‘r’);
eval(script_colorir.read());
script_colorir.close();

A função eval() lê uma string e, se possível, executa como JavaScript, ou lança um erro. O caminho para o arquivo colorir_camadas.jsx acima é um caminho relativo ao script atual. Você sabe o que são caminhos relativos e caminhos absolutos?

Bom, a outra forma é usar a cláusula include nos subscripts necessários, logo no início do arquivo main.jsx, da seguinte maneira:

#include ‘./subscripts/colorir_camada.jsx’;

A partir da linha seguinte no script, tudo o que existir no script colorir_camadas.jsx estará disponível no main.jsx, exatamente como uma cópia tivesse sido feita (CONTRL + C, CONTROL + V). Geralmente, essa forma de programação modular é mais recomendada do que usar a função eval().

Para mais detalhes sobre programação modular com JavaScript para InDesign, consulte a seção Preprocessor directives desse documento aqui, ó: Adobe JavaScript Tools Guide. Em inglês, sempre.

Scripts InDesign: obtendo a pasta do documento atual

Este post partiu de uma dúvida enviada para mim pelo Vinicius Amaral, lá da Imprensa Oficial de São Paulo.

A pergunta dele é mais ou menos a seguinte:

Gostaria de retornar o folder do meu arquivo de indesign ativo. Existe uma forma de retornar o caminho rapidamente? Tentei “Folder(activeDocument).parent” mas não funcionou.

A solução rápida para esse problema é a seguinte:
Document.filePath;

Mas pra isso funcionar, o arquivo já tem que ter sido salvo. Arquivos não-salvos não existem no sistema de arquivos, logo não tem uma propriedade filePath.

Se você quiser garantir que o valor retornado seja do tipo Folder, use um cast da seguinte maneira: Folder(Document.filePath)

Lembrando que esse objeto Document deve referenciar um document já existente, por exemplo, app.activeDocument ou (se você tiver vários documentos abertos), app.documents[index do documento].

Uma outra forma de obter a pasta onde o documento foi salvo é a seguinte: Document.fullName.parent

Crachá com código de barras no InDesign? Pergunte-me como!

Precisei gerar uns crachás e as ferramentas que eu encontrei pela internet não era boas ou não me davam a liberdade que eu precisava no layout gráfico da coisa toda. A parte complicada é botar o código de barras no layout, porque inserir dados variáveis usando o InDesign é fácil (tem esse post meu sobre isso).

O próximo passo então foi avaliar se com scripting eu poderia resolver esse problema. Eu tive que descobrir o seguinte:

  • Qual o tipo de código de barras utilizado pela catraca eletrônica?
  • Qual o tipo de dígito verificador o código de barras utiliza?
  • Como gerar o código de barras a partir de (por exemplo) um número

A primeira dúvida é (foi) simples de resolver: bastou ter acesso ao manual do fabricante da catraca. No caso, aqui em Belo Horizonte, o equipamento era da DIMEP. O código de barras é do tipo 2 por 5 intercalado, também conhecido pelos nomes 25 intercalado ou 25 interleaved.

Quanto ao dígito verificador, simples também, no manual constava a informação: módulo 11. Um artigo introdutório sobre o assunto, para quem quiser entender um pouco mais, é esse, da Wikipedia.

Eu quis que o fluxo de produção dos crachás não precisasse de treinamento do pessoal que me manda os dados a serem inseridos em cada crachá. Então o preenchimento do código de barras seria feito por mim. Mas qual a melhor forma?

Não quis que isso fosse feito abrindo-se uma planilha e realizando o cálculo lá dentro. Pensei, no início, em automatizar completamente o processo, então entraria de um lado o arquivo CSV com os dados, o InDesign sozinho já faria todo o tratamento, e do outro lado um arquivo PDF seria gerado, para impressão numa maquininha porreta que a gente tem aqui.

Implementei parcialmente esse fluxo todo. A parte principal é a geração do código de barras. O script vai mais abaixo (o WP não me deixa subir zip, ou eu ainda não descobri como…), use à vontade mas se te perguntarem quem fez, fala o meu nome, fala?

O manual do script – que eu chamei de 25i Besto –, é esse. É importante ler o manual primeiro, porque o script é bem simples e demanda um carinhozinho pra funcionar corretamente. O script tá aqui, ó: Quagga-e_1.0 (arquivo ZIP). Eventualmente esse link pode estar indisponível, aí vocês podem me pedir o script nos comentários.

Atualização: escrevi um outro script, que agora se chama Quagga.

Como importar PDF multi-página rapidinho no InDesign

Eu ainda tenho a impressão de que muita gente não conhece os recursos de script que o InDesign tem. E, mais ainda, acho que pouca gente já testou alguns dos scripts que vêm (de fábrica) no programa.

Eu particularmente uso muito um, chamado PlaceMultipagePDF.jsx. Ele faz exatamente o que o nome diz: importa um arquivo PDF com várias páginas para dentro de um documento do InDesign.

Sabe acessar os scripts disponíveis no InDesign? Eles ficam no painel de scripts:

Painel de Scripts do InDesign CS3

Se você não tiver esse painel disponível, para ativá-lo é assim:

Ativando o menu com funções de automação

Para usar qualquer um dos scripts, basta dar um duplo click em qualquer um dos arquivos.

Se você tentou achar qualquer coisa nesse painel e ficou meio perdido, uma explicação: o painel lista todos os scripts disponíveis para uso no InDesign. Existem scripts de usuário e os scripts da aplicação. É normal a pasta de scripts de usuário estar vazia, pois é necessário instalar manualmente alguma coisa. A pasta de scripts da aplicação já contém alguma coisa.

Painel de Scripts (detalhe)

Na pasta Samples já existem algumas amostras, de dois tipos: VB Script e JavaScript. São os mesmos scripts, só que em linguagens diferentes. Dê preferência para scripts em JavaScript, porque eles rodam em qualquer plataforma (MAC/Windows).

Eu não vou entrar em muitos detalhes neste post sobre o que são e como usar os scripts.  Se você quiser saber o que fazem os scripts disponíveis nesse painel, clique no item InDesign CS3 Sample Scripts Read Me.pdf com o botão direito e selecione a opção Reveal in Explorer. Você terá acesso a um arquivo PDF que explica o que cada script faz.

Importando PDF multi-página

Clique duas vezes no item PlaceMultipagePDF.jsx. Você será solicitado a selecionar um arquivo PDF. Em seguida, o InDesign irá perguntar em que documento importar o arquivo PDF, e a partir de qual página.

Se você já tiver criado um documento, o InDesign irá perguntar se você quer usá-lo como base ou se você prefere criar um novo arquivo. Se você solicitar a criação de um novo documento, o InDesign automagicamente irá criá-lo com o tamanho de página adequado ao arquivo PDF a ser importado.

Seleção de documento para importação de arquivo PDF

Depois é só aguardar o processo terminar. O progresso da operação será mostrado. A velocidade desse processo depende esssencialmente da velocidade da sua máquina.

Progresso da importação de um arquivo PDF

Eu uso muito esse recurso para, depois de importar o arquivo PDF, criar um booklet (livreto) com o InDesign, a fim de economizar papel (eu geralmente reduzo para formato A5) e poder mandar para encadernação com costura, que é muito mais durável.


Está precisando de um script? Procure a Brucutu Lógico (minha empresa) e podemos conversar melhor.

Navegação de Posts