From f9de6b4703e26df8fd7cfdc8f71b6bf7608a267d Mon Sep 17 00:00:00 2001 From: Michael Demey Date: Thu, 25 Jun 2020 13:50:03 +0200 Subject: [PATCH 1/4] Added Cntent Stream Saving. No syntax check. No indication of it being saved. --- .../itext/SyntaxHighlightedStreamPane.java | 63 +++++++++++++++++-- 1 file changed, 57 insertions(+), 6 deletions(-) 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..16da30ab 100644 --- a/src/main/java/com/itextpdf/rups/view/itext/SyntaxHighlightedStreamPane.java +++ b/src/main/java/com/itextpdf/rups/view/itext/SyntaxHighlightedStreamPane.java @@ -46,7 +46,11 @@ This file is part of the iText (R) project. import com.itextpdf.io.source.RandomAccessFileOrArray; import com.itextpdf.io.source.RandomAccessSourceFactory; import com.itextpdf.kernel.PdfException; -import com.itextpdf.kernel.pdf.*; +import com.itextpdf.kernel.pdf.PdfDictionary; +import com.itextpdf.kernel.pdf.PdfName; +import com.itextpdf.kernel.pdf.PdfObject; +import com.itextpdf.kernel.pdf.PdfStream; +import com.itextpdf.kernel.pdf.PdfString; import com.itextpdf.kernel.pdf.canvas.parser.util.PdfCanvasParser; import com.itextpdf.kernel.pdf.xobject.PdfImageXObject; import com.itextpdf.rups.controller.PdfReaderController; @@ -58,12 +62,29 @@ This file is part of the iText (R) project. import com.itextpdf.rups.view.itext.treenodes.PdfObjectTreeNode; import javax.imageio.ImageIO; -import javax.swing.*; -import javax.swing.text.*; +import javax.swing.AbstractAction; +import javax.swing.ImageIcon; +import javax.swing.JButton; +import javax.swing.JComponent; +import javax.swing.JScrollPane; +import javax.swing.JTextPane; +import javax.swing.KeyStroke; +import javax.swing.text.AttributeSet; +import javax.swing.text.BadLocationException; +import javax.swing.text.SimpleAttributeSet; +import javax.swing.text.Style; +import javax.swing.text.StyleConstants; +import javax.swing.text.StyleContext; +import javax.swing.text.StyledDocument; import javax.swing.undo.CannotRedoException; import javax.swing.undo.CannotUndoException; import javax.swing.undo.UndoManager; -import java.awt.*; + +import java.awt.Color; +import java.awt.FileDialog; +import java.awt.Frame; +import java.awt.HeadlessException; +import java.awt.Toolkit; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; @@ -73,7 +94,11 @@ This file is part of the iText (R) project. import java.io.FilenameFilter; import java.io.IOException; import java.lang.reflect.Method; -import java.util.*; +import java.util.ArrayList; +import java.util.HashMap; +import java.util.Map; +import java.util.Observable; +import java.util.Observer; public class SyntaxHighlightedStreamPane extends JScrollPane implements Observer { @@ -123,7 +148,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) { @@ -227,6 +252,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; @@ -522,3 +548,28 @@ 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) { + try { + String contentStreamContent = this.text.getText(); + PdfObject targetPdfObject = this.target.getPdfObject(); + if ( targetPdfObject instanceof PdfStream ) { + PdfStream stream = (PdfStream) targetPdfObject; + stream.setData(contentStreamContent.getBytes()); + } + System.out.println(); + } catch (CannotRedoException e) { + Toolkit.getDefaultToolkit().beep(); + } + } +} From 49bf0a6362d4f0f26dde53395804812951684175 Mon Sep 17 00:00:00 2001 From: Michael Demey Date: Thu, 25 Jun 2020 13:51:41 +0200 Subject: [PATCH 2/4] Removed sysout --- .../itextpdf/rups/view/itext/SyntaxHighlightedStreamPane.java | 1 - 1 file changed, 1 deletion(-) 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 16da30ab..cd0f6b9a 100644 --- a/src/main/java/com/itextpdf/rups/view/itext/SyntaxHighlightedStreamPane.java +++ b/src/main/java/com/itextpdf/rups/view/itext/SyntaxHighlightedStreamPane.java @@ -567,7 +567,6 @@ public void actionPerformed(ActionEvent evt) { PdfStream stream = (PdfStream) targetPdfObject; stream.setData(contentStreamContent.getBytes()); } - System.out.println(); } catch (CannotRedoException e) { Toolkit.getDefaultToolkit().beep(); } From dcd505fb46d86e46b3f2ca2c1da2437d76f8ad05 Mon Sep 17 00:00:00 2001 From: Michael Demey Date: Thu, 25 Jun 2020 13:52:31 +0200 Subject: [PATCH 3/4] Removed unnecessary exception catching --- .../view/itext/SyntaxHighlightedStreamPane.java | 14 +++++--------- 1 file changed, 5 insertions(+), 9 deletions(-) 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 cd0f6b9a..faa4c2b6 100644 --- a/src/main/java/com/itextpdf/rups/view/itext/SyntaxHighlightedStreamPane.java +++ b/src/main/java/com/itextpdf/rups/view/itext/SyntaxHighlightedStreamPane.java @@ -560,15 +560,11 @@ public SaveAction(ColorTextPane text, PdfObjectTreeNode target) { } public void actionPerformed(ActionEvent evt) { - try { - String contentStreamContent = this.text.getText(); - PdfObject targetPdfObject = this.target.getPdfObject(); - if ( targetPdfObject instanceof PdfStream ) { - PdfStream stream = (PdfStream) targetPdfObject; - stream.setData(contentStreamContent.getBytes()); - } - } catch (CannotRedoException e) { - Toolkit.getDefaultToolkit().beep(); + String contentStreamContent = this.text.getText(); + PdfObject targetPdfObject = this.target.getPdfObject(); + if ( targetPdfObject instanceof PdfStream ) { + PdfStream stream = (PdfStream) targetPdfObject; + stream.setData(contentStreamContent.getBytes()); } } } From 8cf0fbad6903c74cc855045e35d1b3e3b8a16035 Mon Sep 17 00:00:00 2001 From: Michael Demey Date: Fri, 26 Jun 2020 00:20:33 +0200 Subject: [PATCH 4/4] Introuce pdfCOP to RUPS --- pom.xml | 5 ++ .../itext/SyntaxHighlightedStreamPane.java | 74 ++++++++----------- 2 files changed, 37 insertions(+), 42 deletions(-) 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 faa4c2b6..25ff2100 100644 --- a/src/main/java/com/itextpdf/rups/view/itext/SyntaxHighlightedStreamPane.java +++ b/src/main/java/com/itextpdf/rups/view/itext/SyntaxHighlightedStreamPane.java @@ -46,13 +46,10 @@ This file is part of the iText (R) project. import com.itextpdf.io.source.RandomAccessFileOrArray; import com.itextpdf.io.source.RandomAccessSourceFactory; import com.itextpdf.kernel.PdfException; -import com.itextpdf.kernel.pdf.PdfDictionary; -import com.itextpdf.kernel.pdf.PdfName; -import com.itextpdf.kernel.pdf.PdfObject; -import com.itextpdf.kernel.pdf.PdfStream; -import com.itextpdf.kernel.pdf.PdfString; +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; @@ -60,31 +57,15 @@ 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.AbstractAction; -import javax.swing.ImageIcon; -import javax.swing.JButton; -import javax.swing.JComponent; -import javax.swing.JScrollPane; -import javax.swing.JTextPane; -import javax.swing.KeyStroke; -import javax.swing.text.AttributeSet; -import javax.swing.text.BadLocationException; -import javax.swing.text.SimpleAttributeSet; -import javax.swing.text.Style; -import javax.swing.text.StyleConstants; -import javax.swing.text.StyleContext; -import javax.swing.text.StyledDocument; +import javax.swing.*; +import javax.swing.text.*; import javax.swing.undo.CannotRedoException; import javax.swing.undo.CannotUndoException; import javax.swing.undo.UndoManager; - -import java.awt.Color; -import java.awt.FileDialog; -import java.awt.Frame; -import java.awt.HeadlessException; -import java.awt.Toolkit; +import java.awt.*; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import java.awt.event.InputEvent; @@ -94,11 +75,7 @@ This file is part of the iText (R) project. import java.io.FilenameFilter; import java.io.IOException; import java.lang.reflect.Method; -import java.util.ArrayList; -import java.util.HashMap; -import java.util.Map; -import java.util.Observable; -import java.util.Observer; +import java.util.*; public class SyntaxHighlightedStreamPane extends JScrollPane implements Observer { @@ -187,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; } @@ -197,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(); @@ -219,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"); } @@ -265,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++) { @@ -298,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); } @@ -317,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); @@ -461,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; @@ -483,7 +461,7 @@ private void clearPane() { /** * a serial version id. */ - private static final long serialVersionUID = -3699893393067753664L; + private static final long serialVersionUID = - 3699893393067753664L; } @@ -518,6 +496,7 @@ public void append(String s, Map attr) { } class UndoAction extends AbstractAction { + private UndoManager manager; public UndoAction(UndoManager manager) { @@ -534,6 +513,7 @@ public void actionPerformed(ActionEvent evt) { } class RedoAction extends AbstractAction { + private UndoManager manager; public RedoAction(UndoManager manager) { @@ -561,10 +541,20 @@ public SaveAction(ColorTextPane text, PdfObjectTreeNode target) { public void actionPerformed(ActionEvent evt) { String contentStreamContent = this.text.getText(); - PdfObject targetPdfObject = this.target.getPdfObject(); - if ( targetPdfObject instanceof PdfStream ) { - PdfStream stream = (PdfStream) targetPdfObject; - stream.setData(contentStreamContent.getBytes()); + + 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()); } + } }