mirror of
				https://github.com/Frooodle/Stirling-PDF.git
				synced 2025-10-25 11:17:28 +02:00 
			
		
		
		
	Merge remote-tracking branch 'upstream/main' into addGraphicsToRotatePage
# Conflicts: # src/main/resources/templates/rotate-pdf.html
This commit is contained in:
		
						commit
						b123e8eba5
					
				
							
								
								
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										3
									
								
								.gitignore
									
									
									
									
										vendored
									
									
								
							| @ -12,7 +12,8 @@ local.properties | ||||
| .settings/ | ||||
| .loadpath | ||||
| .recommenders | ||||
| 
 | ||||
| .classpath | ||||
| .project | ||||
| 
 | ||||
| # Gradle | ||||
| .gradle | ||||
|  | ||||
							
								
								
									
										29
									
								
								HowToAddNewLanguage.md
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										29
									
								
								HowToAddNewLanguage.md
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,29 @@ | ||||
| <h1><img src="https://github.com/Frooodle/Stirling-PDF/blob/main/docs/stirling.png?raw=true"  width="60" height="60">tirling-PDF</h1> | ||||
| 
 | ||||
| # How to add new languages to Stirling-PDF | ||||
| 
 | ||||
| Fork Stirling-PDF and make a new branch out of Main | ||||
| 
 | ||||
| Then add reference to the language in the navbar by adding a new language entry to the dropdown | ||||
| 
 | ||||
| https://github.com/Frooodle/Stirling-PDF/blob/main/src/main/resources/templates/fragments/navbar.html#L80 | ||||
| 
 | ||||
| For example to add Polish you would add  | ||||
| ``` | ||||
| <a class="dropdown-item lang_dropdown-item" href="" data-language-code="pl_PL">Polish</a> | ||||
| ``` | ||||
| The data-language-code is the code used to reference the file in the next step. | ||||
| 
 | ||||
| Start by copying the existing english property file  | ||||
| 
 | ||||
