SVG nachbearbeiten, Batik

Status
Nicht offen für weitere Antworten.

guni

Bekanntes Mitglied
Hallo,
ich habe in inkskape ein SVG-Template gebastelt.
folgender Code lädt mir die SVG-Datei:
Java:
	    String parser = XMLResourceDescriptor.getXMLParserClassName();
	    SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
	    String uri = "http://www.w3.org/2000/svg";
	    doc = (SVGDocument)f.createDocument(uri, new FileReader("template.svg"));
jetzt habe ich in der template.svg einen Text stehen, den ich gerne per java-code überschreiben möchte. im SVG schaut die Zeile für den Text so aus:
[XML]<text
inkscape:label="txtName"
id="txtName"
y="560.22021"
x="822.04724"
style="font-size:12px;font-style:normal;font-weight:normal;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.77165353;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1;font-family:Bitstream Vera Sans"
xml:space="preserve"><tspan
style="font-size:22px;stroke-width:1.77165353;stroke-miterlimit:4;stroke-dasharray:none"
y="560.22021"
x="822.04724"
id="tspan4473"
sodipodi:role="line">Exportprozess.pdf</tspan></text>[/XML]
wie kann ich aus meinem JAVA Code da drauf zugreifen?!

danke für eure Tips,
guni
 
S

SlaterB

Gast
das ist doch eine Textdatei, FileReader und so? lesen, verändern, schreiben,
etwas gehobener mit einem XML-Parser

bzw. wenn du im Programm
> doc = (SVGDocument)f.createDocument()
hast, dann kannst du evtl. vor dem Speichern im doc editieren
 
S

SlaterB

Gast
kennst du dich denn allgemein mit DOM und XML aus?
baumartig aufgebaute Tags, getChilds(), setTextContent() usw?
ich weiß nicht genau was SVGDocument ist, du könntest ja die Library oder die API-Beschreibung dazu posten,
allerdings genausogut selber darin suchen ;)
 

guni

Bekanntes Mitglied
mit XML kenn ich mich allgemein aus;
über DOM weiß ich nur, dass es eine Abbildung der XML-Datei als Datenstruktur ist; aber gearbeitet hab ich bis jetzt eher mit SAX.

wie auch immer.
hab mich jetzt ein bisschen gespielt und bin draufgekommen, dass ich in meinem SVGDocument wie im normalen Document auch ein getElementById habe.
ich kann dann mit setTextContent den Wert eines Textes umschreiben.
Wie aber kann ich das veränderte Element dann wieder in den DOM-Tree einbauen (anstelle des Elementes mit dem alten Wert?)

mfg, guni
 
S

SlaterB

Gast
wenn du 'doc' veränderst und danach abspeicherst wie bisher, dann sollten doch die Änderungen drin sein,
oder wie ist die weitere Verarbeitung?

edit:
oh, doc stellt nur das Template dar?, das sollte man vielleicht nicht verändern bzw. wird bisher wohl nicht neu gespeichert,
ich weiß nicht genau wie der weitere Ablauf bei dir aussieht/ wie man das, was immer du da machst, normalerweise macht,

notfalls wie gesagt am Ende die erzeugte SVG-Datei neu einlesen und bearbeiten,
sicher nicht der professionellste Tipp, nur meine Sichtweise
 
Zuletzt bearbeitet von einem Moderator:

HoaX

Top Contributor
Deine Änderung sollte automatisch übernommen und angezeigt werden, wenn du am Anfang JSVGCanvas.setDocumentState(JSVGCanvas.ALWAYS_DYNAMIC);
aufgerufen hast
 

guni

Bekanntes Mitglied
hi,

ja. mit ein bisschen probieren habe auch festgestellt, dass sich das verändern von elementattributen direkt auf das doc auswirkt *freu*

jetzt will ich aber in meinem dokument schnittmarekn setzen.

mein code dazu sieht (vereinfacht gesagt) so aus:
Java:
for (i=0;i<10;i++) {
   Element e = (Element)doc.getElementById(Schnittmarke).cloneNode(true);
   e.setAttribute("x",i*10);
}

irgendwie scheinen die zusätzlich geklonten Elemente allerdings nicht automatisch ins doc eingebunden zu werden. Wie kann ich das machen?

mfg, guni
 
S

SlaterB

Gast
doc.getElementById(Schnittmarke ).getParent().addNochEinenNode(e);
 

guni

