Ich versuche, ein PDF in SVG umzuwandeln. Das von mir verwendete Programm ordnet jedoch derzeit einen Pfad für jeden Buchstaben in jedem Textstück zu, dh, wenn ich den Text in der Quelldatei ändere sieht es hässlich aus.
Ich habe mich gefragt, was der sauberste PDF zu SVG-Konverter ist, hoffentlich einer, der keinen Pfad für Textbereiche hat, die einfach keinen brauchen. Wie wir wissen, PDF und SVG sind sich ziemlich ähnlich, daher gehe ich davon aus, dass es einige gute Konverter gibt.
Inkscape wird von vielen Wikipedia-Nutzern verwendet, um PDF zu SVG zu konvertieren.
Sie haben sogar eine praktische Anleitung dazu!
Sie können Inkscape nur in der Befehlszeile verwenden, ohne eine GUI zu öffnen. Versuche dies:
inkscape \
--without-gui \
--file=input.pdf \
--export-plain-svg=output.svg
Um eine vollständige Liste aller Befehlszeilenoptionen zu erhalten, führen Sie inkscape --help
Aus.
Ich verwende derzeit PDFBox , das eine gute Unterstützung für die Grafikausgabe bietet. Es gibt eine gute Unterstützung für das Extrahieren der Vektorstriche und auch für das Verwalten von Schriftarten. Es gibt einige gute Tools zum Ausprobieren (z. B. wird PDFReader als Java Graphics2D) angezeigt). Sie können das Grafik-Tool mit einem SVG-Tool wie Batik abfangen (ich mache das und es gibt eine gute Aufnahme).
Es gibt keine einfache Möglichkeit, alle Dateien PDF nach SVG zu konvertieren - dies hängt von der Strategie und den Tools ab, mit denen die PDF-Dateien erstellt wurden. Einige Texte werden in Vektoren konvertiert und können nicht einfach rekonstruiert werden. Sie müssen installieren Vektor-Schriftarten und suchen Sie nach ihnen.
UPDATE: Ich habe dies nun zu einem Paket PDF2SVG entwickelt, das Batik nicht mehr verwendet:
das auf einer Reihe von PDFs getestet wurde. Es erzeugt eine SVG-Ausgabe bestehend aus
<svg:text>
pro Zeichen<svg:path>
<svg:image>
Spätere Pakete werden (hoffentlich) die Zeichen in laufenden Text und die Pfade zu übergeordneten Grafikobjekten konvertieren
UPDATE: Wir können jetzt aus den SVG-Zeichen wieder laufenden Text erstellen. Wir haben auch Diagramme in domänenspezifisches XML konvertiert (z. B. chemische Spektren). Siehe https://bitbucket.org/petermr/svg2xml-dev . Es ist immer noch in Alpha, aber es bewegt sich mit einer nützlichen Geschwindigkeit. Jeder kann mitmachen!
AKTUALISIEREN. (@Tim Kelty) Wir arbeiten weiterhin an PDF2SVG und nachgelagerten Tools, die (eingeschränkt) Java OCR und die Erstellung übergeordneter Grafikprimitive (Pfeile, Kästchen usw.) ausführen. Siehe - https://bitbucket.org/petermr/imageanalysishttps://bitbucket.org/petermr/diagramanalyzerhttps://bitbucket.org/petermr/norma) und https://bitbucket.org/petermr/AMI-core Dies ist ein finanziertes Projekt zur Erfassung von 100 Millionen Fakten aus der wissenschaftlichen Literatur (contentmine.org), von denen ein Großteil PDF ist.
Dieses Thema ist ziemlich alt, aber hier ist eine praktische Lösung, die ich gefunden habe:
http://www.cityinthesky.co.uk/opensource/pdf2svg/
Es bietet ein Tool, pdf2png, das nach der Installation genau die Aufgabe in der Befehlszeile erledigt. Ich habe es bisher mit einwandfreien Ergebnissen getestet, auch mit Bitmaps.
EDIT: Mein Fehler, dieses Tool wandelt auch Buchstaben in Pfade um, so dass es die ursprüngliche Frage nicht anspricht. Es macht jedoch trotzdem einen guten Job und kann für jeden nützlich sein, der nicht beabsichtigt, den Code in der SVG-Datei zu ändern, also werde ich den Beitrag verlassen.
Hier ist der Prozess, den ich letztendlich verwendet habe. Das Hauptwerkzeug, das ich benutzte, war Inkscape, das in der Lage war, Text in Ordnung zu konvertieren.
Mit Adobe Acrobat Pro Actions (ehemals Batch Processing) können Sie eine benutzerdefinierte Aktion erstellen, um PDF Seiten in separate Dateien zu trennen. Alternativ können Sie PDFs möglicherweise mit GhostScript aufteilen
/* 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"
});
};
Mit Windows Cmd erstellte Batch-Datei, um alle PDF Dateien in einem Ordner zu durchlaufen und sie in SVG zu konvertieren
:: ===== 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"
Mir ist klar, dass es nicht empfehlenswert ist, SVG- oder XML-Tags oder -Attribute aufgrund möglicher Abweichungen manuell mit Gewalt zu bearbeiten, und dass stattdessen ein XML-Parser verwendet werden sollte. Ich hatte jedoch ein einfaches Problem, bei dem die Strichbreite in einer Zeichnung sehr klein war und in einer anderen die Schriftfamilie falsch identifiziert wurde. Daher habe ich das vorherige Windows Cmd-Stapelskript grundlegend geändert, um ein einfaches Suchen und Ersetzen durchzuführen. Die einzigen Änderungen betrafen die Definitionen der Suchzeichenfolgen und das Aufrufen eines PowerShell-Befehls. Der PowerShell-Befehl führt ein Suchen und Ersetzen durch und speichert die geänderte Datei mit einem hinzugefügten Suffix. Ich habe einige andere Referenzen gefunden, die besser zum Parsen oder Ändern der resultierenden SVG-Dateien verwendet werden könnten, wenn eine andere geringfügige Bereinigung durchgeführt werden muss.
:: 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%'"
Hoffe das könnte jemandem helfen
Bash-Skript zum Konvertieren jeder Seite eines PDF in eine eigene SVG-Datei.
#!/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
Verwenden Sie zum Generieren in PNG --export-png
Usw.
Wenn DVI zu SVG eine Option ist, können Sie auch dvisvgm verwenden, um eine DVI-Datei in eine SVG-Datei zu konvertieren. Dies funktioniert beispielsweise perfekt für LaTeX-Formeln (mit der Option --no-fonts
):
dvisvgm --no-fonts input.dvi -o output.svg
Es gibt auch pdf2svg , das Poppler und Cairo verwendet, um ein PDF in SVG zu konvertieren. Als ich das versuchte, wurde die SVG perfekt in inkscape
gerendert.
Ich fand, dass xfig
hervorragende Arbeit geleistet hat:
pstoedit -f fig foo.pdf foo.fig
xfig foo.fig
export to svg
Es hat viel bessere Arbeit geleistet als inkscape. Eigentlich war es wahrscheinlich pdtoedit, das es getan hat.
Hier ist die NodeJS REST api for two PDF Render-Skripte. https://github.com/pumppi/pdf2images
Skripte sind: pdf2svg und Imagemagicks convert