Converter UTF-8 em ISO-8859-1

Iniciado por Mythus, 04 de Setembro de 2007, 16:15

tópico anterior - próximo tópico

Mythus

Estava respondendo o tópico Tungsten E2, e lembrei como tenho sido ignorante fazendo a mesma tarefa centenas de vezes. Daí pensei em criar um script para me ajudar. Eis o problema: Converter um arquivo PDF em HTML charset ISO-8859-1

Os passos manuais são:

$ pdftohtml arquivo.pdf

Nisso ele vai gerar 3 arquivos:
arquivo.html que contém um html com dois frames para serem carregados
arquivo_ind.html que contém o conteúdo do frame esquerdo, o índice das páginas
arquivos.html que contém o conteúdo do frame direito, o texto em si

$ rm arquivo.html arquivo_ind.html

$ iconv arquivos.html -f utf8 -t iso8859-1

Ele vai abrir aparecer o arquivo.html e jogar na tela de saída, e, como sempre tem alguns caracteres à corrigir (" por "; " por "; – por --; ° por º; etc). Sempre que encontra algum desses caracteres aparece a seguinte mensagem:
DAS SESS�ES PREPARATiconv: sequência de entrada ilegal na posição 4813

Eu tenho que abrir uma sessão do vim, descobrir qual é o caractere, substitui-lo por outro(s), salvar (não preciso fechar, porque sei que vou usar de novo) e repito o comando iconv.

Depois de vários loops, finalmente o iconv passa todo o arquivo até o fim, sem erros.

Fecho o vim.

$ iconv arquivos.html -f utf8 -t iso8859-1 > arquivo-pronto.html

$ rm arquivos.html

O que eu queria era que o script pudesse me perguntar qual(is) o(s) caracteres que devem substituir o caractere que provocou a mensagem de erro. E, se fosse possível, ele já iria aprendendo quais os caracteres deveriam ser sempre substituídos.

O que há de chato:
1) Veja o exemplo: convocação
Em UTF-8 lida como se ISO-8859-1 fosse: convocação
Em ISO-8859-1 como se UTF-8 fosse: convoca��o
Eu tenho as vezes que ver o contexto para saber o que está dando problema para fazer a devida substituição.

