PDF in sauberes SVG konvertieren? [geschlossen]

114

Ich versuche, ein PDF in SVG zu konvertieren. Diejenige, die ich derzeit verwende, ordnet jedoch einen Pfad für jeden Buchstaben in jedem Textstück zu. Wenn ich also den Text in seiner Quelldatei ändere, sieht er hässlich aus.

Ich habe mich gefragt, was der sauberste PDF-zu-SVG-Konverter ist, hoffentlich einer, der keinen Pfad für seine Textbereiche hat, die einfach keinen benötigen. Wie wir wissen, sind PDF und SVG ziemlich ähnlich, daher gehe ich davon aus, dass es einige gute Konverter gibt.

DanRedux
quelle
11
'Wie wir wissen, sind PDF und SVG ziemlich ähnlich ...' ?!?!? In diesem Fall wissen Sie viel mehr als ich ...
Kurt Pfeifle
22
Sie sind in dem Sinne ähnlich, dass sie beide vektorbasierte Formate sind. Hier endet der Vergleich, glaube ich.
Frank Rem
1
Ich nehme an, beide verwenden viel absolute Positionierung von Text.
Bryan Field
Tut jemand dies mit interaktiven (Formularfeld-) PDFs, damit diese im Browser interaktiv bleiben und möglicherweise EINGABEN über die gerenderte SVG-Datei legen?
Tim

Antworten:

84

Inkscape wird von vielen Wikipedia-Nutzern verwendet, um PDF in SVG zu konvertieren.

http://inkscape.org/

Sie haben sogar eine praktische Anleitung dazu!

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

Saintt Sheldon Patnett
quelle
4
Inkscape funktioniert nicht so gut, da es den Text auch in Pfade ändert. Ich finde auch, dass sie oft die Schriftdaten verlieren, aber nicht an eine gute, installierte Schrift heranreichen. Wie wird PDF angezeigt, wenn SVG dies nicht kann?
DanRedux
Das ist eine faire Frage, ich bin mit beiden Formaten vertraut, aber ich habe nicht viel über das Thema recherchiert. Ich kann es mir ansehen. Es wird davon ausgegangen, dass die beiden Formate erstellt werden. SVG wird beispielsweise mit XML erstellt, während PDF ein eigenes XML-Format verwendet.
Saintt Sheldon Patnett
3
Der Grund, warum ich das möchte, ist, dass ich den Text mit PHP bearbeiten möchte. Ich könnte es direkt mit PDF machen, aber PDF kann nicht einfach in HTML eingefügt werden, SVG jedoch. Ich kann einfach bei PDF bleiben und es in PHG in PHP konvertieren, nachdem ich seine Werte bearbeitet habe.
DanRedux
8
@DanRedux: AFAIK, Sie können die Konvertierung von "Schrifttexten in Pfade" in Inkscape deaktivieren. In der Inkscape-Befehlszeile würden Sie diese Konvertierung durch Hinzufügen aktivieren--export-text-to-path .
Kurt Pfeifle
1
Es mag offensichtlich sein, aber Illustrator kann PDF in SVG konvertieren. Kam hierher, lud Inkscape herunter und stellte dann fest, dass ich Illustrator hatte. en.wikipedia.org/wiki/Wikipedia:Graphics_Lab/Resources/…
E. Sundin
83

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 

Führen Sie eine vollständige Liste aller Befehlszeilenoptionen aus inkscape --help.

Kurt Pfeifle
quelle
Dies entfernt Platz im Text für mich.
MaxNoe
1
@MaxNoe: Das ist durchaus möglich - aber dann ist dies eine "Eigenschaft" der Art und Weise, wie diese bestimmte PDF-Datei intern erstellt wird. Einige Erklärungen zu Schwierigkeiten beim Erkennen und Extrahieren von "Text" aus PDFs finden Sie in meinen handcodierten PDF-Dateien (mit den eingebetteten Kommentaren) bei GitHub . (Öffnen Sie sie in einem Texteditor Ihrer Wahl sowie in einem PDF-Viewer und kopieren und fügen Sie Text aus den Dateien ein.)
Kurt Pfeifle
Ja, ich denke, es hat damit zu tun, wie Tex Leerzeichen als Boxen rendert.
MaxNoe
23

Ich verwende derzeit PDFBox, das die Grafikausgabe gut unterstützt. 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. PDFReader wird als Java Graphics2D angezeigt). Sie können das Grafiktool mit einem SVG-Tool wie Batik abfangen (ich mache das und es gibt eine gute Erfassung).

Es gibt keine einfache Möglichkeit, alle PDF-Dateien in SVG zu konvertieren. Dies hängt von der Strategie und den Tools ab, die zum Erstellen der PDF-Dateien verwendet werden. Einige Texte werden in Vektoren konvertiert und können nicht einfach rekonstruiert werden. Sie müssen Vektorschriftarten installieren und nachschlagen.

UPDATE: Ich habe dies jetzt zu einem Paket PDF2SVG entwickelt, das Batik nicht mehr verwendet:

Das wurde auf einer Reihe von PDFs getestet. Es erzeugt eine SVG-Ausgabe bestehend aus

  • Zeichen als eins <svg:text>pro Zeichen
  • Pfade als <svg:path>
  • Bilder als <svg:image>

