package de.deutscherv.icepdf.integration; import java.io.ByteArrayInputStream; import java.io.ByteArrayOutputStream; import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import java.io.IOException; import java.io.InputStream; import java.util.ArrayList; import java.util.List; import javax.swing.JOptionPane; import org.apache.commons.exec.CommandLine; import org.apache.commons.exec.DefaultExecutor; import org.apache.commons.exec.ExecuteException; import org.apache.commons.exec.ExecuteWatchdog; import org.icepdf.core.pobjects.Document; import org.icepdf.core.pobjects.PObject; import org.icepdf.core.pobjects.Page; import org.icepdf.core.pobjects.annotations.Annotation; import org.icepdf.core.util.IncrementalUpdater; import org.icepdf.core.util.Library; import org.icepdf.core.util.Parser; import org.icepdf.ri.common.MyAnnotationCallback; import org.icepdf.ri.common.SwingController; import org.icepdf.ri.common.views.AbstractPageViewComponent; import org.icepdf.ri.common.views.AnnotationComponent; import org.icepdf.ri.common.views.annotations.AnnotationComponentFactory; import com.itextpdf.text.DocumentException; import com.itextpdf.text.Element; import com.itextpdf.text.pdf.BaseFont; import com.itextpdf.text.pdf.CMYKColor; import com.itextpdf.text.pdf.PdfContentByte; import com.itextpdf.text.pdf.PdfGState; import com.itextpdf.text.pdf.PdfReader; import com.itextpdf.text.pdf.PdfStamper; import de.deutscherv.diva.common.logging.Logger; public class MySwingController extends SwingController { private static Logger _logger = Logger.getLogger(MySwingController.class); public IMarkupSaveHandler mkpSaveHandler; public MySwingController() { super(); mkpSaveHandler = null; } public int gibAktuelleSeite() { return this.getCurrentPageNumber() + 1; } public void geheZuSeite(int iSeiteNr) { this.showPage(iSeiteNr - 1); } public void print(boolean b) { Thread t = new Thread() { public void run() { _logger.debug("Thread zum Drucken gestartet."); // druckeViaDesktopLokal(); // druckeViaAcrobat(); druckeViaAcrobatwithWatermark(); } }; t.start(); // druckeLokal(); } public void druckeViaAcrobatwithWatermark() { long lStart = System.currentTimeMillis(); File druckTempFile = null; int exitValue = 0; try { druckTempFile = File.createTempFile("druck", ".pdf"); String sTempFile = getDocument().getDocumentLocation(); _logger.debug("TempFile: " + sTempFile); PdfReader pdfReader = new PdfReader(sTempFile); PdfStamper pdfStamper = new PdfStamper(pdfReader, new FileOutputStream(druckTempFile)); // Get the PdfContentByte type by pdfStamper. int iPageNumber = 0; while (iPageNumber < pdfReader.getNumberOfPages()) { iPageNumber++; PdfContentByte overContent = pdfStamper .getOverContent(iPageNumber); BaseFont bf = BaseFont.createFont(BaseFont.HELVETICA, BaseFont.WINANSI, BaseFont.EMBEDDED); PdfGState gs = new PdfGState(); gs.setFillOpacity(0.8f); overContent.setGState(gs); overContent.beginText(); overContent.setFontAndSize(bf, 20); overContent.setColorFill(CMYKColor.LIGHT_GRAY); // overContent.showTextAligned(Element.ALIGN_CENTER, // "*** DUPLIKAT ***", 300, // overContent.getPdfDocument().getPageSize().getTop() - 60, 0); // overContent.showTextAligned(Element.ALIGN_CENTER, // "*** DUPLIKAT ***", 300, // overContent.getPdfDocument().getPageSize().getBottom() + 60, // 0); overContent .showTextAligned( Element.ALIGN_CENTER, "*** DUPLIKAT *** DUPLIKAT *** DUPLIKAT *** DUPLIKAT *** DUPLIKAT *** DUPLIKAT ***", 30, overContent.getPdfDocument().getPageSize() .getHeight() / 2, 90); overContent.endText(); } pdfStamper.close(); _logger.debug("druck.pdf erzeugt"); String line = "C:/Programme/Adobe/Reader 8.0/Reader/AcroRd32.exe /p /h \"" + druckTempFile.getAbsolutePath() + "\""; CommandLine cmdLine = CommandLine.parse(line); DefaultExecutor executor = new DefaultExecutor(); executor.setExitValue(1); ExecuteWatchdog watchdog = new ExecuteWatchdog(60000); executor.setWatchdog(watchdog); exitValue = executor.execute(cmdLine); } catch (FileNotFoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (ExecuteException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (DocumentException e) { // TODO Auto-generated catch block e.printStackTrace(); } finally { druckTempFile.delete(); if (exitValue != 1) { _logger.debug("Drucken über Adobe Acrobat fehlgeschlagen"); } else { _logger.debug("erfolgreich gedruckt in " + (System.currentTimeMillis() - lStart) + " ms."); } } } public void loadMarkupFile(InputStream lIs) throws Exception { Document document = getDocument(); java.util.List pageComponents = getDocumentViewController() .getDocumentViewModel().getPageComponents(); Library library = document.getCatalog().getLibrary(); Parser parser = new Parser(lIs); // keep a hard reference to the objects ArrayList libraryObjects = new ArrayList(); for (Object streamObject = parser.getObject(library); streamObject != null; streamObject = parser.getObject(library)) { libraryObjects.add(streamObject); } // iterate over the stream objects look for pages so we know which // annotations should be added to which page. pageComponents = getDocumentViewController() .getDocumentViewModel().getPageComponents(); MyAnnotationCallback myAnnotationCallback = new org.icepdf.ri.common.MyAnnotationCallback( getDocumentViewController()); for (Object objects : libraryObjects) { if (objects instanceof PObject && ((PObject) objects).getObject() instanceof Page) { Page page = (Page) ((PObject) objects).getObject(); page.init(); int pageNumber = document.getPageTree().getPageNumber( page.getPObjectReference()); AbstractPageViewComponent pageViewComponent = pageComponents .get(pageNumber); // add our new page to the library List annotations = page.getAnnotations(); // hook up the new annotations for (Annotation annotation : annotations) { AnnotationComponent annotationComponent = AnnotationComponentFactory.buildAnnotationComponent( annotation, getDocumentViewController(), pageViewComponent, getDocumentViewController().getDocumentViewModel()); myAnnotationCallback.newAnnotation(pageViewComponent, annotationComponent); } // finally show in the viewer the annotated file. pageViewComponent.init(); } } } public InputStream saveMarkupFile() throws Exception { byte[][] updates = IncrementalUpdater.getUpdatedDocumentObjects(this .getDocument()); // write the bytes to file ByteArrayOutputStream baos = new ByteArrayOutputStream(); // FileOutputStream fileOutputStream = new // FileOutputStream("d:/changes.txt"); for (byte[] update : updates) { // fileOutputStream.write(update); baos.write(update); } baos.close(); return new ByteArrayInputStream(baos.toByteArray()); // fileOutputStream.close(); } /** * Utility method for saving a copy of the currently opened PDF to a file. * This will check all valid permissions and show a file save dialog for the * user to select where to save the file to, and what name to give it. */ @Override public void saveFile() { // // Ensure we actually CAN save the document in the first place // if (!havePermissionToModifyDocument()) { // org.icepdf.ri.util.Resources.showMessageDialog( // viewer, // JOptionPane.INFORMATION_MESSAGE, // messageBundle, // "viewer.dialog.saveAs.noPermission.title", // "viewer.dialog.saveAs.noPermission.msg"); // return; // } // // this.getDocument(); if (!this.getDocument().getStateManager().isChanged() && !Document.foundIncrementalUpdater) { org.icepdf.ri.util.Resources.showMessageDialog(this .getViewerFrame(), JOptionPane.INFORMATION_MESSAGE, this .getMessageBundle(), "viewer.dialog.saveAs.noUpdates.title", "viewer.dialog.saveAs.noUpdates.msg"); return; } if (mkpSaveHandler != null) try { mkpSaveHandler.saveMarkup(); } catch (Exception e) { // TODO Auto-generated catch block e.printStackTrace(); } // } public void registerMarkupSaveHandler(IMarkupSaveHandler imarkupsavehandler) { mkpSaveHandler = imarkupsavehandler; } }