| [https://github.com/Frooodle/Stirling-PDF/tree/langSetup/src/main/resources/messages_en_GB.properties](https://github.com/Frooodle/Stirling-PDF/blob/main/src/main/resources/messages_en_US.properties) | ||||
| 
 | ||||
| Copy and rename it to messages_{your data-language-code here}.properties, in the polish example you would set the name to messages_pl_PL.properties | ||||
| 
 | ||||
| 
 | ||||
| Then simply translate all property entries within that file and make a PR into main for others to use! | ||||
| 
 | ||||
| If you do not have a java IDE i am happy to verify the changes worked once you raise PR (but wont be able to verify the translations themselves) | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
							
								
								
									
										35
									
								
								src/main/java/stirling/software/SPDF/config/Beans.java
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										35
									
								
								src/main/java/stirling/software/SPDF/config/Beans.java
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,35 @@ | ||||
| package stirling.software.SPDF.config; | ||||
| 
 | ||||
| import org.springframework.context.annotation.Bean; | ||||
| import org.springframework.context.annotation.Configuration; | ||||
| import org.springframework.web.servlet.LocaleResolver; | ||||
| import org.springframework.web.servlet.config.annotation.InterceptorRegistry; | ||||
| import org.springframework.web.servlet.config.annotation.WebMvcConfigurer; | ||||
| import org.springframework.web.servlet.i18n.LocaleChangeInterceptor; | ||||
| import org.springframework.web.servlet.i18n.SessionLocaleResolver; | ||||
| 
 | ||||
| import java.util.Locale; | ||||
| 
 | ||||
| @Configuration | ||||
| public class Beans implements WebMvcConfigurer { | ||||
| 
 | ||||
|     @Bean | ||||
|     public LocaleResolver localeResolver() { | ||||
|         SessionLocaleResolver slr = new SessionLocaleResolver(); | ||||
|         slr.setDefaultLocale(Locale.US); | ||||
|         return slr; | ||||
|     } | ||||
| 
 | ||||
|     @Bean | ||||
|     public LocaleChangeInterceptor localeChangeInterceptor() { | ||||
|         LocaleChangeInterceptor lci = new LocaleChangeInterceptor(); | ||||
|         lci.setParamName("lang"); | ||||
|         return lci; | ||||
|     } | ||||
| 
 | ||||
|     @Override | ||||
|     public void addInterceptors(InterceptorRegistry registry) { | ||||
|         registry.addInterceptor(localeChangeInterceptor()); | ||||
|     } | ||||
| 
 | ||||
| } | ||||
							
								
								
									
										0
									
								
								src/main/resources/messages.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										0
									
								
								src/main/resources/messages.properties
									
									
									
									
									
										Normal file
									
								
							
							
								
								
									
										209
									
								
								src/main/resources/messages_en_GB.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										209
									
								
								src/main/resources/messages_en_GB.properties
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,209 @@ | ||||
| ########### | ||||
| # Generic # | ||||
| ########### | ||||
| pdfPrompt=Choose PDF | ||||
| multiPdfPrompt=Choose PDFs (2+) | ||||
| multiPdfDropPrompt=Select (or drag & drop) all PDFs you require | ||||
| imgPrompt=Choose Image | ||||
| genericSubmit=Submit | ||||
| processTimeWarning=Warning: This process can take up to a minute depending on file-size | ||||
| pageOrderPrompt=Page Order (Enter a comma-separated list of page numbers) : | ||||
| goToPage=go | ||||
| ############# | ||||
| # HOME-PAGE # | ||||
| ############# | ||||
| home.desc=Your locally hosted one-stop-shop for all your PDF needs. | ||||
| 
 | ||||
| navbar.convert=Convert | ||||
| navbar.security=Security | ||||
| navbar.other=Other | ||||
| navbar.darkmode=Dark Mode | ||||
| 
 | ||||
| home.merge.title=Merge PDFs | ||||
| home.merge.desc=Easily merge multiple PDFs into one. | ||||
| 
 | ||||
| home.split.title=Split PDFs | ||||
| home.split.desc=Split PDFs into multiple documents | ||||
| 
 | ||||
| home.rotate.title=Rotate PDFs | ||||
| home.rotate.desc=Easily rotate your PDFs. | ||||
| 
 | ||||
| home.imageToPdf.title=Image to PDF | ||||
| home.imageToPdf.desc=Convert a images (PNG, JPEG, GIF) to PDF. | ||||
| 
 | ||||
| home.pdfToImage.title=PDF to Image | ||||
| home.pdfToImage.desc=Convert a PDF to a image. (PNG, JPEG, GIF) | ||||
| 
 | ||||
| home.pdfOrganiser.title=PDF Organiser | ||||
| home.pdfOrganiser.desc=Remove/Rearrange pages in any order | ||||
| 
 | ||||
| home.addImage.title=Add image onto PDF | ||||
| home.addImage.desc=Adds a image onto a set location on the PDF (Work in progress) | ||||
| 
 | ||||
| home.watermark.title=Add Watermark | ||||
| home.watermark.desc=Add a custom watermark to your PDF document. | ||||
| 
 | ||||
| home.permissions.title=Change Permissions | ||||
| home.permissions.desc=Change the permissions of your PDF document | ||||
| 
 | ||||
| home.removePages.title=Remove Pages | ||||
| home.removePages.desc=Delete unwanted pages from your PDF document. | ||||
| 
 | ||||
| home.addPassword.title=Add Password | ||||
| home.addPassword.desc=Encrypt your PDF document with a password. | ||||
| 
 | ||||
| home.removePassword.title=Remove Password | ||||
| home.removePassword.desc=Remove password protection from your PDF document. | ||||
| 
 | ||||
| home.compressPdfs.title=Compress PDFs | ||||
| home.compressPdfs.desc=Compress PDFs to reduce their file size. | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #Add image | ||||
| addImage.title=Add Image | ||||
| addImage.header=Add image to PDF (Work in progress) | ||||
| addImage.submit=Add image | ||||
| 
 | ||||
| #compress | ||||
| compress.title=Compress | ||||
| compress.header=Compress PDF | ||||
| compress.compressLevel=Value between 1 and 100 (1 being most reduced) | ||||
| compress.submit=Compress | ||||
| 
 | ||||
| 
 | ||||
| #merge | ||||
| merge.title=Merge | ||||
| merge.header=Merge multiple PDFs (2+) | ||||
| merge.submit=Merge | ||||
| 
 | ||||
| #pdfOrganiser | ||||
| pdfOrganiser.title=Page Organiser | ||||
| pdfOrganiser.header=PDF Page Organiser | ||||
| pdfOrganiser.submit=Rearrange Pages | ||||
| 
 | ||||
| 
 | ||||
| #pageRemover | ||||
| pageRemover.title=Page Remover | ||||
| pageRemover.header=PDF Page remover | ||||
| pageRemover.pagesToDelete=Pages to delete (Enter a comma-separated list of page numbers) : | ||||
| pageRemover.submit=Delete Pages | ||||
| 
 | ||||
| #rotate | ||||
| rotate.title=Rotate PDF | ||||
| rotate.header=Rotate PDF | ||||
| rotate.selectAngle=Select rotation angle (in multiples of 90 degrees): | ||||
| rotate.submit=Rotate | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #merge | ||||
| split.title=Split PDF | ||||
| split.header=Split PDF | ||||
| split.desc.1=The numbers you select are the page number you wish to do a split on | ||||
| split.desc.2=As such selecting 1,3,7-8 would split a 10 page document into 6 separate PDFS with: | ||||
| split.desc.3=Document #1: Page 1 | ||||
| split.desc.4=Document #2: Page 2 and 3 | ||||
| split.desc.5=Document #3: Page 4, 5 and 6 | ||||
| split.desc.6=Document #4: Page 7 | ||||
| split.desc.7=Document #5: Page 8 | ||||
| split.desc.8=Document #6: Page 9 and 10 | ||||
| split.splitPages=Enter pages to split on: | ||||
| split.submit=Split | ||||
| 
 | ||||
| 
 | ||||
| #merge | ||||
| imageToPDF.title=Image to PDF | ||||
| imageToPDF.header=Image to PDF | ||||
| imageToPDF.submit=Convert | ||||
| 
 | ||||
| #pdfToImage | ||||
| pdfToImage.title=PDF to Image | ||||
| pdfToImage.header=PDF to Image | ||||
| pdfToImage.selectText=Image Format | ||||
| pdfToImage.submit=Convert | ||||
| 
 | ||||
| #addPassword | ||||
| addPassword.title=Add Password | ||||
| addPassword.header=Add password (Encrypt) | ||||
| addPassword.selectText.1=Select PDF to encrypt | ||||
| addPassword.selectText.2=Password | ||||
| addPassword.selectText.3=Encryption Key Length | ||||
| addPassword.selectText.4=Higher values are stronger, but lower values have better compatibility. | ||||
| addPassword.selectText.5=Permissions to set | ||||
| addPassword.selectText.6=Prevent assembly of document | ||||
| addPassword.selectText.7=Prevent content extraction | ||||
| addPassword.selectText.8=Prevent extraction for accessibility | ||||
| addPassword.selectText.9=Prevent filling in form | ||||
| addPassword.selectText.10=Prevent modification | ||||
| addPassword.selectText.11=Prevent annotation modification | ||||
| addPassword.selectText.12=Prevent printing | ||||
| addPassword.selectText.13=Prevent printing different formats | ||||
| addPassword.submit=Encrypt | ||||
| 
 | ||||
| #watermark | ||||
| watermark.title=Add Watermark | ||||
| watermark.header=Add Watermark | ||||
| watermark.selectText.1=Select PDF to add watermark to: | ||||
| watermark.selectText.2=Watermark Text: | ||||
| watermark.selectText.3=Font Size: | ||||
| watermark.selectText.4=Rotation (0-360): | ||||
| watermark.selectText.5=widthSpacer (Space between each watermark horizontally): | ||||
| watermark.selectText.6=heightSpacer (Space between each watermark vertically): | ||||
| watermark.submit=Add Watermark | ||||
| 
 | ||||
| 
 | ||||
| #Change permissions | ||||
| permissions.title=Change Permissions | ||||
| permissions.header=Change Permissions | ||||
| permissions.warning=Warning to have these permissions be unchangeable it is recommended to set them with a password via the add-password page | ||||
| permissions.selectText.1=Select PDF to change permissions | ||||
| permissions.selectText.2=Permissions to set | ||||
| permissions.selectText.3=Prevent assembly of document | ||||
| permissions.selectText.4=Prevent content extraction | ||||
| permissions.selectText.5=Prevent extraction for accessibility | ||||
| permissions.selectText.6=Prevent filling in form | ||||
| permissions.selectText.7=Prevent modification | ||||
| permissions.selectText.8=Prevent annotation modification | ||||
| permissions.selectText.9=Prevent printing | ||||
| permissions.selectText.10=Prevent printing different formats | ||||
| permissions.submit=Change | ||||
| 
 | ||||
| #remove password | ||||
| removePassword.title=Remove password | ||||
| removePassword.header=Remove password (Decrypt) | ||||
| removePassword.selectText.1=Select PDF to Decrypt | ||||
| removePassword.selectText.2=Password | ||||
| removePassword.submit=Remove | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
							
								
								
									
										209
									
								
								src/main/resources/messages_en_US.properties
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										209
									
								
								src/main/resources/messages_en_US.properties
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,209 @@ | ||||
| ########### | ||||
| # Generic # | ||||
| ########### | ||||
| pdfPrompt=Choose PDF | ||||
| multiPdfPrompt=Choose PDFs (2+) | ||||
| multiPdfDropPrompt=Select (or drag & drop) all PDFs you require | ||||
| imgPrompt=Choose Image | ||||
| genericSubmit=Submit | ||||
| processTimeWarning=Warning: This process can take up to a minute depending on file-size | ||||
| pageOrderPrompt=Page Order (Enter a comma-separated list of page numbers) : | ||||
| goToPage=go | ||||
| ############# | ||||
| # HOME-PAGE # | ||||
| ############# | ||||
| home.desc=Your locally hosted one-stop-shop for all your PDF needs. | ||||
| 
 | ||||
| navbar.convert=Convert | ||||
| navbar.security=Security | ||||
| navbar.other=Other | ||||
| navbar.darkmode=Dark Mode | ||||
| 
 | ||||
| home.merge.title=Merge PDFs | ||||
| home.merge.desc=Easily merge multiple PDFs into one. | ||||
| 
 | ||||
| home.split.title=Split PDFs | ||||
| home.split.desc=Split PDFs into multiple documents | ||||
| 
 | ||||
| home.rotate.title=Rotate PDFs | ||||
| home.rotate.desc=Easily rotate your PDFs. | ||||
| 
 | ||||
| home.imageToPdf.title=Image to PDF | ||||
| home.imageToPdf.desc=Convert a images (PNG, JPEG, GIF) to PDF. | ||||
| 
 | ||||
| home.pdfToImage.title=PDF to Image | ||||
| home.pdfToImage.desc=Convert a PDF to a image. (PNG, JPEG, GIF) | ||||
| 
 | ||||
| home.pdfOrganiser.title=PDF Organizer | ||||
| home.pdfOrganiser.desc=Remove/Rearrange pages in any order | ||||
| 
 | ||||
| home.addImage.title=Add image onto PDF | ||||
| home.addImage.desc=Adds a image onto a set location on the PDF (Work in progress) | ||||
| 
 | ||||
| home.watermark.title=Add Watermark | ||||
| home.watermark.desc=Add a custom watermark to your PDF document. | ||||
| 
 | ||||
| home.permissions.title=Change Permissions | ||||
| home.permissions.desc=Change the permissions of your PDF document | ||||
| 
 | ||||
| home.removePages.title=Remove Pages | ||||
| home.removePages.desc=Delete unwanted pages from your PDF document. | ||||
| 
 | ||||
| home.addPassword.title=Add Password | ||||
| home.addPassword.desc=Encrypt your PDF document with a password. | ||||
| 
 | ||||
| home.removePassword.title=Remove Password | ||||
| home.removePassword.desc=Remove password protection from your PDF document. | ||||
| 
 | ||||
| home.compressPdfs.title=Compress PDFs | ||||
| home.compressPdfs.desc=Compress PDFs to reduce their file size. | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #Add image | ||||
| addImage.title=Add Image | ||||
| addImage.header=Add image to PDF (Work in progress) | ||||
| addImage.submit=Add image | ||||
| 
 | ||||
| #compress | ||||
| compress.title=Compress | ||||
| compress.header=Compress PDF | ||||
| compress.compressLevel=Value between 1 and 100 (1 being most reduced) | ||||
| compress.submit=Compress | ||||
| 
 | ||||
| 
 | ||||
| #merge | ||||
| merge.title=Merge | ||||
| merge.header=Merge multiple PDFs (2+) | ||||
| merge.submit=Merge | ||||
| 
 | ||||
| #pdfOrganiser | ||||
| pdfOrganiser.title=Page Organizer | ||||
| pdfOrganiser.header=PDF Page Organizer | ||||
| pdfOrganiser.submit=Rearrange Pages | ||||
| 
 | ||||
| 
 | ||||
| #pageRemover | ||||
| pageRemover.title=Page Remover | ||||
| pageRemover.header=PDF Page remover | ||||
| pageRemover.pagesToDelete=Pages to delete (Enter a comma-separated list of page numbers) : | ||||
| pageRemover.submit=Delete Pages | ||||
| 
 | ||||
| #rotate | ||||
| rotate.title=Rotate PDF | ||||
| rotate.header=Rotate PDF | ||||
| rotate.selectAngle=Select rotation angle (in multiples of 90 degrees): | ||||
| rotate.submit=Rotate | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| #merge | ||||
| split.title=Split PDF | ||||
| split.header=Split PDF | ||||
| split.desc.1=The numbers you select are the page number you wish to do a split on | ||||
| split.desc.2=As such selecting 1,3,7-8 would split a 10 page document into 6 separate PDFS with: | ||||
| split.desc.3=Document #1: Page 1 | ||||
| split.desc.4=Document #2: Page 2 and 3 | ||||
| split.desc.5=Document #3: Page 4, 5 and 6 | ||||
| split.desc.6=Document #4: Page 7 | ||||
| split.desc.7=Document #5: Page 8 | ||||
| split.desc.8=Document #6: Page 9 and 10 | ||||
| split.splitPages=Enter pages to split on: | ||||
| split.submit=Split | ||||
| 
 | ||||
| 
 | ||||
| #merge | ||||
| imageToPDF.title=Image to PDF | ||||
| imageToPDF.header=Image to PDF | ||||
| imageToPDF.submit=Convert | ||||
| 
 | ||||
| #pdfToImage | ||||
| pdfToImage.title=PDF to Image | ||||
| pdfToImage.header=PDF to Image | ||||
| pdfToImage.selectText=Image Format | ||||
| pdfToImage.submit=Convert | ||||
| 
 | ||||
| #addPassword | ||||
| addPassword.title=Add Password | ||||
| addPassword.header=Add password (Encrypt) | ||||
| addPassword.selectText.1=Select PDF to encrypt | ||||
| addPassword.selectText.2=Password | ||||
| addPassword.selectText.3=Encryption Key Length | ||||
| addPassword.selectText.4=Higher values are stronger, but lower values have better compatibility. | ||||
| addPassword.selectText.5=Permissions to set | ||||
| addPassword.selectText.6=Prevent assembly of document | ||||
| addPassword.selectText.7=Prevent content extraction | ||||
| addPassword.selectText.8=Prevent extraction for accessibility | ||||
| addPassword.selectText.9=Prevent filling in form | ||||
| addPassword.selectText.10=Prevent modification | ||||
| addPassword.selectText.11=Prevent annotation modification | ||||
| addPassword.selectText.12=Prevent printing | ||||
| addPassword.selectText.13=Prevent printing different formats | ||||
| addPassword.submit=Encrypt | ||||
| 
 | ||||
| #watermark | ||||
| watermark.title=Add Watermark | ||||
| watermark.header=Add Watermark | ||||
| watermark.selectText.1=Select PDF to add watermark to: | ||||
| watermark.selectText.2=Watermark Text: | ||||
| watermark.selectText.3=Font Size: | ||||
| watermark.selectText.4=Rotation (0-360): | ||||
| watermark.selectText.5=widthSpacer (Space between each watermark horizontally): | ||||
| watermark.selectText.6=heightSpacer (Space between each watermark vertically): | ||||
| watermark.submit=Add Watermark | ||||
| 
 | ||||
| 
 | ||||
| #Change permissions | ||||
| permissions.title=Change Permissions | ||||
| permissions.header=Change Permissions | ||||
| permissions.warning=Warning to have these permissions be unchangeable it is recommended to set them with a password via the add-password page | ||||
| permissions.selectText.1=Select PDF to change permissions | ||||
| permissions.selectText.2=Permissions to set | ||||
| permissions.selectText.3=Prevent assembly of document | ||||
| permissions.selectText.4=Prevent content extraction | ||||
| permissions.selectText.5=Prevent extraction for accessibility | ||||
| permissions.selectText.6=Prevent filling in form | ||||
| permissions.selectText.7=Prevent modification | ||||
| permissions.selectText.8=Prevent annotation modification | ||||
| permissions.selectText.9=Prevent printing | ||||
| permissions.selectText.10=Prevent printing different formats | ||||
| permissions.submit=Change | ||||
| 
 | ||||
| #remove password | ||||
| removePassword.title=Remove password | ||||
| removePassword.header=Remove password (Decrypt) | ||||
| removePassword.selectText.1=Select PDF to Decrypt | ||||
| removePassword.selectText.2=Password | ||||
| removePassword.submit=Remove | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| @ -2,7 +2,7 @@ | ||||
| <html lang="en" xmlns:th="http://www.thymeleaf.org"> | ||||
| 
 | ||||
| 
 | ||||
| <th:block th:insert="~{fragments/common :: head(title='Add-Image')}"></th:block> | ||||
| <th:block th:insert="~{fragments/common :: head(title=#{addImage.title})}"></th:block> | ||||
| 
 | ||||
| 
 | ||||
| <body> | ||||
| @ -14,7 +14,7 @@ | ||||
| 	<div class="container"> | ||||
| 		<div class="row justify-content-center"> | ||||
| 			<div class="col-md-6"> | ||||
| 				<h2>Add image to PDF (Work in progress)</h2> | ||||
| 				<h2 th:text="#{addImage.header}"></h2> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| @ -24,12 +24,12 @@ | ||||
| 					<div class="custom-file"> | ||||
| 						<input type="file" class="custom-file-input" id="fileInput" | ||||
| 							name="fileInput" required> <label | ||||
| 							class="custom-file-label" for="fileInput">Choose PDF</label> | ||||
| 							class="custom-file-label" for="fileInput" th:text="#{pdfPrompt}"></label> | ||||
| 					</div> | ||||
| 					<div class="custom-file"> | ||||
| 						<input type="file" class="custom-file-input" id="fileInput2" | ||||
| 							name="fileInput2" required> <label | ||||
| 							class="custom-file-label" for="fileInput2">Choose Image</label> | ||||
| 							class="custom-file-label" for="fileInput2" th:text="#{imgPrompt}"></label> | ||||
| 					</div> | ||||
| 					<div class="form-group"> | ||||
| 						<label for="x">X</label> <input type="number" class="form-control" | ||||
| @ -39,7 +39,7 @@ | ||||
| 						<label for="y">Y</label> <input type="number" class="form-control" | ||||
| 							id="y" name="y" step="0.01" required> | ||||
| 					</div> | ||||
| 					<button type="submit" class="btn btn-primary">Submit</button> | ||||
| 					<button type="submit" class="btn btn-primary" th:text="#{addImage.submit}"></button> | ||||
| 				</form> | ||||
| 				<th:block th:insert="~{fragments/common :: filelist}"></th:block> | ||||
| 
 | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| <html lang="en" xmlns:th="http://www.thymeleaf.org"> | ||||
| 
 | ||||
| 
 | ||||
| <th:block th:insert="~{fragments/common :: head(title='Compress')}"></th:block> | ||||
| <th:block th:insert="~{fragments/common :: head(title=#{compress.title})}"></th:block> | ||||
| 
 | ||||
| 
 | ||||
| <body>	<div id="page-container"> | ||||
| @ -13,25 +13,23 @@ | ||||
| 	<div class="container"> | ||||
| 		<div class="row justify-content-center"> | ||||
| 			<div class="col-md-6"> | ||||
| 				<h2>Compress PDF</h2> | ||||
| 				<h2 th:text="#{compress.header}"></h2> | ||||
| 				<form action="#" th:action="@{compress-pdf}" | ||||
| 					th:object="${rotateForm}" method="post" | ||||
| 					enctype="multipart/form-data"> | ||||
| 					<p>Warning: This process can take up to a minute depending on | ||||
| 						file-size</p> | ||||
| 					<p th:text="#{processTimeWarning}"></p> | ||||
| 					<div class="custom-file"> | ||||
| 						<input type="file" class="custom-file-input" id="fileInput" | ||||
| 							name="fileInput" required> <label | ||||
| 							class="custom-file-label" for="fileInput">Choose PDF</label> | ||||
| 							class="custom-file-label" for="fileInput" th:text="#{pdfPrompt}"></label> | ||||
| 					</div> | ||||
| 					<div class="form-group"> | ||||
| 						<label for="imageCompressionLevel">Value between 1 and 100 | ||||
| 							(1 being most reduced)</label> <input type="number" class="form-control" | ||||
| 						<label for="imageCompressionLevel" th:text="#{compress.compressLevel}"></label> <input type="number" class="form-control" | ||||
| 							id="imageCompressionLevel" name="imageCompressionLevel" step="1" | ||||
| 							value="1" min="1" max="100" required> | ||||
| 					</div> | ||||
| 
 | ||||
| 					<button type="submit" class="btn btn-primary">Compress</button> | ||||
| 					<button type="submit" class="btn btn-primary" th:text="#{compress.submit}"></button> | ||||
| 				</form> | ||||
| 				<th:block th:insert="~{fragments/common :: filelist}"></th:block> | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| <!DOCTYPE html> | ||||
| <html lang="en" xmlns:th="http://www.thymeleaf.org"> | ||||
| 
 | ||||
| <th:block th:insert="~{fragments/common :: head(title='Image to PDF')}"></th:block> | ||||
| <th:block th:insert="~{fragments/common :: head(title=#{imageToPDF.title})}"></th:block> | ||||
| 
 | ||||
| 
 | ||||
| <body>	<div id="page-container"> | ||||
| @ -12,18 +12,18 @@ | ||||
| 	<div class="container"> | ||||
| 		<div class="row justify-content-center"> | ||||
| 			<div class="col-md-6"> | ||||
| 				<h2>Image to PDF</h2> | ||||
| 				<h2 th:text="#{imageToPDF.header}"></h2> | ||||
| 
 | ||||
| 				<form method="post" enctype="multipart/form-data" | ||||
| 					th:action="@{img-to-pdf}"> | ||||
| 					<div class="custom-file"> | ||||
| 						<input type="file" class="custom-file-input" id="fileInput" | ||||
| 							name="fileInput" required> <label | ||||
| 							class="custom-file-label" for="fileInput">Choose Image</label> | ||||
| 							class="custom-file-label" for="fileInput" th:text="#{imgPrompt}"></label> | ||||
| 					</div> | ||||
| 					<br> | ||||
| 					<br> | ||||
| 					<button type="submit" class="btn btn-primary">Convert</button> | ||||
| 					<button type="submit" class="btn btn-primary" th:text="#{imageToPDF.submit}"></button> | ||||
| 
 | ||||
| 				</form> | ||||
| 				<th:block th:insert="~{fragments/common :: filelist}"></th:block> | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| <!DOCTYPE html> | ||||
| <html lang="en" xmlns:th="http://www.thymeleaf.org"> | ||||
| 
 | ||||
| <th:block th:insert="~{fragments/common :: head(title='PDF to Image')}"></th:block> | ||||
| <th:block th:insert="~{fragments/common :: head(title=#{pdfToImage})}"></th:block> | ||||
| 
 | ||||
| 
 | ||||
| <body>	<div id="page-container"> | ||||
| @ -13,23 +13,23 @@ | ||||
| 	<div class="container"> | ||||
| 		<div class="row justify-content-center"> | ||||
| 			<div class="col-md-6"> | ||||
| 				<h2>PDF to Image</h2> | ||||
| 				<h2 th:text="#{pdfToImage.header}"></h2> | ||||
| 				<form method="post" enctype="multipart/form-data" | ||||
| 					th:action="@{pdf-to-img}"> | ||||
| 					<div class="custom-file"> | ||||
| 						<input type="file" class="custom-file-input" id="fileInput" | ||||
| 							name="fileInput" required> <label | ||||
| 							class="custom-file-label" for="fileInput">Choose PDF</label> | ||||
| 							class="custom-file-label" for="fileInput" th:text="#{pdfPrompt}"></label> | ||||
| 					</div> | ||||
| 					<div class="form-group"> | ||||
| 						<label>Image Format</label> <select class="form-control" | ||||
| 						<label th:text="#{pdfToImage.selectText}"></label> <select class="form-control" | ||||
| 							name="imageFormat"> | ||||
| 							<option value="jpg">JPEG</option> | ||||
| 							<option value="png">PNG</option> | ||||
| 							<option value="gif">GIF</option> | ||||
| 						</select> | ||||
| 					</div> | ||||
| 					<button type="submit" class="btn btn-primary">Convert</button> | ||||
| 					<button type="submit" class="btn btn-primary" th:text="#{pdfToImage.submit}"></button> | ||||
| 				</form> | ||||
| 				<th:block th:insert="~{fragments/common :: filelist}"></th:block> | ||||
| 
 | ||||
|  | ||||
| @ -1,5 +1,5 @@ | ||||
| <div th:fragment="card"  class="feature-card"> | ||||
| 	<h5 class="card-title" th:text="${cardTitle}"></h5> | ||||
| 	<p class="card-text" th:text="${cardText}"></p> | ||||
| 	<a class="btn btn-primary" th:href="${cardLink}">Go</a> | ||||
| 	<a class="btn btn-primary" th:href="${cardLink}" th:text="#{goToPage}"></a> | ||||
| </div> | ||||
| @ -12,56 +12,46 @@ | ||||
| 
 | ||||
| 					<li class="nav-item"><a class="nav-link" href="#" | ||||
| 						th:href="@{merge-pdfs}" | ||||
| 						th:classappend="${currentPage}=='merge-pdfs' ? 'active' : ''">Merge | ||||
| 							PDFs</a></li> | ||||
| 						th:classappend="${currentPage}=='merge-pdfs' ? 'active' : ''" th:text="#{home.merge.title}"></a></li> | ||||
| 					<li class="nav-item"><a class="nav-link" href="#" | ||||
| 						th:href="@{split-pdfs}" | ||||
| 						th:classappend="${currentPage}=='split-pdfs' ? 'active' : ''">Split | ||||
| 							PDFs</a></li> | ||||
| 						th:classappend="${currentPage}=='split-pdfs' ? 'active' : ''" th:text="#{home.split.title}"></a></li> | ||||
| 					<li class="nav-item"><a class="nav-link" href="#" | ||||
| 						th:href="@{pdf-organizer}" | ||||
| 						th:classappend="${currentPage}=='pdf-organizer' ? 'active' : ''">Page | ||||
| 							Organizer</a></li>		 | ||||
| 						th:classappend="${currentPage}=='pdf-organizer' ? 'active' : ''" th:text="#{home.pdfOrganiser.title}"></a></li>		 | ||||
| 							 | ||||
| 					<li class="nav-item"><a class="nav-link" href="#" | ||||
| 						th:href="@{rotate-pdf}" | ||||
| 						th:classappend="${currentPage}=='rotate-pdf' ? 'active' : ''">Rotate PDF</a></li> | ||||
| 						th:classappend="${currentPage}=='rotate-pdf' ? 'active' : ''" th:text="#{home.rotate.title}"></a></li> | ||||
| 						 | ||||
| 						 | ||||
| 						 | ||||
| 								 | ||||
| 					 | ||||
| 					<li class="nav-item dropdown" th:classappend="${currentPage}=='pdf-to-img' OR ${currentPage}=='img-to-pdf' ? 'active' : ''"> | ||||
| 												<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||||
| 					Convert | ||||
| 					</a> | ||||
| 												<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"  th:text="#{navbar.convert}"></a> | ||||
| 					<div class="dropdown-menu" aria-labelledby="navbarDropdown"> | ||||
| 						<a class="dropdown-item" href="#" th:href="@{pdf-to-img}" th:classappend="${currentPage}=='pdf-to-img' ? 'active' : ''">PDF to Image</a> | ||||
| 						<a class="dropdown-item" href="#" th:href="@{img-to-pdf}" th:classappend="${currentPage}=='img-to-pdf' ? 'active' : ''">Image to PDF</a> | ||||
| 						<a class="dropdown-item" href="#" th:href="@{pdf-to-img}" th:classappend="${currentPage}=='pdf-to-img' ? 'active' : ''"  th:text="#{home.pdfToImage.title}"></a> | ||||
| 						<a class="dropdown-item" href="#" th:href="@{img-to-pdf}" th:classappend="${currentPage}=='img-to-pdf' ? 'active' : ''" th:text="#{home.imageToPdf.title}"></a> | ||||
| 					</div> | ||||
| 				</li> | ||||
| 				 | ||||
| 				<li class="nav-item dropdown" th:classappend="${currentPage}=='add-password' OR ${currentPage}=='remove-password' OR ${currentPage}=='change-permissions' OR ${currentPage}=='add-watermark' ? 'active' : ''"> | ||||
| 												<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||||
| 					Security | ||||
| 					</a> | ||||
| 												<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"  th:text="#{navbar.security}"></a> | ||||
| 					<div class="dropdown-menu" aria-labelledby="navbarDropdown"> | ||||
| 						<a class="dropdown-item" href="#" th:href="@{add-password}" th:classappend="${currentPage}=='add-password' ? 'active' : ''">Add password (Encrypt)</a> | ||||
| 						<a class="dropdown-item" href="#" th:href="@{remove-password}" th:classappend="${currentPage}=='remove-password' ? 'active' : ''">Remove password (Decrypt)</a> | ||||
| 						<a class="dropdown-item" href="#" th:href="@{change-permissions}" th:classappend="${currentPage}=='change-permissions' ? 'active' : ''">Change permissions</a> | ||||
| 						<a class="dropdown-item" href="#" th:href="@{add-watermark}" th:classappend="${currentPage}=='add-watermark' ? 'active' : ''">Add Watermark</a> | ||||
| 						<a class="dropdown-item" href="#" th:href="@{add-password}" th:classappend="${currentPage}=='add-password' ? 'active' : ''" th:text="#{home.addPassword.title}"></a> | ||||
| 						<a class="dropdown-item" href="#" th:href="@{remove-password}" th:classappend="${currentPage}=='remove-password' ? 'active' : ''" th:text="#{home.removePassword.title}"></a> | ||||
| 						<a class="dropdown-item" href="#" th:href="@{change-permissions}" th:classappend="${currentPage}=='change-permissions' ? 'active' : ''" th:text="#{home.permissions.title}"></a> | ||||
| 						<a class="dropdown-item" href="#" th:href="@{add-watermark}" th:classappend="${currentPage}=='add-watermark' ? 'active' : ''"  th:text="#{home.watermark.title}"></a> | ||||
| 					</div> | ||||
| 				</li>	 | ||||
| 				 | ||||
| 				<li class="nav-item dropdown" th:classappend="${currentPage}=='remove-pages' OR ${currentPage}=='add-image' OR ${currentPage}=='compress-pdf' ? 'active' : ''"> | ||||
| 												<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||||
| 					Others | ||||
| 					</a> | ||||
| 												<a class="nav-link dropdown-toggle" href="#" id="navbarDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false" th:text="#{navbar.other}"></a> | ||||
| 					<div class="dropdown-menu" aria-labelledby="navbarDropdown"> | ||||
| 						<a class="dropdown-item" href="#" th:href="@{add-image}" th:classappend="${currentPage}=='add-image' ? 'active' : ''">Add | ||||
| 							image to PDF</a> | ||||
| 						<a class="dropdown-item" href="#" th:href="@{compress-pdf}" th:classappend="${currentPage}=='compress-pdf' ? 'active' : ''">Compress PDF</a> | ||||
| 						<a class="dropdown-item" href="#" th:href="@{remove-pages}" th:classappend="${currentPage}=='remove-pages' ? 'active' : ''">Remove Pages</a> | ||||
| 						<a class="dropdown-item" href="#" th:href="@{add-image}" th:classappend="${currentPage}=='add-image' ? 'active' : ''" th:text="#{home.addImage.title}"></a> | ||||
| 						<a class="dropdown-item" href="#" th:href="@{compress-pdf}" th:classappend="${currentPage}=='compress-pdf' ? 'active' : ''" th:text="#{home.compressPdfs.title}"></a> | ||||
| 						<a class="dropdown-item" href="#" th:href="@{remove-pages}" th:classappend="${currentPage}=='remove-pages' ? 'active' : ''" th:text="#{home.removePages.title}"></a> | ||||
| 					</div> | ||||
| 				</li>				 | ||||
| 				 | ||||
| @ -77,10 +67,63 @@ | ||||
| 									 | ||||
| 					<input type="checkbox" id="toggle-dark-mode" checked="true" | ||||
| 						th:onclick="javascript:toggleDarkMode()"> | ||||
| 					<a class="nav-link" href="#" for="toggle-dark-mode">Dark Mode</a> | ||||
| 					<a class="nav-link" href="#" for="toggle-dark-mode" th:text="#{navbar.darkmode}"></a> | ||||
| 					 | ||||
| 					 | ||||
| 					<li class="nav-item dropdown"> | ||||
| 				  <a class="nav-link dropdown-toggle" href="#" id="languageDropdown" role="button" data-toggle="dropdown" aria-haspopup="true" aria-expanded="false"> | ||||
| 				    Language | ||||
| 				  </a> | ||||
| 				  <div class="dropdown-menu" aria-labelledby="languageDropdown"> | ||||
| 				    <a class="dropdown-item lang_dropdown-item" href="" data-language-code="en_US">English (US)</a> | ||||
| 					<a class="dropdown-item lang_dropdown-item" href="" data-language-code="en_GB">English (UK)</a> | ||||
| 				  </div> | ||||
| 				</li> | ||||
| 
 | ||||
| 				</ul> | ||||
| 
 | ||||
| 				 | ||||
| 				 | ||||
| 				<script> | ||||
| 				document.addEventListener('DOMContentLoaded', function() { | ||||
| 					  // Get the dropdown items | ||||
| 					  var dropdownItems = document.querySelectorAll('.lang_dropdown-item'); | ||||
| 					   | ||||
| 					  // Loop through the dropdown items | ||||
| 					  for (var i = 0; i < dropdownItems.length; i++) { | ||||
| 						  dropdownItems[i].classList.remove('active'); | ||||
| 						  if(dropdownItems[i].dataset.languageCode ===  localStorage.getItem('languageCode')){ | ||||
| 						 	dropdownItems[i].classList.add('active'); | ||||
| 					  	} | ||||
| 					    // Add a click event listener to each dropdown item | ||||
| 					    dropdownItems[i].addEventListener('click', function(event) { | ||||
| 					    	 | ||||
| 
 | ||||
| 					      // Prevent the default link behavior | ||||
| 					      event.preventDefault(); | ||||
| 	 | ||||
| 					      // Get the language code | ||||
| 					      var languageCode = this.dataset.languageCode; | ||||
| 
 | ||||
| 					      // Save the language code to local storage | ||||
| 					      localStorage.setItem('languageCode', languageCode); | ||||
| 
 | ||||
| 					      // Get the current URL | ||||
| 					      var currentUrl = window.location.href; | ||||
| 
 | ||||
| 					      // Check if the URL already contains a "?lang" query parameter | ||||
| 					      if (currentUrl.indexOf('?lang=') === -1) { | ||||
| 					        // Update the URL with the "?lang" query parameter | ||||
| 					        window.location.href = currentUrl + '?lang=' + languageCode; | ||||
| 					      } else { | ||||
| 					        // Replace the "?lang" query parameter with the new value | ||||
| 					        window.location.href = currentUrl.replace(/\?lang=\w{2,}/, '?lang=' + languageCode); | ||||
| 					      } | ||||
| 					    }); | ||||
| 					  } | ||||
| 					}); | ||||
| 				 | ||||
| 				</script> | ||||
| 			</div> | ||||
| 		</div> | ||||
| 	</nav> | ||||
|  | ||||
| @ -33,30 +33,29 @@ | ||||
| 			<div class="jumbotron jumbotron-fluid" id="jumbotron"> | ||||
| 				<div class="container"> | ||||
| 					<h1 class="display-4">Stirling PDF</h1> | ||||
| 					<p class="lead">Your locally hosted one-stop-shop for all your | ||||
| 						PDF needs. (Made 100% in ChatGPT in 1 day as a experiment)</p> | ||||
| 					<p class="lead" th:text="#{home.desc}"></p>					 | ||||
| 				</div> | ||||
| 			</div> | ||||
| 
 | ||||
| 			<!-- Features --> | ||||
| 			<div class="features-container container"> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle='Merge PDFs', cardText='Easily merge multiple PDFs into one.', cardLink='merge-pdfs')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle='Split PDFs', cardText='Split PDFs into multiple documents', cardLink='split-pdfs')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle='Rotate PDFs', cardText='Easily rotate your PDFs.', cardLink='rotate-pdf')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle=#{home.merge.title}, cardText=#{home.merge.desc}, cardLink='merge-pdfs')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle=#{home.split.title}, cardText=#{home.split.desc}, cardLink='split-pdfs')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle=#{home.rotate.title}, cardText=#{home.rotate.desc}, cardLink='rotate-pdf')}"></div> | ||||
| 
 | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle='Image to PDF', cardText='Convert a images (PNG, JPEG, GIF) to PDF.', cardLink='img-to-pdf')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle='PDF to Image', cardText='Convert a PDF to a image. (PNG, JPEG, GIF)', cardLink='pdf-to-img')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle='PDF Organizer', cardText='Remove/Rearrange pages in any order', cardLink='pdf-organizer')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle=#{home.imageToPdf.title}, cardText=#{home.imageToPdf.desc}, cardLink='img-to-pdf')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle=#{home.pdfToImage.title}, cardText=#{home.pdfToImage.desc}, cardLink='pdf-to-img')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle=#{home.pdfOrganiser.title}, cardText=#{home.pdfOrganiser.desc}, cardLink='pdf-organizer')}"></div> | ||||