Bekanntes Mitglied
danke. jetzt hab ichs hinbekommen.
mein nächstes Problem ist, dass ich mein DOM-Objekt speichern möchte.
Laut Doku mach ich das so: (natürlich änder ich dann den OutputStream noch)
Java:
SVGGraphics2D svg = new SVGGraphics2D(doc);
boolean useCSS = true; // we want to use CSS style attribute
Writer out = new OutputStreamWriter(System.out, "UTF-8");
svg.stream(out, useCSS);
das Problem ist aber, dass mein Output ziemlich leer aussieht:
[XML]<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE svg PUBLIC '-//W3C//DTD SVG 1.0//EN'
'http://www.w3.org/TR/2001/REC-SVG-20010904/DTD/svg10.dtd'>
<svg style="stroke-dasharray:none; shape-rendering:auto; font-family:&apos;Dialog&apos;; text-rendering:auto; fill-opacity:1; color-interpolation:auto; color-rendering:auto; font-size:12; fill:black; stroke:black; image-rendering:auto; stroke-miterlimit:10; stroke-linecap:square; stroke-linejoin:miter; font-style:normal; stroke-width:1; stroke-dashoffset:0; font-weight:normal; stroke-opacity:1;" xmlns="http://www.w3.org/2000/svg" contentScriptType="text/ecmascript" preserveAspectRatio="xMidYMid meet" xmlns:xlink="http://www.w3.org/1999/xlink" zoomAndPan="magnify" version="1.0" contentStyleType="text/css"
><!--Generated by the Batik Graphics2D SVG Generator--><defs id="genericDefs"
/><g
/></svg
>[/XML]
was mach ich da denn falsch, dass der ganze content fehlt?!
 

HoaX

Top Contributor
Der SVGTranscoder ist ehr dafür gedacht z.B. ein JPG in ein SVG umzuwandeln.
Batik verwendet ja DOM, daher nimm einfach den Transformer:
Java:
            Transformer transformer = TransformerFactory.newInstance().newTransformer();
            DOMSource source = new DOMSource(xmlDocument);

            FileOutputStream os=null;
            os = new FileOutputStream (new File(fileName));
            StreamResult result = new StreamResult(os);

            transformer.transform(source, result );
 
Zuletzt bearbeitet:

guni

Bekanntes Mitglied
wow ... ja. mit dem Transformer bekomm ich einen schönen output.
auch das problem, dass mein SVGDocument leer war hab ich inzwischen gelöst (SVGGraphics2D.getRoot).
jetzt hab ich aber schon wieder ein Problem mit SVGGraphics2D:

ich ezeuge 2 Grafiken und binde sie in mein Dokument ein:
Java:
SVGGraphics2D g2d = new SVGGraphics2D(doc);
		
g2d.draw(new Rectangle(10,10,100,100));
g2d.getRoot(doc.getRootElement());
		
g2d.draw(new Ellipse2D.Double(10,10,100,100));
g2d.getRoot(doc.getRootElement());

der SVG-Output sieht so aus:
[XML]<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
<!--Generated by the Batik Graphics2D SVG Generator--><defs id="genericDefs"/>
<g>
<g>
<rect fill="none" x="10" width="100" height="100" y="10"/>
</g>
</g>
<!--Generated by the Batik Graphics2D SVG Generator--><defs id="genericDefs"/>
<g>
<g>
<circle fill="none" r="50" cx="60" cy="60"/>
</g>
</g>
</svg>[/XML]
1. Warum erzeugt SVGGraphics2D zwei ineinander verschachtelte Gruppen? Eine würde doch reichen, oder?! Oder mach ich da was falsch?
2. BEVOR ich meine Grafik ins Dokument einbinde würde ich meiner Gruppe noch ganz gerne eine ID geben, damit ich dann auf die verschiedenen Elemente in DOM zugreifen kann. Leider fehlt mir der Ansatz wie ich das machen kann ... irgendwer eine Idee?!

danke! guni
 
S

SlaterB

Gast
was bedeutet denn der Aufruf
> g2d.getRoot(doc.getRootElement());
?
der gehört da gewiss nicht hin zwischen jede einzelne Grafik-Anweisung,
daher überrascht es mich nicht, dass dann SVGGraphics2D vielleicht denkt, dass es neu losgeht,
wofür auch der Kommentar + der defs-Block spricht

generell hast du sicherlich wenig Kontrolle über das erzeugte SVG,
wegen solcher Umstände habe ich gleich auf derartige Zwischenklassen verzichtet und schreibe mir meine SVGs selber Buchstabe für Buchstabe zusammen,
ist ja eine einfache Textdatei, das kann man ausnutzen, viel Arbeit ist es dennoch
 

guni

Bekanntes Mitglied
nun ja ...

der gehört normalerweise nicht zwischen jede Zeile, da hast du recht.
das Problem ist, dass die beiden Shapes die ich hier gezeichnet habe in wirklichkeit aus verschiedenen Klassen kommen und zu verschiedenen Zeitpunkten erzeugt werden.
die Vereinfachung die du hier siehst habe ich mir nur zum Testen gebaut.
ich habe also zwei verschiedene Grafiken, die ich beide als group zurückbekomme und in meinen DOMTree einbinde.
Ich hätte nur gerne, dass die groups eine eigene ID bekommen, weil später mal in einer Schleife erzeugt werden und ich dann NACHTRÄGLICH noch einen Transform für die group einbauen möchte.
gibt es denn keine Möglichkeit, die mit SVGGraphics2D modifizierte Grafik zu "benennnen"?!

mfg, guni
 

HoaX

Top Contributor
Wenn du solche Anforderungen hast, dann ist der Weg über SVG2Graphics der falsche. Bearbeite das SVG einfach per DOM.
 

guni

Bekanntes Mitglied
@HoaX: habe das jetzt auf DOM umgeschrieben.
das Problem ist, dass mein XML jetzt irgendwie nicht mehr zu stimmen scheint; hier ein Auszug:
[XML]<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
contentScriptType="text/ecmascript"
zoomAndPan="magnify"
contentStyleType="text/css"
preserveAspectRatio="xMidYMid meet"
version="1.0">
<g xmlns="">
<g>
<rect width="363" fill="none" x="0" height="20" y="0"/>
<rect width="363" fill="none" x="363" height="20" y="0"/>
<rect width="363" fill="none" x="726" height="20" y="0"/>[/XML]
die Grafik wird nicht angezeigt, da die oberste Gruppe einen xmlns="" eingetragen hat. ich will hier gar keinen xmlns stehen haben; kann ich die gruop irgendwie ohne diesem Attribut an mein doc dranhängen?
 

guni

Bekanntes Mitglied
ok ... wird zeit für ein paar mehr Infos:

ich hab eine Datenbank mit Personaldaten.
Änderungen werden versioniert; d.h. der Datensatz hat ein gültig-ab und ein gültig-bis-Datum.

habe also eine Klasse Zeitabschnitt mit (u.a. diesen 2 Funktionen):
Java:
	public Element draw(SVGDocument doc, int xpos, int ypos, int height, double scale) {
		width = new Double(scale * days).intValue();
		return Rectangle(doc, xpos, ypos, width, height);
	}
	
	public Element Rectangle(SVGDocument doc, int x, int y, int width, int height) {
		Element rectangle = doc.createElement("rect");
		rectangle.setAttribute("fill", "none");
		rectangle.setAttribute("x",x+"");
		rectangle.setAttribute("y", y+"");
		rectangle.setAttribute("width", width+"");
		rectangle.setAttribute("height",height+"");
		return rectangle;		
	}
dann gibt es eine Klasse Zeitstrahl, die schaut so aus:
Java:
public abstract class Zeitstrahl {
	
	public LinkedList<Zeitabschnitt> abschnitte = new LinkedList<Zeitabschnitt>();
	
	public Element draw(SVGDocument doc, int y, long gesamttage) {
		
		int height = 20;
		int width = 5709;
		Double scale = new Double(width) / new Double(gesamttage + 20);
		
		Element group = doc.createElement("g");
		
		Iterator<Zeitabschnitt> i = abschnitte.iterator();
		Zeitabschnitt  z = null;
		int x = 0;
		while (i.hasNext()) {
			z = i.next();
			Element rectangle = z.draw(doc, x, y, height, scale);
			group.appendChild(rectangle);
			x += z.width;
		}
		// die restlichen Tage
		group.appendChild(z.Rectangle(doc, x, y, width-x, height));
		return group;
	}
}
da ich Datensätze aus verschiedenen Tabellen miteinander vergleichen möchte, habe ich dann in einer dritten Klasse noch eine Funktion, die mehrere Zeistrahlen untereinander 'zeichnet':
Java:
	public Element draw(SVGDocument doc) {
		Element group = doc.createElement("g");
		group.appendChild(zj.draw(doc, 0, tage));
		group.appendChild(zp.draw(doc, 20, tage));
		group.appendChild(zt.draw(doc, 40, tage));
		group.appendChild(zs.draw(doc, 60, tage));
		group.setAttribute("id", "layer");
		return group;
	}
