Werkzeug um Belege zu scannen, Texterkennung durchzuführen und Belege sortiert abzulegen
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 

166 lines
5.3 KiB

package de.srsoftware.belegscanner;
import de.srsoftware.belegscanner.gui.DocTable;
import de.srsoftware.belegscanner.gui.StatusBar;
import de.srsoftware.belegscanner.gui.Toolbar;
import de.srsoftware.belegscanner.model.ScanProject;
import de.srsoftware.belegscanner.model.api.Project;
import de.srsoftware.tools.gui.DateChooser;
import de.srsoftware.tools.gui.SelectComboBox;
import org.json.JSONObject;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import java.awt.*;
import java.util.Optional;
import static de.srsoftware.belegscanner.Application.t;
import static de.srsoftware.belegscanner.Constants.CONFIG_TARGET;
import static de.srsoftware.belegscanner.Constants.JPG;
import static de.srsoftware.belegscanner.Constants.OCR;
import static de.srsoftware.belegscanner.Constants.PDF;
public class Worker {
private static final Logger LOG = LoggerFactory.getLogger(Worker.class);
private static final String HOME = System.getProperty("user.home");
private static final String YEAR = t("YEAR");
private final Configuration config;
private SelectComboBox pathPicker;
private StatusBar statusBar;
private String category;
private DateChooser datePicker;
private String rawPath, resolvedPath;
private Toolbar toolbar;
private DocTable docTable;
public Worker(Configuration config) {
this.config = config;
}
public void dropCategory(String droppedCat) {
LOG.debug("Worker.dropCategory({})",droppedCat);
}
public JSONObject getCategories() {
return config.getOrCreate("app.categories",new JSONObject());
}
private Optional<JSONObject> getCategory(String name){
var cats = getCategories();
return cats.has(name) ? (cats.get(name) instanceof JSONObject cat ? Optional.of(cat) : Optional.empty()) : Optional.empty();
}
public String getType() {
return config.getOrCreate(CONFIG_TARGET, PDF);
}
public void resolvePath(){
if (rawPath == null) return;
LOG.debug("resolve({})",rawPath);
var date = datePicker.getSelectedDate();
int year = 1900+date.getYear();
int month = date.getMonth()+1;
int day = date.getDate();
resolvedPath = rawPath.replace("$"+t("HOME"),HOME)
.replace("$"+t("CATEGORY"), category)
.replace("$"+t("YEAR"), year+"")
.replace("$"+t("MONTH"), month<10 ? "0"+month : ""+month)
.replace("$"+t("DAY"), day < 10 ? "0"+day : ""+day);
var start = resolvedPath.indexOf("$");
toolbar.resetAdditionalFields();
while (start>-1) {
var end = endOfVar(resolvedPath, start+1);
if (end>start+1){
var variable = resolvedPath.substring(start+1, end);
LOG.debug("…unresolved '{}'",variable);
String value = toolbar.requireField(variable);
variable = "$"+variable;
LOG.debug("replacing '{}' in '{}' by '{}'",variable,resolvedPath,value);
resolvedPath = resolvedPath.replace(variable,value);
start = resolvedPath.indexOf("$",start+1);
} else {
start = resolvedPath.indexOf("$",start+2);
}
}
toolbar.dropUnusedAdditionalFields();
resolvedPath+="."+extension();
statusBar.setPath(resolvedPath);
}
private String extension() {
switch (getType()){
case PDF:
case OCR:
return "pdf";
case JPG:
return "jpg";
}
return "";
}
private int endOfVar(String path, int index) {
while(index<path.length()){
if (!Character.isAlphabetic(path.codePointAt(index))) return index;
index++;
}
return index;
}
public void scan() {
LOG.debug("scan()");
var project = docTable.getProject(resolvedPath).orElseGet(this::createProject);
}
private Project createProject() {
return new ScanProject(resolvedPath);
}
public void setDimension(Dimension dimension) {
LOG.debug("setDimension({})",dimension);
}
public void setPath(String path) {
LOG.debug("setPath({})",path);
this.rawPath = path;
resolvePath();
}
public SelectComboBox setPathPicker(SelectComboBox select) {
pathPicker = select;
return pathPicker.onUpdateText(this::setPath);
}
public void setStatusBar(StatusBar statusBar) {
this.statusBar = statusBar;
}
public void setType(String type) {
LOG.debug("setType({})",type);
config.set(CONFIG_TARGET, type);
resolvePath();
}
public void setCat(String newCat) {
LOG.debug("setCat({}})",newCat);
this.category = newCat;
getCategory(newCat).map(cat -> cat.get(Constants.PATH))
.map(o -> o instanceof String path ? path : null)
.ifPresent(path -> {
pathPicker.setText(path);
setPath(path);
});
}
public void setDatePicker(DateChooser pd) {
datePicker = pd;
pd.addActionListener(ev -> this.resolvePath());
}
public void setToolbar(Toolbar toolbar) {
this.toolbar = toolbar;
}
public void setDocTable(DocTable docTable) {
this.docTable = docTable;
}
}