| 
 | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle='Add image onto PDF', cardText='Adds a image onto a set location on the PDF (Work in progress)', cardLink='add-image')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle='Add Watermark', cardText='Add a custom watermark to your PDF document.', cardLink='add-watermark')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle='Change Permissions', cardText='Change the permissions of your PDF document, such as print, copy, edit, etc.', cardLink='change-permissions')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle=#{home.addImage.title}, cardText=#{home.addImage.desc}, cardLink='add-image')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle=#{home.watermark.title}, cardText=#{home.watermark.desc}, cardLink='add-watermark')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle=#{home.permissions.title}, cardText=#{home.permissions.desc}, cardLink='change-permissions')}"></div> | ||||
| 
 | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle='Remove Pages', cardText='Delete unwanted pages from your PDF document.', cardLink='remove-pages')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle='Add Password', cardText='Encrypt your PDF document with a password.', cardLink='add-password')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle='Remove Password', cardText='Remove password protection from your PDF document.', cardLink='remove-password')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle=#{home.removePages.title}, cardText=#{home.removePages.desc}, cardLink='remove-pages')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle=#{home.addPassword.title}, cardText=#{home.addPassword.desc}, cardLink='add-password')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle=#{home.removePassword.title}, cardText=#{home.removePassword.desc}, cardLink='remove-password')}"></div> | ||||
