web-dev-qa-db-fra.com

convertir pdf en svg

Je veux convertir PDF en SVG, veuillez suggérer des bibliothèques/exécutables qui pourront le faire efficacement. J'ai écrit mon propre programme Java en utilisant Apache) Bibliothèques PDFBox et 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);
    }

Cette solution fonctionne très bien mais la taille des fichiers svg résultants est énorme (plusieurs fois supérieure au pdf). J'ai compris où est le problème en regardant le svg dans un éditeur de texte. il enferme chaque caractère du document d'origine dans son propre bloc même si les propriétés de police des caractères sont les mêmes. Par exemple, le mot bonjour apparaîtra sous la forme de 6 blocs de texte différents. Existe-t-il un moyen de corriger le code ci-dessus? ou veuillez suggérer une autre solution qui fonctionnera plus efficacement.

47
user434541

Inkscape peut également être utilisé pour convertir PDF en SVG. Il est en fait remarquablement bon dans ce domaine, et bien que le code qu'il génère est un peu gonflé, à tout le moins, il ne semble pas avez le problème particulier que vous rencontrez dans votre programme. Je pense qu'il serait difficile de l'intégrer directement dans Java, mais inkscape fournit une interface de ligne de commande pratique pour cette fonctionnalité, donc probablement le moyen le plus simple d'y accéder serait via un appel système.

Pour utiliser l'interface de ligne de commande d'Inkscape pour convertir un PDF en SVG, utilisez:

inkscape -l out.svg in.pdf

Que vous pourrez ensuite appeler en utilisant:

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

Je pense que exec () est synchrone et ne revient que lorsque le processus est terminé (bien que je ne sois pas sûr à 100% à ce sujet), vous devriez donc pouvoir lire "out.svg" après cela. Dans tous les cas, la recherche sur Google de "l'appel système Java" donnera plus d'informations sur la façon de faire correctement cette partie.

55
jbeard4

Jetez un oeil à pdf2svg :

Pour utiliser

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

Lorsque vous utilisez all donnez un nom de fichier avec %d dedans (qui sera remplacé par le numéro de page).

pdf2svg input.pdf output_page%d.svg all

Et pour un dépannage, voir: http://www.calcmaster.net/personal_projects/pdf2svg/

33
Koen.
pdftk 82page.pdf burst
sh to-svg.sh 

contenu de to-svg.sh

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