# wkhtmlapp
## _Bindings to wkhtmltopdf and wkhtmltoimage_
wkhtmlapp depends on the wkhtmltopdf application to generate PDFs or images, abstracted in such a
way that it can support multithreading without damaging the main instance.
This library was developed inspired by barryvdh's laravel-snappy.
| Resource | Link |
| ----------------- | ------------------------------------------------------------------------------------------------------------------------- |
| Crate | [![Crates.io](https://img.shields.io/crates/v/wkhtmlapp?color=warning&style=plastic)](https://crates.io/crates/wkhtmlapp) |
| Documentation | [Cargo docs](https://github.com/JoelTorresAr/wkhtmlapp.git) |
| Upstream | [wkhtmltopdf.org](http://wkhtmltopdf.org/) |
| Wkhtmltox Version | [wkhtmltox-0.12.6-1](https://github.com/wkhtmltopdf/packaging/releases) |
-----
## _Required setup before use_
- set wkhtmltopdf in path system environment variables or download the portable versions
of wkhtmltopdf for your operating system, store them and reference it in the .env file
using WKHTMLTOPDF_CMD and WKHTMLTOIMG_CMD respectively.
```sh
//.env
WKHTMLAPP_WORK_DIR="storage/temp"
WKHTMLTOPDF_CMD="assets/bin/wkhtmltopdf/0.16/wkhtmltopdf"
WKHTMLTOIMG_CMD="assets/bin/wkhtmltopdf/0.16/wkhtmltoimage"
```
### ONLY SOME ARGUMENTS HAVE BEEN VERIFIED, USE WITH CAUTION
## Features
- Convert html code to PDF and IMG
- Convert html file to PDF and IMG
- Convert url link to PDF and IMG
## _Change Logs_
### 1.0.0
- Successfully tested with actix-web on windows and linux systems
### 0.2.0
- You can instantiate PdfApp or ImgApp which will only serve to generate pdf's or images
respectively or instantiate App which gives you access to both
### 0.1.5
- Arg value is no longer optional
### 0.1.4
- Lifetime was implemented, allowing to use str instead of String in sending arguments
### 0.1.3
- Fix: Return full file path
## Example
```sh
use wkhtmlapp::WkhtmlError;
fn main() -> Result<(), WkhtmlError> {
let mut app = wkhtmlapp::App::new()?;
let app_report = app.pdf_app
.set_arg("enable-smart-shrinking", "true")?
.set_arg("title", "Torres")?
.set_arg("header-right", "Página [page] de [toPage]")?
.set_arg("margin-top", "18")?;
let report = app_report.run(
wkhtmlapp::WkhtmlInput::Url("https://www.w3schools.com/graphics/svg_intro.asp"),
"demo",
)?;
println!("report: {:?}", report);
Ok(())
}
```
## PDF Examples
```sh
let pdf_app = PdfApp::new().expect("Failed to init PDF Application");
let html_code = r#"
DEMO
"#;
let file_path = pdf_app.run(WkhtmlInput::Html(html_code),"demo")?;
let file_path = pdf_app.run(WkhtmlInput::File("examples/index.html"), "demo")?;
let file_path = pdf_app.run(
WkhtmlInput::Url("https://www.rust-lang.org/en-US/"),
"demo",
)?;
```
## IMG Examples
```sh
let mut image_app = ImgApp::new().expect("Failed to init image Application");
let args = HashMap::from([("height", "20"), ("width", "20")]);
let res = image_app
.set_format(ImgFormat::Png)?
.set_args(args)?
.run(WkhtmlInput::File("examples/index.html"), "demo")?;
```
## _ImgApp Args_
| Option | Description |
| ---------------------------- | ------------------------------------------------------------------------------------------------------------ |
| allow | Allow the file or files from the specified folder to be loaded (repeatable) |
| bypass-proxy-for | Bypass proxy for host (repeatable) |
| cache-dir | Web cache directory |
| checkbox-checked-svg | Use this SVG file when rendering checked checkboxes |
| checked-svg | Use this SVG file when rendering unchecked checkboxes |
| cookie | Set an additional cookie (repeatable) |
| cookie-jar | Read and write cookies from and to the supplied cookie jar file |
| crop-h | Set height for cropping |
| crop-w | Set width for cropping |
| crop-x | Set x coordinate for cropping (default 0) |
| crop-y | Set y coordinate for cropping (default 0) |
| custom-header | Set an additional HTTP header (repeatable) |
| custom-header-propagation | Add HTTP headers specified by --custom-header for each resource request. |
| no-custom-header-propagation | Do not add HTTP headers specified by --custom-header for each resource request. |
| debug-javascript | Show javascript debugging output |
| no-debug-javascript | Do not show javascript debugging output (default) |
| encoding | Set the default text encoding, for input |
| format | Output format |
| height | Set screen height (default is calculated from page content) (default 0) |
| images | Do load or print images (default) |
| no-images | Do not load or print images |
| disable-javascript | Do not allow web pages to run javascript |
| enable-javascript | Do allow web pages to run javascript (default) |
| javascript-delay | Wait some milliseconds for javascript finish (default 200) |
| load-error-handling | Specify how to handle pages that fail to load: abort, ignore or skip (default abort) |
| load-media-error-handling | Specify how to handle media files that fail to load: abort, ignore or skip (default ignore) |
| disable-local-file-access | Do not allowed conversion of a local file to read in other local files, unless explicitly allowed with allow |
| enable-local-file-access | Allowed conversion of a local file to read in other local files. (default) |
| minimum-font-size | Minimum font size |
| password | HTTP Authentication password |
| disable-plugins | Disable installed plugins (default) |
| enable-plugins | Enable installed plugins (plugins will likely not work) |
| post | Add an additional post field |
| post-file | Post an additional file |
| proxy | Use a proxy |
| quality | Output image quality (between 0 and 100) (default 94) |
| quiet | Be less verbose |
| radiobutton-checked-svg | Use this SVG file when rendering checked radio-buttons |
| radiobutton-svg | Use this SVG file when rendering unchecked radio-buttons |
| run-script | Run this additional javascript after the page is done loading (repeatable) |
| disable-smart-width | Use the specified width even if it is not large enough for the content |
| enable-smart-width | Extend --width to fit unbreakable content (default) |
| stop-slow-scripts | Stop slow running javascript |
| no-stop-slow-scripts | Do not stop slow running javascript (default) |
| transparent | Make the background transparent in pngs * |
| use-xserver | Use the X server (some plugins and other stuff might not work without X11) |
| user-style-sheet | Specify a user style sheet, to load with every page |
| username | HTTP Authentication username |
| width | Set screen width (default is 1024) |
| window-status | Wait until window.status is equal to this string before rendering page |
| zoom | Use this zoom factor (default 1) |
## _PdfApp Args_
| Option | Description |
| ---------------------------- | -------------------------- |
| collate | Global options |
| no-collate | Global options |
| cookie-jar | Global options |
| copies | Global options |
| dpi | Global options |
| extended-help | Global options |
| grayscale | Global options |
| help | Global options |
| htmldoc | Global options |
| ignore-load-errors | Global options - old v0.9 |
| image-dpi | Global options |
| image-quality | Global options |
| license | Global options |
| log-level | Global options |
| lowquality | Global options |
| manpage | Global options |
| margin-bottom | Global options |
| margin-left | Global options |
| margin-right | Global options |
| margin-top | Global options |
| orientation | Global options |
| page-height | Global options |
| page-size | Global options |
| page-width | Global options |
| no-pdf-compression | Global options |
| quiet | Global options |
| read-args-from-stdin | Global options |
| readme | Global options |
| title | Global options |
| use-xserver | Global options |
| version | Global options |
| dump-default-toc-xsl | Outline options |
| dump-outline | Outline options |
| outline | Outline options |
| no-outline | Outline options |
| outline-depth | Outline options |
| output-format | Outline options |
| allow | Page options |
| background | Page options |
| no-background | Page options |
| bypass-proxy-for | Page options |
| cache-dir | Page options |
| checkbox-checked-svg | Page options |
| checkbox-svg | Page options |
| cookie | Page options |
| custom-header | Page options |
| custom-header-propagation | Page options |
| no-custom-header-propagation | Page options |
| debug-javascript | Page options |
| no-debug-javascript | Page options |
| default-header | Page options |
| encoding | Page options |
| disable-external-links | Page options |
| enable-external-links | Page options |
| disable-forms | Page options |
| enable-forms | Page options |
| images | Page options |
| no-images | Page options |
| disable-internal-links | Page options |
| enable-internal-links | Page options |
| disable-javascript | Page options |
| enable-javascript | Page options |
| javascript-delay | Page options |
| keep-relative-links | Page options |
| load-error-handling | Page options |
| load-media-error-handling | Page options |
| disable-local-file-access | Page options |
| enable-local-file-access | Page options |
| minimum-font-size | Page options |
| exclude-from-outline | Page options |
| include-in-outline | Page options |
| page-offset | Page options |
| password | Page options |
| disable-plugins | Page options |
| enable-plugins | Page options |
| post | Page options |
| post-file | Page options |
| print-media-type | Page options |
| no-print-media-type | Page options |
| proxy | Page options |
| proxy-hostname-lookup | Page options |
| radiobutton-checked-svg | Page options |
| radiobutton-svg | Page options |
| redirect-delay | Page options // old v0.9 |
| resolve-relative-links | Page options |
| run-script | Page options |
| disable-smart-shrinking | Page options |
| enable-smart-shrinking | Page options |
| ssl-crt-path | Page options |
| ssl-key-password | Page options |
| ssl-key-path | Page options |
| stop-slow-scripts | Page options |
| no-stop-slow-scripts | Page options |
| disable-toc-back-links | Page options |
| enable-toc-back-links | Page options |
| user-style-sheet | Page options |
| username | Page options |
| viewport-size | Page options |
| window-status | Page options |
| zoom | Page options |
| footer-center | Headers and footer options |
| footer-font-name | Headers and footer options |
| footer-font-size | Headers and footer options |
| footer-html | Headers and footer options |
| footer-left | Headers and footer options |
| footer-line | Headers and footer options |
| no-footer-line | Headers and footer options |
| footer-right | Headers and footer options |
| footer-spacing | Headers and footer options |
| header-center | Headers and footer options |
| header-font-name | Headers and footer options |
| header-font-size | Headers and footer options |
| header-html | Headers and footer options |
| header-left | Headers and footer options |
| header-line | Headers and footer options |
| no-header-line | Headers and footer options |
| header-right | Headers and footer options |
| header-spacing | Headers and footer options |
| replace | Headers and footer options |
| cover | Cover object |
| toc | TOC object |
| disable-dotted-lines | TOC options |
| toc-depth | TOC options - old v0.9 |
| toc-font-name | TOC options - old v0.9 |
| toc-l1-font-size | TOC options - old v0.9 |
| toc-header-text | TOC options |
| toc-header-font-name | TOC options - old v0.9 |
| toc-header-font-size | TOC options - old v0.9 |
| toc-level-indentation | TOC options |
| disable-toc-links | TOC options |
| toc-text-size-shrink | TOC options |
| xsl-style-sheet | TOC options |
## License
MIT
**Free Software, Hell Yeah!**