| 
 | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle='Compress PDFs', cardText='Compress PDFs to reduce their file size.', cardLink='compress-pdf')}"></div> | ||||
| 				<div th:replace="~{fragments/card :: card(cardTitle=#{home.compressPdfs.title}, cardText=#{home.compressPdfs.desc}, cardLink='compress-pdf')}"></div> | ||||
| 
 | ||||
| 			</div> | ||||
| 		</div> | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| <!DOCTYPE html> | ||||
| <html lang="en" xmlns:th="http://www.thymeleaf.org"> | ||||
| 
 | ||||
| <th:block th:insert="~{fragments/common :: head(title='Merge PDFs')}"></th:block> | ||||
| <th:block th:insert="~{fragments/common :: head(title=#{merge.title})}"></th:block> | ||||
| 
 | ||||
| 
 | ||||
| <body>	<div id="page-container"> | ||||
| @ -12,22 +12,22 @@ | ||||
| 	<div class="container" id="dropContainer"> | ||||
| 		<div class="row justify-content-center"> | ||||
| 			<div class="col-md-6"> | ||||
| 				<h2>Merge multiple PDFs (2+)</h2> | ||||
| 				<h2 th:text="#{merge.header}"></h2> | ||||
| 				<form action="merge-pdfs" method="post" | ||||
| 					enctype="multipart/form-data"> | ||||
| 					<div class="form-group"> | ||||
| 						<label>Select (or drag & drop) all PDFs to merge</label> | ||||
| 						<label th:text="#{multiPdfDropPrompt}"></label> | ||||
| 						<div class="custom-file"> | ||||
| 							<input type="file" class="custom-file-input" id="fileInput" | ||||
| 								name="fileInput" multiple required> <label | ||||
| 								class="custom-file-label">Choose PDFs</label> | ||||
| 								class="custom-file-label" th:text="#{pdfPrompt}">s</label> | ||||
| 						</div> | ||||
| 					</div> | ||||
| 					<div class="form-group"> | ||||
| 						<ul id="selectedFiles" class="list-group"></ul> | ||||
| 					</div> | ||||
| 					<div class="form-group text-center"> | ||||
| 						<button type="submit" class="btn btn-primary">Merge</button> | ||||
| 						<button type="submit" class="btn btn-primary" th:text="#{merge.submit}"></button> | ||||
| 					</div> | ||||
| 				</form> | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| <!DOCTYPE html> | ||||
| <html lang="en" xmlns:th="http://www.thymeleaf.org"> | ||||
| 
 | ||||
