PDF security features (#26)

- Support for adding and removing passwords
- Support for watermarks
- Dedicated page remover
- Support for PDF permissions
- Removed endpoint /home and replaced with /
- Code cleanups
- Fixed page titles
This commit is contained in:
Anthony Stirling
2023-02-03 20:26:35 +00:00
committed by GitHub
parent 1937a83531
commit 5275866f09
34 changed files with 1253 additions and 604 deletions

View File

@@ -0,0 +1,103 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title='Add Password')}"></th:block>
<body> <div id="page-container">
<div id="content-wrap">
<div th:insert="~{fragments/navbar.html :: navbar}"></div>
<br>
<br>
<div class="container">
<div class="row justify-content-center">
<div class="col-md-6">
<h2>Add password (Encrypt)</h2>
<form action="add-password" method="post"
enctype="multipart/form-data">
<div class="form-group">
<label>Select PDF to encrypt</label>
<div class="custom-file">
<input type="file" class="custom-file-input" id="fileInput"
name="fileInput" required> <label
class="custom-file-label">Choose PDF</label>
</div>
</div>
<div class="form-group">
<label>Password</label> <input type="password"
class="form-control" id="password" name="password" required>
</div>
<div class="form-group">
<label>Encryption Key Length</label> <select class="form-control"
id="keyLength" name="keyLength">
<option value="40">40</option>
<option value="128">128</option>
<option value="256">256</option>
</select> <small class="form-text text-muted">Higher values are
stronger, but lower values have better compatibility.</small>
</div>
<div class="form-group">
<label>Permissions to set</label>
<div class="form-check">
<input class="form-check-input" type="checkbox"
id="canAssembleDocument" name="canAssembleDocument"> <label
class="form-check-label" for="canAssembleDocument">
Prevent assembly of document </label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox"
id="canExtractContent" name="canExtractContent"> <label
class="form-check-label" for="canExtractContent">
Prevent content extraction </label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox"
id="canExtractForAccessibility"
name="canExtractForAccessibility"> <label
class="form-check-label" for="canExtractForAccessibility">
Prevent extraction for accessibility </label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox"
id="canFillInForm" name="canFillInForm"> <label
class="form-check-label" for="canFillInForm"> Prevent
filling in form </label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="canModify"
name="canModify"> <label class="form-check-label"
for="canModify"> Prevent modification </label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox"
id="canModifyAnnotations" name="canModifyAnnotations"> <label
class="form-check-label" for="canModifyAnnotations">
Prevent annotation modification </label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="canPrint"
name="canPrint"> <label class="form-check-label"
for="canPrint"> Prevent printing </label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox"
id="canPrintFaithful" name="canPrintFaithful"> <label
class="form-check-label" for="canPrintFaithful"> Prevent
printing different formats </label>
</div>
</div>
<br />
<div class="form-group text-center">
<button type="submit" class="btn btn-primary">Encrypt</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div th:insert="~{fragments/footer.html :: footer}"></div>
</div>
</body>
</html>

View File

@@ -0,0 +1,56 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title='Add Watermark')}"></th:block>
<body> <div id="page-container">
<div id="content-wrap">
<div th:insert="~{fragments/navbar.html :: navbar}"></div>
<br>
<br>
<div class="container">
<div class="row justify-content-center">
<div class="col-md-6">
<h2>Add Watermark</h2>
<form method="post" enctype="multipart/form-data" action="add-watermark">
<div class="form-group">
<label>Select PDF to add watermark to:</label>
<div class="custom-file">
<input type="file" class="custom-file-input" id="fileInput"
name="fileInput" required> <label
class="custom-file-label">Choose PDF</label>
</div>
</div>
<div class="form-group">
<label for="watermarkText">Watermark Text:</label>
<input type="text" id="watermarkText" name="watermarkText" class="form-control" placeholder="Stirling-PDF" required/>
</div>
<div class="form-group">
<label for="fontSize">Font Size:</label>
<input type="text" id="fontSize" name="fontSize" class="form-control" value="30"/>
</div>
<div class="form-group">
<label for="rotation">Rotation (0-360):</label>
<input type="text" id="rotation" name="rotation" class="form-control" value="45"/>
</div>
<div class="form-group">
<label for="widthSpacer">widthSpacer (Space between each watermark horizontally):</label>
<input type="text" id="widthSpacer" name="widthSpacer" class="form-control" value="50"/>
</div>
<div class="form-group">
<label for="heightSpacer">heightSpacer (Space between each watermark vertically):</label>
<input type="text" id="heightSpacer" name="heightSpacer" class="form-control" value="50"/>
</div>
<div class="form-group text-center">
<input type="submit" value="Add Watermark" class="btn btn-primary"/>
</div>
</form>
</div>
</div>
</div>
</div>
<div th:insert="~{fragments/footer.html :: footer}"></div>
</div>
</body>
</html>

View File

@@ -0,0 +1,93 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title='Change Permissions')}"></th:block>
<body> <div id="page-container">
<div id="content-wrap">
<div th:insert="~{fragments/navbar.html :: navbar}"></div>
<br>
<br>
<div class="container">
<div class="row justify-content-center">
<div class="col-md-6">
<h2>Change permissions</h2>
<p>Warning to have these permissions be
unchangeable it is recommended to set them with a password via the
add-password page</p>
<form action="add-password" method="post"
enctype="multipart/form-data">
<div class="form-group">
<label>Select PDF to change permissions</label>
<div class="custom-file">
<input type="file" class="custom-file-input" id="fileInput"
name="fileInput"> <label class="custom-file-label">Choose
PDF</label>
</div>
</div>
<div class="form-group">
<label>Permissions to set</label>
<div class="form-check">
<input class="form-check-input" type="checkbox"
id="canAssembleDocument" name="canAssembleDocument"> <label
class="form-check-label" for="canAssembleDocument">
Prevent assembly of document </label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox"
id="canExtractContent" name="canExtractContent"> <label
class="form-check-label" for="canExtractContent">
Prevent content extraction </label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox"
id="canExtractForAccessibility"
name="canExtractForAccessibility"> <label
class="form-check-label" for="canExtractForAccessibility">
Prevent extraction for accessibility </label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox"
id="canFillInForm" name="canFillInForm"> <label
class="form-check-label" for="canFillInForm"> Prevent
filling in form </label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="canModify"
name="canModify"> <label class="form-check-label"
for="canModify"> Prevent modification </label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox"
id="canModifyAnnotations" name="canModifyAnnotations"> <label
class="form-check-label" for="canModifyAnnotations">
Prevent annotation modification </label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox" id="canPrint"
name="canPrint"> <label class="form-check-label"
for="canPrint"> Prevent printing </label>
</div>
<div class="form-check">
<input class="form-check-input" type="checkbox"
id="canPrintFaithful" name="canPrintFaithful"> <label
class="form-check-label" for="canPrintFaithful"> Prevent
printing different formats </label>
</div>
</div>
<br />
<div class="form-group text-center">
<button type="submit" class="btn btn-primary">Change</button>
</div>
</form>
</div>
</div>
</div>
</div>
<div th:insert="~{fragments/footer.html :: footer}"></div>
</div>
</body>
</html>

View File

@@ -0,0 +1,38 @@
<!DOCTYPE html>
<html lang="en" xmlns:th="http://www.thymeleaf.org">
<th:block th:insert="~{fragments/common :: head(title='Remove password')}"></th:block>
<body> <div id="page-container">
<div id="content-wrap">
<div th:insert="~{fragments/navbar.html :: navbar}"></div>
<br>
<br>
<div class="container">
<div class="row justify-content-center">
<div class="col-md-6">
<h2>Remove password (Decrypt)</h2>
<form action="add-password" method="post"
enctype="multipart/form-data">
<div class="form-group">
<label>Select PDF to Decrypt</label>
<div class="custom-file">
<input type="file" class="custom-file-input" id="fileInput"
name="fileInput" required> <label
class="custom-file-label">Choose PDF</label>
</div>
</div>
<div class="form-group">
<label>Password</label> <input type="password"
class="form-control" id="password" name="password" required>
</div>
</form>
</div>
</div>
</div>
</div>
<div th:insert="~{fragments/footer.html :: footer}"></div>
</div>
</body>
</html>