2010-06-02 13 views
5

Ich benutze die Python rsvg Bindungen, um ein SVG-Bild in Kairo zu rendern und in Datei zu speichern, die meistens funktioniert. Aber wenn die SVG-Datei eine verknüpfte Bild enthält, etwa so:rsvg rendert keine verknüpften Bilder

<image href="static/usrimgs/tmpDtIKpx.png" x="10" y="10" width="600px" height="400px"></image> 

das Bild nicht in der endgültigen Datei nicht angezeigt (der Rest des svg macht nur in Ordnung). Der relative Pfad ist korrekt, abhängig davon, wo das Skript ausgeführt wird, aber ich vermute, dass es ein Problem mit der Tatsache gibt, dass es normalerweise eine relative URL und kein relativer Dateipfad ist. Wie komme ich hier zurecht?

+0

Ich habe das gleiche Problem. Wenn Sie einen ungültigen URL href (Link zu einer Datei, die nicht existiert) eingeben, wird angezeigt, dass rsvg keinen Fehler ausgibt, wenn er die Datei nicht finden kann. – molecular

Antwort

2

Die Antwort war, die Links zu verarbeiten, um mit file:/// zu beginnen und ein voller absoluter Pfad zu sein.

+1

hat mir nicht geholfen :(. Es funktioniert auf einem anderen Rechner mit der gleichen librsvg-Version. Allerdings nicht auf diesem Archlinux-Rechner. Selbst kompiliert rsvg-konvertieren selbst .. hat nicht geholfen. – molecular

+0

Gleiches Problem (mit OSX 10.9) – tobinharris

2

Es scheint, dass, wenn die Datei, die Sie einschließen, nicht auf dem gleichen Pfad oder unter dem Pfad der SVG-Datei ist, die Sie konvertieren möchten, sie wird es nicht finden. Ich betrachte dies als einen Fehler.

+0

Ein "Sicherheitsmerkmal", denke ich. Ich habe die Quelle angeschaut und es gibt keine Möglichkeit, sie zu deaktivieren, wenn sie nicht neu kompiliert wird. Nur eine Anmerkung, dass dies unter Ubuntu 10.04 funktioniert hat, aber am 12.04 wurde diese 'Funktion' hinzugefügt. –

11

Es gibt viele Faktoren, die erfüllt sein müssen, damit LibRsvg eine Bildressource laden kann. Ab v2.40 Dazu gehören:

  • das Bild ein xlink:href Attribut haben muss
  • dieses Attribut kann eine vollständige, gültige URI
  • das Schema data:// oder file:// sein
  • file:// Pfade enthalten sein müssen absolut
  • file:// Pfade müssen in oder unter dem Pfad der SVG-Quelldatei sein (nachdem alle symbolischen Links dereferenziert wurden)

Beachten Sie, dass, wenn die Eingabe über stdin an rsvg-convert übergeben wird, keine Pfade als Unterverzeichnisse der Eingabedatei gelten und alle file:// Bilder abgelehnt werden.

rsvg-convert <input.svg> output.png # images denied 

rsvg-convert -o output.png input.svg # images allowed 

Der Code Regierungs Bild-URL Auflösung kann in der LibRsvg source in rsvg-base.c, Funktion _rsvg_handle_allow_load finden.

eine Debug-Meldung Hinzufügen RSVG-convert, wenn Bild Laden fehlschlägt, ein

#define G_ENABLE_DEBUG 

zu config.h in der Quelle und neu kompilieren anhängen können.

2

Ich wollte Librsvg Bild-Rendering auf meinem Mac arbeiten, um SVG-Rendering zu beschleunigen. Ian Mackinnons großartige Antwort enthält alle Zutaten, aber eine Änderung der Bibliothek umzusetzen, ist schwierig. Mit diesen Schritten hat librsvg verknüpfte Bilder korrekt mit relativen Pfaden gerendert. Ich hoffe, das spart jemandem Zeit.

Zuerst habe ich installiert librsvg mit:

brew install --build-from-source librsvg 

Zum Zeitpunkt des Schreibens, installiert diese Version 2.40.13 und die notwendigen Bibliotheken, es zu bauen.Ich habe dann heruntergeladen und extrahiert das Quellarchiv in meinem Home-Verzeichnis:

wget https://download.gnome.org/sources/librsvg/2.40/librsvg-2.40.13.tar.xz 
tar jxvf librsvg-2.40.13.tar.xz 
cd librsvg-2.40.13 

Ich habe das _rsvg_handle_allow_load Funktion in rsvg-base.c in diesem Verzeichnis, indem Sie diesen Code um die Linie 2275 die Bahnladebeschränkungen zu umgehen:

2275 
2276  goto allow; // Just try and load it! 
2277  

ich auch die rsvg_cairo_surface_new_from_href Funktion in rsvg-image.c bearbeiten benötigt und stoppen sie ihn laden MIME-Typen verwenden - ersetzen sie einfach die Funktion wie folgt aus:

55  if (mime_type) { 
56   // loader = gdk_pixbuf_loader_new_with_mime_type (mime_type, error);  // This doesn't work on my mac 
57   loader = gdk_pixbuf_loader_new(); // This works 
58  } else { 
59   loader = gdk_pixbuf_loader_new(); 
60  } 

ich diese leicht modifizierten Befehle zu verwenden, erforderlich, um die modifizierte Bibliothek zu kompilieren und installieren:

make clean 
make install gdk_pixbuf_binarydir=/usr/local/Cellar/librsvg/2.40.13/lib/gdk-pixbuf-2.0/2.10.0/loaders gdk_pixbuf_moduledir=/usr/local/Cellar/librsvg/2.40.13/lib/gdk-pixbuf-2.0/2.10.0/loaders 

Je nach System, könnten Sie sudo zu den oben genannten Befehlen hinzufügen müssen.

Sobald dies geschehen war, ich relativ SVG-Links mit dem rsvg-convert Kommandozeilen-Tool machen könnte, die mit librsvg installiert ist:

rsvg-convert test.svg -o test.png 

Ich war auch in der Lage ImageMagick verwendet SVGs mit Links relativ Bild zu PNG konvertieren Dateien, wenn ich es nach der Installation von librsvg auf diese Weise installiert:

convert test.svg test.png 

Dies wird Ihnen RSVG Funktion und Leistung lassen testen - ich fand es war 2-3x schneller als Inkscape für meine Anwendung. Ich empfehle, den Code intelligenter zu ändern, wenn Sie dies in einer Produktionsumgebung verwenden.