| <th:block th:insert="~{fragments/common :: head(title='Organizer')}"></th:block> | ||||
| <th:block th:insert="~{fragments/common :: head(title=#{pdfOrganiser.title})}"></th:block> | ||||
| 
 | ||||
| 
 | ||||
| <body>	<div id="page-container"> | ||||
| @ -12,25 +12,21 @@ | ||||
| 	<div class="container"> | ||||
| 		<div class="row justify-content-center"> | ||||
| 			<div class="col-md-6"> | ||||
| 				<h2>PDF Page Organizer</h2> | ||||
| 
 | ||||
| 
 | ||||
| 
 | ||||
| 				<h2 th:text="#{pdfOrganiser.header}"></h2> | ||||
| 				 | ||||
| 				<form th:action="@{rearrange-pages}" method="post" | ||||
| 					enctype="multipart/form-data"> | ||||
| 					<div class="custom-file"> | ||||
| 						<input type="file" class="custom-file-input" id="fileInput" | ||||
| 							name="fileInput" required> <label | ||||
| 							class="custom-file-label" for="fileInput">Choose PDF</label> | ||||
| 							class="custom-file-label" for="fileInput" th:text="#{pdfPrompt}"></label> | ||||
| 					</div> | ||||
| 					<div class="form-group"> | ||||
| 						<label for="pageOrder">Page Order (Enter a comma-separated | ||||
| 							list of page numbers) :</label> <input type="text" class="form-control" | ||||
| 						<label for="pageOrder" th:text="#{pageOrderPrompt}"></label> <input type="text" class="form-control" | ||||
| 							id="fileInput" name="pageOrder" | ||||
| 							placeholder="(e.g. 1,3,2 or 4-8,2,10-12)" required> | ||||
| 					</div> | ||||
| 					<button type="submit" class="btn btn-primary">Rearrange | ||||
| 						Pages</button> | ||||
| 					<button type="submit" class="btn btn-primary" th:text="#{pdfOrganiser.submit}"></button> | ||||
| 				</form> | ||||
| 				<th:block th:insert="~{fragments/common :: filelist}"></th:block> | ||||
| 
 | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| <!DOCTYPE html> | ||||
