Game fixes and ocr docs (#824)
This commit is contained in:
parent
8d9f0361d0
commit
673f005fe6
13 changed files with 50 additions and 47 deletions
|
@ -15,7 +15,7 @@ services:
|
||||||
ports:
|
ports:
|
||||||
- 8080:8080
|
- 8080:8080
|
||||||
volumes:
|
volumes:
|
||||||
- /stirling/latest/data:/usr/share/tesseract-ocr/5/tessdata:rw
|
- /stirling/latest/data:/usr/share/tessdata:rw
|
||||||
- /stirling/latest/config:/configs:rw
|
- /stirling/latest/config:/configs:rw
|
||||||
- /stirling/latest/logs:/logs:rw
|
- /stirling/latest/logs:/logs:rw
|
||||||
environment:
|
environment:
|
||||||
|
|
|
@ -15,7 +15,7 @@ services:
|
||||||
ports:
|
ports:
|
||||||
- 8080:8080
|
- 8080:8080
|
||||||
volumes:
|
volumes:
|
||||||
- /stirling/latest/data:/usr/share/tesseract-ocr/5/tessdata:rw
|
- /stirling/latest/data:/usr/share/tessdata:rw
|
||||||
- /stirling/latest/config:/configs:rw
|
- /stirling/latest/config:/configs:rw
|
||||||
- /stirling/latest/logs:/logs:rw
|
- /stirling/latest/logs:/logs:rw
|
||||||
environment:
|
environment:
|
||||||
|
|
|
@ -15,7 +15,7 @@ services:
|
||||||
ports:
|
ports:
|
||||||
- 8080:8080
|
- 8080:8080
|
||||||
volumes:
|
volumes:
|
||||||
- /stirling/latest/data:/usr/share/tesseract-ocr/5/tessdata:rw
|
- /stirling/latest/data:/usr/share/tessdata:rw
|
||||||
- /stirling/latest/config:/configs:rw
|
- /stirling/latest/config:/configs:rw
|
||||||
- /stirling/latest/logs:/logs:rw
|
- /stirling/latest/logs:/logs:rw
|
||||||
environment:
|
environment:
|
||||||
|
|
|
@ -15,7 +15,7 @@ services:
|
||||||
ports:
|
ports:
|
||||||
- 8080:8080
|
- 8080:8080
|
||||||
volumes:
|
volumes:
|
||||||
- /stirling/latest/data:/usr/share/tesseract-ocr/5/tessdata:rw
|
- /stirling/latest/data:/usr/share/tessdata:rw
|
||||||
- /stirling/latest/config:/configs:rw
|
- /stirling/latest/config:/configs:rw
|
||||||
- /stirling/latest/logs:/logs:rw
|
- /stirling/latest/logs:/logs:rw
|
||||||
environment:
|
environment:
|
||||||
|
|
|
@ -1,37 +0,0 @@
|
||||||
import cv2
|
|
||||||
import sys
|
|
||||||
import argparse
|
|
||||||
import numpy as np
|
|
||||||
|
|
||||||
def is_blank_image(image_path, threshold=10, white_percent=99, white_value=255, blur_size=5):
|
|
||||||
image = cv2.imread(image_path, cv2.IMREAD_GRAYSCALE)
|
|
||||||
|
|
||||||
if image is None:
|
|
||||||
print(f"Error: Unable to read the image file: {image_path}")
|
|
||||||
return False
|
|
||||||
|
|
||||||
# Apply Gaussian blur to reduce noise
|
|
||||||
blurred_image = cv2.GaussianBlur(image, (blur_size, blur_size), 0)
|
|
||||||
|
|
||||||
_, thresholded_image = cv2.threshold(blurred_image, white_value - threshold, white_value, cv2.THRESH_BINARY)
|
|
||||||
|
|
||||||
# Calculate the percentage of white pixels in the thresholded image
|
|
||||||
white_pixels = np.sum(thresholded_image == white_value)
|
|
||||||
white_pixel_percentage = (white_pixels / thresholded_image.size) * 100
|
|
||||||
|
|
||||||
print(f"Page has white pixel percent of {white_pixel_percentage}")
|
|
||||||
return white_pixel_percentage >= white_percent
|
|
||||||
|
|
||||||
|
|
||||||
if __name__ == "__main__":
|
|
||||||
parser = argparse.ArgumentParser(description='Detect if an image is considered blank or not.')
|
|
||||||
parser.add_argument('image_path', help='The path to the image file.')
|
|
||||||
parser.add_argument('-t', '--threshold', type=int, default=10, help='Threshold for determining white pixels. The default value is 10.')
|
|
||||||
parser.add_argument('-w', '--white_percent', type=float, default=99, help='The percentage of white pixels for an image to be considered blank. The default value is 99.')
|
|
||||||
args = parser.parse_args()
|
|
||||||
|
|
||||||
blank = is_blank_image(args.image_path, args.threshold, args.white_percent)
|
|
||||||
|
|
||||||
# Return code 1: The image is considered blank.
|
|
||||||
# Return code 0: The image is not considered blank.
|
|
||||||
sys.exit(int(blank))
|
|
|
@ -140,7 +140,6 @@ public class EndpointConfiguration {
|
||||||
// CLI
|
// CLI
|
||||||
addEndpointToGroup("CLI", "compress-pdf");
|
addEndpointToGroup("CLI", "compress-pdf");
|
||||||
addEndpointToGroup("CLI", "extract-image-scans");
|
addEndpointToGroup("CLI", "extract-image-scans");
|
||||||
addEndpointToGroup("CLI", "remove-blanks");
|
|
||||||
addEndpointToGroup("CLI", "repair");
|
addEndpointToGroup("CLI", "repair");
|
||||||
addEndpointToGroup("CLI", "pdf-to-pdfa");
|
addEndpointToGroup("CLI", "pdf-to-pdfa");
|
||||||
addEndpointToGroup("CLI", "file-to-pdf");
|
addEndpointToGroup("CLI", "file-to-pdf");
|
||||||
|
@ -218,7 +217,8 @@ public class EndpointConfiguration {
|
||||||
addEndpointToGroup("Java", "split-by-size-or-count");
|
addEndpointToGroup("Java", "split-by-size-or-count");
|
||||||
addEndpointToGroup("Java", "overlay-pdf");
|
addEndpointToGroup("Java", "overlay-pdf");
|
||||||
addEndpointToGroup("Java", "split-pdf-by-sections");
|
addEndpointToGroup("Java", "split-pdf-by-sections");
|
||||||
|
addEndpointToGroup("Java", "remove-blanks");
|
||||||
|
|
||||||
// Javascript
|
// Javascript
|
||||||
addEndpointToGroup("Javascript", "pdf-organizer");
|
addEndpointToGroup("Javascript", "pdf-organizer");
|
||||||
addEndpointToGroup("Javascript", "sign");
|
addEndpointToGroup("Javascript", "sign");
|
||||||
|
|
|
@ -41,7 +41,7 @@ public class OCRController {
|
||||||
private static final Logger logger = LoggerFactory.getLogger(OCRController.class);
|
private static final Logger logger = LoggerFactory.getLogger(OCRController.class);
|
||||||
|
|
||||||
public List<String> getAvailableTesseractLanguages() {
|
public List<String> getAvailableTesseractLanguages() {
|
||||||
String tessdataDir = "/usr/share/tesseract-ocr/5/tessdata";
|
String tessdataDir = "/usr/share/tessdata";
|
||||||
File[] files = new File(tessdataDir).listFiles();
|
File[] files = new File(tessdataDir).listFiles();
|
||||||
if (files == null) {
|
if (files == null) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
|
|
|
@ -82,7 +82,7 @@ public class OtherWebController {
|
||||||
}
|
}
|
||||||
|
|
||||||
public List<String> getAvailableTesseractLanguages() {
|
public List<String> getAvailableTesseractLanguages() {
|
||||||
String tessdataDir = "/usr/share/tesseract-ocr/5/tessdata";
|
String tessdataDir = "/usr/share/tessdata";
|
||||||
File[] files = new File(tessdataDir).listFiles();
|
File[] files = new File(tessdataDir).listFiles();
|
||||||
if (files == null) {
|
if (files == null) {
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
|
|
|
@ -42,7 +42,7 @@
|
||||||
}
|
}
|
||||||
#lives {
|
#lives {
|
||||||
top: 10px;
|
top: 10px;
|
||||||
left: calc(7vw); /* Adjusted position */
|
left: calc(9vw); /* Adjusted position */
|
||||||
}
|
}
|
||||||
#high-score {
|
#high-score {
|
||||||
top: 10px;
|
top: 10px;
|
||||||
|
|
|
@ -25,6 +25,17 @@ $(document).ready(function () {
|
||||||
const originalButtonText = $("#submitBtn").text();
|
const originalButtonText = $("#submitBtn").text();
|
||||||
$("#submitBtn").text("Processing...");
|
$("#submitBtn").text("Processing...");
|
||||||
console.log(override);
|
console.log(override);
|
||||||
|
|
||||||
|
// Set a timeout to show the game button if operation takes more than 5 seconds
|
||||||
|
const timeoutId = setTimeout(() => {
|
||||||
|
var boredWaiting = localStorage.getItem("boredWaiting") || "disabled";
|
||||||
|
const showGameBtn = document.getElementById('show-game-btn');
|
||||||
|
if(boredWaiting === "enabled" && showGameBtn){
|
||||||
|
showGameBtn.style.display = 'block';
|
||||||
|
}
|
||||||
|
}, 5000);
|
||||||
|
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (remoteCall === true) {
|
if (remoteCall === true) {
|
||||||
if (override === "multi" || (!multiple && files.length > 1 && override !== "single")) {
|
if (override === "multi" || (!multiple && files.length > 1 && override !== "single")) {
|
||||||
|
@ -33,8 +44,11 @@ $(document).ready(function () {
|
||||||
await handleSingleDownload(url, formData);
|
await handleSingleDownload(url, formData);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
clearTimeout(timeoutId);
|
||||||
$("#submitBtn").text(originalButtonText);
|
$("#submitBtn").text(originalButtonText);
|
||||||
|
|
||||||
} catch (error) {
|
} catch (error) {
|
||||||
|
clearTimeout(timeoutId);
|
||||||
handleDownloadError(error);
|
handleDownloadError(error);
|
||||||
$("#submitBtn").text(originalButtonText);
|
$("#submitBtn").text(originalButtonText);
|
||||||
console.error(error);
|
console.error(error);
|
||||||
|
|
|
@ -70,6 +70,24 @@
|
||||||
<script>
|
<script>
|
||||||
console.log("loaded game");
|
console.log("loaded game");
|
||||||
$(document).ready(function() {
|
$(document).ready(function() {
|
||||||
|
|
||||||
|
|
||||||
|
// Find the file input within the form
|
||||||
|
var fileInput = $('input[type="file"]');
|
||||||
|
|
||||||
|
// Find the closest enclosing form of the file input
|
||||||
|
var form = fileInput.closest('form');
|
||||||
|
|
||||||
|
// Find the submit button within the form
|
||||||
|
var submitButton = form.find('button[type="submit"], input[type="submit"]');
|
||||||
|
|
||||||
|
// Create the 'show-game-btn' button
|
||||||
|
var gameButton = $('<button type="button" class="btn btn-primary" id="show-game-btn" style="display:none;">Bored waiting?</button><br /><br />');
|
||||||
|
|
||||||
|
// Insert the 'show-game-btn' just above the submit button
|
||||||
|
submitButton.before(gameButton);
|
||||||
|
|
||||||
|
|
||||||
function loadGameScript(callback) {
|
function loadGameScript(callback) {
|
||||||
console.log('loadGameScript called');
|
console.log('loadGameScript called');
|
||||||
const script = document.createElement('script');
|
const script = document.createElement('script');
|
||||||
|
@ -104,6 +122,8 @@
|
||||||
gameDialog.close();
|
gameDialog.close();
|
||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
|
||||||
})
|
})
|
||||||
</script>
|
</script>
|
||||||
<div id="game-container">
|
<div id="game-container">
|
||||||
|
@ -115,6 +135,7 @@
|
||||||
</div>
|
</div>
|
||||||
<link rel="stylesheet" href="css/game.css">
|
<link rel="stylesheet" href="css/game.css">
|
||||||
</dialog>
|
</dialog>
|
||||||
|
|
||||||
</th:block>
|
</th:block>
|
||||||
|
|
||||||
<th:block th:fragment="fileSelector(name, multiple)" th:with="accept=${accept} ?: '*/*', inputText=${inputText} ?: #{pdfPrompt}, remoteCall=${remoteCall} ?: true, notRequired=${notRequired} ?: false">
|
<th:block th:fragment="fileSelector(name, multiple)" th:with="accept=${accept} ?: '*/*', inputText=${inputText} ?: #{pdfPrompt}, remoteCall=${remoteCall} ?: true, notRequired=${notRequired} ?: false">
|
||||||
|
@ -139,6 +160,9 @@
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<button type="button" class="btn btn-primary" id="show-game-btn" style="display:none;">Bored waiting?</button>
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
<script src="js/fileInput.js"></script>
|
<script src="js/fileInput.js"></script>
|
||||||
</th:block>
|
</th:block>
|
|
@ -5,6 +5,7 @@
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
<th:block th:insert="~{fragments/common :: game}"></th:block>
|
||||||
<div id="page-container">
|
<div id="page-container">
|
||||||
<div id="content-wrap">
|
<div id="content-wrap">
|
||||||
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
|
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
</head>
|
</head>
|
||||||
|
|
||||||
<body>
|
<body>
|
||||||
|
<th:block th:insert="~{fragments/common :: game}"></th:block>
|
||||||
<div id="page-container">
|
<div id="page-container">
|
||||||
<div id="content-wrap">
|
<div id="content-wrap">
|
||||||
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
|
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
|
||||||
|
|
Loading…
Reference in a new issue