web-dev-qa-db-fra.com

Convertir PDF pour nettoyer le SVG?

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

Je me demandais quel était le convertisseur de PDF le plus propre en SVG, espérons-le, qui n'a pas de chemin d'accès 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.

106
DanRedux

De nombreuses personnes sur Wikipedia utilisent Inkscape pour convertir 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

82

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

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

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

81
Kurt Pfeifle

J'utilise actuellement PDFBox qui supporte bien la sortie graphique. L’extraction des traits vectoriels et la gestion des polices sont bien supportées. Il existe de bons outils pour l'essayer (par exemple, PDFReader s'affichera sous la forme Java Graphics2D). Vous pouvez intercepter l'outil graphique avec un outil SVG tel que Batik (je le fais et cela donne une bonne capture).

Il n’existe pas de moyen simple de convertir tous les PDF au format SVG. Cela dépend de la stratégie et des outils utilisés pour créer les fichiers PDF. Certains textes sont convertis en vecteurs et ne peuvent pas être facilement reconstruits. Vous devez installer des polices vectorielles et les rechercher.

UPDATE: 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 en tant que <svg:image>

Les derniers paquets vont (espérons-le) convertir les caractères en texte courant et les chemins d'accès aux objets graphiques de niveau supérieur

UPDATE: Nous pouvons maintenant recréer du texte courant à partir des caractères SVG. Nous avons également converti des diagrammes en XML spécifique à un domaine (spectres chimiques, par exemple). Voir https://bitbucket.org/petermr/svg2xml-dev . Il est toujours en Alpha, mais avance à une vitesse utile. Tout le monde peut participer!

MISE À JOUR. (@Tim Kelty) Nous continuons à travailler sur PDF2SVG ainsi que sur des outils en aval qui effectuent (de manière limitée) Java OCR et la création de primitives graphiques de niveau supérieur (flèches, zones, etc.) Voir https://bitbucket.org/petermr/imageanalysishttps://bitbucket.org/petermr/diagramanalyzerhttps://bitbucket.org/petermr/norma et https://bitbucket.org/petermr/AMI-core . Il s'agit d'un projet financé visant à recueillir 100 millions de faits tirés de la littérature scientifique (contentmine.org), dont une grande partie est au format PDF.

21
peter.murray.rust

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

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

Il offre 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, il fait quand même un bon travail et peut être utile à tous ceux qui n’ont pas l’intention de modifier le code dans le fichier svg, je vais donc laisser le message.

18
pierre

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

  • utilisé des actions Adobe Acrobat Pro avec JavaScript pour scinder les feuilles PDF
  • a exécuté Inkscape Portable 0.48.5 à partir de Windows Cmd pour convertir en SVG
  • modifié manuellement un attribut XML SVG 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 d'Adobe Acrobat Pro Actions (anciennement Traitement par lots), créez une action personnalisée pour séparer les pages PDF en fichiers séparés. Sinon, vous pourrez peut-être séparer des PDF avec GhostScript.

Acrobat JavaScript Action pour diviser des 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: fichier de commandes Inkscape avec Windows CMD

Utilisation du fichier de commandes créé par Windows Cmd pour parcourir tous les fichiers PDF d'un dossier et les convertir au format SVG

Fichier de commandes pour convertir 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 la meilleure pratique de modifier manuellement la force brute des balises ou attributs SVG ou XML en raison de variations potentielles et que je devrais utiliser plutôt un analyseur XML. Cependant, un problème simple se posait: la largeur de trait sur un dessin était très petite et, sur un autre, la famille de polices était mal identifiée. J'ai donc modifié le script de traitement par lots précédent de Windows Cmd pour effectuer une recherche et un remplacement simples. Les seules modifications ont été apportées aux définitions de chaîne de recherche et à l'appel d'une commande PowerShell. La commande PowerShell effectuera une recherche, remplacera et sauvegardera 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 devait être effectué.

Modifications pour rechercher et remplacer manuellement des 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 aux pages séparées

Références GhostScript pour séparer les pages

Références de ligne de commande Inkscape pour la conversion de PDF à SVG

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

Recherche sur le remplacement des balises/attributs XML

9
ClearBlueSky85

Script Bash pour convertir chaque page d'un PDF dans 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, utilisez --export-png, etc ...

7
Alain Pannetier

Si DVI en 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 l'option --no-fonts):

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

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

6
dhaumann

J'ai trouvé que xfig faisait un excellent travail:

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

export to svg

Il a fait beaucoup mieux que Inkscape. En fait, c’est probablement pdtoedit qui l’a fait.

1
user877329

Voici l’API NodeJS REST pour deux scripts de rendu PDF. https://github.com/pumppi/pdf2images

Les scripts sont: pdf2svg et Imagemagicks convert

0
user257980