| <html lang="en" xmlns:th="http://www.thymeleaf.org"> | ||||
| 
 | ||||
| <th:block th:insert="~{fragments/common :: head(title='Page Remover')}"></th:block> | ||||
| <th:block th:insert="~{fragments/common :: head(title=#{pageRemover.title})}"></th:block> | ||||
| 
 | ||||
| 
 | ||||
| <body>	<div id="page-container"> | ||||
| @ -12,23 +12,21 @@ | ||||
| 	<div class="container"> | ||||
| 		<div class="row justify-content-center"> | ||||
| 			<div class="col-md-6"> | ||||
| 				<h2>PDF Page remover</h2> | ||||
| 				<h2 th:text="#{pageRemover.header}"></h2> | ||||
| 
 | ||||
| 				<form th:action="@{remove-pages}" method="post" | ||||
| 					enctype="multipart/form-data"> | ||||
| 					<div class="custom-file"> | ||||
| 						<input type="file" class="custom-file-input" id="fileInput" | ||||
| 							name="fileInput" required> <label | ||||
| 							class="custom-file-label" for="fileInput">Choose PDF</label> | ||||
| 							class="custom-file-label" for="fileInput" th:text="#{pdfPrompt}"></label> | ||||
| 					</div> | ||||
| 					<div class="form-group"> | ||||
| 						<label for="pagesToDelete">Pages to delete (Enter a comma-separated | ||||
| 							list of page numbers) :</label> <input type="text" class="form-control" | ||||
| 						<label for="pagesToDelete" th:text="#{pageRemover.pagesToDelete}"></label> <input type="text" class="form-control" | ||||
| 							id="fileInput" name="pagesToDelete" | ||||
| 							placeholder="(e.g. 1,2,6 or 1-10,15-30)" required> | ||||
| 					</div> | ||||
| 					<button type="submit" class="btn btn-primary">Delete | ||||
| 						Pages</button> | ||||
| 					<button type="submit" class="btn btn-primary" th:text="#{pageRemover.submit}"></button> | ||||
| 				</form> | ||||
| 				<th:block th:insert="~{fragments/common :: filelist}"></th:block> | ||||
| 
 | ||||
