Impressora HP: Impressão extremamente lenta

Sintomas: Impressora não realiza a impressão (Linux) ou imprime de forma extremamente lenta, imprimindo 1 faixa de cada vez (uns 15 ou 20 segundos de intervalo entre uma impressão e outra – Linux e Windows 7).

Diagnóstico: Provavelmente um dos cartuchos está com problema. Remova 1 cartucho de cada vez, mande um documento para a fila de impressão e verifique se a impressão voltou ao normal. Se sim, o cartucho com defeito é o que foi retirado.

Plus: No Linux, baixe a ferramenta gerenciamento de impressão da HP e o driver hplip no site: http://hplipopensource.com/hplip-web/index.html

Postgres (Large Objects) + CodeIgniter (Image_Lib)

Estou no início do meu aprendizado com CodeIgniter e PostgreSQL e nesse pouco tempo não vi nenhuma referência à manipulação de blobs na documentação ou mesmo no código do framework. Para contornar o problema criei um helper para me auxiliar nessa tarefa. Utilizando as funções nativas do PHP em conjunto com o CodeIgniter, você pode manipular facilmente seus large objects. O único problema que tive foi com a image_lib usando gd2 e imagens geradas com pg_lo_read_all, sendo totalmente on the fly, isso ficará para um outro post.

Ok, vamos ao que interessa:

  • Exportando o large object – método 1
if ( ! function_exists('pgsql_lo_export')) {

	function pgsql_lo_export($id_object, $caminho_arquivo)
	{
		$CI =& get_instance();

		// Inicia a transação
		$CI->db->trans_start();

		// Exporta o arquivo
		$retorno = pg_lo_export($id_object, $caminho_arquivo);

		// Encerra a transação
		$CI->db->trans_complete();

		return $retorno;
	}
}

linha 5: Recupera a instância do CodeIgniter, sem isso não é possível usar as bibliotecas.

linha 8 e 14: Todas as funções de manipulação dos large objects devem estar dentro de uma transação e também precisam de um resource para a conexão. Essas linhas resolvem os dois problemas, engloba a chamada da função em uma transação e também cria uma conexão padrão. Não entendeu? clique aqui.

linha 11: Faz a mágica da exportação

  • Exibir a imagem – método 1
// Método do controller
public function thumbnail($oid)
{
	// define os diretórios
	$diretorio_saida = str_replace(SELF,'',APPPATH)."uploads/";
	$arquivo_saida = tempnam($diretorio_saida,'fa_');

	// Exporta o large object
	pgsql_lo_export($oid, $arquivo_saida);

	$config['image_library'] = 'gd2';
	$config['source_image'] = $arquivo_saida;
	$config['dynamic_output'] = TRUE;
	$config['create_thumb'] = TRUE;
	$config['maintain_ratio'] = TRUE;
	$config['width'] = 160;
	$config['height'] = 120;

	// Carrega a image_lib
	$this->load->library('image_lib', $config);

	// Tenta redimensionar a imagem
	if ( ! $this->image_lib->resize())
	{
		echo $this->image_lib->display_errors();
	}

	// Apaga o arquivo temporário
	unlink($arquivo_saida);
}

linha 5 e 6: Define onde gerar os arquivos temporários. Atenção para a linha 6 que usa a função tempnam, essa função cria um arquivo temporário com nome único. Vai ser útil para evitar problemas com nomes de arquivos

linha 9: Exporta o blob para o arquivo temporário usando a função criada anteriormente

linha 13 e 14: A opção dynamic_output indica que a imagem não será salva no disco (on the fly) e create_thumb que o arquivo original não será modificado

linha 23: Redimensiona nossa imagem

linha 29: Apaga nosso arquivo temporário

  • Exibir a imagem – método 2 (sem churumelas)
if ( ! function_exists('pgsql_lo_read_all')) {

	function pgsql_lo_read_all($id_objeto)
	{

		$CI =& get_instance();

		// Inicia a transação
		$CI->db->trans_start();

		// Abre o OID para leitura e envia para o browser
		$hnd = pg_lo_open($id_objeto, "r");
		pg_lo_read_all($hnd);
		pg_lo_close($hnd);

		// Encerra a transação
		$CI->db->trans_complete();

	}
}

Essa função é bem parecida com a primeira função, a diferença é que ela não exporta o binário para um arquivo no disco, o conteúdo é enviado diretamente para o browser usando pg_lo_read_all.

É isso ai, chega de programar … agora é a vez da cremosa gelada. Boas festas e até o próximo post.