diese Group wird aber dann - sobald ich ein doc.appendChild mache - so in mein svg geschrieben:
[XML]<g xmlns="">[/XML]
... damit wird dann nichts angezeigt :-(
wäre um jeden Tipp dankbar; das ganze is schon recht dringend.

mfg, guni
 

Ebenius

Top Contributor
Du musst die Methoden mit [c]NS[/c] benutzen. Also kein [c]doc.createElement("g");[/c] sondern sowas:
Java:
doc.createElementNS("http://www.w3.org/2000/svg", "g");
Das musst Du eigentlich überall tun wo Du das DOM veränderst. Ansonsten fügst Du Elemente mit dem Default Namespace zum DOM, was Du aber gar nicht möchtest. Du möchtest ja im SVG-Namespace weiter arbeiten.

Ebenius
 

guni

Bekanntes Mitglied
hmm ... ja ... damit bin ich dieses xmlns-Attribut im group-tag los ...
eine grafik seh ich da aber trotzdem noch nicht.
was fehlt mir denn da?!

Java:
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
     contentScriptType="text/ecmascript"
     zoomAndPan="magnify"
     contentStyleType="text/css"
     preserveAspectRatio="xMidYMid meet"
     version="1.0">
   <g id="layer">
      <g>
         <rect width="363" fill="none" x="0" height="20" y="0"/>
         <rect width="363" fill="none" x="363" height="20" y="0"/>
         <rect width="363" fill="none" x="726" height="20" y="0"/>
         <rect width="363" fill="none" x="1089" height="20" y="0"/>
         <rect width="363" fill="none" x="1452" height="20" y="0"/>
         <rect width="363" fill="none" x="1815" height="20" y="0"/>
         <rect width="363" fill="none" x="2178" height="20" y="0"/>
         <rect width="363" fill="none" x="2541" height="20" y="0"/>
         <rect width="363" fill="none" x="2904" height="20" y="0"/>
         <rect width="2442" fill="none" x="3267" height="20" y="0"/>
      </g>
      <g>
         <rect width="3044" fill="none" x="0" height="20" y="20"/>
         <rect width="249" fill="none" x="3044" height="20" y="20"/>
         <rect width="0" fill="none" x="3293" height="20" y="20"/>
         <rect width="0" fill="none" x="3293" height="20" y="20"/>
         <rect width="2416" fill="none" x="3293" height="20" y="20"/>
      </g>
      <g>
         <rect width="3044" fill="none" x="0" height="20" y="40"/>
         <rect width="249" fill="none" x="3044" height="20" y="40"/>
         <rect width="0" fill="none" x="3293" height="20" y="40"/>
         <rect width="144" fill="none" x="3293" height="20" y="40"/>
         <rect width="114" fill="none" x="3437" height="20" y="40"/>
         <rect width="208" fill="none" x="3551" height="20" y="40"/>
         <rect width="149" fill="none" x="3759" height="20" y="40"/>
         <rect width="367" fill="none" x="3908" height="20" y="40"/>
         <rect width="357" fill="none" x="4275" height="20" y="40"/>
         <rect width="37" fill="none" x="4632" height="20" y="40"/>
         <rect width="326" fill="none" x="4669" height="20" y="40"/>
         <rect width="350" fill="none" x="4995" height="20" y="40"/>
         <rect width="338" fill="none" x="5345" height="20" y="40"/>
         <rect width="0" fill="none" x="5683" height="20" y="40"/>
         <rect width="26" fill="none" x="5683" height="20" y="40"/>
      </g>
      <g>
         <rect width="3440" fill="none" x="0" height="20" y="60"/>
         <rect width="114" fill="none" x="3440" height="20" y="60"/>
         <rect width="208" fill="none" x="3554" height="20" y="60"/>
         <rect width="149" fill="none" x="3762" height="20" y="60"/>
         <rect width="367" fill="none" x="3911" height="20" y="60"/>
         <rect width="357" fill="none" x="4278" height="20" y="60"/>
         <rect width="37" fill="none" x="4635" height="20" y="60"/>
         <rect width="326" fill="none" x="4672" height="20" y="60"/>
         <rect width="350" fill="none" x="4998" height="20" y="60"/>
         <rect width="338" fill="none" x="5348" height="20" y="60"/>
         <rect width="0" fill="none" x="5686" height="20" y="60"/>
         <rect width="23" fill="none" x="5686" height="20" y="60"/>
      </g>
   </g>
</svg>
 

guni

Bekanntes Mitglied
hmm ... selfsvg.info gibt einen Seiten-Ladefehler zurück; aber dein Tipp hat mein Problem trotzdem gelöst ;-)
danke erstmal.
jetzt stürze ich mich ins transformieren und skalieren ;-)
 

