Converti PDF in SVG pulito? [chiuso]


114

Sto tentando di convertire un PDF in SVG. Tuttavia, quello che sto usando attualmente mappa un percorso per ogni lettera in ogni parte di testo, il che significa che se cambio il testo nel suo file sorgente, sembra brutto.

Mi chiedevo quale sia il convertitore da PDF a SVG più pulito, spero che non abbia un percorso per le aree di testo che semplicemente non ne hanno bisogno. Come sappiamo, PDF e SVG sono abbastanza simili, quindi presumo che ci siano alcuni buoni convertitori là fuori.


11
'Come sappiamo, PDF e SVG sono abbastanza simili ...' ?!?!? In tal caso, sai molto più di me ...
Kurt Pfeifle

22
Sono simili nel senso che sono entrambi formati basati su vettori. È lì che finisce il confronto, credo.
Frank Rem

1
Suppongo che entrambi utilizzino molto il posizionamento assoluto del testo.
Bryan Field

Qualcuno lo fa con PDF interattivi (campo modulo) in modo che rimangano interattivi nel browser, sovrapponendo gli INPUT all'SVG renderizzato, forse?
Tim

Risposte:


84

Inkscape è utilizzato da molte persone su Wikipedia per convertire PDF in SVG.

http://inkscape.org/

Hanno anche una pratica guida su come farlo!

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


4
Inkscape non funziona molto bene, poiché cambia anche il testo in tracciati. Trovo anche che spesso perdano i dati del carattere, ma non sembrano approssimarsi a un buon carattere installato. Come viene visualizzato il PDF se SVG non può?
DanRedux

Questa è una domanda giusta, ho familiarità con entrambi i formati ma non ho fatto molte ricerche sull'argomento. Potrei dare un'occhiata. Pensa che possa ridursi al modo in cui sono costruiti i due formati. SVG, ad esempio, è costruito con XML mentre PDF utilizza il proprio formato di tipo XML.
Saintt Sheldon Patnett

3
Bene, il motivo per cui voglio questo è perché voglio essere in grado di modificare il testo usando PHP. Potrei farlo direttamente con PDF, ma il PDF non può essere integrato facilmente in HTML, ma SVG sì. Potrei semplicemente restare con il PDF e convertirlo in JPG in PHP dopo aver modificato i suoi valori ..
DanRedux

8
@DanRedux: AFAIK, puoi disattivare la conversione dei "testi dei caratteri in percorsi" in Inkscape. Sulla riga di comando di Inkscape abiliterai questa conversione aggiungendo --export-text-to-path.
Kurt Pfeifle

1
Può essere ovvio, ma Illustrator può convertire PDF in SVG. Sono venuto qui, ho scaricato Inkscape e poi ho capito che avevo Illustrator. en.wikipedia.org/wiki/Wikipedia:Graphics_Lab/Resources/…
E. Sundin,

83

Puoi usare Inkscape solo dalla riga di comando, senza aprire una GUI. Prova questo:

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

Per un elenco completo di tutte le opzioni della riga di comando, esegui inkscape --help.


Questo rimuove lo spazio nel testo per me.
MaxNoe

1
@MaxNoe: È del tutto possibile, ma questa è una "proprietà" del modo in cui quel particolare PDF è costruito, internamente. Per alcune spiegazioni delle difficoltà quando si tratta di riconoscere ed estrarre "testo" da PDF, vedere i miei file PDF codificati a mano (con i commenti incorporati) su GitHub . (Aprili in un editor di testo a tua scelta e in un visualizzatore di PDF e copia e incolla il testo dai file.)
Kurt Pfeifle

Sì, penso che abbia a che fare con il modo in cui tex rende gli spazi bianchi, come scatole.
MaxNoe

23

Attualmente sto utilizzando PDFBox che ha un buon supporto per l'output grafico. C'è un buon supporto per l'estrazione dei tratti vettoriali e anche per la gestione dei caratteri. Ci sono alcuni buoni strumenti per provarlo (ad esempio PDFReader verrà visualizzato come Java Graphics2D). Puoi intercettare lo strumento grafico con uno strumento SVG come Batik (lo faccio e dà una buona cattura).

Non esiste un modo semplice per convertire tutti i PDF in SVG: dipende dalla strategia e dagli strumenti utilizzati per creare i PDF. Parte del testo viene convertito in vettori e non può essere facilmente ricostruito: è necessario installare i caratteri vettoriali e cercarli.

AGGIORNAMENTO: ora l'ho sviluppato in un pacchetto PDF2SVG che non usa più Batik:

che è stato testato su una serie di PDF. Produce output SVG composto da

  • caratteri come uno <svg:text>per carattere
  • percorsi come <svg:path>
  • immagini come <svg:image>

I pacchetti successivi convertiranno (si spera) i caratteri in testo scorrevole ei percorsi in oggetti grafici di livello superiore

AGGIORNAMENTO: ora possiamo ricreare il testo in esecuzione dai caratteri SVG. Abbiamo anche convertito i diagrammi in XML specifici del dominio (ad esempio spettri chimici). Vedi https://bitbucket.org/petermr/svg2xml-dev . È ancora in Alpha, ma si sta muovendo a una velocità utile. Tutti possono partecipare!

