© 2020 Docspell, v{{site.version}}
- |""".stripMargin - ), - micrositeName := "Docspell", - micrositeDescription := "Auto-tagging Document Organizer", - micrositeDocumentationUrl := "doc", - micrositeDocumentationLabelDescription := "Documentation", - micrositeFavicons := Seq(microsites.MicrositeFavicon("favicon.png", "96x96")), - micrositeAuthor := "eikek", - micrositeGithubOwner := "eikek", - micrositeGithubRepo := "docspell", - micrositeGitterChannel := false, - micrositeShareOnSocial := false, - micrositeHighlightLanguages ++= Seq("json", "javascript"), - micrositeEditButton := Some(microsites.MicrositeEditButton("Improve this page", "/edit/master/modules/microsite/docs/{{ page.path }}")), - fork in run := true, - micrositeCompilingDocsTool := WithMdoc, - mdocVariables := Map( - "VERSION" -> version.value, - "PVERSION" -> version.value.replace('.', '_') - ), - micrositeExtraMdFiles := Map( - file("Changelog.md") -> ExtraMdFileConfig( - "changelog.md", - "docs", - Map("title" -> "Changelog", "permalink" -> "changelog") - ) - ), - Compile/resourceGenerators += Def.task { - val jekyllOut = resourceManaged.value/"main"/"jekyll" + ghpagesNoJekyll := true, + // the ghpages plugins works together with the site plugin (its a dependency) + // to make it publish the zola generated site, override their mappings with the zola output + mappings in SitePlugin.autoImport.makeSite := + Path.selectSubpaths(zolaOutputDir.value, _ => true).toSeq, + git.remoteRepo := "git@github.com:eikek/docspell", + Compile / resourceGenerators += Def.task { + val templateOut = baseDirectory.value / "site" / "templates" / "shortcodes" + val staticOut = baseDirectory.value / "site" / "static" / "openapi" + IO.createDirectories(Seq(templateOut, staticOut)) val logger = streams.value.log - val templates = Seq( - (resourceDirectory in (restserver, Compile)).value / "reference.conf" -> jekyllOut /"_includes"/"server.conf", - (resourceDirectory in (joex, Compile)).value / "reference.conf" -> jekyllOut/"_includes"/"joex.conf", - (LocalRootProject / baseDirectory).value / "tools" / "exim" / "exim.conf" -> jekyllOut/ "_includes"/"sample-exim.conf" - ) - val res1 = templates.map { case (s, t) => - logger.info(s"Copying $s -> $t") - IO.write(t, "{% raw %}\n") - IO.append(t, IO.readBytes(s)) - IO.write(t, "\n{% endraw %}", append = true) - t - } - val files = Seq( - (resourceDirectory in (restapi, Compile)).value/"docspell-openapi.yml" -> jekyllOut/"openapi"/"docspell-openapi.yml" + (resourceDirectory in (restserver, Compile)).value / "reference.conf" -> templateOut / "server.conf", + (resourceDirectory in (joex, Compile)).value / "reference.conf" -> templateOut / "joex.conf", + (LocalRootProject / baseDirectory).value / "tools" / "exim" / "exim.conf" -> templateOut / "sample-exim.conf", + (resourceDirectory in (restapi, Compile)).value / "docspell-openapi.yml" -> staticOut / "docspell-openapi.yml", + (restapi / Compile / openapiStaticDoc).value -> staticOut / "docspell-openapi.html" ) IO.copy(files) - res1 ++ files.map(_._2) + files.map(_._2) }.taskValue, - Compile/resourceGenerators += Def.task { - val staticDoc = (restapi/Compile/openapiStaticDoc).value - val target = resourceManaged.value/"main"/"jekyll"/"openapi"/"docspell-openapi.html" - IO.copy(Seq(staticDoc -> target)) + Compile / resourceGenerators += Def.task { + val changelog = (LocalRootProject / baseDirectory).value / "Changelog.md" + val targetDir = baseDirectory.value / "site" / "content" / "docs" / "changelog" + IO.createDirectory(targetDir) + val target = targetDir / "_index.md" + + IO.write( + target, + """|+++ + |title = "Changelog" + |description = "See what changed between releases." + |weight = 10 + |insert_anchor_links = "right" + |[extra] + |maketoc = false + |+++ + |""".stripMargin + ) + IO.append(target, IO.readBytes(changelog)) Seq(target) }.taskValue ) -val root = project.in(file(".")). - settings(sharedSettings). - settings(noPublish). - settings( +val root = project + .in(file(".")) + .settings(sharedSettings) + .settings(noPublish) + .settings( name := "docspell-root" - ). - aggregate(common - , extract - , convert - , analysis - , ftsclient - , ftssolr - , files - , store - , joexapi - , joex - , backend - , webapp - , restapi - , restserver) - - + ) + .aggregate( + common, + extract, + convert, + analysis, + ftsclient, + ftssolr, + files, + store, + joexapi, + joex, + backend, + webapp, + restapi, + restserver + ) // --- Helpers -def copyWebjarResources(src: Seq[File], base: File, artifact: String, version: String, logger: Logger): Seq[File] = { - val targetDir = base/"META-INF"/"resources"/"webjars"/artifact/version +def copyWebjarResources( + src: Seq[File], + base: File, + artifact: String, + version: String, + logger: Logger +): Seq[File] = { + val targetDir = base / "META-INF" / "resources" / "webjars" / artifact / version logger.info(s"Copy webjar resources from ${src.size} files/directories.") src.flatMap { dir => if (dir.isDirectory) { - val files = (dir ** "*").filter(_.isFile).get pair Path.relativeTo(dir) - files.map { case (f, name) => - val target = targetDir/name - IO.createDirectories(Seq(target.getParentFile)) - IO.copy(Seq(f -> target)) - target + val files = (dir ** "*").filter(_.isFile).get.pair(Path.relativeTo(dir)) + files.map { + case (f, name) => + val target = targetDir / name + IO.createDirectories(Seq(target.getParentFile)) + IO.copy(Seq(f -> target)) + target } } else { - val target = targetDir/dir.name + val target = targetDir / dir.name IO.createDirectories(Seq(target.getParentFile)) IO.copy(Seq(dir -> target)) Seq(target) @@ -540,19 +592,34 @@ def copyWebjarResources(src: Seq[File], base: File, artifact: String, version: S } } -def compileElm(logger: Logger, wd: File, outBase: File, artifact: String, version: String, mode: ElmCompileMode): Seq[File] = { +def compileElm( + logger: Logger, + wd: File, + outBase: File, + artifact: String, + version: String, + mode: ElmCompileMode +): Seq[File] = { logger.info("Compile elm files ...") - val target = outBase/"META-INF"/"resources"/"webjars"/artifact/version/"docspell-app.js" + val target = + outBase / "META-INF" / "resources" / "webjars" / artifact / version / "docspell-app.js" val cmd = Seq("elm", "make") ++ mode.flags ++ Seq("--output", target.toString) - val proc = Process(cmd ++ Seq(wd/"src"/"main"/"elm"/"Main.elm").map(_.toString), Some(wd)) + val proc = Process( + cmd ++ Seq(wd / "src" / "main" / "elm" / "Main.elm").map(_.toString), + Some(wd) + ) val out = proc.!! logger.info(out) Seq(target) } def createWebjarSource(wj: Seq[ModuleID], out: File): Seq[File] = { - val target = out/"Webjars.scala" - val fields = wj.map(m => s"""val ${m.name.toLowerCase.filter(_ != '-')} = "/${m.name}/${m.revision}" """).mkString("\n\n") + val target = out / "Webjars.scala" + val fields = wj + .map(m => + s"""val ${m.name.toLowerCase.filter(_ != '-')} = "/${m.name}/${m.revision}" """ + ) + .mkString("\n\n") val content = s"""package docspell.restserver.webapp |object Webjars { |$fields @@ -564,36 +631,45 @@ def createWebjarSource(wj: Seq[ModuleID], out: File): Seq[File] = { } def packageTools(logger: Logger, dir: File, version: String): Seq[File] = { - val target = dir/"target" + val target = dir / "target" IO.delete(target) IO.createDirectory(target) - val archive = target/s"docspell-tools-${version}.zip" + val archive = target / s"docspell-tools-${version}.zip" logger.info(s"Packaging tools to $archive ...") - val webext = target/"docspell-firefox-extension.xpi" - val wx = dir/"webextension" - IO.zip(Seq( - wx/"_locales/de/messages.json" -> "_locales/de/messages.json", - wx/"_locales/en/messages.json" -> "_locales/en/messages.json", - wx/"docspell.js" -> "docspell.js", - wx/"icons"/"logo-48.png" -> "icons/logo-48.png", - wx/"icons"/"logo-96.png" -> "icons/logo-96.png", - wx/"manifest.json" -> "manifest.json" - ), webext) + val webext = target / "docspell-firefox-extension.xpi" + val wx = dir / "webextension" + IO.zip( + Seq( + wx / "_locales/de/messages.json" -> "_locales/de/messages.json", + wx / "_locales/en/messages.json" -> "_locales/en/messages.json", + wx / "docspell.js" -> "docspell.js", + wx / "icons" / "logo-48.png" -> "icons/logo-48.png", + wx / "icons" / "logo-96.png" -> "icons/logo-96.png", + wx / "manifest.json" -> "manifest.json" + ), + webext + ) - IO.zip(Seq( - webext -> s"docspell-tools-${version}/firefox/docspell-extension.xpi", - wx/"native/app_manifest.json" ->s"docspell-tools-${version}/firefox/native/app_manifest.json", - wx/"native/native.py" ->s"docspell-tools-${version}/firefox/native/native.py", - dir/"ds.sh" -> s"docspell-tools-${version}/ds.sh", - dir/"consumedir.sh" -> s"docspell-tools-${version}/consumedir.sh" - ), archive) + IO.zip( + Seq( + webext -> s"docspell-tools-${version}/firefox/docspell-extension.xpi", + wx / "native/app_manifest.json" -> s"docspell-tools-${version}/firefox/native/app_manifest.json", + wx / "native/native.py" -> s"docspell-tools-${version}/firefox/native/native.py", + dir / "ds.sh" -> s"docspell-tools-${version}/ds.sh", + dir / "consumedir.sh" -> s"docspell-tools-${version}/consumedir.sh" + ), + archive + ) Seq(archive) } // --- aliases -addCommandAlias("make", ";set webapp/elmCompileMode := ElmCompileMode.Production ;root/openapiCodegen ;root/test:compile") +addCommandAlias( + "make", + ";set webapp/elmCompileMode := ElmCompileMode.Production ;root/openapiCodegen ;root/test:compile" +) addCommandAlias("make-zip", ";restserver/universal:packageBin ;joex/universal:packageBin") addCommandAlias("make-deb", ";restserver/debian:packageBin ;joex/debian:packageBin") addCommandAlias("make-tools", ";root/toolsPackage") diff --git a/modules/microsite/docs/demo.md b/modules/microsite/docs/demo.md deleted file mode 100644 index 234b60f3..00000000 --- a/modules/microsite/docs/demo.md +++ /dev/null @@ -1,22 +0,0 @@ ---- -layout: docs -title: Demo -permalink: demo ---- - -# {{ page.title }} - -## Finding Items - - - - -## Basic Idea (First Version) - - diff --git a/modules/microsite/docs/dev/adr.md b/modules/microsite/docs/dev/adr.md deleted file mode 100644 index 8410f065..00000000 --- a/modules/microsite/docs/dev/adr.md +++ /dev/null @@ -1,26 +0,0 @@ ---- -layout: docs -title: ADRs -permalink: dev/adr ---- - -# ADR - -Some early information about certain details can be found in a few -[ADR](https://adr.github.io/) that exist: - -- [0001 Components](adr/0001_components) -- [0002 Component Interaction](adr/0002_component_interaction) -- [0003 Encryption](adr/0003_encryption) -- [0004 ISO8601 vs Unix](adr/0004_iso8601vsEpoch) -- [0005 Job Executor](adr/0005_job-executor) -- [0006 More File Types](adr/0006_more-file-types) - - [0007 Convert HTML](adr/0007_convert_html_files) - - [0008 Convert Text](adr/0008_convert_plain_text) - - [0009 Convert Office Files](adr/0009_convert_office_docs) - - [0010 Convert Image Files](adr/0010_convert_image_files) - - [0011 Extract Text](adr/0011_extract_text) -- [0012 Periodic Tasks](adr/0012_periodic_tasks) -- [0013 Archive Files](adr/0013_archive_files) -- [0014 Full-Text Search](adr/0014_fulltext_search_engine) -- [0015 Convert PDF files](adr/0015_convert_pdf_files) diff --git a/modules/microsite/docs/doc.md b/modules/microsite/docs/doc.md deleted file mode 100644 index 81aed022..00000000 --- a/modules/microsite/docs/doc.md +++ /dev/null @@ -1,95 +0,0 @@ ---- -layout: docs -title: Documentation -permalink: doc ---- - -# {{page.title}} - -This is the documentation for Docspell @VERSION@. - -Docspell assists in organizing large amounts of files that are -typically scanned paper documents. You can associate tags, set -correspondends, what a document is concerned with, a name, a date and -some more. If your documents are associated with this meta data, you -should be able to quickly find them later using the search feature. -But adding this manually to each document is a tedious task. What if -most of it could be attached automatically? - -## How it works - -Documents have two main properties: a correspondent (sender or -receiver that is not you) and something the document is about. Usually -it is about a person or some thing – maybe your car, or contracts -concerning some familiy member, etc. - -1. You maintain a kind of address book. It should list all possible - correspondents and the concerning people/things. This grows - incrementally with each new unknown document. -2. When docspell analyzes a document, it tries to find matches within - your address book. It can detect the correspondent and a concerning - person or thing. It will then associate this data to your - documents. -3. You can inspect what docspell has done and correct it. If docspell - has found multiple suggestions, they will be shown for you to - select one. If it is not correctly associated, very often the - correct one is just one click away. - -The set of meta data that docspell uses to draw suggestions from, must -be maintained manually. But usually, this data doesn't grow as fast as -the documents. After a while there is a quite complete address book -and only once in a while it has to be revisited. - -Besides extracting the text from documents to analyze, docspell also -converts all files into PDF files. This unifies the different formats -your documents may be in originally and makes them more accessible -from other systems and the future. - -## Terms - -In order to better understand these pages, some terms should be -explained first. - -### Item - -An **Item** is roughly your (pdf) document, only that an item may span -multiple files, which are called **attachments**. And an item has -**meta data** associated: - -- a **correspondent**: the other side of the communication. It can be - an organization or a person. -- a **concerning person** or **equipment**: a person or thing that - this item is about. Maybe it is an insurance contract about your - car. -- **tag**: an item can be tagged with custom tags. A tag can have a - *category*. This is intended for grouping tags, for example a - category `doctype` could be used to group tags like `bill`, - `contract`, `receipt` etc. Usually an item is not tagged with more - than one tag of a category. -- a **item date**: this is the date of the document – if this is not - set, the created date of the item is used. -- a **due date**: an optional date indicating that something has to be - done (e.g. paying a bill, submitting it) about this item until this - date -- a **direction**: one of "incoming" or "outgoing" -- a **name**: some item name, defaults to the file name of the - attachments -- some **notes**: arbitrary descriptive text. You can use markdown - here, which is appropriately formatted in the web application. - -### Collective - -The users of the application are part of a **collective**. A -**collective** is a group of users that share access to the same -items. The account name is therefore comprised of a *collective name* -and a *user name*. - -All users of a collective are equal; they have same permissions to -access all items. The items don't belong to a user, but to the -collective. - -That means, to identify yourself when signing in, you have to give the -collective name and your user name. By default it is separated by a -slash `/`, for example `smith/john`. If your user name is the same as -the collective name, you can omit one; so `smith/smith` can be -abbreviated to just `smith`. diff --git a/modules/microsite/docs/doc/install.md b/modules/microsite/docs/doc/install.md deleted file mode 100644 index 90236233..00000000 --- a/modules/microsite/docs/doc/install.md +++ /dev/null @@ -1,235 +0,0 @@ ---- -layout: docs -title: Installation -permalink: doc/install ---- - -# {{ page.title }} - -This page contains detailed installation instructions. For a quick -start, refer to [this page](../getit). - -Docspell has been developed and tested on a GNU/Linux system. It may -run on Windows and MacOS machines, too (ghostscript and tesseract are -available on these systems). But I've never tried. - -Docspell consists of two components that are started in separate -processes: - -1. *REST Server* This is the main application, providing the REST Api - and the web application. -2. *Joex* (job executor) This is the component that does the document - processing. - -They can run on multiple machines. All REST server and Joex instances -should be on the same network. It is not strictly required that they -can reach each other, but the components can then notify themselves -about new or done work. - -While this is possible, the simple setup is to start both components -once on the same machine. - -The [download page](https://github.com/eikek/docspell/releases) -provides pre-compiled packages and the [development page](../dev) -contains build instructions. - - -## Prerequisites - -The two components have one prerequisite in common: they both require -Java to run. While this is the only requirement for the *REST server*, -the *Joex* components requires some more external programs. - -### Java - -Very often, Java is already installed. You can check this by opening a -terminal and typing `java -version`. Otherwise install Java using your -package manager or see [this site](https://adoptopenjdk.net/) for -other options. - -It is enough to install the JRE. The JDK is required, if you want to -build docspell from source. - -Docspell has been tested with Java version 1.8 (or sometimes referred -to as JRE 8 and JDK 8, respectively). The pre-build packages are also -build using JDK 8. But a later version of Java should work as well. - -The next tools are only required on machines running the *Joex* -component. - -### External Programs for Joex - -- [Ghostscript](http://pages.cs.wisc.edu/~ghost/) (the `gs` command) - is used to extract/convert PDF files into images that are then fed - to ocr. It is available on most GNU/Linux distributions. -- [Unpaper](https://github.com/Flameeyes/unpaper) is a program that - pre-processes images to yield better results when doing ocr. If this - is not installed, docspell tries without it. However, it is - recommended to install, because it [improves text - extraction](https://github.com/tesseract-ocr/tesseract/wiki/ImproveQuality) - (at the expense of a longer runtime). -- [Tesseract](https://github.com/tesseract-ocr/tesseract) is the tool - doing the OCR (converts images into text). It can also convert - images into pdf files. It is a widely used open source OCR engine. - Tesseract 3 and 4 should work with docspell; you can adopt the - command line in the configuration file, if necessary. -- [Unoconv](https://github.com/unoconv/unoconv) is used to convert - office documents into PDF files. It uses libreoffice/openoffice. -- [wkhtmltopdf](https://wkhtmltopdf.org/) is used to convert HTML into - PDF files. -- [OCRmyPDF](https://github.com/jbarlow83/OCRmyPDF) can be optionally - used to convert PDF to PDF files. It adds an OCR layer to scanned - PDF files to make them searchable. It also creates PDF/A files from - the input pdf. - -The performance of `unoconv` can be improved by starting `unoconv -l` -in a separate process. This runs a libreoffice/openoffice listener -therefore avoids starting one each time `unoconv` is called. - -### Example Debian - -On Debian this should install all joex requirements: - -``` bash -sudo apt-get install ghostscript tesseract-ocr tesseract-ocr-deu tesseract-ocr-eng unpaper unoconv wkhtmltopdf ocrmypdf -``` - - -## Database - -Both components must have access to a SQL database. Docspell has -support these databases: - -- PostreSQL -- MariaDB -- H2 - -The H2 database is an interesting option for personal and mid-size -setups, as it requires no additional work. It is integrated into -docspell and works really well. It is also configured as the default -database. - -For large installations, PostgreSQL or MariaDB is recommended. Create -a database and a user with enough privileges (read, write, create -table) to that database. - -When using H2, make sure that all components access the same database -– the jdbc url must point to the same file. Then, it is important to -add the options -`;MODE=PostgreSQL;DATABASE_TO_LOWER=TRUE;AUTO_SERVER=TRUE` at the end -of the url. See the [config page](configure#jdbc) for an example. - - -## Installing from ZIP files - -After extracting the zip files, you'll find a start script in the -`bin/` folder. - - -## Installing from DEB packages - -The DEB packages can be installed on Debian, or Debian based Distros: - -``` bash -$ sudo dpkg -i docspell*.deb -``` - -Then the start scripts are in your `$PATH`. Run `docspell-restserver` -or `docspell-joex` from a terminal window. - -The packages come with a systemd unit file that will be installed to -autostart the services. - - -## Running - -Run the start script (in the corresponding `bin/` directory when using -the zip files): - -``` -$ ./docspell-restserver*/bin/docspell-restserver -$ ./docspell-joex*/bin/docspell-joex -``` - -This will startup both components using the default configuration. The -configuration should be adopted to your needs. For example, the -database connection is configured to use a H2 database in the `/tmp` -directory. Please refer to the [configuration page](configure) for how -to create a custom config file. Once you have your config file, simply -pass it as argument to the command: - -``` -$ ./docspell-restserver*/bin/docspell-restserver /path/to/server-config.conf -$ ./docspell-joex*/bin/docspell-joex /path/to/joex-config.conf -``` - -After starting the rest server, you can reach the web application at -path `/app`, so using default values it would be -`http://localhost:7880/app`. - -You should be able to create a new account and sign in. Check the -[configuration page](configure) to further customize docspell. - - -### Options - -The start scripts support some options to configure the JVM. One often -used setting is the maximum heap size of the JVM. By default, java -determines it based on properties of the current machine. You can -specify it by given java startup options to the command: - -``` -$ ./docspell-restserver*/bin/docspell-restserver -J-Xmx1G -- /path/to/server-config.conf -``` - -This would limit the maximum heap to 1GB. The double slash separates -internal options and the arguments to the program. Another frequently -used option is to change the default temp directory. Usually it is -`/tmp`, but it may be desired to have a dedicated temp directory, -which can be configured: - -``` -$ ./docspell-restserver*/bin/docspell-restserver -J-Xmx1G -Djava.io.tmpdir=/path/to/othertemp -- /path/to/server-config.conf -``` - -The command: - -``` -$ ./docspell-restserver*/bin/docspell-restserver -h -``` - -gives an overview of supported options. - - -## Raspberry Pi, and similiar - -Both component can run next to each other on a raspberry pi or -similiar device. - - -### REST Server - -The REST server component runs very well on the Raspberry Pi and -similiar devices. It doesn't require much resources, because the heavy -work is done by the joex components. - - -### Joex - -Running the joex component on the Raspberry Pi is possible, but will -result in long processing times for OCR. Files that don't require OCR -are no problem. - -Tested on a RPi model 3 (4 cores, 1G RAM) processing a PDF (scanned -with 300dpi) with two pages took 9:52. You can speed it up -considerably by uninstalling the `unpaper` command, because this step -takes quite long. This, of course, reduces the quality of OCR. But -without `unpaper` the same sample pdf was then processed in 1:24, a -speedup of 8 minutes. - -You should limit the joex pool size to 1 and, depending on your model -and the amount of RAM, set a heap size of at least 500M -(`-J-Xmx500M`). - -For personal setups, when you don't need the processing results asap, -this can work well enough. diff --git a/modules/microsite/docs/doc/tools.md b/modules/microsite/docs/doc/tools.md deleted file mode 100644 index 8595ab3c..00000000 --- a/modules/microsite/docs/doc/tools.md +++ /dev/null @@ -1,20 +0,0 @@ ---- -layout: docs -title: Tools -permalink: doc/tools ---- - -# {{ page.title }} - -The `tools/` folder contains some scripts and other resources intented -for integrating docspell. - -- [ds.sh](ds) A script to quickly upload files from the command - line. -- [Consume Directory](consumedir) A script to watch a directory - for new files and upload them to docspell. -- [Browser Extension](browserext) An extension for firefox to - upload files from your browser via *right-click -> upload to - docspell*. -- [SMTP Gateway](smtpgateway) Start a SMTP server that forwards all - mails to docspell. diff --git a/modules/microsite/docs/getit.md b/modules/microsite/docs/getit.md deleted file mode 100644 index 61893ab0..00000000 --- a/modules/microsite/docs/getit.md +++ /dev/null @@ -1,107 +0,0 @@ ---- -layout: docs -title: Quickstart -permalink: getit ---- - -# {{ page.title }} - -There are the following quick ways to get docspell to run on your -machine: - -- [Download, Unpack, Run](#without-docker) You can download - pre-compiled binaries from the [Release - Page](https://github.com/eikek/docspell/releases). There are `deb` - packages and generic zip files. -- [With Docker](#with-docker) -- [NixOs Module](doc/nix#docspell-as-a-service-on-nixos) - -Check the [demo videos](demo) to see the basic idea. Refer to the -[documentation](doc) for more information on how to use docspell. - - -## Download, Unpack, Run - -### Prerequisite - -Install Java (use your package manager or look -[here](https://adoptopenjdk.net/)). - -OCR functionality requires the following tools: - -- [tesseract](https://github.com/tesseract-ocr/tesseract), -- [ghostscript](http://pages.cs.wisc.edu/~ghost/) and possibly -- [unpaper](https://github.com/Flameeyes/unpaper). - -The last is not really required, but improves OCR. - -PDF conversion requires the following tools: - -- [unoconv](https://github.com/unoconv/unoconv) -- [wkhtmltopdf](https://wkhtmltopdf.org/) - - -### Using zip files - -You need to download the two files: - -- [docspell-restserver-{{site.version}}.zip](https://github.com/eikek/docspell/releases/download/v{{site.version}}/docspell-restserver-{{site.version}}.zip) -- [docspell-joex-{{site.version}}.zip](https://github.com/eikek/docspell/releases/download/v{{site.version}}/docspell-joex-{{site.version}}.zip) - - -1. Unzip both files: - ``` bash - $ unzip docspell-*.zip - ``` -2. Open two terminal windows and navigate to the the directory - containing the zip files. -3. Start both components executing: - ``` bash - $ ./docspell-restserver*/bin/docspell-restserver - ``` - in one terminal and - ``` bash - $ ./docspell-joex*/bin/docspell-joex - ``` - in the other. -4. Point your browser to: