2010-12-27 10 views
1

Ich versuche Position zu Bild zu setzen, die ich PDF hinzugefügt habe, aber es positioniert immer auf 0,0. Ich suchte viel, konnte aber keine Lösung finden. Ich denke, ich konnte die Positionierung nicht gut verstehen.iText PdfContentByte addTemplate Position hat keine Auswirkung

Hier ist der Code, der immer zu 0,0, aber es sollte 200.300 sein!

Vielen Dank für Ihre Hilfe,

DefaultPieDataset dataset = new DefaultPieDataset(); 

dataset.setValue(String.format("%s, %s", "pie1", "pie1"),20); 
dataset.setValue(String.format("%s, %s", "pie2", "pie2"),80); 

JFreeChart chart = ChartFactory.createPieChart("testPie", dataset, true, true, false); 

Document document = new Document(); 
document.addCreationDate(); 
document.setPageSize(PageSize.A4); 

PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("test.pdf")); 
document.open(); 

PdfContentByte cb = writer.getDirectContent(); 
PdfTemplate tp = cb.createTemplate(300, 300); 
Graphics2D g2 = cb.createGraphics(300, 300, new DefaultFontMapper()); 

Rectangle2D r2D = new Rectangle2D.Double(0, 0, 300, 300); 
chart.draw(g2, r2D, null); 
g2.dispose(); 
cb.addTemplate(tp, 200, 300); 
document.close(); 

Antwort

0

Ihre Vorlage leer ist ... Sie zum PdfGraphics2D immer direkt aus dem direkten Inhalt des Schreibers (CB.createGraphics statt, was Sie wahrscheinlich gedacht, TP. createGraphics).

Es gibt mehrere Lösungen:

Option 1: das Graphics2D aus der Vorlage

Graphics2D g2 = tp.createGraphics(...) 

Option 2: die Vorlage Graben, das Diagramm direkt in der contentByte bewegen. Die graphics2D-Schnittstelle ist ein wenig klobig, daher sollten Sie es im Allgemeinen bevorzugen, Dinge direkt in contentByte zu tun, wann immer dies möglich ist. Es funktioniert gut, aber der Content-Stream, den es erstellt, ist nicht so effizient wie es sein könnte. In diesem speziellen Fall halte ich das nicht für wichtig, aber das ist eine gute Faustregel.

cb.saveState(); 
cb.concatMatrix(1, 0, 0, 1, 200, 300); 
Graphics2D g2 = cb.createGraphics(...); 
... 
g2.dispose(); 
cb.restoreState(); 
document.close(); 

Option drei: die Vorlage Graben und das Diagramm aus der Graphics2D Instanz bewegen:

g2.transform(AffineTransform.getTranslateInstance(200, 300)); 
chart.draw(...); 
+0

Vielen Dank, sehr, sehr geschätzt. Ich sollte mehr und mehr an itext arbeiten. – jiraiya

Verwandte Themen