2) Marcadores
  • ou qualquer outro são lidos no UTF-8, mas às vezes tenho que descobrir qual sinal deverá substituir e não dar problema (+; *; #; etc)

Eu até posso usar uma seqüência de sed nos caracteres que eu já sei que dão problemas
sed s/caractere utf/caractere iso/g arquivos.html > arquivos.html
mas não consigo prever todos os casos.

Agradeço desde já a ajuda.
Abraços,
_________________
Não é programador, não é hacker. Formado em Direito pela UFPb. Usuário de Linux em tempo integral: Linux User Number: 174012.

Mythus

Eis a versão 0.0.0.1

#!/bin/sh
#
# utf2iso.sh -- Scritp para conversão de PDF para HTML ISO-8859-1
#
# Dependências:
# pdftohtml
# sed
# basename
# grep
# iconv
# Uso: ./utf2iso.sh arquivo
#
# Elaborado por Mythus em 05/09/2007.

pdftohtml $1 > /dev/null
#aspas
sed s/[""]/\"/g `basename $1 .pdf`s.html > `basename $1 .pdf`.html
#travessões
sed s/–/\-\-/g `basename $1 .pdf`.html > `basename $1 .pdf`s.html
#aspas simples
sed s/['']/\'/g `basename $1 .pdf`s.html > `basename $1 .pdf`.html
grep -v `basename $1 .pdf`s.html\# `basename $1 .pdf`.html > `basename $1 .pdf`s.html
grep -v \<hr\> `basename $1 .pdf`s.html > `basename $1 .pdf`.html
grep -v \<A\ name=\"outline\"\> `basename $1 .pdf`.html > `basename $1 .pdf`s.html
iconv -f UTF-8 -t ISO-8859-1 `basename $1 .pdf`s.html > `basename $1 .pdf`.html
rm  `basename $1 .pdf`s.html `basename $1 .pdf`_ind.html


Se aparecer "iconv: sequência de entrada ilegal na posição 123456789"  significa que eu esqueci de prever a substituição do caractere que está na posição 123456789.
Abraços,
_________________
Não é programador, não é hacker. Formado em Direito pela UFPb. Usuário de Linux em tempo integral: Linux User Number: 174012.

Mythus

O script já foi bastante testado e o resultado é esse:

#!/bin/sh
#
# utf2iso.sh -- Scritp para conversão de PDF para HTML ISO-8859-1
#
# Dependências:
#       pdftohtml
#       sed
#       basename
#       grep
#       iconv
# Uso: ./utf2iso.sh arquivo
#
# Elaborado por Mythus em 05/09/2007

pdftohtml $1 > /dev/null
sed s/[""]/\"/g `basename $1 .pdf`s.html > `basename $1 .pdf`.html
sed s/[–—]/\-\-/g `basename $1 .pdf`.html > `basename $1 .pdf`s.html
sed s/['']/\'/g `basename $1 .pdf`s.html > `basename $1 .pdf`.html
sed s/●/\*/g  `basename $1 .pdf`.html > `basename $1 .pdf`s.html
sed s/•/+/g  `basename $1 .pdf`s.html > `basename $1 .pdf`.html
sed s/º/º/g  `basename $1 .pdf`.html > `basename $1 .pdf`s.html
sed s/→/\-\-\>/g  `basename $1 .pdf`s.html > `basename $1 .pdf`.html
sed s/.../\.\.\./g  `basename $1 .pdf`.html > `basename $1 .pdf`s.html
sed s/\ -\ /\ \-\-\ /g  `basename $1 .pdf`s.html > `basename $1 .pdf`.html
grep -v `basename $1 .pdf`s.html\# `basename $1 .pdf`.html > `basename $1 .pdf`s.html
grep -v \<hr\> `basename $1 .pdf`s.html > `basename $1 .pdf`.html
grep -v \<A\ name=\"outline\"\> `basename $1 .pdf`.html > `basename $1 .pdf`s.html
iconv -f UTF-8 -t ISO-8859-1 `basename $1 .pdf`s.html > `basename $1 .pdf`.html
rm  `basename $1 .pdf`s.html `basename $1 .pdf`_ind.html


Bugs conhecidos:
1) Tabelas não são convertidas de maneira apropriada pelo pdftohtml, as linhas ficam uma embaixo da outra.
Se tiver uma tabela 2x2
11 12
21 22
é impressa assim:
11
12
21
22

2) Texto em colunas também não tem um resultado muito agradável, as linhas de cada coluna fica alternando.
Se tiver duas colunas:
Coluna1 Colu- Coluna2 Colu-
na1 Coluna1. na2 Coluna2.
é impressa assim:
Coluna1 Colu-
Coluna2 Colu-
na1 Coluna1.
na2 Coluna2.

3) Arquivos com extenção em CapsLock não funcionam 100% (preguiça de consertar agora)

4) Arquivos com expaço não funcionam.

O que seria interessante fazer (além de corrigir bugs):
1) Fazer com que o programa "aprenda" à medida que for usado e encontrar um obstáculo para o iconv. Algo do tipo:
"O caractere  em 'Fazenda Nacional  2006)' não tem correlado para ISO-8859-1, deseja substitui-lo por quais caracteres?"
Minha resposta poderia ser desde "" (nada) à " -- " (espaços e hífens)

2) Contar uma piada legal ;D
Abraços,
_________________
Não é programador, não é hacker. Formado em Direito pela UFPb. Usuário de Linux em tempo integral: Linux User Number: 174012.

Mythus

Já faz muito tempo que isso está pronto e, na verdade, uma vez ou outra acabava tendo que acrescentar uma linha para mudar um ou outro caractere, o resultado atual é:

Lido no gedit:
#!/bin/sh
#
# utf2iso.sh -- Scritp para conversão de PDF para HTML ISO-8859-1
#
# Dependências:
# pdftohtml
# sed
# basename
# grep
# iconv
# Uso: ./utf2iso.sh arquivo
#
# Elaborado por Mythus em 05/09/2007

