2010-11-08 7 views
39

Voglio convertire PDF in SVG per favore suggerire alcune librerie/eseguibili che saranno in grado di farlo in modo efficiente. Ho scritto il mio programma Java utilizzando le librerie Apache PDFBox e Batik -convertire pdf in formato 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); 
    } 

Questa soluzione funziona grande, ma la dimensione dei file risultanti SVG in enorme (molte volte superiore alla pdf).. Ho capito dove si trova il problema guardando lo svg in un editor di testo. racchiude ogni carattere nel documento originale nel suo blocco anche se le proprietà dei caratteri dei caratteri sono le stesse. Ad esempio la parola ciao apparirà come 6 diversi blocchi di testo. C'è un modo per correggere il codice sopra? oppure, per favore, suggerire un'altra soluzione che funzioni in modo più efficiente.

risposta

49

Inkscape può anche essere utilizzato per convertire PDF in SVG. In realtà è straordinariamente bravo in questo, e anche se il codice che genera è un po 'gonfio, per lo meno, non sembra avere il particolare problema che si sta incontrando nel tuo programma. Penso che sarebbe difficile integrarlo direttamente in Java, ma inkscape fornisce una comoda interfaccia a riga di comando per questa funzionalità, quindi probabilmente il modo più semplice per accedervi sarebbe tramite una chiamata di sistema.

usare l'interfaccia a linea di comando di Inkscape per convertire un PDF in un file SVG, utilizzare:

inkscape -l out.svg in.pdf 

che sarà poi possibile probabilmente chiamata utilizzando:

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

penso exec() è sincrono e ritorna solo dopo il completamento del processo (anche se non ne sono sicuro al 100%), quindi sarà sufficiente leggere "out.svg" dopo. In ogni caso, con Google "chiamata di sistema java" verranno fornite maggiori informazioni su come eseguire correttamente questa parte.

+0

grazie che il comando Inkscape sembra funzionare ma converte solo la prima pagina, do u know di un'opzione della riga di comando che produrrà 1 svg per ogni pagina? – user434541

+1

Non conosco un modo per farlo, e la pagina man di inkscape non sembra indicare che questa funzionalità è esposta nell'interfaccia della riga di comando. Suppongo che le tue opzioni siano di aggiungere questa interfaccia tu stesso modificando il codice inkscape. Oppure, si potrebbe fare qualcosa di molto hacky e creativo, e usare un programma come ghostscript per dividere il PDF in più documenti a pagina singola, e quindi alimentare ciascuna pagina individualmente in inkscape. – jbeard4

+1

Probabilmente la soluzione migliore è quella di dividere il file pdf in un file per pagina. Sia pdfjam che pdftk possono farlo. – hlovdal

30

Date un'occhiata a pdf2svg:

Per utilizzare

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

Quando si utilizza all dare un nome di file con %d in esso (che sarà sostituito dal numero di pagina).

pdf2svg input.pdf output_page%d.svg all 

E per qualche risoluzione dei problemi vedono: http://www.calcmaster.net/personal_projects/pdf2svg/

+3

Ho usato pdf2svg, ma ho appena scoperto che è molto più approssimativo di inkscape. Nello specifico, perdi i dettagli quando esegui il rendering di cerchi di piccole dimensioni (mi occupo di pdf di 100.000 di percorsi). YMMV. –

+2

@AidanKane: D'altra parte, pdf2svg fa meglio di Inkscape per il testo; il testo da un file di output LaTeX non è stato visualizzato nell'output di Inkscape. –

+0

@Mechanicalsnail: ora ho molta più esperienza in questo. Hai ragione, ci sono volte in cui ho trovato cose che mancano nelle conversioni di inkscape e pdf2svg va bene. pdf2svg è stato aggiornato per chiamare una funzione diversa in cairo per eseguire il rendering (che ha risolto il problema descritto in precedenza). Sfortunatamente ciò non ha alcun testo in svg: tutti i glifi vengono convertiti in percorsi. Ho aggiustato cairo e poppler per far funzionare di nuovo il testo, ma non mi fido del mio trucco :) –

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

contenuto di to-svg.sh

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