|  | ||||
| @ -2,7 +2,7 @@ | ||||
| <html lang="en" xmlns:th="http://www.thymeleaf.org"> | ||||
| 
 | ||||
| 
 | ||||
| <th:block th:insert="~{fragments/common :: head(title='Rotate')}"></th:block> | ||||
| <th:block th:insert="~{fragments/common :: head(title=#{rotate.title})}"></th:block> | ||||
| 
 | ||||
| 
 | ||||
| <body>	<div id="page-container"> | ||||
| @ -13,7 +13,7 @@ | ||||
| 	<div class="container"> | ||||
| 		<div class="row justify-content-center"> | ||||
| 			<div class="col-md-6"> | ||||
| 				<h2>Rotate PDF</h2> | ||||
| 				<h2 th:text="#{rotate.header}"></h2> | ||||
| 
 | ||||
| 				<form action="#" th:action="@{rotate-pdf}" th:object="${rotateForm}" method="post" enctype="multipart/form-data"> | ||||
| 					<div th:replace="fragments/common :: fileSelector(name='fileInput', multiple=false)"></div> | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| <!DOCTYPE html> | ||||
| <html lang="en" xmlns:th="http://www.thymeleaf.org"> | ||||
| 
 | ||||
| <th:block th:insert="~{fragments/common :: head(title='Add Password')}"></th:block> | ||||
| <th:block th:insert="~{fragments/common :: head(title=#{addPassword.title})}"></th:block> | ||||
| 
 | ||||
| <body>	<div id="page-container"> | ||||
| 		<div id="content-wrap"> | ||||
| @ -11,85 +11,78 @@ | ||||
| 	<div class="container"> | ||||
| 		<div class="row justify-content-center"> | ||||
| 			<div class="col-md-6"> | ||||
| 				<h2>Add password (Encrypt)</h2> | ||||
| 				<h2 th:text="#{addPassword.header}"></h2> | ||||
| 
 | ||||
| 				<form action="add-password" method="post" | ||||
| 					enctype="multipart/form-data"> | ||||
| 					<div class="form-group"> | ||||
| 						<label>Select PDF to encrypt</label> | ||||
| 						<label th:text="#{addPassword.selectText.1}"></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> | ||||
| 								class="custom-file-label" th:text="#{pdfPrompt}"></label> | ||||
| 						</div> | ||||
| 					</div> | ||||
| 					<div class="form-group"> | ||||
| 						<label>Password</label> <input type="password" | ||||
| 						<label th:text="#{addPassword.selectText.2}"></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" | ||||
| 						<label th:text="#{addPassword.selectText.3}"></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> | ||||
| 						</select> <small class="form-text text-muted" th:text="#{addPassword.selectText.4}"></small> | ||||
| 					</div> | ||||
| 					<div class="form-group"> | ||||
| 						<label>Permissions to set</label> | ||||
| 						<label th:text="#{addPassword.selectText.5}"></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> | ||||
| 								class="form-check-label" for="canAssembleDocument" th:text="#{addPassword.selectText.6}"></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> | ||||
| 								class="form-check-label" for="canExtractContent" th:text="#{addPassword.selectText.7}"></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> | ||||
| 								class="form-check-label" for="canExtractForAccessibility" th:text="#{addPassword.selectText.8}"></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> | ||||
| 								class="form-check-label" for="canFillInForm" th:text="#{addPassword.selectText.9}"></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> | ||||
| 								for="canModify" th:text="#{addPassword.selectText.10}"></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> | ||||
| 								class="form-check-label" for="canModifyAnnotations" th:text="#{addPassword.selectText.11}"></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> | ||||
| 								for="canPrint" th:text="#{addPassword.selectText.12}"></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> | ||||
| 								class="form-check-label" for="canPrintFaithful" th:text="#{addPassword.selectText.13}"></label> | ||||
| 						</div> | ||||
| 
 | ||||
| 					</div> | ||||
| 					<br /> | ||||
| 					<div class="form-group text-center"> | ||||
| 						<button type="submit" class="btn btn-primary">Encrypt</button> | ||||
| 						<button type="submit" class="btn btn-primary" th:text="#{addPassword.submit}"></button> | ||||
| 					</div> | ||||
| 
 | ||||
| 				</form> | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| <!DOCTYPE html> | ||||
| <html lang="en" xmlns:th="http://www.thymeleaf.org"> | ||||
| 
 | ||||
| <th:block th:insert="~{fragments/common :: head(title='Add Watermark')}"></th:block> | ||||
| <th:block th:insert="~{fragments/common :: head(title=#{watermark.title})}"></th:block> | ||||
| 
 | ||||
| <body>	<div id="page-container"> | ||||
| 		<div id="content-wrap"> | ||||
| @ -11,39 +11,39 @@ | ||||
| 	<div class="container"> | ||||
| 		<div class="row justify-content-center"> | ||||
| 			<div class="col-md-6"> | ||||
| 				<h2>Add Watermark</h2> | ||||
| 				<h2 th:text="#{watermark.header}"></h2> | ||||
| 
 | ||||
| 				<form method="post" enctype="multipart/form-data" action="add-watermark"> | ||||
| 		            <div class="form-group"> | ||||
| 						<label>Select PDF to add watermark to:</label> | ||||
| 						<label th:text="#{watermark.selectText.1}"></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> | ||||
| 								class="custom-file-label" th:text="#{pdfPrompt}"></label> | ||||
| 						</div> | ||||
| 					</div> | ||||
| 		            <div class="form-group"> | ||||
| 		                <label for="watermarkText">Watermark Text:</label> | ||||
| 		                <label for="watermarkText" th:text="#{watermark.selectText.2}"></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> | ||||
| 		                <label for="fontSize" th:text="#{watermark.selectText.3}"></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> | ||||
| 		                <label for="rotation" th:text="#{watermark.selectText.4}"></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> | ||||
| 		                <label for="widthSpacer" th:text="#{watermark.selectText.5}"></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> | ||||
| 		                <label for="heightSpacer" th:text="#{watermark.selectText.6}"></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"/> | ||||
| 		                <input type="submit" th:value="#{watermark.submit}" class="btn btn-primary"/> | ||||
| 		            </div> | ||||
|         </form>  | ||||
| </div> | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| <!DOCTYPE html> | ||||
| <html lang="en" xmlns:th="http://www.thymeleaf.org"> | ||||
| 
 | ||||