guni

Bekanntes Mitglied
hallo,

nochmals vielen dank für eure hilfe.
habe die erzeugung meines svg's jetzt (fast geschafft).
nun ist das problem, dass ich dieses svg in ein pdf einbinden möchte. das geht glaub ich in xsl-fo mit einem instream-foreign-object.

jetzt hab ich also daten und graphiken.
die grafiken werden problemlos erzeugt.
die daten auch.
wie aber kann ich grafik und daten in EINE xml schmeißen, so, dass xsl-fo das ganze dann auslesen kann.
ich stelle mir da ungefähr sowas vor:
Java:
<root>
  <employee>
    <graphics>
      <!-- hier beginnt der svg-Teil -->
    </graphics>
    <data>
      <!-- hier beginnt der Datenteil -->
    </data>
  </employee>
  ...
</root>
natürlich gibt mir java einen fehler, dass er nicht keine durch ein SVGDocument erzeugte Node in einen anderen DOMTree einspielen kann.
gibt es da Lösungen?
Macht es überhaupt Sinn, die Grafiken so "abzulegen"
gibt es eine bessere Variante, sie über XSL-FO einzulesen?

mfg, guni
 
S

SlaterB

Gast
ich verwende
<fo:external-graphic src="url(dateipfad)" content-height=".."/>

mit einer vorher auf die Festplatte gespeicherten SVG-Datei,
 

guni

Bekanntes Mitglied
ok ... diese Grafik muss ich dann aber mit dem PDF nicht mit ausliefern, oder?! Sie wird vom XSLTranformer dann eh eingebunden schätze ich ...

mfg, guni
 
S

SlaterB

Gast
die Grafik ist dann im PDF drin,
ich glaube das <fo:external-graphic> ist zumindest bei SVG auch äquivalent zum SVG-Inhalt direkt im XSL, wie auch immer das zu bewerkstelligen wäre
(ich würde die XSL-Datei kopieren und den SVG-Text hineinschneiden ;) )

im PDF sind es dann aber direkte PDF-Grafikbefehle, zumindest bei Apache Fop in den Versionen, die ich bisher kenne,
insbesondere werden Farbverläufe (Gradient) in echte Bilder transformiert, was die PDF-Größe stark anwachsen läßt
 

guni

Bekanntes Mitglied
hallo,
habe versucht, das SVG extern einzubinden.
jetzt habe ich 2 Probleme.
1. wie kann ich im xsl-fo sagen, dass der Dateiname von der Personalnummer des jeweiligen Mitarbeiters abhängt (es wird pro Mitarbeiternode im XML eine SVG-Grafik erstellt); das Ganze sollte also ungefähr so aussehen:
[XML] <fo:block>
<xsl:variable name="varFilename">pdf/grafik<xsl:value-of select="@psnr" />.svg</xsl:variable>
<fo:external-graphic
src="url($varFilename)"
content-width="267mm"
content-height="20mm" />
</fo:block>[/XML]
2. die SVG Datei (wenn ich sie statisch angebe dann wird sie geladen) wird nach ca 4 cm abschgeschnitten ...

wie kann ich diese beiden Probleme lösen?

mfg, guni
 
S

SlaterB

Gast
funktioniert denn die Variable nicht?
ist das SVG ansonsten komplett, z.B. im FireFox geöffnet?
poste die Datei
 

guni

