# SVG nachbearbeiten, Batik



## guni (22. Jul 2009)

Hallo, 
ich habe in inkskape ein SVG-Template gebastelt.
folgender Code lädt mir die SVG-Datei:

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


----------



## SlaterB (22. Jul 2009)

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


----------



## guni (22. Jul 2009)

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



ja. das wollt ich eigentlich wissen. wie geht das?!


----------



## SlaterB (22. Jul 2009)

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 (22. Jul 2009)

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


----------



## SlaterB (22. Jul 2009)

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


----------



## HoaX (22. Jul 2009)

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


----------



## guni (22. Jul 2009)

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:

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


----------



## SlaterB (22. Jul 2009)

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


----------



## guni (22. Jul 2009)

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)

```
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?!


----------



## SlaterB (22. Jul 2009)

das Beispiel scheint nur dafür gedacht, in SVGGraphics2D noch neu per Java-Grapic-Befehle zu malen,
dennoch erstaunlich, dass alles andere weg ist, ob das Document geleert wurde?

vielleicht besser
'Re: SVGDocument to a SVG file' - MARC


----------



## HoaX (22. Jul 2009)

Der SVGTranscoder ist ehr dafür gedacht z.B. ein JPG in ein SVG umzuwandeln.
Batik verwendet ja DOM, daher nimm einfach den Transformer:

```
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 );
```


----------



## guni (27. Jul 2009)

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:

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


----------



## SlaterB (27. Jul 2009)

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 (27. Jul 2009)

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 (27. Jul 2009)

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


----------



## guni (27. Jul 2009)

@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 (27. Jul 2009)

interessant ist, dass ich dieses Attribut weder entfernen noch ändern kann ...


----------



## guni (27. Jul 2009)

kann mir da irgendjemand weiterhelfen?


----------



## Ebenius (27. Jul 2009)

Wie genau baust Du das fehlerhafte DOM auf?

Ebenius


----------



## HoaX (27. Jul 2009)

Ebenius hat gesagt.:


> Wie genau baust Du das fehlerhafte DOM auf?
> 
> Ebenius



Genau, was zauberst du da? Ich habe schon mehrere Projekte mit Batik gemacht mit allerhand Dynamik und sowas ist da nie aufgetreten...


----------



## guni (28. Jul 2009)

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

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

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

```
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 (28. Jul 2009)

Du musst die Methoden mit [c]NS[/c] benutzen. Also kein [c]doc.createElement("g");[/c] sondern sowas:
	
	
	
	





```
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 (28. Jul 2009)

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?!


```
<?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>
```


----------



## SlaterB (28. Jul 2009)

z.B.

```
..
     version="1.0"
     width="900" height="700" fill="gray" font-size="13" viewBox="0 0 900 700"
     >
   <g id="layer" stroke="#404040">
..
```
lose von einem meiner SVG kopiert,
ein Tutorial 
SelfSVG - SVG-Grafiken selbst erstellen


----------



## guni (28. Jul 2009)

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 (28. Jul 2009)

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:

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


----------



## SlaterB (28. Jul 2009)

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

mit einer vorher auf die Festplatte gespeicherten SVG-Datei,


----------



## guni (29. Jul 2009)

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


----------



## SlaterB (29. Jul 2009)

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 (29. Jul 2009)

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


----------



## SlaterB (29. Jul 2009)

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


----------



## guni (29. Jul 2009)

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 (29. Jul 2009)

> 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 (29. Jul 2009)

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!


----------



## SlaterB (29. Jul 2009)

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


```
<?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


----------



## SlaterB (29. Jul 2009)

guni hat gesagt.:


> <xsl:value-of select="concat('url(',$varFilename,')')"/>


oh, genau,
in kürzerer Schreibweise ginge evtl. auch 
url({$varFilename})

die geschweiften Klammern sind wichtig


----------



## guni (29. Jul 2009)

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


----------



## SlaterB (29. Jul 2009)

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 (29. Jul 2009)

[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]


----------



## guni (29. Jul 2009)

wie soll ich denn das pdf posten


----------



## SlaterB (29. Jul 2009)

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


----------



## guni (29. Jul 2009)

ok ... hier kommt die pdf; svg hab ich auf seite 2 unten schon geposted ...


----------



## SlaterB (29. Jul 2009)

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 (29. Jul 2009)

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


----------



## SlaterB (29. Jul 2009)

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 (8. Dez 2009)

guni hat gesagt.:


> Hallo,
> ich habe in inkskape ein SVG-Template gebastelt.
> folgender Code lädt mir die SVG-Datei:
> 
> ...



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


----------



## Ebenius (8. Dez 2009)

Mutmaßlich [c]SVGDocument[/c], wenn man dem Cast glauben darf.

Ebenius


----------



## algorismi (9. Dez 2009)

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


----------