AGGIORNARE. (@Tim Kelty) Stiamo continuando a lavorare su PDF2SVG e anche su strumenti a valle che eseguono (limitato) Java OCR e creazione di primitive grafiche di livello superiore (frecce, scatole, ecc.) Vedi https://bitbucket.org/petermr/ imageanalysis https://bitbucket.org/petermr/diagramanalyzer https://bitbucket.org/petermr/norma e https://bitbucket.org/petermr/ami-core . Si tratta di un progetto finanziato per acquisire 100 milioni di fatti dalla letteratura scientifica (contentmine.org), molti dei quali sono PDF.


19

Questo argomento è piuttosto vecchio, ma ecco una pratica soluzione che ho trovato:

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

Offre uno strumento, pdf2png, che una volta installato fa esattamente il lavoro nella riga di comando. Finora l'ho testato con risultati irreprensibili, anche con bitmap.

EDIT: errore mio, questo strumento converte anche le lettere in percorsi, quindi non risolve la domanda iniziale. Comunque fa comunque un buon lavoro e può essere utile a chiunque non intenda modificare il codice nel file svg, quindi lascio il post.


Su Ubuntu puoi installarlo con: $ sudo apt-get install pdf2svg
tvw

2
Sebbene converta le lettere in percorsi, i risultati sono ottimi. Per apportare alcune modifiche, ho usato per modificare gli SVG direttamente con un editor. Se li apri e li salvi con inkscape come SVG di inkscape, il codice ha un aspetto migliore e hai gli ID oggetto, per trovare facilmente le entità che desideri modificare.
tvw

1
Puoi installarlo su Mac con brew install pdf2svg.
Colas

10

Ecco il processo che ho finito per usare. Lo strumento principale che ho usato è stato Inkscape che è stato in grado di convertire bene il testo.

  • ha utilizzato le azioni di Adobe Acrobat Pro con JavaScript per suddividere i fogli PDF
  • eseguito Inkscape Portable 0.48.5 da Windows Cmd per convertirlo in SVG
  • ha apportato alcune modifiche manuali a un particolare attributo XML SVG con cui avevo problemi utilizzando Windows Cmd e Windows PowerShell

Pagine separate: Adobe Acrobat Pro con JavaScript

Utilizzando Adobe Acrobat Pro Actions (in precedenza Batch Processing) creare un'azione personalizzata per separare le pagine PDF in file separati. In alternativa potresti essere in grado di dividere i PDF con GhostScript

Acrobat JavaScript Action per dividere le pagine

/* 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"
    });
};

Conversione da PDF a SVG: Inkscape con file batch CMD di Windows

Utilizzando Windows Cmd creato un file batch per scorrere tutti i file PDF in una cartella e convertirli in SVG

File batch per convertire PDF in SVG nella cartella corrente

:: ===== 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"

Attributi di pulizia: Windows Cmd e PowerShell

Mi rendo conto che non è una buona pratica modificare manualmente i tag SVG o XML o gli attributi a causa di potenziali variazioni e dovrei invece utilizzare un parser XML. Tuttavia ho avuto un semplice problema in cui la larghezza del tratto su un disegno era molto piccola e su un altro la famiglia di caratteri veniva identificata in modo errato, quindi ho sostanzialmente modificato il precedente script batch di Windows Cmd per eseguire una semplice ricerca e sostituzione. Le uniche modifiche riguardavano le definizioni della stringa di ricerca e la modifica per chiamare un comando di PowerShell. Il comando PowerShell eseguirà una ricerca e sostituzione e salverà il file modificato con un suffisso aggiunto. Ho trovato altri riferimenti che potrebbero essere utilizzati meglio per analizzare o modificare i file SVG risultanti se è necessario eseguire qualche altra pulizia minore.

Modifiche per trovare e sostituire manualmente i dati XML SVG

:: 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%'"

Spero che questo possa aiutare qualcuno

Riferimenti

Azioni di Adobe Acrobat Pro e riferimenti JavaScript a pagine separate

Riferimenti GhostScript a pagine separate

Riferimenti alla riga di comando di Inkscape per la conversione da PDF a SVG

Riferimenti allo script di file batch di Windows Cmd

Ricerca sulla sostituzione di tag / attributi XML


7

Se DVI to SVG è un'opzione, puoi anche usare dvisvgm per convertire un file DVI in un file SVG. Funziona perfettamente, ad esempio, per le formule LaTeX (con opzione --no-fonts):

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

C'è anche pdf2svg che usa poppler e Cairo per convertire un pdf in SVG. Quando l'ho provato, l'SVG è stato renderizzato perfettamente inkscape.


1
Ho un PDF che riproduce alcuni simboli LaTeX dal pacchetto skak (pezzi degli scacchi). Questo particolare file non è ben gestito in Inkscape, poiché i simboli diventano lettere Arial ... Ho ottenuto risultati corretti con pdf2svg.
LRMAAX

Per i sistemi Windows c'è una serie di strumenti binari compilati qui: Poppler per Windows .
Paolo Gibellini

7

Script Bash per convertire ogni pagina di un PDF nel proprio file 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

Per generare in png, usa --export-png, ecc ...


1

Ho scoperto che ha xfigfatto un ottimo lavoro:

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

export to svg

Ha fatto un lavoro molto migliore di Inkscape. In realtà è stato probabilmente pdtoedit a farlo.


Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.