Author: [log in to unmask]
Date: Fri Mar 27 18:08:54 2015
New Revision: 2604
Log:
Add utilities for exporting plots to PDF file.
Added:
java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/ExportPdf.java
Added: java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/ExportPdf.java
=============================================================================
--- java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/ExportPdf.java (added)
+++ java/trunk/monitoring-util/src/main/java/org/hps/monitoring/plotting/ExportPdf.java Fri Mar 27 18:08:54 2015
@@ -0,0 +1,117 @@
+package org.hps.monitoring.plotting;
+
+import hep.aida.IPlotter;
+import hep.aida.jfree.plotter.Plotter;
+
+import java.awt.Component;
+import java.awt.Image;
+import java.awt.image.BufferedImage;
+import java.io.File;
+import java.io.FileOutputStream;
+import java.io.IOException;
+import java.util.ArrayList;
+import java.util.Collection;
+import java.util.List;
+
+import javax.swing.JPanel;
+
+import org.apache.pdfbox.exceptions.COSVisitorException;
+import org.apache.pdfbox.util.PDFMergerUtility;
+
+import com.itextpdf.text.BadElementException;
+import com.itextpdf.text.Document;
+import com.itextpdf.text.DocumentException;
+import com.itextpdf.text.PageSize;
+import com.itextpdf.text.pdf.PdfWriter;
+
+/**
+ * This is a class for exporting plot graphics to PDF.
+ *
+ * @author Jeremy McCormick <[log in to unmask]>
+ *
+ */
+public class ExportPdf {
+
+ private ExportPdf() {
+ }
+
+ /**
+ * Export a JPanel to a single PDF.
+ * @param panel The JPanel.
+ * @param name The output file name.
+ * @throws IOException If there is a problem opening the PDF document.
+ */
+ static void write(JPanel panel, String name) throws IOException {
+
+ Document document = new Document(PageSize.A4.rotate(), 50, 50, 50, 50);
+ PdfWriter writer;
+ try {
+ writer = PdfWriter.getInstance(document, new FileOutputStream(name));
+ } catch (DocumentException e) {
+ throw new IOException(e);
+ }
+ document.open();
+
+ Image awtImage = getImageFromPanel(panel);
+
+ com.itextpdf.text.Image iTextImage = null;
+ try {
+ iTextImage = com.itextpdf.text.Image.getInstance(writer, awtImage, 1f);
+ } catch (BadElementException e) {
+ throw new IOException(e);
+ }
+
+ iTextImage.setAbsolutePosition(50, 50);
+ iTextImage.scalePercent(60);
+ try {
+ document.add(iTextImage);
+ } catch (DocumentException e) {
+ throw new IOException(e);
+ }
+
+ document.close();
+ }
+
+ /**
+ * Get an image from a Swing component.
+ * @param component The Swing component.
+ * @return The image from the component.
+ */
+ static java.awt.Image getImageFromPanel(Component component) {
+ BufferedImage image = new BufferedImage(component.getWidth(), component.getHeight(), BufferedImage.TYPE_INT_RGB);
+ component.paint(image.getGraphics());
+ return image;
+ }
+
+ /**
+ * Write a single PDF containing the graphics from the collection of plotters,
+ * with one plotter per page.
+ *
+ * @param plotters The collection of plotters.
+ * @param fileName The name of the output file.
+ * @throws IOException If there is a problem merging all the plotter PDFs together.
+ */
+ public static void write(Collection<IPlotter> plotters, String fileName) throws IOException {
+
+ PDFMergerUtility merge = new PDFMergerUtility();
+ merge.setDestinationFileName(fileName);
+
+ List<File> tempFiles = new ArrayList<File>();
+ for (IPlotter plotter : plotters) {
+ File tempFile = File.createTempFile("plot", ".pdf");
+ tempFiles.add(tempFile);
+ write(((Plotter)plotter).panel(), tempFile.getPath());
+ merge.addSource(tempFile);
+ }
+
+ try {
+ merge.mergeDocuments();
+ } catch (COSVisitorException e) {
+ throw new IOException("Error merging documents", e);
+ }
+
+ for (File tempFile : tempFiles) {
+ tempFile.delete();
+ }
+ }
+}
|