Convertir un PDF en SVG propre? [fermé]


114

J'essaye de convertir un PDF en SVG. Cependant, celui que j'utilise actuellement mappe un chemin pour chaque lettre dans chaque morceau de texte, ce qui signifie que si je change le texte dans son fichier source, il a l'air moche.

Je me demandais quel est le convertisseur PDF en SVG le plus propre, j'espère qu'il n'a pas de chemin pour ses zones de texte qui n'en ont tout simplement pas besoin. Comme nous le savons, PDF et SVG sont assez similaires, donc je suppose qu'il existe de bons convertisseurs.


11
"Comme nous le savons, PDF et SVG sont assez similaires ..." ?!?!? Dans ce cas, vous en savez beaucoup plus que moi ...
Kurt Pfeifle

22
Ils sont similaires en ce sens qu'ils sont tous deux des formats vectoriels. C'est là que s'arrête la comparaison, je crois.
Frank Rem

1
Je suppose qu'ils utilisent tous les deux beaucoup de positionnement absolu du texte.
Bryan Field

Est-ce que quelqu'un fait cela avec des PDF interactifs (champ de formulaire) afin qu'ils restent interactifs dans le navigateur, superposant peut-être les INPUT sur le SVG rendu?
Tim du

Réponses:


84

Inkscape est utilisé par de nombreuses personnes sur Wikipédia pour convertir des PDF en SVG.

http://inkscape.org/

Ils ont même un guide pratique sur la façon de le faire!

http://en.wikipedia.org/wiki/Wikipedia:Graphic_Lab/Resources/PDF_conversion_to_SVG#Conversion_with_Inkscape


4
Inkscape ne fonctionne pas très bien, car il transforme également le texte en chemins. Je trouve également qu'ils perdent souvent les données de police, mais ne semblent pas se rapprocher d'une bonne police installée. Comment le PDF l'affiche-t-il si SVG ne le peut pas?
DanRedux

C'est une bonne question, je suis familier avec les deux formats mais je n'ai pas fait beaucoup de recherches sur le sujet. Je vais peut-être y jeter un coup d'œil. Il pense que cela peut se résumer à la façon dont les deux formats sont construits. SVG par exemple est construit avec XML tandis que PDF utilise son propre format de type XML.
Saintt Sheldon Patnett

3
Eh bien, la raison pour laquelle je veux cela, c'est parce que je veux pouvoir éditer le texte en utilisant PHP. Je pourrais le faire directement avec PDF, mais le PDF ne peut pas être facilement intégré dans HTML, mais SVG le peut. Je peux simplement m'en tenir au PDF et le convertir en JPG en PHP après avoir modifié ses valeurs.
DanRedux

8
@DanRedux: AFAIK, vous pouvez désactiver la conversion «textes de polices en chemins» dans Inkscape. Sur la ligne de commande Inkscape vous permettra cette conversion en ajoutant --export-text-to-path.
Kurt Pfeifle

1
Cela peut être évident, mais Illustrator peut convertir un PDF en SVG. Je suis venu ici, j'ai téléchargé Inkscape puis j'ai réalisé que j'avais Illustrator. en.wikipedia.org/wiki/Wikipedia:Graphics_Lab/Resources/…
E. Sundin

83

Vous pouvez utiliser Inkscape uniquement sur la ligne de commande, sans ouvrir une interface graphique. Essaye ça:

inkscape \
  --without-gui \
  --file=input.pdf \
  --export-plain-svg=output.svg 

Pour une liste complète de toutes les options de ligne de commande, exécutez inkscape --help.


Cela supprime l'espace dans le texte pour moi.
MaxNoe

1
@MaxNoe: C'est tout à fait possible - mais alors c'est une "propriété" de la façon dont ce PDF particulier est construit, en interne. Pour quelques explications sur les difficultés liées à la reconnaissance et à l'extraction de "texte" à partir de PDF, consultez mes fichiers PDF codés à la main (avec les commentaires intégrés) sur GitHub . (Ouvrez-les dans un éditeur de texte de votre choix ainsi que dans une visionneuse PDF et copiez-collez le texte des fichiers.)
Kurt Pfeifle

Ouais, je pense que cela a à voir avec la façon dont tex rend les espaces, sous forme de boîtes.
MaxNoe

23

J'utilise actuellement PDFBox qui a un bon support pour la sortie graphique. Il existe un bon support pour l'extraction des traits vectoriels et également pour la gestion des polices. Il existe de bons outils pour l'essayer (par exemple, PDFReader s'affichera en tant que Java Graphics2D). Vous pouvez intercepter l'outil graphique avec un outil SVG comme Batik (je fais cela et cela donne une bonne capture).

Il n'y a pas de moyen simple de convertir tous les PDF en SVG - cela dépend de la stratégie et des outils utilisés pour créer les PDF. Certains textes sont convertis en vecteurs et ne peuvent pas être facilement reconstruits - vous devez installer des polices vectorielles et les rechercher.