Bekanntes Mitglied
die svg sieht so aus:
[XML]<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
contentScriptType="text/ecmascript"
zoomAndPan="magnify"
contentStyleType="text/css"
stroke="#000000"
preserveAspectRatio="xMidYMid meet"
version="1.0">
<g stroke-width="1px" id="strahl263">
<g>
<rect width="3055" fill="none" x="0" height="20" y="20"/>
<rect width="250" fill="none" x="3055" height="20" y="20"/>
<rect width="0" fill="none" x="3305" height="20" y="20"/>
<path style="fill:none"
d="M 3305.0,20.0 L 5899.0,20.0 L 5939.0,30.0 L 5899.0,40.0 L 3305.0,40.0 L 3305.0,20.0"/>
</g>
<g>
<rect width="3055" fill="none" x="0" height="20" y="40"/>
<rect width="250" fill="none" x="3055" height="20" y="40"/>
<rect width="0" fill="none" x="3305" height="20" y="40"/>
<rect width="145" fill="none" x="3305" height="20" y="40"/>
<rect width="115" fill="none" x="3450" height="20" y="40"/>
<rect width="209" fill="none" x="3565" height="20" y="40"/>
<rect width="150" fill="none" x="3774" height="20" y="40"/>
<rect width="369" fill="none" x="3924" height="20" y="40"/>
<rect width="359" fill="none" x="4293" height="20" y="40"/>
<rect width="38" fill="none" x="4652" height="20" y="40"/>
<rect width="328" fill="none" x="4690" height="20" y="40"/>
<rect width="352" fill="none" x="5018" height="20" y="40"/>
<rect width="340" fill="none" x="5370" height="20" y="40"/>
<path style="fill:none"
d="M 5710.0,40.0 L 5899.0,40.0 L 5939.0,50.0 L 5899.0,60.0 L 5710.0,60.0 L 5710.0,40.0"/>
</g>
<g>
<rect width="3453" fill="none" x="0" height="20" y="60"/>
<rect width="115" fill="none" x="3453" height="20" y="60"/>
<rect width="209" fill="none" x="3568" height="20" y="60"/>
<rect width="150" fill="none" x="3777" height="20" y="60"/>
<rect width="369" fill="none" x="3927" height="20" y="60"/>
<rect width="359" fill="none" x="4296" height="20" y="60"/>
<rect width="38" fill="none" x="4655" height="20" y="60"/>
<rect width="328" fill="none" x="4693" height="20" y="60"/>
<rect width="352" fill="none" x="5021" height="20" y="60"/>
<rect width="340" fill="none" x="5373" height="20" y="60"/>
<path style="fill:none"
d="M 5713.0,60.0 L 5899.0,60.0 L 5939.0,70.0 L 5899.0,80.0 L 5713.0,80.0 L 5713.0,60.0"/>
</g>
</g>
</svg>[/XML]
 

guni

Bekanntes Mitglied
funktioniert denn die Variable nicht?
hmm ... nein - ich war nur unfähig sie richtig aufzurufen.
schein ich aber immer noch zu sein, weil auch das hier
[XML]<fo:block>
<xsl:variable name="varFilename">pdf/grafik<xsl:value-of select="@psnr" />.svg</xsl:variable>
<fo:external-graphic
src="url(<xsl:value-of select="$varFilename"/>)"
content-width="267mm"
content-height="20mm" />
</fo:block>[/XML]
funktioniert nicht. (xsl:value-of ist der Unterschied zu vorher)
Wie lad ich denn meine Datei, wenn der Dateiname erst dynamisch ermittelt werden muss?!

mfg, guni
 

guni

Bekanntes Mitglied
ok ... die Antwort auf's einbinden der Grafik war just a google-click away:
[XML] <fo:external-graphic
content-width="267mm"
content-height="20mm" >
<xsl:attribute name="src">
<xsl:value-of select="concat('url(',$varFilename,')')"/>
</xsl:attribute>
</fo:external-graphic>[/XML]
.. was die Länge/Breite des Bildes betrifft: lasse ich die Angaben der content-width/content-height vollständig raus, dann merke ich, dass sich das Bild in der Höhe sehr wohl verändert; vermutlich auch in seiner Breite. Allerdings muss das Problem woanders liegen; das Bild wird schließlich abgeschnitten!
 
S

SlaterB

Gast
muss das erste Testbild wirklich 6000 Pixel breit sein und gerade Linien enthalten, wo man nicht erkennen kann, wo es rechts zu Ende ist?

vielleicht musst du, wenn die Angaben wie
> width="900" height="700" viewBox="0 0 900 700"
fehlen, die Maße im PDF genauso breit angeben

