Wie kann ich verhindern, dass mein PDF-zu-SVG-Konvertierungscode aufgeblähten Inhalt generiert?

Lesezeit: 6 Minuten

Benutzeravatar von user434541
Benutzer434541

Ich möchte PDF in SVG konvertieren. Ich habe mein eigenes Java-Programm mit den Bibliotheken Apache PDFBox und Batik geschrieben

PDDocument document = PDDocument.load( pdfFile );
DOMImplementation domImpl =
    GenericDOMImplementation.getDOMImplementation();

// Create an instance of org.w3c.dom.Document.
String svgNS = "http://www.w3.org/2000/svg";
Document svgDocument = domImpl.createDocument(svgNS, "svg", null);
SVGGeneratorContext ctx = SVGGeneratorContext.createDefault(svgDocument);
ctx.setEmbeddedFontsOn(true);

// Ask the test to render into the SVG Graphics2D implementation.

    for(int i = 0 ; i < document.getNumberOfPages() ; i++){
        String svgFName = svgDir+"page"+i+".svg";
        (new File(svgFName)).createNewFile();
        // Create an instance of the SVG Generator.
        SVGGraphics2D svgGenerator = new SVGGraphics2D(ctx,false);
        Printable page  = document.getPrintable(i);
        page.print(svgGenerator, document.getPageFormat(i), i);
        svgGenerator.stream(svgFName);
    }

Diese Lösung funktioniert, aber die Größe der resultierenden SVG-Dateien ist riesig (um ein Vielfaches größer als die ursprüngliche PDF-Datei). Ich habe herausgefunden, wo das Problem liegt, indem ich mir die SVG-Datei in einem Texteditor angesehen habe: Sie umschließt jedes Zeichen im Originaldokument in einem eigenen <text> </text> blockieren, auch wenn die Schriftarteigenschaften der Zeichen gleich sind.

Beispielsweise wird das Wort „Hallo“ in Form von 6 verschiedenen Textblöcken angezeigt.

Gibt es eine Möglichkeit, den obigen Code zu reparieren? Oder gibt es eine andere Lösung, die effizienter funktioniert?

  • Verwandt: PDF in sauberes SVG konvertieren?

    – TylerH

    15. Mai um 19:22 Uhr

  • Beachten Sie, dass Anfragen zu Toolempfehlungen nicht zum Stack Overflow-Thema gehören. Leider handelt es sich bisher bei jeder einzelnen Antwort weiter unten um eine Tool-Empfehlung. Das vollständige Entfernen dieser Anfrage aus dem obigen Beitrag würde also diese Antworten ungültig machen, was hier nicht zulässig ist. Ich hoffe, dass meine Verbesserungen an der Frage dazu führen, dass sie gerettet bleibt und gleichzeitig verhindert, dass hier weitere „Inkscape verwenden“-Antworten erscheinen.

    – TylerH

    15. Mai um 19:24 Uhr

Inkscape kann auch zum Konvertieren von PDF in SVG verwendet werden. Darin ist es tatsächlich bemerkenswert gut, und obwohl der Code, den es generiert, etwas aufgebläht ist, scheint es zumindest nicht das besondere Problem zu geben, auf das Sie in Ihrem Programm stoßen. Ich denke, es wäre eine Herausforderung, es direkt in Java zu integrieren, aber Inkscape bietet eine praktische Befehlszeilenschnittstelle für diese Funktionalität, sodass der Zugriff wahrscheinlich am einfachsten über einen Systemaufruf wäre.

Um die Befehlszeilenschnittstelle von Inkscape zum Konvertieren einer PDF-Datei in eine SVG-Datei zu verwenden, verwenden Sie Folgendes:

inkscape -l out.svg in.pdf

Was Sie dann wahrscheinlich aufrufen können mit:

Runtime.getRuntime().exec("inkscape -l out.svg in.pdf")

http://download.oracle.com/javase/1.4.2/docs/api/java/lang/Runtime.html#exec%28java.lang.String%29

Ich denke, exec() ist synchron und kehrt erst zurück, nachdem der Prozess abgeschlossen ist (obwohl ich da nicht 100 % sicher bin), also sollten Sie danach einfach „out.svg“ lesen können. Wenn Sie „Java-Systemaufruf“ googeln, erhalten Sie auf jeden Fall weitere Informationen darüber, wie dieser Teil richtig ausgeführt wird.

  • Vielen Dank, dass der Inkscape-Befehl zu funktionieren scheint, jedoch nur die erste Seite konvertiert. Kennen Sie eine Befehlszeilenoption, die 1 SVG für jede Seite erstellt?

    – Benutzer434541

    8. November 2010 um 18:20 Uhr

  • Ich kenne keine Möglichkeit, dies zu tun, und die Inkscape-Manpage scheint nicht darauf hinzuweisen, dass diese Funktionalität in der Befehlszeilenschnittstelle verfügbar ist. Ich nehme an, Ihre Optionen wären, diese Schnittstelle selbst hinzuzufügen, indem Sie den Inkscape-Code ändern. Oder Sie könnten etwas sehr Hackiges und Kreatives tun und ein Programm wie Ghostscript verwenden, um das PDF in mehrere einseitige Dokumente aufzuteilen und dann jede Seite einzeln an Inkscape weiterzuleiten.

    – jbeard4

    9. November 2010 um 2:06

  • Die wahrscheinlich beste Lösung besteht dann darin, die PDF-Datei in eine Datei pro Seite aufzuteilen. Sowohl pdfjam als auch pdftk können dies tun.

    – hlovdal

    28. August 2011 um 22:27

  • Die Antwort von @Koen. verweist auf pdf2svg, das mehrere Seiten bearbeiten kann: pdf2svg input.pdf output_page%d.svg all

    – alxndr

    10. Februar 2013 um 5:53


  • Ich habe den Inkscape-Befehlszeilenansatz verwendet, aber die Schriftarten sehen im SVG wirklich hässlich aus. Gibt es eine Möglichkeit, das Problem zu beheben?

    – Remus

    8. Okt. 2013 um 7:51

