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.
De nombreuses personnes sur Wikipedia utilisent Inkscape pour convertir PDF en SVG.
Ils ont même un guide pratique sur la façon de le faire!
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
.
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
<svg:text>
par caractère<svg:path>
<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.
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.
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.
À 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.
/* 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"
});
};
Utilisation du fichier de commandes créé par Windows Cmd pour parcourir tous les fichiers PDF d'un dossier et les convertir au format SVG
:: ===== 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"
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é.
:: 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
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 ...
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
.
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.
Voici l’API NodeJS REST pour deux scripts de rendu PDF. https://github.com/pumppi/pdf2images
Les scripts sont: pdf2svg et Imagemagicks convert