Spätere Pakete konvertieren (hoffentlich) die Zeichen in laufenden Text und die Pfade zu übergeordneten Grafikobjekten

UPDATE: Wir können jetzt laufenden Text aus den SVG-Zeichen neu 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, bewegt sich aber mit einer nützlichen Geschwindigkeit. Jeder kann mitmachen!

AKTUALISIEREN. (@Tim Kelty) Wir arbeiten weiterhin an PDF2SVG und an nachgeschalteten Tools, die (eingeschränkte) Java-OCR und die Erstellung übergeordneter Grafikprimitive (Pfeile, Kästchen usw.) durchführen. Siehe https://bitbucket.org/petermr/ Imageanalyse https://bitbucket.org/petermr/diagramanalyzer https://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.

peter.murray.rust
quelle
19

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.

BEARBEITEN: Mein Fehler, dieses Tool konvertiert auch Buchstaben in Pfade, sodass die ursprüngliche Frage nicht beantwortet wird. 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.

Pierre
quelle
Unter Ubuntu können Sie es installieren mit: $ sudo apt-get install pdf2svg
tvw
2
Obwohl es Buchstaben in Pfade konvertiert, sind die Ergebnisse großartig. Um einige Änderungen vorzunehmen, habe ich die SVGs direkt mit einem Editor bearbeitet. Wenn Sie sie mit inkscape als inkscape-SVG öffnen und speichern, sieht der Code besser aus und Sie haben Objekt-IDs, um die zu ändernden Entitäten leicht zu finden.
TVW
1
Sie können es auf einem Mac mit installieren brew install pdf2svg.
Colas
10

Hier ist der Prozess, den ich letztendlich verwendet habe. Das Hauptwerkzeug, das ich benutzte, war Inkscape, das Text in Ordnung konvertieren konnte.

  • verwendete Adobe Acrobat Pro-Aktionen mit JavaScript, um die PDF-Blätter aufzuteilen
  • führte Inkscape Portable 0.48.5 von Windows Cmd aus, um es in SVG zu konvertieren
  • Ich habe einige manuelle Änderungen an einem bestimmten SVG-XML-Attribut vorgenommen, mit dem ich Probleme hatte, indem ich Windows Cmd und Windows PowerShell verwendet habe

Separate Seiten: Adobe Acrobat Pro mit JavaScript

Erstellen Sie mithilfe von Adobe Acrobat Pro-Aktionen (früher Stapelverarbeitung) eine benutzerdefinierte Aktion, um PDF-Seiten in separate Dateien zu trennen. Alternativ können Sie PDFs möglicherweise mit GhostScript aufteilen

Acrobat JavaScript-Aktion zum Teilen von Seiten

/* 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"
    });
};

PDF-zu-SVG-Konvertierung: Inkscape mit Windows CMD-Batchdatei

Unter Verwendung von Windows Cmd wurde eine Batchdatei erstellt, um alle PDF-Dateien in einem Ordner zu durchlaufen und sie in SVG zu konvertieren

Batch-Datei zum Konvertieren von PDF in SVG im aktuellen Ordner

:: ===== 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"

Bereinigungsattribute: Windows Cmd und PowerShell

Mir ist klar, dass es aufgrund möglicher Abweichungen nicht empfehlenswert ist, SVG- oder XML-Tags oder -Attribute manuell zu bearbeiten, und stattdessen einen XML-Parser verwenden 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-Batch-Skript 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 kleinere Bereinigung durchgeführt werden muss.

Änderungen zum manuellen Suchen und Ersetzen von SVG-XML-Daten

:: 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

Verweise

Adobe Acrobat Pro-Aktionen und JavaScript-Verweise auf separate Seiten

GhostScript verweist auf separate Seiten

Inkscape-Befehlszeilenreferenzen für die Konvertierung von PDF in SVG

Windows Cmd Batch File Script-Referenzen

Forschung zum Ersetzen von XML-Tags / Attributen

ClearBlueSky85
quelle
7

Wenn DVI zu SVG eine Option ist, können Sie mit dvisvgm auch eine DVI-Datei in eine SVG-Datei konvertieren. Dies funktioniert beispielsweise für LaTeX-Formeln (mit Option --no-fonts) perfekt :

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

Es gibt auch pdf2svg , das Poppler und Kairo verwendet, um ein PDF in SVG zu konvertieren. Als ich das versuchte, war die SVG perfekt gerendert inkscape.

Dhaumann
quelle
1
Ich habe ein PDF, das einige LaTeX-Symbole aus dem Skak-Paket (Schachfiguren) rendert. Diese bestimmte Datei wird in Inkscape nicht gut verarbeitet, da Symbole zu Arial-Buchstaben werden ... Ich habe mit pdf2svg korrekte Ergebnisse erzielt.
LRMAAX
Für Windows-Systeme gibt es hier eine Reihe kompilierter Binärwerkzeuge: Poppler für Windows .
Paolo Gibellini
7

Bash-Skript zum Konvertieren jeder Seite einer PDF-Datei 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

Um in PNG zu generieren, verwenden Sie --export-png, etc ...

Alain Pannetier
quelle
1

Ich fand, dass xfigdas einen exzellenten Job gemacht 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.

user877329
quelle