Koen.s Benutzeravatar
Koen.

Schauen Sie mal rein pdf2svg (auch auf auf Github):

Benutzen

pdf2svg <input.pdf> <output.svg> [<pdf page no. or "all" >]

Beim Benutzen all Geben Sie einen Dateinamen mit ein %d darin enthalten ist (die durch die Seitenzahl ersetzt wird).

pdf2svg input.pdf output_page%d.svg all

Und für einige Fehlerbehebungen siehe:
http://www.calcmaster.net/personal_projects/pdf2svg/

  • Ich habe pdf2svg verwendet, aber ich habe gerade festgestellt, dass es viel mehr eine Annäherung als Inkscape ist. Insbesondere gehen beim Rendern kleiner Kreise Details verloren (ich habe es mit PDFs mit Hunderten von Pfaden zu tun). YMMV.

    – Aidan Kane

    27. November 2012 um 23:18 Uhr

  • @AidanKane: Andererseits schneidet pdf2svg für Text besser ab als Inkscape; Text aus einer LaTeX-Ausgabedatei wurde für mich nicht in der Inkscape-Ausgabe angezeigt.

    – Mechanische Schnecke

    23. Februar 2014 um 21:15 Uhr

  • @Mechanicalsnail: Ich habe jetzt viel mehr Erfahrung damit. Sie haben Recht, es gibt Zeiten, in denen ich festgestellt habe, dass bei Inkscape-Konvertierungen Dinge fehlen – und pdf2svg ist in Ordnung. pdf2svg wurde aktualisiert, um eine andere Funktion in Kairo aufzurufen, um das Rendering durchzuführen (wodurch das zuvor beschriebene Problem behoben wurde). Leider geht dies mit dem Nachteil einher, dass in den SVG-Dateien kein Text vorhanden ist – alle Glyphen werden in Pfade umgewandelt. Ich habe Cairo und Poppler gepatcht, damit Text wieder funktioniert, aber ich vertraue meinem Hack nicht ganz 🙂

    – Aidan Kane

    23. Februar 2014 um 23:19 Uhr

  • Sowohl Inkscape als auch Dvisvgm können aus Latex kein korrektes SVG erstellen. pdf2svg kann.

    – ivo Welch

    1. März 2014 um 22:23

Benutzeravatar von SuperNova
SuperNova

pdftocairo kann zum Konvertieren von PDF in SVG verwendet werden.
Es ist Teil von Poppler-Utils die entweder von installiert werden kann PyPI über piperstellt aus Git oder über den Paketmanager Ihres Betriebssystems (Beispiel: Ubuntu/Deb hat es unter demselben Namen).

Um beispielsweise die zweite Seite einer PDF-Datei zu konvertieren, kann der folgende Befehl ausgeführt werden:

pdftocairo -svg -f 1 -l 1 input.pdf

  • Ihr Befehl konvertiert die „erste“ Seite, nicht die „zweite“.

    – s.ouchene

    20. Januar 2022 um 9:44

Benutzeravatar von MrDrMcCoy
HerrDrMcCoy

Ich habe Probleme mit den empfohlenen Tools inkscape, pdf2svg oder pdftocairo sowie mit den nicht empfohlenen Convert- und Mutool-Tools festgestellt, als ich versuchte, große und komplexe PDFs wie einige der topografischen Karten des USGS zu konvertieren. Manchmal stürzten sie ab, manchmal erzeugten sie massiv überdimensionierte Dateien.

Das einzige PDF-zu-SVG-Konvertierungstool, das alle für meinen Anwendungsfall korrekt verarbeiten konnte, war dvisvgm. Die Verwendung ist ganz einfach:

dvisvgm --pdf --output=file.svg file.pdf

Es verfügt über verschiedene zusätzliche Optionen zum Umgang mit der Konvertierung von Elementen sowie zur Optimierung. Die resultierenden Dateien können weiter komprimiert werden SVGCleaner ggf. ohne Wahrnehmungsqualitätsverlust.

Benutzeravatar von Leblanc Meneses
Leblanc Meneses

Sie können Bash in einer *nix-Umgebung verwenden.

Der Burst-Vorgang teilt jede Seite im PDF in Dateien auf. to-svg.sh durchläuft diese einseitigen PDFs, um die zugehörige SVG-Datei zu generieren

pdftk 82page.pdf burst
sh to-svg.sh 

Inhalt von to-svg.sh

#!/bin/bash
FILES=burst/*
for f in $FILES
do
  inkscape -l "$f.svg" "$f"
done

Benutzeravatar von Daniel T
Daniel T

Inkscape funktioniert nicht mit dem -l Option nicht mehr. Es hieß: „Datei kann nicht geöffnet werden: /out.svg (existiert nicht)“. Die Langform dieser Option finden Sie in der Manpage als --export-plain-svg und funktioniert, zeigt aber eine Verfallswarnung an. Ich konnte den Befehl mithilfe von reparieren und aktualisieren -o Option auf Inkscape 1.1.2-3ubuntu4:

inkscape in.pdf -o out.svg

1451820cookie-checkWie kann ich verhindern, dass mein PDF-zu-SVG-Konvertierungscode aufgeblähten Inhalt generiert?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy