57 votes

convertir pdf en svg

Je souhaite convertir un PDF en SVG, merci de me suggérer des librairies/exécutables qui pourront le faire efficacement. J'ai écrit mon propre programme java en utilisant les bibliothèques apache 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 à celle du pdf). J'ai trouvé le problème en regardant le svg dans un éditeur de texte. Il enferme chaque caractère du document original dans son propre bloc même si les propriétés de la police des caractères sont les mêmes. Par exemple, le mot hello apparaîtra sous la forme de 6 blocs de texte différents. Est-ce qu'il y a un moyen de corriger le code ci-dessus ? ou s'il vous plaît, suggérez une autre solution qui fonctionnera plus efficacement.

63voto

jbeard4 Points 5680

Inkscape peut également être utilisé pour convertir des PDF en SVG. Il est en fait remarquablement bon pour cela, et bien que le code qu'il génère soit un peu gonflé, il ne semble pas avoir 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é, de sorte que la façon la plus simple d'y accéder serait probablement par le biais d'un appel système.

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

inkscape -l out.svg in.pdf

Que vous pouvez alors probablement appeler à l'aide :

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 qu'une fois le processus terminé (bien que je n'en sois pas sûr à 100%), donc vous devriez pouvoir lire "out.svg" après cela. Quoi qu'il en soit, en cherchant sur Google "java system call", vous obtiendrez plus d'informations sur la façon de faire cette partie correctement.

0 votes

Merci, cette commande inkscape semble fonctionner mais elle ne convertit que la première page, connaissez-vous une option de ligne de commande qui produira 1 svg pour chaque page ?

1 votes

Je ne connais pas de moyen de le faire, et la page de manuel d'inkscape ne semble pas indiquer que cette fonctionnalité est exposée dans l'interface de ligne de commande. Je suppose que vos options seraient d'ajouter cette interface vous-même en modifiant le code d'inkscape. Ou bien, vous pourriez faire quelque chose de très bricolé et créatif, et utiliser un programme comme ghostscript pour diviser le PDF en plusieurs documents d'une seule page, et ensuite envoyer chaque page individuellement à inkscape.

1 votes

La meilleure solution consiste probablement à diviser le fichier PDF en un fichier par page. pdfjam et pdftk peuvent tous deux le faire.

41voto

Koen. Points 3570

Jetez un coup d'œil à pdf2svg (également sur sur github ) :

Pour utiliser

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

Lors de l'utilisation de all donner un nom de fichier avec %d (qui sera remplacé par le numéro de page).

pdf2svg input.pdf output_page%d.svg all

Et pour certains dépannages, voir : http://www.calcmaster.net/personal_projects/pdf2svg/

5 votes

J'utilisais pdf2svg mais je viens de découvrir qu'il est beaucoup plus approximatif qu'inkscape. En particulier, on perd des détails lors du rendu de petits cercles (j'ai affaire à des pdfs de 100 000 chemins). YMMV.

6 votes

@AidanKane : D'un autre côté, pdf2svg fait mieux qu'Inkscape pour le texte ; le texte d'un fichier de sortie LaTeX n'apparaissait pas dans la sortie d'Inkscape pour moi.

1 votes

@Mechanicalsnail : J'ai beaucoup plus d'expérience dans ce domaine maintenant. pdf2svg a été mis à jour pour appeler une fonction différente dans cairo pour faire le rendu (ce qui a corrigé le problème que j'ai décrit précédemment). Malheureusement, cela a pour conséquence qu'il n'y a pas de texte dans les svgs - tous les glyphes sont convertis en chemins. J'ai patché cairo et poppler pour que le texte fonctionne à nouveau mais je n'ai pas totalement confiance en mon hack :)

11voto

Trying2Learn Points 11

pdftocairo peut être utilisé pour convertir un pdf en svg. pdfcairo fait partie de poppler-utils.

Par exemple, pour convertir la deuxième page d'un document PDF, il faut suivre les étapes suivantes

pdftocairo -svg -f 1 -l 1 input.pdf

2voto

Leblanc Meneses Points 1664
pdftk 82page.pdf burst
sh to-svg.sh 

le contenu de to-svg.sh

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

2voto

MrDrMcCoy Points 204

J'ai rencontré des problèmes avec la proposition de inkscape , pdf2svg , pdftocairo , ainsi que l'option non suggérée convert et mutool lorsqu'il s'agit de convertir des PDF volumineux et complexes tels que certaines cartes topographiques de l'USGS. Parfois, ils se plantaient, d'autres fois, ils produisaient des fichiers massivement gonflés. Le seul outil de conversion de PDF en SVG capable de les gérer correctement dans mon cas d'utilisation était dvisvgm . Son utilisation est très simple :

dvisvgm --pdf --output=file.svg file.pdf

Il dispose de plusieurs options supplémentaires pour gérer la façon dont les éléments sont convertis, ainsi que pour l'optimisation. Les fichiers qui en résultent peuvent être compactés par svgcleaner si nécessaire, sans perte de qualité perceptuelle.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X