Como converter todos os arquivos SVG de uma pasta em PDF de uma vez

A versão simples:

Você precisa do Inkscape instalado.

Crie um arquivo powershell no Bloco de Notas com o seguinte conteúdo:

Get-ChildItem *.svg | ForEach-Object { & “C:\Program Files (x86)\Inkscape\bin\inkscape.exe” $_.FullName –export-filename “$($_.FullName -replace ‘\.svg$’, ‘.pdf’)” }

Edite o caminho indicado no arquivo para apontar para a sua cópia do inkscape. Geralmente você pode deixar assim mesmo.

Salve como “conv.ps1” na mesma pasta que os arquivos SVG.

Crie um arquivo “conv.bat” com o seguinte conteúdo:

powershell -executionpolicy bypass -File conv.ps1

e salve na mesma pasta.

Se Inkscape estiver em execução, feche.

Agora execute conv.bat. Se tudo correr bem os arquivos *.pdf vão aparecer silenciosamente na mesma pasta.

Eu me baseei na dica encontrada aqui .

Porém essa solução simples tem vários problemas que são resolvidos a seguir.

A versão complicada

Você precisa do Inkscape e do pdftk free instalados. Nesta versão do meu script você precisa copiar pdftk.exe para o diretório onde estiverem os seus arquivos SVG.

Crie um arquivo powershell no Bloco de Notas com o seguinte conteúdo:

OBS: Não sou proficiente em powershell e você vai encontrar meus vícios de outras linguagens no script.

$SVGCount = @( Get-ChildItem *.svg ).Count;
Write-Host 'Número de arquivos SVG para processar: ' $SVGCount


$PDFCount = @( Get-ChildItem *.pdf ).Count;
if ($PDFCOunt -gt 0) {


Write-Host 'Encontrei ' $PDFCount ' arquivos PDF na pasta.'

$ArquivosApagados=$false
$confirmation = Read-Host "Para apagar todos os arquivos PDF da pasta, tecle s, seguido de ENTER. 
Ou apenas ENTER para prosseguir sem apagar.";
if ($confirmation -eq 's') {
Write-Host 'Apagando os arquivos PDF';
$ArquivosApagados=$true
    Get-ChildItem *.pdf | ForEach-Object { $_.Delete()}
} 

}
else {$ArquivosApagados=$true}

Write-Host 'Convertendo todos os arquivos SVG da pasta para arquivos PDF.';
Write-Host 'Você pode interromper a qualquer momento com CTRL+C.';

#Sem uma pausa entre cada conversão o número de arquivos criados pelo Inkscape frequentemente é menor
#que o número de arquivos SVG. Com 100ms funciona na maioria das vezes para mim ao converter 25 arquivos
#simples em um Ryzen 5 5600G com 24GB de RAM, mas com 10ms ou menos os problemas acontecem.
#Eu não sei ainda a razão, mas eu imagino que se seus arquivos forem mais complexos ou em maior
#quantidade ou sua máquina for menos robusta você vai precisar aumentar essa pausa.
Get-ChildItem *.svg | ForEach-Object { & "C:\Program Files (x86)\Inkscape\bin\inkscape.exe" $_.FullName --export-filename "$($_.FullName -replace '\.svg$', '.pdf')" 
Start-Sleep -Milliseconds 100}

