2010-11-08 12 views
39

Quiero convertir PDF a SVG por favor sugiera algunas bibliotecas/ejecutables que podrán hacer esto de manera eficiente. He escrito mi propio programa Java utilizando las bibliotecas Apache PDFBox y Batik -convertir pdf a svg

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 muy bien, pero el tamaño de los archivos SVG que resultan en grandes (muchas veces mayor que el PDF).. He descubierto dónde está el problema mirando el svg en un editor de texto. incluye todos los caracteres del documento original en su propio 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 forma de corregir el código anterior? o sugiera otra solución que funcione de manera más eficiente.

Respuesta

49

Inkscape también se puede utilizar para convertir PDF a SVG. En realidad es muy bueno en esto, y aunque el código que genera está un poco hinchado, al menos no parece tener el problema particular que estás encontrando en tu programa. Creo que sería un desafío integrarlo directamente en Java, pero inkscape proporciona una interfaz conveniente de línea de comandos para esta funcionalidad, por lo que probablemente la forma más fácil de acceder a ella sea a través de una llamada al sistema.

de usar interfaz de línea de comandos de Inkscape para convertir un PDF a un SVG, utilice:

inkscape -l out.svg in.pdf 

que luego se puede probablemente llamada 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

pienso exec() es sincrónico y solo regresa después de que el proceso se complete (aunque no estoy 100% seguro de eso), por lo que simplemente podrá leer "out.svg" después de eso. En cualquier caso, googlear "java system call" arrojará más información sobre cómo hacer esa parte correctamente.

+0

gracias ese comando inkscape parece funcionar sin embargo, sólo convierte la primera página, do u conocer de una opción de línea de comando que producirá 1 svg para cada página? – user434541

+1

No conozco una forma de hacerlo, y la página man 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 modificando el código de Inkscape. O bien, podría hacer algo muy hacky y creativo, y utilizar un programa como ghostscript para dividir el PDF en múltiples documentos de una sola página, y luego alimentar cada página individualmente a Inkscape. – jbeard4

+1

Probablemente la mejor solución es dividir el archivo pdf en un archivo por página. Tanto pdfjam como pdftk pueden hacer esto. – hlovdal

30

Tome un vistazo a pdf2svg:

Para utilizar

pdf2svg <input.pdf> <output.svg> [<pdf page no. or "all" >] 

Al utilizar all dar un nombre de archivo con %d en ella (que será sustituido por el número de página).

pdf2svg input.pdf output_page%d.svg all 

Y por alguna solución de problemas, véase: http://www.calcmaster.net/personal_projects/pdf2svg/

+3

He estado usando pdf2svg pero acabo de descubrir que es mucho más una aproximación que inkscape. Específicamente, se pierden detalles cuando se renderizan círculos pequeños (estoy lidiando con pdfs de 100,000s de rutas). YMMV. –

+2

@AidanKane: Por otro lado, pdf2svg funciona mejor que Inkscape para texto; el texto de un archivo de salida LaTeX no apareció en la salida de Inkscape para mí. –

+0

@Mechanicalsnail: Tengo mucha más experiencia con esto ahora. Tienes razón, hay momentos en los que he encontrado que faltan cosas en las conversiones de Inkscape, y pdf2svg está bien. pdf2svg se actualizó para llamar a una función diferente en el Cairo para hacer el procesamiento (que solucionó el problema que describí anteriormente). Desafortunadamente, esto tiene el costo de no tener texto en svgs: todos los glifos se convierten en rutas. Reparé el cairo y el poppler para que el texto vuelva a funcionar, pero no confío totalmente en mi hack :) –

1
pdftk 82page.pdf burst 
sh to-svg.sh 

contenido de to-svg.sh

#!/bin/bash 
FILES=burst/* 
for f in $FILES 
do 
    inkscape -l "$f.svg" "$f" 
done