You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@pdfbox.apache.org by ti...@apache.org on 2019/06/15 11:42:50 UTC
svn commit: r1861373 - in
/pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger:
PDFDebugger.java pagepane/PagePane.java ui/TextDialog.java ui/ViewMenu.java
Author: tilman
Date: Sat Jun 15 11:42:50 2019
New Revision: 1861373
URL: http://svn.apache.org/viewvc?rev=1861373&view=rev
Log:
PDFBOX-2941: added simple text extraction in separate window
Added:
pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/TextDialog.java
- copied, changed from r1860828, pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/LogDialog.java
Modified:
pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java
pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/pagepane/PagePane.java
pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/ViewMenu.java
Modified: pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java?rev=1861373&r1=1861372&r2=1861373&view=diff
==============================================================================
--- pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java (original)
+++ pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/PDFDebugger.java Sat Jun 15 11:42:50 2019
@@ -106,6 +106,7 @@ import org.apache.pdfbox.debugger.ui.Pag
import org.apache.pdfbox.debugger.ui.ReaderBottomPanel;
import org.apache.pdfbox.debugger.ui.RecentFiles;
import org.apache.pdfbox.debugger.ui.RotationMenu;
+import org.apache.pdfbox.debugger.ui.TextDialog;
import org.apache.pdfbox.debugger.ui.Tree;
import org.apache.pdfbox.debugger.ui.ViewMenu;
import org.apache.pdfbox.debugger.ui.ZoomMenu;
@@ -252,6 +253,8 @@ public class PDFDebugger extends JFrame
LogDialog.init(viewer, viewer.statusBar.getLogLabel());
System.setProperty("org.apache.commons.logging.Log", "org.apache.pdfbox.debugger.ui.DebugLog");
+ TextDialog.init(viewer);
+
// trigger premature initializations for more accurate rendering benchmarks
// See discussion in PDFBOX-3988
if (PDType1Font.COURIER.isStandard14())
Modified: pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/pagepane/PagePane.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/pagepane/PagePane.java?rev=1861373&r1=1861372&r2=1861373&view=diff
==============================================================================
--- pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/pagepane/PagePane.java (original)
+++ pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/pagepane/PagePane.java Sat Jun 15 11:42:50 2019
@@ -53,6 +53,7 @@ import java.util.Map.Entry;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.TimeUnit;
import org.apache.pdfbox.debugger.ui.HighResolutionImageIcon;
+import org.apache.pdfbox.debugger.ui.TextDialog;
import org.apache.pdfbox.pdmodel.common.PDRectangle;
import org.apache.pdfbox.pdmodel.interactive.action.PDAction;
import org.apache.pdfbox.pdmodel.interactive.action.PDActionGoTo;
@@ -65,6 +66,7 @@ import org.apache.pdfbox.pdmodel.interac
import org.apache.pdfbox.pdmodel.interactive.documentnavigation.destination.PDPageDestination;
import org.apache.pdfbox.pdmodel.interactive.form.PDAcroForm;
import org.apache.pdfbox.pdmodel.interactive.form.PDField;
+import org.apache.pdfbox.text.PDFTextStripper;
/**
* Display the page number and a page rendering.
@@ -226,6 +228,30 @@ public class PagePane implements ActionL
{
startRendering();
}
+ else if (ViewMenu.isExtractText(actionEvent))
+ {
+ startExtracting();
+ }
+ }
+
+ private void startExtracting()
+ {
+ TextDialog textDialog = TextDialog.instance();
+ textDialog.setSize(800, 400);
+ textDialog.setVisible(true);
+ textDialog.setLocation(getPanel().getLocationOnScreen().x + getPanel().getWidth() / 2,
+ getPanel().getLocationOnScreen().y + getPanel().getHeight() / 2);
+ try
+ {
+ PDFTextStripper stripper = new PDFTextStripper();
+ stripper.setStartPage(pageIndex + 1);
+ stripper.setEndPage(pageIndex + 1);
+ textDialog.setText(stripper.getText(document));
+ }
+ catch (IOException ex)
+ {
+ throw new RuntimeException(ex);
+ }
}
private void startRendering()
Copied: pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/TextDialog.java (from r1860828, pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/LogDialog.java)
URL: http://svn.apache.org/viewvc/pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/TextDialog.java?p2=pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/TextDialog.java&p1=pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/LogDialog.java&r1=1860828&r2=1861373&rev=1861373&view=diff
==============================================================================
--- pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/LogDialog.java (original)
+++ pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/TextDialog.java Sat Jun 15 11:42:50 2019
@@ -1,9 +1,10 @@
/*
- * Copyright 2016 The Apache Software Foundation.
- *
- * Licensed under the Apache License, Version 2.0 (the "License");
- * you may not use this file except in compliance with the License.
- * You may obtain a copy of the License at
+ * Licensed to the Apache Software Foundation (ASF) under one or more
+ * contributor license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright ownership.
+ * The ASF licenses this file to You under the Apache License, Version 2.0
+ * (the "License"); you may not use this file except in compliance with
+ * the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
@@ -15,189 +16,66 @@
*/
package org.apache.pdfbox.debugger.ui;
-import java.awt.Color;
+import java.awt.Container;
import java.awt.Frame;
-import java.io.PrintWriter;
-import java.io.StringWriter;
-import java.util.ArrayList;
-import java.util.List;
import javax.swing.JDialog;
-import javax.swing.JLabel;
import javax.swing.JScrollPane;
import javax.swing.JTextPane;
-import javax.swing.text.BadLocationException;
-import javax.swing.text.SimpleAttributeSet;
-import javax.swing.text.StyleConstants;
-import javax.swing.text.StyledDocument;
/**
- * Custom log dialog.
+ * Window for text extraction result.
*
+ * @author Tilman Hausherr
* @author John Hewson
*/
-public class LogDialog extends JDialog
+public class TextDialog extends JDialog
{
- private static LogDialog instance;
-
- public static void init(Frame owner, JLabel logLabel)
+ private static TextDialog instance;
+
+ public static void init(Frame owner)
{
- instance = new LogDialog(owner, logLabel);
+ instance = new TextDialog(owner);
}
- public static LogDialog instance()
+ public static TextDialog instance()
{
return instance;
}
- private final JLabel logLabel;
private final JTextPane textPane;
private final JScrollPane scrollPane;
- private int fatalCount = 0;
- private int errorCount = 0;
- private int warnCount = 0;
- private int otherCount = 0;
- private int exceptionCount = 0;
-
- private LogDialog(Frame owner, JLabel logLabel)
+
+ private TextDialog(Frame owner)
{
super(owner);
- this.logLabel = logLabel;
-
+
textPane = new JTextPane();
scrollPane = new JScrollPane(textPane);
getContentPane().add(scrollPane);
-
- this.pack();
+ pack();
}
-
- public void log(String name, String level, Object o, Throwable throwable)
- {
- StyledDocument doc = textPane.getStyledDocument();
-
- String levelText;
- SimpleAttributeSet levelStyle = new SimpleAttributeSet();
- switch (level)
- {
- case "fatal":
- levelText = "Fatal";
- StyleConstants.setForeground(levelStyle, Color.WHITE);
- StyleConstants.setBackground(levelStyle, Color.BLACK);
- fatalCount++;
- break;
- case "error":
- levelText = "Error";
- StyleConstants.setForeground(levelStyle, new Color(0xFF291F));
- StyleConstants.setBackground(levelStyle, new Color(0xFFF0F0));
- errorCount++;
- break;
- case "warn":
- levelText = "Warning";
- StyleConstants.setForeground(levelStyle, new Color(0x614201));
- StyleConstants.setBackground(levelStyle, new Color(0xFFFCE5));
- warnCount++;
- break;
- case "info":
- levelText = "Info";
- StyleConstants.setForeground(levelStyle, new Color(0x203261));
- StyleConstants.setBackground(levelStyle, new Color(0xE2E8FF));
- otherCount++;
- break;
- case "debug":
- levelText = "Debug";
- StyleConstants.setForeground(levelStyle, new Color(0x32612E));
- StyleConstants.setBackground(levelStyle, new Color(0xF4FFEC));
- otherCount++;
- break;
- case "trace":
- levelText = "Trace";
- StyleConstants.setForeground(levelStyle, new Color(0x64438D));
- StyleConstants.setBackground(levelStyle, new Color(0xFEF3FF));
- otherCount++;
- break;
- default:
- throw new Error(level);
- }
-
- SimpleAttributeSet nameStyle = new SimpleAttributeSet();
- StyleConstants.setForeground(nameStyle, new Color(0x6A6A6A));
-
- String shortName = name.substring(name.lastIndexOf('.') + 1);
- String message = o == null ? "(null)" : o.toString();
-
- if (throwable != null)
- {
- StringWriter sw = new StringWriter();
- throwable.printStackTrace(new PrintWriter(sw));
- message += "\n " + sw.toString();
- exceptionCount++;
- }
-
- try
- {
- doc.insertString(doc.getLength(), " " + levelText + " ", levelStyle);
- doc.insertString(doc.getLength(), " [" + shortName + "]", nameStyle);
- doc.insertString(doc.getLength(), " " + message + "\n", null);
- }
- catch (BadLocationException e)
- {
- throw new Error(e);
- }
- textPane.setCaretPosition(doc.getLength());
-
- // update status bar with new counts
- updateStatusBar();
- }
-
- private void updateStatusBar()
- {
- List<String> infos = new ArrayList<>();
-
- if (exceptionCount > 0)
- {
- infos.add(exceptionCount + " exception" + (errorCount > 1 ? "s" : ""));
- }
-
- if (fatalCount > 0)
- {
- infos.add(errorCount + " error" + (errorCount > 1 ? "s" : ""));
- }
-
- if (errorCount > 0)
- {
- infos.add(errorCount + " error" + (errorCount > 1 ? "s" : ""));
- }
-
- if (warnCount > 0)
- {
- infos.add(warnCount + " warning" + (warnCount > 1 ? "s" : ""));
- }
-
- if (otherCount > 0)
- {
- infos.add(otherCount + " message" + (otherCount > 1 ? "s" : ""));
- }
-
- String info = "";
- for (String str : infos)
- {
- if (info.length() > 0)
- {
- info += ", ";
- }
- info += str;
- }
-
- logLabel.setText(info);
- }
-
+
public void clear()
{
- fatalCount = 0;
- errorCount = 0;
- warnCount = 0;
- otherCount = 0;
- exceptionCount = 0;
textPane.setText("");
- logLabel.setText("");
+ }
+
+ public void setText(String text)
+ {
+ textPane.setText(text);
+ }
+
+ // these two just to avoid the "overridable method call in constructor" warning
+
+ @Override
+ public final Container getContentPane()
+ {
+ return super.getContentPane();
+ }
+
+ @Override
+ public final void pack()
+ {
+ super.pack();
}
}
Modified: pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/ViewMenu.java
URL: http://svn.apache.org/viewvc/pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/ViewMenu.java?rev=1861373&r1=1861372&r2=1861373&view=diff
==============================================================================
--- pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/ViewMenu.java (original)
+++ pdfbox/trunk/debugger/src/main/java/org/apache/pdfbox/debugger/ui/ViewMenu.java Sat Jun 15 11:42:50 2019
@@ -34,6 +34,7 @@ public class ViewMenu extends MenuBase
private static final String SHOW_FONT_BBOX = "Show Approximate Text Bounds";
private static final String SHOW_GLYPH_BOUNDS = "Show Glyph Bounds";
private static final String ALLOW_SUBSAMPLING = "Allow subsampling";
+ private static final String EXTRACT_TEXT = "Extract Text";
private JMenuItem viewModeItem;
private JCheckBoxMenuItem showTextStripper;
@@ -41,6 +42,7 @@ public class ViewMenu extends MenuBase
private JCheckBoxMenuItem showFontBBox;
private JCheckBoxMenuItem showGlyphBounds;
private JCheckBoxMenuItem allowSubsampling;
+ private static JMenuItem extractTextMenuItem;
private final PDFDebugger pdfDebugger;
@@ -123,7 +125,18 @@ public class ViewMenu extends MenuBase
{
return instance.showGlyphBounds.isSelected();
}
-
+
+ /**
+ * Tell whether the "Extract Text" menu entry was hit.
+ *
+ * @param actionEvent
+ * @return true if the "Extract Text" menu entry was hit.
+ */
+ public static boolean isExtractText(ActionEvent actionEvent)
+ {
+ return extractTextMenuItem.equals(actionEvent.getSource());
+ }
+
/**
* State if subsampling for image rendering shall be used.
*
@@ -202,6 +215,12 @@ public class ViewMenu extends MenuBase
allowSubsampling.setEnabled(false);
viewMenu.add(allowSubsampling);
+ viewMenu.addSeparator();
+
+ extractTextMenuItem = new JMenuItem(EXTRACT_TEXT);
+ extractTextMenuItem.setEnabled(false);
+ viewMenu.add(extractTextMenuItem);
+
return viewMenu;
}
}