MISE À JOUR: J'ai maintenant développé ceci dans un package PDF2SVG qui n'utilise plus Batik:

qui a été testé sur une gamme de PDF. Il produit une sortie SVG composée de

  • caractères comme un <svg:text>par caractère
  • chemins comme <svg:path>
  • images comme <svg:image>

Les packages ultérieurs convertiront (espérons-le) les caractères en texte courant et les chemins en objets graphiques de niveau supérieur

MISE À JOUR: Nous pouvons maintenant recréer le texte courant à partir des caractères SVG. Nous avons également converti les diagrammes en XML spécifiques au domaine (par exemple, les spectres chimiques). Voir https://bitbucket.org/petermr/svg2xml-dev . Il est toujours en Alpha, mais se déplace à une vitesse utile. Tout le monde peut participer!

METTRE À JOUR. (@Tim Kelty) Nous continuons à travailler sur PDF2SVG ainsi que sur des outils en aval qui font (limité) l'OCR Java et la création de primitives graphiques de plus haut niveau (flèches, boîtes, etc.) Voir https://bitbucket.org/petermr/ imageanalysis https://bitbucket.org/petermr/diagramanalyzer https://bitbucket.org/petermr/norma et https://bitbucket.org/petermr/ami-core . Il s'agit d'un projet financé pour capturer 100 millions de faits de la littérature scientifique (contentmine.org), dont une grande partie est PDF.


19

Ce sujet est assez ancien, mais voici une solution pratique que j'ai trouvée:

http://www.cityinthesky.co.uk/opensource/pdf2svg/

Il propose un outil, pdf2png, qui une fois installé fait exactement le travail en ligne de commande. Je l'ai testé avec des résultats irréprochables jusqu'à présent, y compris avec des bitmaps.

EDIT: Mon erreur, cet outil convertit également les lettres en chemins, donc il ne répond pas à la question initiale. Cependant, cela fait du bon travail quand même, et peut être utile à quiconque n'a pas l'intention de modifier le code dans le fichier svg, alors je vais laisser le message.


Sur Ubuntu, vous pouvez l'installer avec: $ sudo apt-get install pdf2svg
tvw

2
Bien qu'il convertisse les lettres en chemins, les résultats sont excellents. Pour faire quelques modifications, j'avais l'habitude d'éditer les SVG directement avec un éditeur. Si vous les ouvrez et les enregistrez avec inkscape en tant que SVG inkscape, le code est meilleur et vous avez des identifiants d'objet, pour trouver facilement les entités que vous souhaitez modifier.
tvw

1
Vous pouvez l'installer sur Mac avec brew install pdf2svg.
Colas

10

Voici le processus que j'ai fini par utiliser. L'outil principal que j'ai utilisé était Inkscape qui était capable de convertir le texte correctement.

  • utilisé les actions d'Adobe Acrobat Pro avec JavaScript pour fractionner les feuilles PDF
  • a exécuté Inkscape Portable 0.48.5 à partir de Windows Cmd pour convertir en SVG
  • apporté des modifications manuelles à un attribut XML SVG particulier avec lequel j'avais des problèmes en utilisant Windows Cmd et Windows PowerShell

Pages séparées: Adobe Acrobat Pro avec JavaScript

À l'aide des actions Adobe Acrobat Pro (anciennement Traitement par lots), créez une action personnalisée pour séparer les pages PDF en fichiers séparés. Vous pouvez également diviser des PDF avec GhostScript

Action JavaScript Acrobat pour diviser les pages

/* Extract Pages to Folder */

var re = /.*\/|\.pdf$/ig;
var filename = this.path.replace(re,"");

{
    for ( var i = 0;  i < this.numPages; i++ )
    this.extractPages
     ({
        nStart: i,
        nEnd: i,
        cPath : filename + "_s" + ("000000" + (i+1)).slice (-3) + ".pdf"
    });
};

Conversion de PDF en SVG: Inkscape avec fichier de commandes Windows CMD

L'utilisation de Windows Cmd a créé un fichier de commandes pour parcourir tous les fichiers PDF d'un dossier et les convertir en SVG

Fichier batch pour convertir le PDF en SVG dans le dossier actuel

:: ===== SETUP =====
@echo off
CLS
echo Starting SVG conversion...
echo.

:: setup working directory (if different)
REM set "_work_dir=%~dp0"
set "_work_dir=%CD%"

:: setup counter
set "count=1"

:: setup file search and save string
set "_work_x1=pdf"
set "_work_x2=svg"
set "_work_file_str=*.%_work_x1%"

:: setup inkscape commands
set "_inkscape_path=D:\InkscapePortable\App\Inkscape\"
set "_inkscape_cmd=%_inkscape_path%inkscape.exe"

:: ===== FIND FILES IN WORKING DIRECTORY =====
:: Output from DIR last element is single  carriage return character. 
:: Carriage return characters are directly removed after percent expansion, 
:: but not with delayed expansion.

pushd "%_work_dir%"
FOR /f "tokens=*" %%A IN ('DIR /A:-D /O:N /B %_work_file_str%') DO (
    CALL :subroutine "%%A"
)
popd

:: ===== CONVERT PDF TO SVG WITH INKSCAPE =====

:subroutine
echo.
IF NOT [%1]==[] (

    echo %count%:%1
    set /A count+=1

    start "" /D "%_work_dir%" /W "%_inkscape_cmd%" --without-gui --file="%~n1.%_work_x1%" --export-dpi=300 --export-plain-svg="%~n1.%_work_x2%"

) ELSE (
    echo End of output
)
echo.

GOTO :eof

:: ===== INKSCAPE REFERENCE =====

:: print inkscape help
REM "%_inkscape_cmd%" --help > "%~dp0\inkscape_help.txt"
REM "%_inkscape_cmd%" --verb-list > "%~dp0\inkscape_verb_list.txt"

Attributs de nettoyage: Windows Cmd et PowerShell

Je me rends compte que ce n'est pas une bonne pratique de modifier manuellement les balises ou attributs SVG ou XML en raison de variations potentielles et que je devrais utiliser un analyseur XML à la place. Cependant, j'ai eu un problème simple où la largeur du trait sur un dessin était très petite et sur un autre la famille de polices était incorrectement identifiée, j'ai donc fondamentalement modifié le script de commandes Windows Cmd précédent pour faire une simple recherche et remplacement. Les seuls changements concernaient les définitions de chaîne de recherche et la modification pour appeler une commande PowerShell. La commande PowerShell effectuera une recherche et un remplacement et enregistrera le fichier modifié avec un suffixe ajouté. J'ai trouvé d'autres références qui pourraient être mieux utilisées pour analyser ou modifier les fichiers SVG résultants si un autre nettoyage mineur est nécessaire.

Modifications pour rechercher et remplacer manuellement les données XML SVG

:: setup file search and save string
set "_work_x1=svg"
set "_work_x2=svg"
set "_work_s2=_mod"
set "_work_file_str=*.%_work_x1%"

powershell -Command "(Get-Content '%~n1.%_work_x1%') | ForEach-Object {$_ -replace 'stroke-width:0.06', 'stroke-width:1'} | ForEach-Object {$_ -replace 'font-family:Times Roman','font-family:Times New Roman'} | Set-Content '%~n1%_work_s2%.%_work_x2%'"

J'espère que cela pourrait aider quelqu'un

Références

Actions Adobe Acrobat Pro et références JavaScript à des pages séparées

Références GhostScript à des pages séparées

Références de ligne de commande d'Inkscape pour la conversion de PDF en SVG

Références de script de fichier batch Windows Cmd

Recherche de remplacement de balises / attributs XML


7

Si DVI to SVG est une option, vous pouvez également utiliser dvisvgm pour convertir un fichier DVI en fichier SVG. Cela fonctionne parfaitement par exemple pour les formules LaTeX (avec option --no-fonts):

dvisvgm --no-fonts input.dvi -o output.svg

Il existe également pdf2svg qui utilise poppler et Cairo pour convertir un pdf en SVG. Quand j'ai essayé cela, le SVG était parfaitement rendu inkscape.


1
J'ai un PDF qui rend certains symboles LaTeX du paquet skak (pièces d'échecs). Ce fichier particulier n'est pas bien géré dans Inkscape, puisque les symboles deviennent des lettres Arial ... J'ai des résultats corrects avec pdf2svg.
LRMAAX

Pour les systèmes Windows, il existe un ensemble d'outils binaires compilés ici: Poppler pour Windows .
Paolo Gibellini

7

Script Bash pour convertir chaque page d'un PDF en son propre fichier SVG.

#!/bin/bash
#
#  Make one PDF per page using PDF toolkit.
#  Convert this PDF to SVG using inkscape
#

inputPdf=$1

pageCnt=$(pdftk $inputPdf dump_data | grep NumberOfPages | cut -d " " -f 2)

for i in $(seq 1 $pageCnt); do
    echo "converting page $i..."
    pdftk ${inputPdf} cat $i output ${inputPdf%%.*}_${i}.pdf
    inkscape --without-gui "--file=${inputPdf%%.*}_${i}.pdf" "--export-plain-svg=${inputPdf%%.*}_${i}.svg"
done

Pour générer en png, utiliser --export-png, etc ...


1

J'ai trouvé que cela xfigfaisait un excellent travail:

pstoedit -f fig foo.pdf foo.fig
xfig foo.fig

export to svg

Il a fait un bien meilleur travail qu'inkscape. En fait, c'est probablement pdtoedit qui l'a fait.


En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.