¿Convertir PDF a SVG limpio? [cerrado]

114

Estoy intentando convertir un PDF a SVG. Sin embargo, el que estoy usando actualmente asigna una ruta para cada letra en cada fragmento de texto, lo que significa que si cambio el texto en su archivo de origen, se ve feo.

Me preguntaba cuál es el convertidor de PDF a SVG más limpio, con suerte uno que no tenga una ruta para sus áreas de texto que simplemente no la necesitan. Como sabemos, PDF y SVG son bastante similares, así que supongo que hay algunos buenos convertidores por ahí.

DanRedux
fuente
11
'Como sabemos, PDF y SVG son bastante similares ...' ?!?!? En ese caso, sabes mucho más que yo ...
Kurt Pfeifle
22
Son similares en el sentido de que ambos son formatos basados ​​en vectores. Ahí es donde termina la comparación, creo.
Frank Rem
1
Supongo que ambos usan mucho posicionamiento absoluto de texto.
Bryan Field
¿Alguien está haciendo esto con PDF interactivos (campo de formulario) para que sigan siendo interactivos en el navegador, superponiendo INPUTs sobre el SVG renderizado, tal vez?
Tim

Respuestas:

84

Muchas personas utilizan Inkscape en Wikipedia para convertir PDF a SVG.

http://inkscape.org/

¡Incluso tienen una guía práctica sobre cómo hacerlo!

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

Saintt Sheldon Patnett
fuente
4
Inkscape no funciona muy bien, ya que también cambia el texto en rutas. También encuentro que a menudo pierden los datos de la fuente, pero no parecen aproximarse a una buena fuente instalada. ¿Cómo lo muestra PDF si SVG no puede?
DanRedux
Esa es una pregunta justa, estoy familiarizado con ambos formatos, pero no he investigado mucho sobre el tema. Puedo echarle un vistazo. Piensa que puede reducirse a la forma en que se construyen los dos formatos. SVG, por ejemplo, está construido con XML, mientras que PDF usa su propio formato de tipo XML.
Saintt Sheldon Patnett
3
Bueno, la razón por la que quiero esto es porque quiero poder editar el texto usando PHP. Podría hacerlo directamente con PDF, pero PDF no se puede insertar fácilmente en HTML, pero SVG sí. Puedo seguir con PDF y convertirlo a JPG en PHP después de editar sus valores ..
DanRedux
8
@DanRedux: AFAIK, puede desactivar la conversión de 'textos de fuente a rutas' en Inkscape. En la línea de comandos de Inkscape, habilitaría esta conversión agregando --export-text-to-path.
Kurt Pfeifle
1
Puede ser obvio, pero Illustrator puede convertir PDF a SVG. Vine aquí, descargué Inkscape y luego me di cuenta de que tenía Illustrator. en.wikipedia.org/wiki/Wikipedia:Graphics_Lab/Resources/…
E. Sundin
83

Puede usar Inkscape solo en la línea de comandos, sin abrir una GUI. Prueba esto:

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

Para obtener una lista completa de todas las opciones de la línea de comandos, ejecute inkscape --help.

Kurt Pfeifle
fuente
Esto me quita espacio en el texto.
MaxNoe
1
@MaxNoe: Eso es bastante posible, pero esta es una "propiedad" de la forma en que se construye ese PDF en particular, internamente. Para obtener algunas explicaciones de las dificultades cuando se trata de reconocer y extraer "texto" de archivos PDF, consulte mis archivos PDF codificados a mano (con los comentarios incrustados) en GitHub . (Ábralos en un editor de texto de su elección, así como en un visor de PDF y copie y pegue el texto de los archivos.)
Kurt Pfeifle
Sí, creo que tiene que ver con la forma en que tex representa los espacios en blanco, como cuadros.
MaxNoe
23

Actualmente estoy usando PDFBox, que tiene un buen soporte para la salida gráfica. Hay un buen soporte para extraer los trazos vectoriales y también para administrar fuentes. Hay algunas buenas herramientas para probarlo (por ejemplo, PDFReader se mostrará como Java Graphics2D). Puedes interceptar la herramienta gráfica con una herramienta SVG como Batik (hago esto y da una buena captura).

No existe una forma sencilla de convertir todos los PDF a SVG; depende de la estrategia y las herramientas utilizadas para crear los PDF. Parte del texto se convierte en vectores y no se puede reconstruir fácilmente; debe instalar fuentes vectoriales y buscarlas.

ACTUALIZACIÓN: Ahora he desarrollado esto en un paquete PDF2SVG que ya no usa Batik:

que ha sido probado en una variedad de archivos PDF. Produce una salida SVG que consta de

  • personajes como uno <svg:text>por personaje
  • caminos como <svg:path>
  • imágenes como <svg:image>

Los paquetes posteriores convertirán (con suerte) los caracteres en texto en ejecución y las rutas en objetos gráficos de nivel superior

ACTUALIZACIÓN: Ahora podemos volver a crear el texto en ejecución a partir de los caracteres SVG. También hemos convertido diagramas a XML de dominio específico (por ejemplo, espectros químicos). Consulte https://bitbucket.org/petermr/svg2xml-dev . Todavía está en Alfa, pero se mueve a una velocidad útil. ¡Cualquiera puede unirse!

ACTUALIZAR. (@Tim Kelty) Seguimos trabajando en PDF2SVG y también en herramientas posteriores que hacen (limitado) Java OCR y la creación de primitivas gráficas de nivel superior (flechas, cuadros, etc.) Consulte https://bitbucket.org/petermr/ imageanalysis https://bitbucket.org/petermr/diagramanalyzer https://bitbucket.org/petermr/norma y https://bitbucket.org/petermr/ami-core . Este es un proyecto financiado para capturar 100 millones de datos de la literatura científica (contentmine.org), muchos de los cuales son PDF.

peter.murray.rust
fuente
19

Este tema es bastante antiguo, pero aquí hay una solución útil que encontré:

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

Ofrece una herramienta, pdf2png, que una vez instalada hace exactamente el trabajo en la línea de comandos. Lo he probado con resultados irreprochables hasta ahora, incluso con mapas de bits.

EDITAR: Mi error, esta herramienta también convierte letras en caminos, por lo que no aborda la pregunta inicial. Sin embargo, hace un buen trabajo de todos modos y puede ser útil para cualquiera que no tenga la intención de modificar el código en el archivo svg, así que dejaré la publicación.

pierre
fuente
En Ubuntu puede instalarlo con: $ sudo apt-get install pdf2svg
tvw
2
Aunque convierte letras en caminos, los resultados son excelentes. Para hacer algunas modificaciones, solía editar los SVG directamente con un editor. Si los abre y los guarda con inkscape como un SVG de inkscape, el código se ve mejor y tiene identificadores de objetos, para encontrar fácilmente las entidades que desea cambiar.
tvw
1
Puedes instalarlo en Mac con brew install pdf2svg.
Colas
10

Este es el proceso que terminé usando. La herramienta principal que utilicé fue Inkscape, que pudo convertir texto correctamente.

  • usó acciones de Adobe Acrobat Pro con JavaScript para dividir las hojas PDF
  • ejecutó Inkscape Portable 0.48.5 desde Windows Cmd para convertir a SVG
  • Hice algunas ediciones manuales en un atributo XML de SVG en particular con el que tenía problemas al usar Windows Cmd y Windows PowerShell

Páginas separadas: Adobe Acrobat Pro con JavaScript

El uso de Acciones de Adobe Acrobat Pro (anteriormente Procesamiento por lotes) crea una acción personalizada para separar páginas PDF en archivos separados. Alternativamente, puede dividir archivos PDF con GhostScript

Acción de JavaScript de Acrobat 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"
    });
};

Conversión de PDF a SVG: Inkscape con archivo por lotes CMD de Windows

El uso de Windows Cmd creó un archivo por lotes para recorrer todos los archivos PDF en una carpeta y convertirlos a SVG

Archivo por lotes para convertir PDF a SVG en la carpeta actual

:: ===== 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 limpieza: Windows Cmd y PowerShell

Me doy cuenta de que no es una buena práctica editar manualmente por fuerza bruta etiquetas o atributos SVG o XML debido a posibles variaciones y debería usar un analizador XML en su lugar. Sin embargo, tuve un problema simple en el que el ancho del trazo en un dibujo era muy pequeño y en otro la familia de fuentes se identificaba incorrectamente, por lo que básicamente modifiqué el script por lotes de Windows Cmd anterior para hacer una búsqueda y reemplazo simple. Los únicos cambios fueron en las definiciones de la cadena de búsqueda y cambiar para llamar a un comando de PowerShell. El comando de PowerShell realizará una búsqueda, reemplazará y guardará el archivo modificado con un sufijo agregado. Encontré algunas otras referencias que podrían usarse mejor para analizar o modificar los archivos SVG resultantes si se necesita realizar alguna otra limpieza menor.

Modificaciones para buscar y reemplazar manualmente datos 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%'"

Espero que esto pueda ayudar a alguien

Referencias

Acciones de Adobe Acrobat Pro y referencias de JavaScript a páginas separadas

Referencias de GhostScript a páginas separadas

Referencias de la línea de comandos de Inkscape para la conversión de PDF a SVG

Referencias de secuencias de comandos de archivos por lotes de Windows Cmd

Investigación de reemplazo de atributos / etiquetas XML

ClearBlueSky85
fuente
7

Si DVI a SVG es una opción, también puede usar dvisvgm para convertir un archivo DVI en un archivo SVG. Esto funciona perfectamente, por ejemplo, para fórmulas LaTeX (con opción --no-fonts):

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

También hay pdf2svg que usa poppler y Cairo para convertir un pdf en SVG. Cuando probé esto, el SVG estaba perfectamente renderizado en formato inkscape.

dhaumann
fuente
1
Tengo un PDF que muestra algunos símbolos LaTeX del paquete skak (piezas de ajedrez). Este archivo en particular no se maneja bien en Inkscape, ya que los símbolos se convierten en letras Arial ... Tengo resultados correctos con pdf2svg.
LRMAAX
Para los sistemas Windows, hay un conjunto de herramientas binarias compiladas aquí: Poppler para Windows .
Paolo Gibellini
7

Script Bash para convertir cada página de un PDF en su propio archivo 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 generar en png, usar --export-png, etc ...

Alain Pannetier
fuente
1

Descubrí que xfighizo un excelente trabajo:

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

export to svg

Hizo un trabajo mucho mejor que inkscape. En realidad, probablemente fue pdtoedit quien lo hizo.

user877329
fuente