| <th:block th:insert="~{fragments/common :: head(title='Change Permissions')}"></th:block> | ||||
| <th:block th:insert="~{fragments/common :: head(title=#{permissions.title})}"></th:block> | ||||
| 
 | ||||
| 
 | ||||
| <body>	<div id="page-container"> | ||||
| @ -12,74 +12,65 @@ | ||||
| 	<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> | ||||
| 				<h2 th:text="#{permissions.header}"></h2> | ||||
| 				<p th:text="#{permissions.warning}"></p> | ||||
| 				<form action="add-password" method="post" | ||||
| 					enctype="multipart/form-data"> | ||||
| 					<div class="form-group"> | ||||
| 						<label>Select PDF to change permissions</label> | ||||
| 						<label th:text="#{permissions.selectText.1}"></label> | ||||
| 						<div class="custom-file"> | ||||
| 							<input type="file" class="custom-file-input" id="fileInput" | ||||
| 								name="fileInput"> <label class="custom-file-label">Choose | ||||
| 								PDF</label> | ||||
| 								name="fileInput"> <label class="custom-file-label" th:text="#{pdfPrompt}"></label> | ||||
| 						</div> | ||||
| 					</div> | ||||
| 					<div class="form-group"> | ||||
| 						<label>Permissions to set</label> | ||||
| 						<label th:text="#{permissions.selectText.2}"></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> | ||||
| 								class="form-check-label" for="canAssembleDocument" th:text="#{permissions.selectText.3}"></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> | ||||
| 								class="form-check-label" for="canExtractContent" th:text="#{permissions.selectText.4}"></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> | ||||
| 								class="form-check-label" for="canExtractForAccessibility" th:text="#{permissions.selectText.5}"></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> | ||||
| 								class="form-check-label" for="canFillInForm" th:text="#{permissions.selectText.6}"></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> | ||||
| 								for="canModify" th:text="#{permissions.selectText.7}"></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> | ||||
| 								class="form-check-label" for="canModifyAnnotations" th:text="#{permissions.selectText.8}"></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> | ||||
| 								for="canPrint" th:text="#{permissions.selectText.9}"></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> | ||||
| 								class="form-check-label" for="canPrintFaithful" th:text="#{permissions.selectText.10}"></label> | ||||
| 						</div> | ||||
| 
 | ||||
| 					</div> | ||||
| 					<br /> | ||||
| 					<div class="form-group text-center"> | ||||
| 						<button type="submit" class="btn btn-primary">Change</button> | ||||
| 						<button type="submit" class="btn btn-primary" th:text="#{permissions.submit}"></button> | ||||
| 					</div> | ||||
| 
 | ||||
| 				</form> | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| <!DOCTYPE html> | ||||
| <html lang="en" xmlns:th="http://www.thymeleaf.org"> | ||||
| 
 | ||||
| <th:block th:insert="~{fragments/common :: head(title='Remove password')}"></th:block> | ||||
| <th:block th:insert="~{fragments/common :: head(title=#{removePassword.title})}"></th:block> | ||||
| 
 | ||||
| <body>	<div id="page-container"> | ||||
| 		<div id="content-wrap"> | ||||
| @ -11,22 +11,26 @@ | ||||
| 	<div class="container"> | ||||
| 		<div class="row justify-content-center"> | ||||
| 			<div class="col-md-6"> | ||||
| 				<h2>Remove password (Decrypt)</h2> | ||||
| 				<h2 th:text="#{removePassword.header}"></h2> | ||||
| 
 | ||||
| 				<form action="add-password" method="post" | ||||
| 					enctype="multipart/form-data"> | ||||
| 					<div class="form-group"> | ||||
| 						<label>Select PDF to Decrypt</label> | ||||
| 						<label  th:text="#{removePassword.selectText.1}"></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> | ||||
| 								class="custom-file-label" th:text="#{pdfPrompt}"></label> | ||||
| 						</div> | ||||
| 					</div> | ||||
| 					<div class="form-group"> | ||||
| 						<label>Password</label> <input type="password" | ||||
| 						<label  th:text="#{removePassword.selectText.2}"></label> <input type="password" | ||||
| 							class="form-control" id="password" name="password" required> | ||||
| 					</div> | ||||
| 					<br /> | ||||
| 					<div class="form-group text-center"> | ||||
| 						<button type="submit" class="btn btn-primary" th:text="#{removePassword.submit}"></button> | ||||
| 					</div> | ||||
| 				</form> | ||||
| 			</div> | ||||
| 		</div> | ||||
|  | ||||
| @ -1,7 +1,7 @@ | ||||
| <!DOCTYPE html> | ||||
| <html lang="en" xmlns:th="http://www.thymeleaf.org"> | ||||
| 
 | ||||
| <th:block th:insert="~{fragments/common :: head(title='Split')}"></th:block> | ||||
| <th:block th:insert="~{fragments/common :: head(title=#{split.title})}"></th:block> | ||||
| 
 | ||||
| 
 | ||||
| <body> | ||||
| @ -14,33 +14,31 @@ | ||||
| 	<div class="container"> | ||||
| 		<div class="row justify-content-center"> | ||||
| 			<div class="col-md-6"> | ||||
| 				<h1>Split PDF</h1> | ||||
| 				<p>The numbers you select are the page number you wish to do a | ||||
| 					split on</p> | ||||
| 				<p>As such selecting 1,3,7-8 would split a 10 page document into | ||||
| 					6 separate PDFS with:</p> | ||||
| 				<p>Document #1: Page 1</p> | ||||
| 				<p>Document #2: Page 2 and 3</p> | ||||
| 				<p>Document #3: Page 4, 5 and 6</p> | ||||
| 				<p>Document #4: Page 7</p> | ||||
| 				<p>Document #5: Page 8</p> | ||||
| 				<p>Document #6: Page 9 and 10</p> | ||||
| 				<h1 th:text="#{split.header}"></h1> | ||||
| 				<p th:text="#{split.desc.1}"></p> | ||||
| 				<p th:text="#{split.desc.2}"></p> | ||||
| 				<p th:text="#{split.desc.3}"></p> | ||||
| 				<p th:text="#{split.desc.4}"></p> | ||||
| 				<p th:text="#{split.desc.5}"></p> | ||||
| 				<p th:text="#{split.desc.6}"></p> | ||||
| 				<p th:text="#{split.desc.7}"></p> | ||||
| 				<p th:text="#{split.desc.8}"></p> | ||||
| 
 | ||||
| 				<form th:action="@{split-pages}" method="post" | ||||
| 					enctype="multipart/form-data"> | ||||
| 					<div class="custom-file"> | ||||
| 						<input type="file" class="custom-file-input" id="fileInput" | ||||
| 							name="fileInput" required> <label | ||||
| 							class="custom-file-label" for="fileInput">Choose PDF</label> | ||||
| 							class="custom-file-label" for="fileInput" th:text="#{pdfPrompt}"></label> | ||||
| 					</div> | ||||
| 
 | ||||
| 					<div class="form-group"> | ||||
| 						<label for="pages">Enter pages to split on:</label> <input | ||||
| 						<label for="pages" th:text="#{split.splitPages}"></label> <input | ||||
| 							type="text" class="form-control" id="pages" name="pages" | ||||
| 							placeholder="1,3,5-10" required> | ||||
| 					</div> | ||||
| 					<br> | ||||
| 					<button type="submit" class="btn btn-primary">Submit</button> | ||||
| 					<button type="submit" class="btn btn-primary" th:text="#{split.submit}"></button> | ||||
| 				</form> | ||||
| 				<th:block th:insert="~{fragments/common :: filelist}"></th:block> | ||||
| 			</div> | ||||
|  | ||||
		Loading…
	
		Reference in New Issue
	
	Block a user