usuario434541
Quiero convertir PDF a SVG. He escrito mi propio programa Java utilizando las bibliotecas Apache PDFBox y Batik.
PDDocument document = PDDocument.load( pdfFile );
DOMImplementation domImpl =
GenericDOMImplementation.getDOMImplementation();
// Create an instance of org.w3c.dom.Document.
String svgNS = "http://www.w3.org/2000/svg";
Document svgDocument = domImpl.createDocument(svgNS, "svg", null);
SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(svgDocument);
ctx.setEmbeddedFontsOn(true);
// Ask the test to render into the SVG Graphics2D implementation.
for(int i = 0 ; i < document.getNumberOfPages() ; i++){
String svgFName = svgDir+"page"+i+".svg";
(new File(svgFName)).createNewFile();
// Create an instance of the SVG Generator.
SVGGraphics2D svgGenerator = new SVGGraphics2D(ctx,false);
Printable page = document.getPrintable(i);
page.print(svgGenerator, document.getPageFormat(i), i);
svgGenerator.stream(svgFName);
}
Esta solución funciona, pero el tamaño de los archivos SVG resultantes es enorme (muchas veces mayor que el PDF de origen). Descubrí dónde está el problema mirando el SVG en un editor de texto: encierra cada carácter en el documento original en su propio <text> </text>
bloque incluso si las propiedades de fuente de los caracteres son las mismas.
Por ejemplo, la palabra “hola” aparecerá como 6 bloques de texto diferentes.
¿Hay alguna manera de arreglar el código anterior? ¿O hay otra solución que funcione de manera más eficiente?
Inkscape también se puede utilizar para convertir PDF a SVG. De hecho, es muy bueno en esto, y aunque el código que genera está un poco inflado, al menos, no parece tener el problema particular que está encontrando en su programa. Creo que sería un desafío integrarlo directamente en Java, pero Inkscape proporciona una interfaz de línea de comandos conveniente para esta funcionalidad, por lo que probablemente la forma más fácil de acceder sea a través de una llamada al sistema.
Para usar la interfaz de línea de comandos de Inkscape para convertir un PDF a SVG, use:
inkscape -l out.svg in.pdf
Al que probablemente puedas llamar usando:
Runtime.getRuntime().exec("inkscape -l out.svg in.pdf")
http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Runtime.html#exec%28java.lang.String%29
Creo que exec () es sincrónico y solo regresa después de que se completa el proceso (aunque no estoy 100% seguro de eso), por lo que debería poder leer “out.svg” después de eso. En cualquier caso, buscar en Google “llamada al sistema Java” arrojará más información sobre cómo hacer esa parte correctamente.
-
gracias, el comando Inkscape parece funcionar, sin embargo, solo convierte la primera página, ¿conoce alguna opción de línea de comando que produzca 1 svg para cada página?
– usuario434541
8 de noviembre de 2010 a las 18:20
-
No conozco una forma de hacerlo, y la página de manual de Inkscape no parece indicar que esta funcionalidad esté expuesta en la interfaz de línea de comandos. Supongo que sus opciones serían agregar esta interfaz usted mismo modificando el código de Inkscape. O bien, podría hacer algo muy ingenioso y creativo, y usar un programa como ghostscript para dividir el PDF en varios documentos de una sola página y luego enviar cada página individualmente a Inkscape.
– jbarba4
9 de noviembre de 2010 a las 2:06
-
Probablemente, la mejor solución sea dividir el archivo pdf en un archivo por página. Tanto pdfjam como pdftk pueden hacer esto.
– hlovdal
28 de agosto de 2011 a las 22:27
-
La respuesta de @ Koen apunta a pdf2svg, que puede hacer varias páginas:
pdf2svg input.pdf output_page%d.svg all
– alxndr
10 de febrero de 2013 a las 5:53
-
Usé el enfoque de línea de comandos de Inkscape, pero las fuentes se ven muy feas en el svg. ¿Hay alguna forma de arreglarlo?
– remo
8 de octubre de 2013 a las 7:51
Koen.
Echa un vistazo a pdf2svg (también en en github):
Usar
pdf2svg <input.pdf> <output.svg> [<pdf page no. or "all" >]
Cuando usas all
dar un nombre de archivo con %d
en él (que será reemplazado por el número de página).
pdf2svg input.pdf output_page%d.svg all
Y para solucionar algunos problemas, consulte:
http://www.calcmaster.net/personal_projects/pdf2svg/
-
Había estado usando pdf2svg pero acabo de descubrir que es mucho más una aproximación que inkscape. Específicamente, pierde detalles al renderizar círculos pequeños (estoy tratando con archivos PDF de 100,000 de rutas). YMMV.
– Aidan Kane
27 de noviembre de 2012 a las 23:18
-
@AidanKane: Por otro lado, pdf2svg funciona mejor que Inkscape para texto; el texto de un archivo de salida de LaTeX no apareció en la salida de Inkscape para mí.
– Caracol mecánico
23 de febrero de 2014 a las 21:15
-
@Mechanicalsnail: ahora tengo mucha más experiencia con esto. Tiene razón, hay momentos en los que he encontrado cosas que faltan en las conversiones de Inkscape, y pdf2svg está bien. pdf2svg se actualizó para llamar a una función diferente en el cairo para realizar la representación (lo que solucionó el problema que describí anteriormente). Desafortunadamente, eso tiene el costo de no tener texto en svgs: todos los glifos se convierten en rutas. Parcheé cairo y poppler para que el texto volviera a funcionar, pero no confío totalmente en mi truco 🙂
– Aidan Kane
23 de febrero de 2014 a las 23:19
-
tanto inkscape como dvisvgm no pueden crear un svg correcto a partir de látex. pdf2svg puede.
– ivo Welch
1 de marzo de 2014 a las 22:23
supernova
pdftocairo
se puede utilizar para convertir PDF a SVG.
es parte de poppler-utils que se puede instalar desde PyPI a través de pip
construido desde git, o a través del administrador de paquetes de su sistema operativo (por ejemplo, ubuntu/deb lo tiene bajo este mismo nombre).
Por ejemplo, para convertir la segunda página de un PDF, se puede ejecutar el siguiente comando:
pdftocairo -svg -f 1 -l 1 input.pdf
-
Su comando convertirá la “primera” página, no la “segunda”.
– s.ouchene
20 de enero de 2022 a las 9:44
señordrmccoy
He encontrado problemas con las herramientas sugeridas inkscape, pdf2svg o pdftocairo, así como con las herramientas convert y mutool no sugeridas, al intentar convertir archivos PDF grandes y complejos, como algunos de los mapas topográficos del USGS. A veces se bloqueaban, otras veces producían archivos enormemente inflados.
La única herramienta de conversión de PDF a SVG que pudo manejarlos todos correctamente para mi caso de uso fue dvisvgm. Usarlo es muy simple:
dvisvgm --pdf --output=file.svg file.pdf
Tiene varias opciones adicionales para manejar cómo se convierten los elementos, así como para la optimización. Sus archivos resultantes se pueden compactar aún más mediante limpiador de svg si es necesario sin pérdida de calidad perceptiva.
Leblanc Meneses
Puede usar bash en un entorno * nix.
La operación de ráfaga divide cada página del PDF en archivos. to-svg.sh recorre estos PDF de una sola página para generar el archivo SVG asociado
pdftk 82page.pdf burst
sh to-svg.sh
contenidos de to-svg.sh
#!/bin/bash
FILES=burst/*
for f in $FILES
do
inkscape -l "$f.svg" "$f"
done
daniel t
Inkscape no funciona con el -l
opción más. Decía “No se puede abrir el archivo: /out.svg (no existe)”. La forma larga de esa opción está en la página del manual como --export-plain-svg
y funciona, pero muestra una advertencia de desaprobación. Pude arreglar y actualizar el comando usando el -o
opción en Inkscape 1.1.2-3ubuntu4:
inkscape in.pdf -o out.svg
Relacionado: ¿Convertir PDF a SVG limpio?
– TylerH
15 de mayo a las 19:22
Tenga en cuenta que las solicitudes de recomendación de herramientas están fuera de tema en Stack Overflow. Desafortunadamente, cada una de las respuestas a continuación hasta la fecha es una recomendación de herramienta, por lo que eliminar esa solicitud por completo de la publicación anterior invalidaría esas respuestas, que es algo que no está permitido aquí. Con suerte, mis mejoras a la pregunta permitirán que permanezca salvada y, al mismo tiempo, eviten que aparezcan más respuestas de “usar Inkscape” aquí.
– TylerH
15 de mayo a las 19:24