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.
Bom dia Jefferson, fazendo uma pesquisa sobre PDF acabei caindo aqui.
Foi uma grata surpresa reencontrar suas postagens, que eu seguia lá em 2011 sobre os firmwares do PROVIEW 858, lembra? kkkk
Tudo de bom para você!
Claro que me lembro, Pedro. Eu lembro imediatamente de quase todos os nomes de leitores que listei aqui:
https://ryan.com.br/blogs/quicktalk/regras-de-participacao/
O que me surpreende é o meu blog ainda aparecer como resultado em uma busca no Google para um assunto “comum” de TI.
Surpreso e muito honrado por ver meu nome ali… Sou seu fã (real, e no bom sentido). Abraço!