jpg - Convertir PDF para limpiar SVG?
convertir pdf a vector online (9)
Actualmente estoy usando PDFBox que tiene un buen soporte para salida gráfica. Existe 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). Puede interceptar la herramienta gráfica con una herramienta SVG como Batik (hago esto y proporciona una buena captura).
No hay una forma simple de convertir todo el PDF a SVG; depende de la estrategia y las herramientas utilizadas para crear los archivos PDF. Algunos textos se convierten en vectores y no se pueden 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 gama de archivos PDF. Produce salida SVG que consiste en
- caracteres como uno
<svg:text>
por personaje - rutas como
<svg:path>
- imágenes como
<svg:image>
Los paquetes posteriores (con suerte) convertirán los caracteres a texto en ejecución y las rutas a objetos gráficos de mayor nivel
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 específicos del dominio (por ejemplo, espectros químicos). Ver https://bitbucket.org/petermr/svg2xml-dev . Todavía está en Alpha, pero se está moviendo a una velocidad útil. ¡Cualquiera puede unirse!
ACTUALIZAR. (@Tim Kelty) Continuamos trabajando en PDF2SVG y también en herramientas descendentes que hacen (limitado) Java OCR y la creación de primitivas de gráficos de alto nivel (flechas, casillas, 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.
Estoy intentando convertir un PDF a SVG. Sin embargo, el que estoy usando actualmente mapea una ruta para cada letra en cada pedazo de texto, lo que significa que si cambio el texto en su archivo fuente, se ve feo.
Me preguntaba cuál es el convertidor de PDF a SVG más limpio, con suerte uno que no tiene una ruta para sus áreas de texto que simplemente no necesitan una. Como sabemos, PDF y SVG son bastante similares, así que supongo que hay algunos buenos convertidores por ahí.
Aquí está la apéndice NodeJS REST para dos scripts de renderizado PDF. https://github.com/pumppi/pdf2images
Los scripts son: pdf2svg y Imagemagicks convert
Descubrí que xfig
hizo 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 el pdtoedit el que lo hizo.
Este es el proceso que terminé usando. La herramienta principal que utilicé fue Inkscape, que fue capaz de convertir texto de forma correcta.
- usó acciones de Adobe Acrobat Pro con JavaScript para dividir las hojas de PDF
- ejecutó Inkscape Portable 0.48.5 desde Windows Cmd para convertir a SVG
- Hice algunas ediciones manuales a un atributo SVG XML particular con el que estaba teniendo problemas usando Windows Cmd y Windows PowerShell
Páginas separadas: Adobe Acrobat Pro con JavaScript
Usando Adobe Acrobat Pro Actions (anteriormente Batch Processing) crea una acción personalizada para separar páginas PDF en archivos separados. Alternativamente, puede dividir archivos PDF con GhostScript
Acrobat JavaScript Action 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: archivo por lotes Inkscape con Windows CMD
Usando 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 aplicar manualmente fuerza bruta a las etiquetas o atributos SVG o XML debido a posibles variaciones y, en su lugar, debería usar un analizador XML. Sin embargo, tuve un problema simple en el que el ancho de trazo en un dibujo era muy pequeño y en otro la familia de fuentes estaba siendo identificada incorrectamente, así que básicamente modifiqué el script anterior de Windows Cmd para hacer un simple descubrimiento y reemplazo. 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á un buscar y reemplazar y guardará el archivo modificado con un sufijo agregado. Encontré algunas otras referencias que podrían utilizarse mejor para analizar o modificar los archivos SVG resultantes si se necesita realizar alguna otra limpieza menor.
Modificaciones para encontrar y reemplazar manualmente los 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
- Cómo automatizar la extracción de páginas desde un PDF ...
- JavaScript para Acrobat API Reference - extractPages
- Extraiga páginas para separar archivos PDF (¿hay algún problema con el bucle?)
- ¿Cómo puedo crear un valor de Zerofilled usando JavaScript?
- Cómo generar enteros con ceros a la izquierda en JavaScript
Referencias de GhostScript a páginas separadas
- Ayuda de GhostScript noob - Rompiendo un archivo PDF multipágina ...
- Cómo convertir un archivo PDF de varias páginas ...
- Dividir un PDF con Ghostscript
Referencia de Inkscape Command Line para conversión de PDF a SVG
Windows Cmd Batch File Secuencias de comandos
- Características ocultas de los archivos por lotes de Windows
- SS64.com - Índice de la línea de comandos de CMD de Windows
- ¿Por qué el bucle FOR / f en este script por lotes evalúa una línea en blanco?
Búsqueda de reemplazo de etiqueta / atributo XML
- ¿Cómo puede encontrar y reemplazar texto en un archivo usando el entorno de línea de comandos de Windows?
- Cambiar datos de etiquetas en un archivo XML usando el archivo de proceso por lotes de Windows
- actualizar XML desde la línea de comando [windows]
- ¿Cómo modificar / crear valores en archivos XML usando PowerShell?
- Edición de atributos XML usando Powershell
- powershell cambia el valor del atributo XML Element
Este tema es bastante antiguo, pero esta es una solución práctica que encontré:
http://www.cityinthesky.co.uk/opensource/pdf2svg/
Ofrece una herramienta, pdf2png, que una vez instalada hace exactamente el trabajo en línea de comandos. Lo he probado con resultados irreprochables hasta ahora, incluso con bitmaps.
EDITAR: Mi error, esta herramienta también convierte letras en rutas, por lo que no aborda la pregunta inicial. Sin embargo, hace un buen trabajo de todos modos, y puede ser útil para cualquier persona que no tenga la intención de modificar el código en el archivo svg, así que dejaré la publicación.
Inkscape es utilizado por muchas personas en Wikipedia para convertir PDF a SVG.
¡Incluso tienen una guía práctica sobre cómo hacerlo!
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 línea de comandos, ejecute inkscape --help
.
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, use --export-png
, etc ...
Si DVI a SVG es una opción, también puede usar dvisvgm para convertir un archivo DVI a un archivo SVG. Esto funciona perfectamente, por ejemplo, para las 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 se procesó perfectamente en inkscape
.