converta o volume de arquivos de texto para pdf com nomenclatura baseada no arquivo de cabeçalho

4

Saber que "Como converter de texto em .pdf" já está bem respondido aqui link e aqui link Estou à procura de algo mais específico:

Usando o Claws-Mail [ site ] e um plug-in [ RSSyl ] para ler feeds RSS Eu coletei muitos arquivos de texto. Eu quero converter em arquivos .pdf.

Problema : Os arquivos dentro das pastas são numerados [1, 2,…, 456]. Cada feed tem sua própria pasta, mas por dentro eu tenho 'apenas' arquivos numerados. Todo arquivo contém um cabeçalho [seguido pelo conteúdo da mensagem]:

Date: Tue,  5 Feb 2013 19:59:53 GMT
From: N/A
Subject: Civilized Discourse Construction Kit
X-RSSyl-URL: http://www.codinghorror.com/blog/2013/02/civilized-discourse-construction-kit.html
Message-ID: <http://www.codinghorror.com/blog/2013/02/civilized-discourse-construction-kit.html>
Content-Type: text/html; charset=UTF-8

<html><head><meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<base href="http://www.codinghorror.com/blog/2013/02/civilized-discourse-construction-kit.html">
</head><body>
<p>URL: <a href="http://www.codinghorror.com/blog/2013/02/civilized-discourse-construction-kit.html">http://www.codinghorror.com/blog/2013/02/civilized-discourse-construction-kit.html</a></p>
<br>
<!-- RSSyl text start -->

Pergunta : Uma maneira de converter cada arquivo em um arquivo .pdf e renomeá-lo, com base no nome dado em Assunto . Super-incrível seria converter e renomear dessa maneira:

"folder.name"_"date"_"file name" com cada informação retirada dos dados do cabeçalho. Como existem algumas centenas de arquivos, estou procurando uma maneira de processamento em lote.

Os arquivos são html formatados, mas sem um sufixo .htm[l] .

    
por erch 23.06.2013 / 13:08

2 respostas

2

Se você tem uma árvore de arquivos relativamente simples, onde você tem apenas um nível de diretórios, e onde cada diretório contém uma lista de arquivos, mas não há sub-diretórios, você deve ser capaz de fazer algo assim (você pode colar diretamente no seu terminal e tecle Enter ):

for dir in *; do    ## For each directory
 if [ "$(ls -A "$dir")" ]; then  ## If the dir is not empty
   for file in "$dir"/*; do      ## For each file in $dir
    i=0;                         ## initialize a counter
    ## Get the subject
    sub=$(grep ^Subject: "$file" | cut -d ':' -f 2-);
    ## get the date, and format it to MMDDYY_Hour:Min:Sec
    date=$(date -d "$(grep ^Date: $file | cut -d ':' -f 2-)" +%m%d%y_%H:%M:%S);
    ## the pdf's name will be <directory's name> _ <date> _ <subject>
    name="$dir"_"$date"_"$sub";
    ## if a file of this name exists
    while [ -e "$dir/$name".pdf ]; do
      let i++;                       ## increment the counter
      name="$dir"_"$date"_"$sub"$i;  ## append it to the pdf's name
    done;
    wkhtmltopdf "$file" "$dir"/"$name".pdf; ## convert html to pdf
  done
 fi
done

NOTAS

  • Esta solução requer wkhtmltopdf :

    Simple shell utility to convert html to pdf using the webkit rendering engine, and qt.

    Em sistemas baseados em Debian, você pode instalá-lo com

    sudo apt-get install wkhtmltopdf
    
  • Assume-se que não há nenhum arquivo no diretório de nível superior e apenas os arquivos html desejados em todos os subdiretórios.

  • Ele pode lidar com nomes de arquivos e diretórios que contenham espaços, novas linhas e outros caracteres não ortodoxos.

  • Dado um arquivo dir1/foo com o conteúdo do exemplo que você publicou, ele criará um arquivo chamado dir1/dir1_020513_20:59:53_Civilized Discourse Construction Kit10.pdf

por 24.06.2013 / 04:16
0

Você sempre pode usar o título da página para a convenção de nomes, por isso deve ser exclusivo.

Dado o arquivo com a lista de endereços, aqui está o one-liner:

while read url; do wkhtmltopdf $url "$(curl -s $url | grep -o "<title>[^<]*" | tail -c+8).pdf"; done < urls.lst

onde urls.lst é seu arquivo com lista de URLs.

    
por 13.05.2015 / 16:28