if($ArquivosApagados)
{

#O Inkscape é executado de forma assíncrona e quando chegamos a este ponto do script, 
#mesmo tendo 25 arquivos SVG na pasta, apenas 2 arquivos PDF foram gerados no meu PC.
#É preciso usar estratégias para esperar que o Inkscape termine  


Write-Host 'Esperando que a contagem de arquivos PDF chegue a ' $SVGCount;


$PDFCount = @( Get-ChildItem *.pdf ).Count;

while ($PDFCount –lt $SVGCount)
    {

      $i = @( Get-ChildItem *.pdf ).Count;

      #Método alternativo de contagem
      #$filepath = "."
      #$filetype = "*.pdf"
      #$i = [System.IO.Directory]::GetFiles("$filepath", "$filetype").Count

      #Sem fazer essa checagem, vou escrever centenas de vezes a mesma contagem na tela
      if ($i -gt $PDFCount){
      $PDFCount=$i
      Write-Host 'Número de arquivos PDF: ' $PDFCount;
      } 


     }

    
}
else
{   #Se os arquivos PDF não foram apagados no início do script eu não tenho como me basear
    #em contagem de arquivos para saber se inkscape acabou. Então eu arbitro uma pausa.
    #Você pode ter que aumentar essa pausa para atender ao seu caso.
    Write-Host 'Aguardando 5 segundos para dar tempo ao Inkscape antes de tentar combinar os arquivos...';
    Start-Sleep -Seconds 5
    $PDFCount = @( Get-ChildItem *.pdf).Count;
    Write-Host 'Número de arquivos PDF: ' $PDFCount;
}

$NomeArquivoCombinado = "multipaginas.pdf"

#pdftk aborta a execução se encontrar o resultado de uma execução prévia. E isso
#vai acontecer se você tiver optado por não apagar os arquivos PDF lá no ínicio
if (Test-Path $NomeArquivoCombinado) {
    Remove-Item $NomeArquivoCombinado -Force
}

#O fato do número de arquivos PDF ser o esperado não significa que o inkscape terminou
#de escrever o último deles. pdftk vai acusar erro e abortar se um dos arquivos PD
#ainda estiver em uso. Uma pequena pausa pode ser necessária.
Start-Sleep -Milliseconds 100

pdftk *.pdf cat output $NomeArquivoCombinado
Write-Host 'Terminado. Pressione qualquer tecla para sair...';
$null = $Host.UI.RawUI.ReadKey('NoEcho,IncludeKeyDown');

Edite o caminho indicado no arquivo para apontar para a sua cópia do inkscape. Geralmente você pode deixar assim mesmo.

Salve como “conv.ps1” na mesma pasta que os arquivos SVG.

Crie um arquivo “conv.bat” com o seguinte conteúdo (propositalmente sem acentuação):

@Echo Off
REM sem isto, executar um script powershell no Windows fica desnecessariamente complicado
Powershell -executionpolicy bypass -File conv.ps1

REM Sem esta pausa você não verá a razão se erros de sintaxe no arquivo *.ps1 abortarem a execução.
REM Você pode removê-la quando tiver terminado de ajustar o script para os seus interesses 
pause

e salve na mesma pasta.

Se Inkscape estiver em execução, feche.

Agora execute conv.bat. Se tudo correr bem os arquivos *.pdf vão aparecer silenciosamente na mesma pasta e você terá no final um arquivo “multipaginas.pdf” com a mescla de todos os outros.

Problemas desse processo: 

  • Não é possível determinar a ordem dos arquivos PDF na cópia final via script. Você precisa se certificar de que cada arquivo SVG esteja em ordem alfabética correspondente à  posição desejada no arquivo PDF final.  Por exemplo, se você tiver os arquivos “página1.pdf”, “página2.pdf”… “página100.pdf”, pode precisar renomear os primeiros com zeros na frente do número para a ordem ficar correta (“página001.pdf”);
  • O fato do script apagar *.pdf por default requer que você saiba o que está fazendo ao colocá-lo em uma pasta qualquer. Você assume que sabe ao teclar “s” seguido de ENTER;
  • Eu ofereço a opção de não apagar os arquivos PDF apenas por desencargo de consciência, porque eu não quero oferecer um script que apaga todos os arquivos PDF sem dar ao usuário a oportunidade de mudar de idéia. Porém se você escolher continuar sem apagar os arquivos e o inkscape não gerar todos os arquivos novos, os arquivos PDF existentes na pasta não vão corresponder aos SVG.
3 comentários

Deixe um comentário

Você pode usar estas tags HTML

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code class="" title="" data-url=""> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="" title="" data-url=""> <span class="" title="" data-url="">

  

  

  

:) :( ;) O_o B) :lol: :huh: :S :D :-P 8-O :yahoo: :rtfm: :dashhead1: :clapping: more »