diff --git a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java index 3dc28a49be..08c6f8f6d4 100644 --- a/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java +++ b/Core/src/org/sleuthkit/autopsy/core/UserPreferences.java @@ -62,6 +62,7 @@ public final class UserPreferences { private static final String MESSAGE_SERVICE_HOST = "MessageServiceHost"; //NON-NLS private static final String MESSAGE_SERVICE_PORT = "MessageServicePort"; //NON-NLS public static final String TEXT_TRANSLATOR_NAME = "TextTranslatorName"; + public static final String OCR_TRANSLATION_ENABLED = "OcrTranslationEnabled"; public static final String PROCESS_TIME_OUT_ENABLED = "ProcessTimeOutEnabled"; //NON-NLS public static final String PROCESS_TIME_OUT_HOURS = "ProcessTimeOutHours"; //NON-NLS private static final int DEFAULT_PROCESS_TIMEOUT_HR = 60; @@ -347,6 +348,14 @@ public final class UserPreferences { public static String getTextTranslatorName() { return preferences.get(TEXT_TRANSLATOR_NAME, null); } + + public static void setUseOcrInTranslation(boolean enableOcr) { + preferences.putBoolean(OCR_TRANSLATION_ENABLED, enableOcr); + } + + public static boolean getUseOcrInTranslation() { + return preferences.getBoolean(OCR_TRANSLATION_ENABLED, true); + } /** * Persists message service connection info. @@ -623,4 +632,4 @@ public final class UserPreferences { return Paths.get(UserMachinePreferences.getBaseTempDirectory(), getAppName()) .toAbsolutePath().toString(); } -} +} \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/Bundle.properties b/Core/src/org/sleuthkit/autopsy/texttranslation/Bundle.properties index 5fcf80851c..bd321cf492 100755 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/Bundle.properties +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/Bundle.properties @@ -6,3 +6,4 @@ TranslationOptionsPanelController.moduleErr.msg=A module caused an error listeni TranslationContentPanel.showLabel.text=Show: TranslationOptionsPanel.translationServiceLabel.text=Text translator: TranslationOptionsPanel.translationOptionsDescription.text=Configure a 3rd party text translation service to enable text and file name translation. +TranslationOptionsPanel.enableOcrCheckBox.text=Enable Optical Character Recognition (OCR) in the translation content viewer diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/texttranslation/Bundle.properties-MERGED index 665c07c36f..2da3aab4a4 100755 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/Bundle.properties-MERGED @@ -10,3 +10,4 @@ TranslationOptionsPanelController.moduleErr.msg=A module caused an error listeni TranslationContentPanel.showLabel.text=Show: TranslationOptionsPanel.translationServiceLabel.text=Text translator: TranslationOptionsPanel.translationOptionsDescription.text=Configure a 3rd party text translation service to enable text and file name translation. +TranslationOptionsPanel.enableOcrCheckBox.text=Enable Optical Character Recognition (OCR) in the translation content viewer diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/TranslationOptionsPanel.form b/Core/src/org/sleuthkit/autopsy/texttranslation/TranslationOptionsPanel.form index 52cd0fb65c..aadca0381f 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/TranslationOptionsPanel.form +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/TranslationOptionsPanel.form @@ -16,17 +16,23 @@ + + - - - + + + + + + + + - @@ -42,9 +48,13 @@ - - - + + + + + + + @@ -76,5 +86,17 @@ + + + + + + + + + + + + - + \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/TranslationOptionsPanel.java b/Core/src/org/sleuthkit/autopsy/texttranslation/TranslationOptionsPanel.java index 3c9ee7dc7b..9fdb95b2b1 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/TranslationOptionsPanel.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/TranslationOptionsPanel.java @@ -111,6 +111,7 @@ final class TranslationOptionsPanel extends javax.swing.JPanel { } translatorComboBox.setSelectedItem(currentSelection); loadSelectedPanelSettings(); + enableOcrCheckBox.setSelected(UserPreferences.getUseOcrInTranslation()); } /** @@ -128,6 +129,8 @@ final class TranslationOptionsPanel extends javax.swing.JPanel { logger.log(Level.WARNING, "Unable to save settings for TextTranslator named: " + currentSelection, ex); } } + // Save whether OCR is enabled in the content viewer + UserPreferences.setUseOcrInTranslation(enableOcrCheckBox.isSelected()); } @@ -144,6 +147,8 @@ final class TranslationOptionsPanel extends javax.swing.JPanel { translationServiceLabel = new javax.swing.JLabel(); translationServicePanel = new javax.swing.JPanel(); translationOptionsDescription = new javax.swing.JLabel(); + jSeparator1 = new javax.swing.JSeparator(); + enableOcrCheckBox = new javax.swing.JCheckBox(); translatorComboBox.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { @@ -157,20 +162,31 @@ final class TranslationOptionsPanel extends javax.swing.JPanel { org.openide.awt.Mnemonics.setLocalizedText(translationOptionsDescription, org.openide.util.NbBundle.getMessage(TranslationOptionsPanel.class, "TranslationOptionsPanel.translationOptionsDescription.text")); // NOI18N + org.openide.awt.Mnemonics.setLocalizedText(enableOcrCheckBox, org.openide.util.NbBundle.getMessage(TranslationOptionsPanel.class, "TranslationOptionsPanel.enableOcrCheckBox.text")); // NOI18N + enableOcrCheckBox.addActionListener(new java.awt.event.ActionListener() { + public void actionPerformed(java.awt.event.ActionEvent evt) { + enableOcrCheckBoxActionPerformed(evt); + } + }); + javax.swing.GroupLayout layout = new javax.swing.GroupLayout(this); this.setLayout(layout); layout.setHorizontalGroup( layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addComponent(jSeparator1) .addGroup(layout.createSequentialGroup() .addContainerGap() .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) .addComponent(translationServicePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) + .addComponent(translationOptionsDescription, javax.swing.GroupLayout.DEFAULT_SIZE, 462, Short.MAX_VALUE) .addGroup(layout.createSequentialGroup() - .addComponent(translationServiceLabel) - .addGap(10, 10, 10) - .addComponent(translatorComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 214, javax.swing.GroupLayout.PREFERRED_SIZE) - .addGap(0, 0, Short.MAX_VALUE)) - .addComponent(translationOptionsDescription, javax.swing.GroupLayout.PREFERRED_SIZE, 462, Short.MAX_VALUE)) + .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) + .addGroup(layout.createSequentialGroup() + .addComponent(translationServiceLabel) + .addGap(10, 10, 10) + .addComponent(translatorComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, 214, javax.swing.GroupLayout.PREFERRED_SIZE)) + .addComponent(enableOcrCheckBox)) + .addGap(0, 0, Short.MAX_VALUE))) .addContainerGap()) ); layout.setVerticalGroup( @@ -183,8 +199,12 @@ final class TranslationOptionsPanel extends javax.swing.JPanel { .addComponent(translatorComboBox, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) .addComponent(translationServiceLabel)) .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) - .addComponent(translationServicePanel, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE) - .addContainerGap()) + .addComponent(translationServicePanel, javax.swing.GroupLayout.PREFERRED_SIZE, javax.swing.GroupLayout.DEFAULT_SIZE, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.UNRELATED) + .addComponent(jSeparator1, javax.swing.GroupLayout.PREFERRED_SIZE, 10, javax.swing.GroupLayout.PREFERRED_SIZE) + .addPreferredGap(javax.swing.LayoutStyle.ComponentPlacement.RELATED) + .addComponent(enableOcrCheckBox) + .addContainerGap(javax.swing.GroupLayout.DEFAULT_SIZE, Short.MAX_VALUE)) ); }// //GEN-END:initComponents @@ -192,12 +212,18 @@ final class TranslationOptionsPanel extends javax.swing.JPanel { updatePanel(); }//GEN-LAST:event_translatorComboBoxActionPerformed + private void enableOcrCheckBoxActionPerformed(java.awt.event.ActionEvent evt) {//GEN-FIRST:event_enableOcrCheckBoxActionPerformed + controller.changed(); + }//GEN-LAST:event_enableOcrCheckBoxActionPerformed + // Variables declaration - do not modify//GEN-BEGIN:variables + private javax.swing.JCheckBox enableOcrCheckBox; + private javax.swing.JSeparator jSeparator1; private javax.swing.JLabel translationOptionsDescription; private javax.swing.JLabel translationServiceLabel; private javax.swing.JPanel translationServicePanel; private javax.swing.JComboBox translatorComboBox; // End of variables declaration//GEN-END:variables -} +} \ No newline at end of file diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/ui/Bundle.properties-MERGED b/Core/src/org/sleuthkit/autopsy/texttranslation/ui/Bundle.properties-MERGED index 802b117c35..c87d7ae238 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/ui/Bundle.properties-MERGED +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/ui/Bundle.properties-MERGED @@ -8,6 +8,7 @@ TranslatedContentViewer.errorExtractingText=An error occurred while extracting t TranslatedContentViewer.extractingText=Extracting text, please wait... TranslatedContentViewer.fileHasNoText=File has no text. TranslatedContentViewer.noServiceProvider=The machine translation software was not found. +TranslatedContentViewer.ocrNotEnabled=OCR is not enabled. To change, go to Tools->Options->Machine Translation TranslatedContentViewer.translatingText=Translating text, please wait... # {0} - exception message TranslatedContentViewer.translationException=An error occurred while translating the text ({0}). diff --git a/Core/src/org/sleuthkit/autopsy/texttranslation/ui/TranslatedTextViewer.java b/Core/src/org/sleuthkit/autopsy/texttranslation/ui/TranslatedTextViewer.java index ab0b9de083..ac3b9b2291 100644 --- a/Core/src/org/sleuthkit/autopsy/texttranslation/ui/TranslatedTextViewer.java +++ b/Core/src/org/sleuthkit/autopsy/texttranslation/ui/TranslatedTextViewer.java @@ -48,6 +48,7 @@ import org.sleuthkit.datamodel.Content; import java.util.List; import java.util.logging.Level; import javax.swing.SwingUtilities; +import org.sleuthkit.autopsy.core.UserPreferences; import org.sleuthkit.autopsy.coreutils.Logger; import org.sleuthkit.autopsy.coreutils.PlatformUtil; import org.sleuthkit.autopsy.texttranslation.ui.TranslationContentPanel.DisplayDropdownOptions; @@ -201,10 +202,17 @@ public final class TranslatedTextViewer implements TextViewer { * @throws * org.sleuthkit.autopsy.textextractors.TextExtractor.InitReaderException */ + @NbBundle.Messages({ + "TranslatedContentViewer.ocrNotEnabled=OCR is not enabled. To change, go to Tools->Options->Machine Translation", + }) private String getFileText(AbstractFile file) throws IOException, InterruptedException, TextExtractor.InitReaderException { final boolean isImage = file.getMIMEType().toLowerCase().startsWith("image/"); // NON-NLS + if (isImage && ! UserPreferences.getUseOcrInTranslation()) { + return Bundle.TranslatedContentViewer_ocrNotEnabled(); + } + String result; - if (isImage) { + if (UserPreferences.getUseOcrInTranslation()) { result = extractText(file, OCR_ENABLED); } else { result = extractText(file, OCR_DISABLED); @@ -363,4 +371,4 @@ public final class TranslatedTextViewer implements TextViewer { return panel.getSelectedOcrLanguagePack(); } } -} +} \ No newline at end of file diff --git a/docs/doxygen-user/images/mt_config.png b/docs/doxygen-user/images/mt_config.png index e3022aec0d..b793191ae8 100644 Binary files a/docs/doxygen-user/images/mt_config.png and b/docs/doxygen-user/images/mt_config.png differ diff --git a/docs/doxygen-user/images/mt_ocr_image.png b/docs/doxygen-user/images/mt_ocr_image.png new file mode 100644 index 0000000000..b4e16bfa09 Binary files /dev/null and b/docs/doxygen-user/images/mt_ocr_image.png differ diff --git a/docs/doxygen-user/images/mt_ocr_result.png b/docs/doxygen-user/images/mt_ocr_result.png new file mode 100644 index 0000000000..27d9af77f0 Binary files /dev/null and b/docs/doxygen-user/images/mt_ocr_result.png differ diff --git a/docs/doxygen-user/keyword_search.dox b/docs/doxygen-user/keyword_search.dox index 271e660cac..fd207a6de2 100644 --- a/docs/doxygen-user/keyword_search.dox +++ b/docs/doxygen-user/keyword_search.dox @@ -57,6 +57,7 @@ The "Indexed Text" tab shows the results when running the keyword search module \image html keyword-search-ocr-indexed-text.png +\anchor keyword_search_ocr_config By default, OCR is only configured for English text. Its configuration depends on the presence of language files (called "traineddata" files) that exist in a location that Autopsy can understand. To add support for more languages, you will need to download additional "traineddata" and move them to the right location. The following steps breakdown this process for you: diff --git a/docs/doxygen-user/machine_translation.dox b/docs/doxygen-user/machine_translation.dox index cec795d932..4609c81257 100644 --- a/docs/doxygen-user/machine_translation.dox +++ b/docs/doxygen-user/machine_translation.dox @@ -17,6 +17,8 @@ To set up a machine translation service, go to Options->Tools and then select th Each service will require slightly different configuration steps. After setting everything up, you can run a quick check that the service is set up correctly using the "Test" button. +The checkbox at the bottom allows you to enable or disable optical character recognition (OCR). When enabled, if you select an image in the \ref mt_content_viewer "content viewer" Autopsy will use OCR to attempt to extract text to be translated. Instructions for installing OCR packages for different languages can be found on the \ref keyword_search_ocr_config "Keyword Search page". + \section mt_file_names Translating File Names You can use machine translation to automatically translate file and folder names, such as the ones seen below: @@ -49,4 +51,12 @@ Then use the drop-down menu on the right to change from "Original Text" to "Tran \image html mt_message_translated.png +If you've enabled OCR as described in the \ref mt_config section above, you can extract and translate text from images. Here is an image containing the beginning of a French poem: + +\image html mt_ocr_image.png + +If you go to the Text tab and then the Translation viewer it will use OCR to read text from the image and then display the translation. + +\image html mt_ocr_result.png + */ \ No newline at end of file