2024-02-11 17:47:00 +01:00
|
|
|
<!DOCTYPE html>
|
2024-03-21 21:58:01 +01:00
|
|
|
<html th:lang="${#locale.language}" th:dir="#{language.direction}" th:data-language="${#locale.toString()}" xmlns:th="http://www.thymeleaf.org">
|
2024-02-16 22:49:06 +01:00
|
|
|
<head>
|
|
|
|
<th:block th:insert="~{fragments/common :: head(title=#{rotate.title}, header=#{rotate.header})}"></th:block>
|
|
|
|
</head>
|
2024-02-11 17:47:00 +01:00
|
|
|
|
2024-02-16 22:49:06 +01:00
|
|
|
<body>
|
2024-02-11 17:47:00 +01:00
|
|
|
<div id="page-container">
|
2024-02-16 22:49:06 +01:00
|
|
|
<div id="content-wrap">
|
|
|
|
<th:block th:insert="~{fragments/navbar.html :: navbar}"></th:block>
|
2024-03-21 21:58:01 +01:00
|
|
|
<br><br>
|
2024-02-16 22:49:06 +01:00
|
|
|
<div class="container">
|
|
|
|
<div class="row justify-content-center">
|
|
|
|
<div class="col-md-6">
|
|
|
|
<h2 th:text="#{rotate.header}"></h2>
|
|
|
|
|
|
|
|
<form action="#" th:action="@{api/v1/general/rotate-pdf}" th:object="${rotateForm}" method="post" enctype="multipart/form-data">
|
|
|
|
<div th:replace="~{fragments/common :: fileSelector(name='fileInput', multiple=false, accept='application/pdf')}"></div>
|
|
|
|
<input type="hidden" id="angleInput" name="angle" value="0">
|
|
|
|
|
|
|
|
<div id="editSection" style="display: none">
|
2024-03-21 21:58:01 +01:00
|
|
|
<div id="previewContainer">
|
|
|
|
<!-- pdf-preview -->
|
|
|
|
</div>
|
2024-02-11 17:47:00 +01:00
|
|
|
|
2024-03-21 21:58:01 +01:00
|
|
|
<div class="buttonContainer">
|
|
|
|
<button type="button" class="btn btn-secondary" onclick="rotate(-90)">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-counterclockwise" viewBox="0 0 16 16">
|
|
|
|
<path fill-rule="evenodd" d="M8 3a5 5 0 1 1-4.546 2.914.5.5 0 0 0-.908-.417A6 6 0 1 0 8 2v1z" />
|
|
|
|
<path d="M8 4.466V.534a.25.25 0 0 0-.41-.192L5.23 2.308a.25.25 0 0 0 0 .384l2.36 1.966A.25.25 0 0 0 8 4.466z" />
|
|
|
|
</svg>
|
|
|
|
</button>
|
|
|
|
<button type="submit" id="submitBtn" class="btn btn-primary" th:text="#{rotate.submit}"></button>
|
|
|
|
<button type="button" class="btn btn-secondary" onclick="rotate(90)">
|
|
|
|
<svg xmlns="http://www.w3.org/2000/svg" width="16" height="16" fill="currentColor" class="bi bi-arrow-clockwise" viewBox="0 0 16 16">
|
|
|
|
<path fill-rule="evenodd" d="M8 3a5 5 0 1 0 4.546 2.914.5.5 0 0 1 .908-.417A6 6 0 1 1 8 2v1z" />
|
|
|
|
<path d="M8 4.466V.534a.25.25 0 0 1 .41-.192l2.36 1.966c.12.1.12.284 0 .384L8.41 4.658A.25.25 0 0 1 8 4.466z" />
|
|
|
|
</svg>
|
|
|
|
</button>
|
|
|
|
</div>
|
2024-02-11 17:47:00 +01:00
|
|
|
</div>
|
2024-02-16 22:49:06 +01:00
|
|
|
</form>
|
2024-02-11 17:47:00 +01:00
|
|
|
</div>
|
2024-02-16 22:49:06 +01:00
|
|
|
</div>
|
2024-02-11 17:47:00 +01:00
|
|
|
</div>
|
2024-02-16 22:49:06 +01:00
|
|
|
</div>
|
|
|
|
<th:block th:insert="~{fragments/footer.html :: footer}"></th:block>
|
2024-02-11 17:47:00 +01:00
|
|
|
</div>
|
|
|
|
<script>
|
2024-02-16 22:49:06 +01:00
|
|
|
const angleInput = document.getElementById("angleInput");
|
|
|
|
const fileInput = document.getElementById("fileInput-input");
|
2024-03-21 21:58:01 +01:00
|
|
|
const previewContainer = document.getElementById("previewContainer");
|
|
|
|
// const preview = document.getElementById("pdf-preview");
|
2024-02-16 22:49:06 +01:00
|
|
|
fileInput.addEventListener("change", async function() {
|
|
|
|
console.log("loading pdf");
|
|
|
|
|
|
|
|
document.querySelector("#editSection").style.display = "";
|
|
|
|
|
|
|
|
var url = URL.createObjectURL(fileInput.files[0])
|
|
|
|
pdfjsLib.GlobalWorkerOptions.workerSrc = 'pdfjs/pdf.worker.js'
|
|
|
|
const pdf = await pdfjsLib.getDocument(url).promise;
|
|
|
|
const page = await pdf.getPage(1);
|
|
|
|
|
|
|
|
const canvas = document.createElement("canvas");
|
|
|
|
|
|
|
|
// set the canvas size to the size of the page
|
|
|
|
if (page.rotate == 90 || page.rotate == 270) {
|
|
|
|
canvas.width = page.view[3];
|
|
|
|
canvas.height = page.view[2];
|
|
|
|
} else {
|
|
|
|
canvas.width = page.view[2];
|
|
|
|
canvas.height = page.view[3];
|
|
|
|
}
|
|
|
|
|
|
|
|
// render the page onto the canvas
|
|
|
|
var renderContext = {
|
|
|
|
canvasContext: canvas.getContext("2d"),
|
|
|
|
viewport: page.getViewport({ scale: 1 })
|
|
|
|
};
|
|
|
|
|
|
|
|
await page.render(renderContext).promise;
|
2024-03-21 21:58:01 +01:00
|
|
|
const preview = document.createElement("img");
|
|
|
|
preview.id = "pdf-preview";
|
|
|
|
preview.alt = "preview";
|
2024-02-16 22:49:06 +01:00
|
|
|
preview.src = canvas.toDataURL();
|
2024-03-21 21:58:01 +01:00
|
|
|
previewContainer.appendChild(preview);
|
2024-02-16 22:49:06 +01:00
|
|
|
});
|
|
|
|
|
|
|
|
function rotate(deg) {
|
2024-03-21 21:58:01 +01:00
|
|
|
const preview = document.getElementById("pdf-preview");
|
2024-02-16 22:49:06 +01:00
|
|
|
var lastTransform = preview.style.rotate;
|
|
|
|
if (!lastTransform) {
|
|
|
|
lastTransform = "0";
|
|
|
|
}
|
|
|
|
const lastAngle = parseInt(lastTransform.replace(/[^\d-]/g, ''));
|
|
|
|
const newAngle = lastAngle + deg;
|
|
|
|
preview.style.rotate = newAngle + "deg";
|
|
|
|
angleInput.value = newAngle;
|
|
|
|
}
|
|
|
|
</script>
|
2024-03-21 21:58:01 +01:00
|
|
|
</body>
|
|
|
|
</html>
|