pdftohtml $1 > /dev/null
sed s//fi/g `basename $1 .pdf`s.html > `basename $1 .pdf`.html
sed s//fl/g `basename $1 .pdf`.html > `basename $1 .pdf`s.html
sed s/[""]/\"/g `basename $1 .pdf`s.html > `basename $1 .pdf`.html
sed s/[–—]/\-\-/g `basename $1 .pdf`.html > `basename $1 .pdf`s.html
sed s/['']/\'/g `basename $1 .pdf`s.html > `basename $1 .pdf`.html
sed s/●/\*/g  `basename $1 .pdf`.html > `basename $1 .pdf`s.html
sed s/•/+/g  `basename $1 .pdf`s.html > `basename $1 .pdf`.html
sed s/º/º/g  `basename $1 .pdf`.html > `basename $1 .pdf`s.html
sed s/→/\-\-\>/g  `basename $1 .pdf`s.html > `basename $1 .pdf`.html
sed s/.../\.\.\./g  `basename $1 .pdf`.html > `basename $1 .pdf`s.html
sed s/\ -\ /\ \-\-\ /g  `basename $1 .pdf`s.html > `basename $1 .pdf`.html
#cp `basename $1 .pdf`s.html `basename $1 .pdf`.html
grep -v `basename $1 .pdf`s.html\# `basename $1 .pdf`.html > `basename $1 .pdf`s.html
grep -v \<hr\> `basename $1 .pdf`s.html > `basename $1 .pdf`.html
grep -v \<A\ name=\"outline\"\> `basename $1 .pdf`.html > `basename $1 .pdf`s.html
iconv -f UTF-8 -t ISO-8859-1 `basename $1 .pdf`s.html > `basename $1 .pdf`.html
rm  `basename $1 .pdf`s.html `basename $1 .pdf`_ind.html
fortune


Lido no vim:
#!/bin/sh
#
# utf2iso.sh -- Scritp para conversão de PDF para HTML ISO-8859-1
#
# Dependências:
#       pdftohtml
#       sed
#       basename
#       grep
#       iconv
# Uso: ./utf2iso.sh arquivo
#
# Elaborado por Mythus em 05/09/2007

pdftohtml $1 > /dev/null
sed s/^\/fi/g `basename $1 .pdf`s.html > `basename $1 .pdf`.html
sed s/^]/fl/g `basename $1 .pdf`.html > `basename $1 .pdf`s.html
sed s/[""^P^Q]/\"/g `basename $1 .pdf`s.html > `basename $1 .pdf`.html
sed s/[–—^U]/\-\-/g `basename $1 .pdf`.html > `basename $1 .pdf`s.html
sed s/['']/\'/g `basename $1 .pdf`s.html > `basename $1 .pdf`.html
sed s/●/\*/g  `basename $1 .pdf`.html > `basename $1 .pdf`s.html
sed s/•/+/g  `basename $1 .pdf`s.html > `basename $1 .pdf`.html
sed s/º/º/g  `basename $1 .pdf`.html > `basename $1 .pdf`s.html
sed s/→/\-\-\>/g  `basename $1 .pdf`s.html > `basename $1 .pdf`.html
sed s/.../\.\.\./g  `basename $1 .pdf`.html > `basename $1 .pdf`s.html
sed s/\ -\ /\ \-\-\ /g  `basename $1 .pdf`s.html > `basename $1 .pdf`.html
#cp `basename $1 .pdf`s.html `basename $1 .pdf`.html
grep -v `basename $1 .pdf`s.html\# `basename $1 .pdf`.html > `basename $1 .pdf`s.html
grep -v \<hr\> `basename $1 .pdf`s.html > `basename $1 .pdf`.html
grep -v \<A\ name=\"outline\"\> `basename $1 .pdf`.html > `basename $1 .pdf`s.html
iconv -f UTF-8 -t ISO-8859-1 `basename $1 .pdf`s.html > `basename $1 .pdf`.html
rm  `basename $1 .pdf`s.html `basename $1 .pdf`_ind.html
fortune


A verdade é que isso aí me satisfaz e nem mexi muito mais nele. O #cp (cp comentado) é uma gambiarra para não ter que modificar a seqüência inferior quando eu não acrescentava um número par de linhas nas substituições acima dele.

É isso.
Abraços,
_________________
Não é programador, não é hacker. Formado em Direito pela UFPb. Usuário de Linux em tempo integral: Linux User Number: 174012.