diff --git a/pom.xml b/pom.xml index a9de0873..0fc3d693 100644 --- a/pom.xml +++ b/pom.xml @@ -105,6 +105,11 @@ ${itext.version} test + + com.itextpdf + pdfCop + 1.0.1-SNAPSHOT + diff --git a/src/main/java/com/itextpdf/rups/view/itext/SyntaxHighlightedStreamPane.java b/src/main/java/com/itextpdf/rups/view/itext/SyntaxHighlightedStreamPane.java index 460a86cd..25ff2100 100644 --- a/src/main/java/com/itextpdf/rups/view/itext/SyntaxHighlightedStreamPane.java +++ b/src/main/java/com/itextpdf/rups/view/itext/SyntaxHighlightedStreamPane.java @@ -49,6 +49,7 @@ This file is part of the iText (R) project. import com.itextpdf.kernel.pdf.*; import com.itextpdf.kernel.pdf.canvas.parser.util.PdfCanvasParser; import com.itextpdf.kernel.pdf.xobject.PdfImageXObject; +import com.itextpdf.pdfdsl.PdfCop; import com.itextpdf.rups.controller.PdfReaderController; import com.itextpdf.rups.event.RupsEvent; import com.itextpdf.rups.model.LoggerHelper; @@ -56,6 +57,7 @@ This file is part of the iText (R) project. import com.itextpdf.rups.view.contextmenu.ContextMenuMouseListener; import com.itextpdf.rups.view.contextmenu.StreamPanelContextMenu; import com.itextpdf.rups.view.itext.treenodes.PdfObjectTreeNode; +import org.antlr.v4.runtime.misc.ParseCancellationException; import javax.imageio.ImageIO; import javax.swing.*; @@ -123,7 +125,7 @@ public class SyntaxHighlightedStreamPane extends JScrollPane implements Observer /** * Constructs a SyntaxHighlightedStreamPane. * - * @param controller the pdf reader controller + * @param controller the pdf reader text * @param pluginMode the plugin mode */ public SyntaxHighlightedStreamPane(PdfReaderController controller, boolean pluginMode) { @@ -162,7 +164,7 @@ public void render(PdfObjectTreeNode target) { manager.discardAllEdits(); manager.setLimit(0); this.target = target; - if (!(target.getPdfObject() instanceof PdfStream)) { + if (! ( target.getPdfObject() instanceof PdfStream )) { clearPane(); return; } @@ -172,7 +174,7 @@ public void render(PdfObjectTreeNode target) { if (PdfName.Image.equals(stream.getAsName(PdfName.Subtype))) { try { //Convert byte array back to Image - if (!stream.get(PdfName.Width, false).isNumber() && !stream.get(PdfName.Height, false).isNumber()) + if (! stream.get(PdfName.Width, false).isNumber() && ! stream.get(PdfName.Height, false).isNumber()) return; PdfImageXObject pimg = new PdfImageXObject(stream); BufferedImage img = pimg.getBufferedImage(); @@ -194,6 +196,7 @@ public void actionPerformed(ActionEvent event) { try { FileDialog fileDialog = new FileDialog(new Frame(), "Save", FileDialog.SAVE); fileDialog.setFilenameFilter(new FilenameFilter() { + public boolean accept(File dir, String name) { return name.endsWith(".jpg"); } @@ -227,6 +230,7 @@ public boolean accept(File dir, String name) { setTextEditableRoutine(false); } } else if (stream.get(PdfName.Length1) == null) { + text.registerKeyboardAction(new SaveAction(text, this.target), KeyStroke.getKeyStroke(KeyEvent.VK_S, InputEvent.CTRL_MASK), JComponent.WHEN_FOCUSED); setTextEditableRoutine(true); String newline = "\n"; byte[] bb = null; @@ -239,7 +243,7 @@ public boolean accept(File dir, String name) { ArrayList tokens = new ArrayList<>(); while (ps.parse(tokens).size() > 0) { // operator is at the end - String operator = (tokens.get(tokens.size() - 1)).toString(); + String operator = ( tokens.get(tokens.size() - 1) ).toString(); // operands are in front of their operator StringBuilder operandssb = new StringBuilder(); for (int i = 0; i < tokens.size() - 1; i++) { @@ -272,10 +276,10 @@ public boolean accept(File dir, String name) { public void saveToTarget() { manager.discardAllEdits(); manager.setLimit(0); - if (controller != null && ((PdfDictionary) target.getPdfObject()).containsKey(PdfName.Filter)) { + if (controller != null && ( (PdfDictionary) target.getPdfObject() ).containsKey(PdfName.Filter)) { controller.deleteTreeNodeDictChild(target, PdfName.Filter); } - ((PdfStream) target.getPdfObject()).setData(text.getText().getBytes()); + ( (PdfStream) target.getPdfObject() ).setData(text.getText().getBytes()); if (controller != null) { controller.selectNode(target); } @@ -291,7 +295,7 @@ protected void append(StringBuilder sb, PdfObject obj) { byte[] b = str.getValueBytes(); String hex; for (byte aB : b) { - hex = Integer.toHexString((aB & 0xFF)); + hex = Integer.toHexString(( aB & 0xFF )); if (hex.length() % 2 == 1) sb.append("0"); sb.append(hex); @@ -435,7 +439,7 @@ protected void initAttributes() { private void setTextEditableRoutine(boolean editable) { text.setEditable(editable); - if ((pdfStreamGetInputStreamMethod != null) && editable && (target != null) && (target.getPdfObject() instanceof PdfStream)) { + if (( pdfStreamGetInputStreamMethod != null ) && editable && ( target != null ) && ( target.getPdfObject() instanceof PdfStream )) { try { popupMenu.setSaveToStreamEnabled(pdfStreamGetInputStreamMethod.invoke(target.getPdfObject()) == null); return; @@ -457,7 +461,7 @@ private void clearPane() { /** * a serial version id. */ - private static final long serialVersionUID = -3699893393067753664L; + private static final long serialVersionUID = - 3699893393067753664L; } @@ -492,6 +496,7 @@ public void append(String s, Map attr) { } class UndoAction extends AbstractAction { + private UndoManager manager; public UndoAction(UndoManager manager) { @@ -508,6 +513,7 @@ public void actionPerformed(ActionEvent evt) { } class RedoAction extends AbstractAction { + private UndoManager manager; public RedoAction(UndoManager manager) { @@ -522,3 +528,33 @@ public void actionPerformed(ActionEvent evt) { } } } + +class SaveAction extends AbstractAction { + + private final ColorTextPane text; + private final PdfObjectTreeNode target; + + public SaveAction(ColorTextPane text, PdfObjectTreeNode target) { + this.text = text; + this.target = target; + } + + public void actionPerformed(ActionEvent evt) { + String contentStreamContent = this.text.getText(); + + PdfCop pdfCop = new PdfCop(); + + try { + pdfCop.compile(contentStreamContent); + System.out.println("Syntax compiled successfully!"); + PdfObject targetPdfObject = this.target.getPdfObject(); + if (targetPdfObject instanceof PdfStream) { + PdfStream stream = (PdfStream) targetPdfObject; + stream.setData(contentStreamContent.getBytes()); + } + } catch (ParseCancellationException pce) { + System.out.println("Syntax failed to compile: " + pce.getMessage()); + } + + } +}