ich möchte damit jedenfalls gar nicht erst testen ;)
versuche folgendes Bild

Code:
<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
     contentScriptType="text/ecmascript"
     zoomAndPan="magnify"
     contentStyleType="text/css"
     stroke="#000000"
     preserveAspectRatio="xMidYMid meet"
     version="1.0">
   <g stroke-width="1px" id="strahl263">
      <line x1="5" y1="5" x2="200" y2="200"/>
      <line x1="200" y1="5" x2="5" y2="200"/>
   </g>
</svg>

mit content-height="20mm", content-height="40mm", content-height="80mm", content-height="5mm" usw.,
probiere die viewbox + width/ height-Angaben im SVG aus, machen die irgendwelche Unterschiede?
welche Erkenntnisse kannst du gewinnen,

Ausprobieren ist das A und O wenn exakte Anleitungen fehlen,
vielleicht fragst du ja gerade nach letzterem, ich kann das dann nicht beantworten, höchstens selber testen ;)
 

guni

Bekanntes Mitglied
ja ... die möglichkeit geht auch ;-)
jetzt hab ich schon wieder ein problem:
meine XML-Grafik hat ja eine Breite von ca. 6000px (ist bei jeder Grafik anders weil es von der Anzahl der eingestellten Tage anhängt)
Ok. ich definiere jetzt also einfach eine Wunschbreite (z.B. 900); dann berechne ich mir meine scale (=new Double(900/tage))
und mache ein doc.getElementById("groupgraph").setAttribute("transform","scale("+scale+",1)");
... das funktioniert auch soweit.
mein svg wird richtig schön auf die gewünschte länge verkleinert.
binde ich die grafik dann allerdings über xsl-fo in mein pdf ein, dann hab ich überall unterschiedliche Strichstärken :-(
kann ich das auch noch irgendwie verhindern?!
danke, guni
 
S

SlaterB

Gast
kannst du wieder SVG + PDF posten?
oder selber nachschauen ob das bei hohen Zoom weggeht?
sieht es ausgedruckt einheitlich aus?

mit derartigen Anzeigeproblemen kämpfe ich auch manchmal, ohne rechte Lösung,
zu dünne Striche auch bei XSL-Tabellen sind ungünstig
 

guni

Bekanntes Mitglied
[XML]<?xml version="1.0" encoding="UTF-8"?>
<svg xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink"
contentScriptType="text/ecmascript"
width="900"
zoomAndPan="magnify"
contentStyleType="text/css"
viewBox="0 0 900 60"
height="60"
stroke="#000000"
preserveAspectRatio="xMidYMid meet"
stroke-width="1px"
version="1.0">
<g id="strahl263" transform="scale(0.15128593040847202,1)">
<g>
<rect width="3055" fill="none" x="0" height="20" y="0"/>
<rect width="250" fill="none" x="3055" height="20" y="0"/>
<rect width="0" fill="none" x="3305" height="20" y="0"/>
<path style="fill:none"
d="M 3305.0,0.0 L 5899.0,0.0 L 5939.0,10.0 L 5899.0,20.0 L 3305.0,20.0 L 3305.0,0.0"/>
</g>
<g>
<rect width="3055" fill="none" x="0" height="20" y="20"/>
<rect width="250" fill="none" x="3055" height="20" y="20"/>
<rect width="0" fill="none" x="3305" height="20" y="20"/>
<rect width="145" fill="none" x="3305" height="20" y="20"/>
<rect width="115" fill="none" x="3450" height="20" y="20"/>
<rect width="209" fill="none" x="3565" height="20" y="20"/>
<rect width="150" fill="none" x="3774" height="20" y="20"/>
<rect width="369" fill="none" x="3924" height="20" y="20"/>
<rect width="359" fill="none" x="4293" height="20" y="20"/>
<rect width="38" fill="none" x="4652" height="20" y="20"/>
<rect width="328" fill="none" x="4690" height="20" y="20"/>
<rect width="352" fill="none" x="5018" height="20" y="20"/>
<rect width="340" fill="none" x="5370" height="20" y="20"/>
<path style="fill:none"
d="M 5710.0,20.0 L 5899.0,20.0 L 5939.0,30.0 L 5899.0,40.0 L 5710.0,40.0 L 5710.0,20.0"/>
</g>
<g>
<rect width="3453" fill="none" x="0" height="20" y="40"/>
<rect width="115" fill="none" x="3453" height="20" y="40"/>
<rect width="209" fill="none" x="3568" height="20" y="40"/>
<rect width="150" fill="none" x="3777" height="20" y="40"/>
<rect width="369" fill="none" x="3927" height="20" y="40"/>
<rect width="359" fill="none" x="4296" height="20" y="40"/>
<rect width="38" fill="none" x="4655" height="20" y="40"/>
<rect width="328" fill="none" x="4693" height="20" y="40"/>
<rect width="352" fill="none" x="5021" height="20" y="40"/>
<rect width="340" fill="none" x="5373" height="20" y="40"/>
<path style="fill:none"
d="M 5713.0,40.0 L 5899.0,40.0 L 5939.0,50.0 L 5899.0,60.0 L 5713.0,60.0 L 5713.0,40.0"/>
</g>
</g>
</svg>[/XML]
 
Zuletzt bearbeitet von einem Moderator:
S

SlaterB

Gast
unter der Antworten-Box (im erweiterten Modus mit den Smileys) 'Zusätzliche Einstellungen' und dort 'Anhänge verwalten'
 
S

SlaterB

Gast
wie gesagt, durch Zoom hätte man erkennen können, dass die senkrechten Striche von der Dicke her ok sind,
nur nunmal in der Seitenansicht auf 1 oder 2 Pixel des Monitors dargestellt werden müssen,

dazu kann ich im Grund nicht mehr sagen als zuvor, bis auf doch noch zwei Dinge:
1. teste andere Linienbreiten, insbesondere dickere
2. besonders schlecht ist hier, dass die senkrechten Linien leicht versetzt sind, also

<rect width="38" fill="none" x="4652" height="20" y="20"/>
+
<rect width="38" fill="none" x="4655" height="20" y="40"/>

mit x=3 Unterschied, ist das gewollt?
wenn die Linien exakt untereinander wären, dann würden sie sicher einheitlich dargestellt,
die Abweichen zur nächsten senkrechten Linie bei x = 4693 betrifft das aber nicht
 

guni

Bekanntes Mitglied
ob das so gewollt ist? nein - eigentlich nicht. ich muss mir nochmal ansehen, wie es dazu kommt ...
thema ausdrucken: die senkrechten striche sind im gedrucken format alle gleich dick. die waagrechten auch, aber: sie sind dicker als die Senkrechten.
ich werde mich da noch ein bisschen spielen; vielleicht find ich da ja noch eine schönere Lösung als einen Transform ...
das problem ist nämlich, dass ich die abschnitte in den Pfeilen noch nummerieren muss.
wenn ich das allerdings VOR dem Transform mache, dann ist das Ergebnis später verzerrt und unleserlich :-(
 
S

SlaterB

Gast
ah ja, ein Transform hast du noch drin, das ist auch schuld,
normalerweise wären die senkrechten Linien so breit wie die waagerechten,
aber wenn du sie um das 10fache stauchst, dann wird nicht nur der Zwischenraum kleiner, sondern auch die Linien
 

algorismi

Aktives Mitglied
Hallo,
ich habe in inkskape ein SVG-Template gebastelt.
folgender Code lädt mir die SVG-Datei:
Java:
	    String parser = XMLResourceDescriptor.getXMLParserClassName();
	    SAXSVGDocumentFactory f = new SAXSVGDocumentFactory(parser);
	    String uri = "http://www.w3.org/2000/svg";
	    doc = (SVGDocument)f.createDocument(uri, new FileReader("template.svg"));

Hi guni,

ich versuche auch gerade mit Hilfe von Batik den Inhalt einer SVG-Datei in Java auszulesen,
damit ich es später in Java bearbeiten kann.
Kannst du mir sagen von welchem Typ die Variable "doc" ist, ist sie vielleicht vom Typ "Document" ??


Gruß
Algorismi
 

algorismi

Aktives Mitglied
Hallo Leute,

irgendwie komm ich net so ganz weiter.
Habe es jetzt auch endlich geschafft, eine vorhandene SVG-datei in Java reinzuladen, bloß wie komme ich jetzt an die einzelnen Elemente der SVG-Datei ran?

Also meine SVG Datei besteht aus 4 path-elementen und wie kann ich jetzt z.b auf das erste path-element zugreifen?
und wie könnte ich denn einen weiteren path hinzufügen z.b. am ende????

Gruß
Algorismi
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben