Converter PDF em SVG limpo? [fechadas]

114

Estou tentando converter um PDF para SVG. No entanto, o que estou usando atualmente mapeia um caminho para cada letra em cada pedaço de texto, o que significa que se eu alterar o texto em seu arquivo de origem, ele ficará feio.

Gostaria de saber qual é o conversor de PDF para SVG mais limpo, espero que não tenha um caminho para as áreas de texto que simplesmente não precisam de um. Como sabemos, PDF e SVG são bastante semelhantes, então presumo que haja alguns bons conversores por aí.

DanRedux
fonte
11
'Como sabemos, PDF e SVG são bastante semelhantes ...' ?!?!? Nesse caso, você sabe muito mais do que eu ...
Kurt Pfeifle
22
Eles são semelhantes no sentido de que ambos são formatos baseados em vetores. É aí que termina a comparação, eu acredito.
Frank Rem
1
Suponho que os dois usam muito posicionamento absoluto de texto.
Bryan Field
Alguém está fazendo isso com PDFs interativos (campo de formulário) para que eles permaneçam interativos no navegador, sobrepondo INPUTs sobre o SVG renderizado, talvez?
Tim

Respostas:

84

O Inkscape é usado por muitas pessoas na Wikipedia para converter PDF em SVG.

http://inkscape.org/

Eles ainda têm um guia prático sobre como fazer isso!

http://en.wikipedia.org/wiki/Wikipedia:Graphic_Lab/Resources/PDF_conversion_to_SVG#Conversion_with_Inkscape

Saintt Sheldon Patnett
fonte
4
O Inkscape não funciona muito bem, pois também transforma o texto em caminhos. Também descobri que muitas vezes perdem os dados da fonte, mas não parecem se aproximar de uma fonte boa instalada. Como o PDF exibe se o SVG não pode?
DanRedux
Essa é uma pergunta justa, estou familiarizado com os dois formatos, mas não fiz muitas pesquisas sobre o assunto. Eu posso dar uma olhada nisso. Acho que pode se resumir à maneira como os dois formatos são construídos. SVG, por exemplo, é construído com XML, enquanto PDF usa seu próprio formato XML Type.
Saintt Sheldon Patnett
3
Bem, o motivo pelo qual quero isso é porque quero poder editar o texto usando PHP. Eu poderia fazer isso diretamente com PDF, mas PDF não pode ser embutido facilmente em HTML, mas SVG pode. Posso apenas ficar com PDF e convertê-lo para JPG em PHP depois de editar seus valores.
DanRedux
8
@DanRedux: AFAIK, você pode desligar a conversão de 'textos fonte em caminhos' no Inkscape. Na linha de comando do Inkscape, você habilitaria essa conversão adicionando --export-text-to-path.
Kurt Pfeifle
1
Pode ser óbvio, mas o Illustrator pode converter PDF em SVG. Vim aqui, baixei o Inkscape e percebi que tinha o Illustrator. en.wikipedia.org/wiki/Wikipedia:Graphics_Lab/Resources/…
E. Sundin
83

Você pode usar o Inkscape apenas na linha de comando, sem abrir uma GUI. Experimente isto:

inkscape \
  --without-gui \
  --file=input.pdf \
  --export-plain-svg=output.svg 

Para obter uma lista completa de todas as opções de linha de comando, execute inkscape --help.

Kurt Pfeifle
fonte
Isso remove espaço no texto para mim.
MaxNoe
1
@MaxNoe: Isso é bem possível - mas essa é uma "propriedade" da maneira como esse PDF específico é construído internamente. Para obter algumas explicações sobre as dificuldades quando se trata de reconhecer e extrair "texto" de PDFs, consulte meus arquivos PDF codificados manualmente (com os comentários incorporados) no GitHub . (Abra-os em um editor de texto de sua escolha, bem como em um visualizador de PDF e copie e cole o texto dos arquivos.)
Kurt Pfeifle
Sim, acho que tem a ver com a maneira como o tex está renderizando espaços em branco, como caixas.
MaxNoe
23

Atualmente, estou usando o PDFBox, que tem um bom suporte para saída gráfica. Há um bom suporte para extrair os traços vetoriais e também para gerenciar fontes. Existem algumas ferramentas boas para experimentá-lo (por exemplo, PDFReader será exibido como Java Graphics2D). Você pode interceptar a ferramenta gráfica com uma ferramenta SVG como Batik (eu faço isso e dá uma boa captura).

Não há uma maneira simples de converter todos os PDFs em SVG - depende da estratégia e das ferramentas usadas para criar os PDFs. Alguns textos são convertidos em vetores e não podem ser facilmente reconstruídos - você precisa instalar fontes vetoriais e procurá-las.

ATUALIZAÇÃO: agora desenvolvi isso em um pacote PDF2SVG que não usa mais Batik:

que foi testado em uma variedade de PDFs. Ele produz saída SVG consistindo em

  • personagens como um <svg:text>por personagem
  • caminhos como <svg:path>
  • imagens como <svg:image>

Os pacotes posteriores (com sorte) converterão os caracteres em texto corrido e os caminhos em objetos gráficos de nível superior

ATUALIZAÇÃO: agora podemos recriar o texto em execução a partir dos caracteres SVG. Também convertemos diagramas em XML de domínio específico (por exemplo, espectros químicos). Consulte https://bitbucket.org/petermr/svg2xml-dev . Ainda está em Alfa, mas está se movendo a uma velocidade útil. Qualquer pessoa pode participar!

ATUALIZAR. (@Tim Kelty) Continuamos trabalhando em PDF2SVG e também em ferramentas downstream que fazem (limitado) Java OCR e criação de primitivas gráficas de nível superior (setas, caixas, etc.). Veja https://bitbucket.org/petermr/ imageanalysis https://bitbucket.org/petermr/diagramanalyzer https://bitbucket.org/petermr/norma e https://bitbucket.org/petermr/ami-core . Este é um projeto financiado para capturar 100 milhões de fatos da literatura científica (contentmine.org), muitos dos quais são PDF.

peter.murray.rust
fonte
19

Este tópico é bastante antigo, mas aqui está uma solução útil que encontrei:

http://www.cityinthesky.co.uk/opensource/pdf2svg/

Ele oferece uma ferramenta, pdf2png, que uma vez instalada faz exatamente o trabalho na linha de comando. Eu testei com resultados irrepreensíveis até agora, inclusive com bitmaps.

EDIT: Erro meu, esta ferramenta também converte letras em caminhos, por isso não responde à questão inicial. No entanto, ele faz um bom trabalho de qualquer maneira e pode ser útil para qualquer pessoa que não pretenda modificar o código no arquivo svg, então deixarei o post.

Pierre
fonte
No Ubuntu, você pode instalá-lo com: $ sudo apt-get install pdf2svg
tvw
2
Embora converta letras em caminhos, os resultados são excelentes. Para fazer algumas modificações, costumava editar os SVGs diretamente com um editor. Se você abri-los e salvá-los com o inkscape como um inkscape SVG, o código parece melhor e você tem ids de objeto para encontrar facilmente as entidades que deseja alterar.
tvw
1
Você pode instalá-lo no Mac com brew install pdf2svg.
Colas
10

Aqui está o processo que acabei usando. A principal ferramenta que usei foi o Inkscape, que era capaz de converter perfeitamente o texto.

  • usou ações do Adobe Acrobat Pro com JavaScript para dividir as folhas PDF
  • executou o Inkscape Portable 0.48.5 do Windows Cmd para converter para SVG
  • fiz algumas edições manuais em um atributo XML SVG específico com o qual estava tendo problemas ao usar o Windows Cmd e o Windows PowerShell

Páginas separadas: Adobe Acrobat Pro com JavaScript

Usando o Adobe Acrobat Pro Actions (anteriormente Batch Processing), crie uma ação personalizada para separar as páginas PDF em arquivos separados. Como alternativa, você pode dividir PDFs com GhostScript

Ação Acrobat JavaScript para dividir páginas

/* Extract Pages to Folder */

var re = /.*\/|\.pdf$/ig;
var filename = this.path.replace(re,"");

{
    for ( var i = 0;  i < this.numPages; i++ )
    this.extractPages
     ({
        nStart: i,
        nEnd: i,
        cPath : filename + "_s" + ("000000" + (i+1)).slice (-3) + ".pdf"
    });
};

Conversão de PDF para SVG: Inkscape com arquivo de lote CMD do Windows

Usando o Windows Cmd, criou um arquivo em lote para percorrer todos os arquivos PDF em uma pasta e convertê-los em SVG

Arquivo em lote para converter PDF em SVG na pasta atual

:: ===== SETUP =====
@echo off
CLS
echo Starting SVG conversion...
echo.

:: setup working directory (if different)
REM set "_work_dir=%~dp0"
set "_work_dir=%CD%"

:: setup counter
set "count=1"

:: setup file search and save string
set "_work_x1=pdf"
set "_work_x2=svg"
set "_work_file_str=*.%_work_x1%"

:: setup inkscape commands
set "_inkscape_path=D:\InkscapePortable\App\Inkscape\"
set "_inkscape_cmd=%_inkscape_path%inkscape.exe"

:: ===== FIND FILES IN WORKING DIRECTORY =====
:: Output from DIR last element is single  carriage return character. 
:: Carriage return characters are directly removed after percent expansion, 
:: but not with delayed expansion.

pushd "%_work_dir%"
FOR /f "tokens=*" %%A IN ('DIR /A:-D /O:N /B %_work_file_str%') DO (
    CALL :subroutine "%%A"
)
popd

:: ===== CONVERT PDF TO SVG WITH INKSCAPE =====

:subroutine
echo.
IF NOT [%1]==[] (

    echo %count%:%1
    set /A count+=1

    start "" /D "%_work_dir%" /W "%_inkscape_cmd%" --without-gui --file="%~n1.%_work_x1%" --export-dpi=300 --export-plain-svg="%~n1.%_work_x2%"

) ELSE (
    echo End of output
)
echo.

GOTO :eof

:: ===== INKSCAPE REFERENCE =====

:: print inkscape help
REM "%_inkscape_cmd%" --help > "%~dp0\inkscape_help.txt"
REM "%_inkscape_cmd%" --verb-list > "%~dp0\inkscape_verb_list.txt"

Atributos de limpeza: Windows Cmd e PowerShell

Sei que não é uma prática recomendada editar manualmente a força bruta de tags ou atributos SVG ou XML devido a variações em potencial e, em vez disso, deveria usar um analisador XML. No entanto, tive um problema simples em que a largura do traço em um desenho era muito pequena e em outro a família de fontes estava sendo identificada incorretamente, então basicamente modifiquei o script de lote anterior do Windows Cmd para fazer um simples localizar e substituir. As únicas alterações foram nas definições de string de pesquisa e na mudança para chamar um comando do PowerShell. O comando PowerShell executará um localizar e substituir e salvar o arquivo modificado com um sufixo adicionado. Eu encontrei algumas outras referências que poderiam ser mais bem usadas para analisar ou modificar os arquivos SVG resultantes se alguma outra limpeza secundária for necessária.

Modificações para localizar e substituir manualmente dados SVG XML

:: setup file search and save string
set "_work_x1=svg"
set "_work_x2=svg"
set "_work_s2=_mod"
set "_work_file_str=*.%_work_x1%"

powershell -Command "(Get-Content '%~n1.%_work_x1%') | ForEach-Object {$_ -replace 'stroke-width:0.06', 'stroke-width:1'} | ForEach-Object {$_ -replace 'font-family:Times Roman','font-family:Times New Roman'} | Set-Content '%~n1%_work_s2%.%_work_x2%'"

Espero que isso possa ajudar alguém

Referências

Ações do Adobe Acrobat Pro e referências JavaScript para páginas separadas

Referências do GhostScript para páginas separadas

Referências de linha de comando do Inkscape para conversão de PDF para SVG

Referências do Windows Cmd Batch File Script

Pesquisa de substituição de tag / atributo XML

ClearBlueSky85
fonte
7

Se DVI para SVG for uma opção, você também pode usar dvisvgm para converter um arquivo DVI em um arquivo SVG. Isso funciona perfeitamente, por exemplo, para fórmulas LaTeX (com opção --no-fonts):

dvisvgm --no-fonts input.dvi -o output.svg

Também existe o pdf2svg que usa o poppler e o Cairo para converter um pdf em SVG. Quando tentei fazer isso, o SVG estava perfeitamente renderizado inkscape.

Dhaumann
fonte
1
Eu tenho um PDF que renderiza alguns símbolos LaTeX do pacote skak (peças de xadrez). Este arquivo em particular não é bem tratado no Inkscape, já que os símbolos se transformam em letras Arial ... Obtive resultados corretos com o pdf2svg.
LRMAAX
Para sistemas Windows, há um conjunto de ferramentas binárias compiladas aqui: Poppler para Windows .
Paolo Gibellini
7

Script Bash para converter cada página de um PDF em seu próprio arquivo SVG.

#!/bin/bash
#
#  Make one PDF per page using PDF toolkit.
#  Convert this PDF to SVG using inkscape
#

inputPdf=$1

pageCnt=$(pdftk $inputPdf dump_data | grep NumberOfPages | cut -d " " -f 2)

for i in $(seq 1 $pageCnt); do
    echo "converting page $i..."
    pdftk ${inputPdf} cat $i output ${inputPdf%%.*}_${i}.pdf
    inkscape --without-gui "--file=${inputPdf%%.*}_${i}.pdf" "--export-plain-svg=${inputPdf%%.*}_${i}.svg"
done

Para gerar em png, usar --export-png, etc ...

Alain Pannetier
fonte
1

Achei que xfigfez um excelente trabalho:

pstoedit -f fig foo.pdf foo.fig
xfig foo.fig

export to svg

Ele fez um trabalho muito melhor do que o inkscape. Na verdade, provavelmente foi o pdtoedit que fez isso.

user877329
fonte