iText PdfContentByte addTemplate позиция не влияет - PullRequest
1 голос
/ 27 декабря 2010

Я пытаюсь установить положение изображения, которое я добавил в PDF, но оно всегда позиционируется в 0,0. Я много искал, но не смог найти решение. Я думаю, что я не мог хорошо понять о позиционировании.

Вот код, который всегда равен 0,0, но должен быть 200,300!

Большое спасибо за вашу помощь,

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

1 Ответ

0 голосов
/ 27 декабря 2010

Ваш шаблон пуст ... вы получаете PdfGraphics2D непосредственно из прямого контента автора (CB.createGraphics вместо того, что вы, вероятно, намеревались, TP.createGraphics).

Существует несколько решений:

вариант 1: получить Graphics2D из шаблона

 Graphics2D g2 = tp.createGraphics(...)

вариант 2: отказаться от шаблона, переместить диаграмму непосредственно в contentByte.Интерфейс graphics2D немного неуклюжий, поэтому вы, как правило, предпочитаете делать вещи напрямую в contentByte, когда это возможно.Он работает нормально, но созданный им поток контента не так эффективен, как мог бы быть.В данном конкретном случае я не думаю, что это будет иметь значение, но это хорошее практическое правило.

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

Вариант третий: откажитесь от шаблона и переместите диаграмму из экземпляра Graphics2D:

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