1
0
Fork 0
mirror of https://github.com/24eme/signaturepdf synced 2024-05-21 15:16:37 +02:00

Merge branch 'internationalisation'

This commit is contained in:
tale-fau 2023-09-19 12:28:46 +02:00
commit a18f539df6
11 changed files with 1787 additions and 242 deletions

View file

@ -1,4 +1,8 @@
.PHONY: test
.PHONY: test all
.DEFAULT_GOAL := all
all: update_trad
node_modules/jest/bin/jest.js:
npm install jest
@ -8,3 +12,20 @@ node_modules/puppeteer:
test: node_modules/jest/bin/jest.js node_modules/puppeteer
./node_modules/jest/bin/jest.js
update_trad:
# Extraction des phrases traductibles...
@xgettext --from-code=utf-8 --output=./locale/application.pot templates/*.php
# Mise a jour des fichiers .po...
@for lang in $$(find locale -mindepth 1 -maxdepth 1 -type d); do \
po_file="$$lang/LC_MESSAGES/application.po"; \
msgmerge --update -N "$$po_file" ./locale/application.pot; \
done
# Creation des fichiers .mo...
@for lang in $$(find locale -mindepth 1 -maxdepth 1 -type d); do \
po_file="$$lang/LC_MESSAGES/application.po"; \
rm -f "$$lang/LC_MESSAGES/application.mo"; \
msgfmt "$$po_file" --output-file="$$lang/LC_MESSAGES/application.mo"; \
done

329
README.en.md Normal file
View file

@ -0,0 +1,329 @@
<sup>[Français](README.md) | **[English](README.en.md)**</sup>
# PDF Signature
Free web software for signing PDFs.
## Instances
List of instances where you can use this software:
- [pdf.24eme.fr](https://pdf.24eme.fr)
- [pdf.libreon.fr](https://pdf.libreon.fr)
- [pdf.hostux.net](https://pdf.hostux.net)
- [pdf.nebulae.co](https://pdf.nebulae.co)
_Feel free to add yours through an issue or a pull request._
## License
Open-source software under the AGPL V3 license.
## Installation
### Debian/Ubuntu
Dependencies:
- php >= 5.6
- rsvg-convert
- pdftk
- imagemagick
- potrace
Installing dependencies:
```
sudo aptitude install php librsvg2-bin pdftk imagemagick potrace
```
Getting the source code:
```
git clone https://github.com/24eme/signaturepdf.git
```
To run it:
```
php -S localhost:8000 -t public
```
#### PHP Configuration
```
upload_max_filesize = 24M # Maximum size of the PDF file to sign
post_max_size = 24M # Maximum size of the PDF file to sign
max_file_uploads = 201 # Maximum number of pages in the PDF, here 200 pages + the original PDF
```
#### Apache Configuration
```
DocumentRoot /path/to/signaturepdf/public
<Directory /path/to/signaturepdf/public>
Require all granted
FallbackResource /index.php
php_value max_file_uploads 201
php_value upload_max_filesize 24M
php_value post_max_size 24M
</Directory>
```
### Deploy with Docker
#### Building the image
```bash
docker build -t signaturepdf .
```
#### Running a container
```bash
docker run -d --name=signaturepdf -p 8080:80 signaturepdf
```
[localhost:8080](http://localhost:8080)
#### Configuration
The following variables can be used to configure the deployment:
| Variable | description | exemple | defaut |
| ---------------------- |-----------------------------------------------------------------------| -------------------------------- | --------- |
| `SERVERNAME` | Deployment URL | `pdf.24eme.fr` | localhost |
| `UPLOAD_MAX_FILESIZE` | Maximum size of the PDF file to sign | 48M | 24M |
| `POST_MAX_SIZE` | Maximum size of the PDF file to sign | 48M | 24M |
| `MAX_FILE_UPLOADS` | Maximum number of pages in the PDF, here 200 pages + the original PDF | 401 | 201 |
| `PDF_STORAGE_PATH` | Path where uploaded PDF files can be stored | /data | /data |
| `DISABLE_ORGANIZATION` | Disable the Organize route | true | false |
| `PDF_DEMO_LINK` | Show, hide, or change the demo PDF link | false, `link` or `relative path` | true |
```bash
docker run -d --name=signaturepdf -p 8080:80 -e SERVERNAME=pdf.example.org -e UPLOAD_MAX_FILESIZE=48M -e POST_MAX_SIZE=48M -e MAX_FILE_UPLOADS=401 -e PDF_STORAGE_PATH=/data signaturepdf
```
### Alpine
Here is a script to install the solution on Linux Alpine (tested with version 3.15).
Remember to edit the "domain" variable at the beginning of the script to match the URL it will be called with.
The main components are:
- php 8 + php-fpm
- Nginx
- pdftk ("manual" installation requiring openjdk8)
- imagick
- potrace
- librsvg
What the script does:
- Installs dependencies
- Configures php and php-fpm
- Configures Nginx
- Configures the config.ini
- Clones the repo
```
#!/bin/sh
domain='sign.example.com'
apk update
apk add bash nginx git php8 php8-fpm php8-session php8-gd php8-fileinfo openjdk8 imagemagick potrace librsvg
cd /tmp
wget https://gitlab.com/pdftk-java/pdftk/-/jobs/924565145/artifacts/raw/build/libs/pdftk-all.jar
mv pdftk-all.jar pdftk.jar
cat <<EOF >>pdftk
#!/usr/bin/env bash
/usr/bin/java -jar "\$0.jar" "\$@"
EOF
chmod 775 pdftk*
mv pdftk* /usr/bin
sed -i 's/user = nobody/user = nginx/g' /etc/php8/php-fpm.d/www.conf
sed -i 's/;listen.owner = nginx/listen.owner = nginx/g' /etc/php8/php-fpm.d/www.conf
sed -i 's/post_max_size = 8M/post_max_size = 50M/g' /etc/php8/php.ini
sed -i 's/upload_max_filesize = 2M/upload_max_filesize = 50M/g' /etc/php8/php.ini
sed -i 's/max_file_uploads = 20 /max_file_uploads = 300/g' /etc/php8/php.ini
service php-fpm8 restart
cd /var/www
git clone https://github.com/24eme/signaturepdf.git
cat <<EOF >>/etc/nginx/http.d/signaturepdf.conf
server {
listen 80 default_server;
listen [::]:80 default_server;
server_name ${domain};
client_max_body_size 0;
root /var/www/signaturepdf/public/;
index index.php index.html;
location / {
# URLs to attempt, including pretty ones.
try_files \$uri \$uri/ /index.php?\$query_string;
}
location ~ [^/]\.php(/|$) {
root /var/www/signaturepdf/public/;
fastcgi_split_path_info ^(.+\.php)(/.+)$;
fastcgi_index index.php;
include fastcgi_params;
fastcgi_buffer_size 128k;
fastcgi_buffers 128 128k;
fastcgi_param PATH_INFO \$fastcgi_path_info;
fastcgi_param SCRIPT_FILENAME \$document_root\$fastcgi_script_name;
fastcgi_pass 127.0.0.1:9000;
}
}
EOF
rm /etc/nginx/http.d/default.conf
rm -R /var/www/localhost
service nginx restart
rc-update add nginx
rc-update add php-fpm8
mkdir /var/www/signaturepdf/tmp
chown nginx /var/www/signaturepdf/tmp
cat <<EOF >>/var/www/signaturepdf/config/config.ini
PDF_STORAGE_PATH=/var/www/signaturepdf/tmp
EOF
```
## Configuration
### Enabling and Configuring Multi-Signature Mode
This mode allows multiple people to sign a PDF, but it requires that the PDFs be stored on the server.
It is not mandatory to enable this mode for the application to work; it is an option.
Create the `config/config.ini` file
```
cp config/config.ini{.example,}
```
In the `config/config.ini` file, configure the `PDF_STORAGE_PATH` variable with the path where uploaded PDF files can be stored:
```
PDF_STORAGE_PATH=/path/to/folder
```
Create this folder:
```
mkdir /path/to/folder
```
The web server should have write permissions on this folder.
For example, for Apache:
```
chown www-data /path/to/folder/to/store/pdf
```
### Disabling the Organize Mode
To disable the Organize mode, add `DISABLE_ORGANIZATION=true` to the
`config/config.ini` file.
### Hiding or Modifying the Demo PDF Link
To hide the demo PDF link, add `PDF_DEMO_LINK=false` to the
`config/config.ini` file.
### Default Fields for Metadata Editing
In the `config/config.ini` file, you can add as many fields as you want with the HTML input type (text, date, number, email, etc.) that will be preloaded for each PDF.
```
METADATA_DEFAULT_FIELDS[field1].type = "text"
METADATA_DEFAULT_FIELDS[field2].type = "text"
METADATA_DEFAULT_FIELDS[field3].type = "date"
METADATA_DEFAULT_FIELDS[field4].type = "number"
```
## Update
The latest stable version is on the `master` branch. To update, simply fetch the latest changes:
```
git pull -r
```
## Tests
To run functional tests:
```
make test
```
The tests are performed using `puppeteer` and `jest`.
To run the tests and view the browser (in debug mode):
```
DEBUG=1 make test
```
## Libraries Used
- **Fat-Free** PHP micro framework: https://github.com/bcosca/fatfree (GPLv3)
- **Bootstrap** HTML, CSS, and JavaScript framework: https://getbootstrap.com/ (MIT)
- **PDF.js** JavaScript library for rendering PDFs in an HTML canvas: https://github.com/mozilla/pdf.js (Apache-2.0)
- **Fabric.js** JavaScript library for manipulating an HTML canvas: https://github.com/fabricjs/fabric.js (MIT)
- **PDFtk** PDF manipulation tools (GPL)
- **librsvg** SVG manipulation tools: https://gitlab.gnome.org/GNOME/librsvg (LGPL-2+)
- **potrace** Bitmap to vector image conversion tools: http://potrace.sourceforge.net/ (GPLv2)
- **OpenType.js** Tools for converting text and its font into paths: https://github.com/opentypejs/opentype.js (MIT)
- **ImageMagick** Image manipulation toolset: https://imagemagick.org/ (Apache-2.0)
- **Caveat** Handwriting-style font: https://github.com/googlefonts/caveat (OFL-1.1)
- **PDF-LIB** JavaScript library for PDF manipulation used for writing metadata: https://pdf-lib.js.org/ (MIT)
For testing:
- **Jest** JavaScript Testing Framework: https://jestjs.io/ (MIT)
- **Puppeteer** Node.js library for controlling a web browser: https://github.com/puppeteer/puppeteer (Apache-2.0)
## Contributions
### Translation
To update the translation, simply execute `make` that will update the `.pot` file,
which will merge the `.po` files which then will allow to create updated `.mo` files.
Translations might be added on Weblate : https://hosted.weblate.org/projects/signature-pdf/application/
### Contributors
These people are the authors of the code of this software :
Vincent LAURENT (24ème), Jean-Baptiste Le Metayer (24ème), Xavier Garnier (Logilab), Simon Chabot (Logilab), Tangui Morlier (24ème), Gabriel POMA (24ème), Tanguy Le Faucheur (24ème), Étienne Deparis, battosai30
### Fundings
- 1 365 € excl. taxes from the company Logilab for the development of the shared signature feature
- 1 950 € excl. taxes from the company Logilab for the development of the metadata editing feature
- 100 € excl. taxes donations from the company Spirkop
- 100 € excl. taxes donations from the company PDG IT
- 1 040 € excl. taxes from the foundation NLNet pour software internationalization
The development of the software was primarily done during the working hours of 24ème employees.

View file

@ -1,4 +1,6 @@
# Signature de PDF
<sup>**[Français](README.md)** | [English](README.en.md)</sup>
# Signature de PDF
Logiciel web libre permettant de signer un PDF.
@ -310,18 +312,25 @@ Pour les tests :
## Contributions
### Traduction
### Traductions
Les traductions peuvent etre faites sur Weblate : https://hosted.weblate.org/projects/signature-pdf/application/
Pour mettre à jour la traduction, exécutez simplement `make` qui mettra a jour le fichier `.pot`,
qui fera un merge avec les fichiers `.po` qui permetteront de recréer les fichiers `.mo` mis a jour.
Des traductions peuvent etre ajoutées sur Weblate : https://hosted.weblate.org/projects/signature-pdf/application/
### Contributeurs
- Vincent LAURENT (24ème)
- Le Metayer Jean-Baptiste (24ème)
- Xavier Garnier (Logilab)
- Simon Chabot (Logilab)
- Gabriel POMA (24ème)
Ces personnes sont auteurices du code de ce logiciel :
Logilab a apporté une contribution financière de 1 365 € TTC à la société 24ème pour développer le mode multi signature.
Vincent LAURENT (24ème), Jean-Baptiste Le Metayer (24ème), Xavier Garnier (Logilab), Simon Chabot (Logilab), Tangui Morlier (24ème), Gabriel POMA (24ème), Tanguy Le Faucheur (24ème), Étienne Deparis, battosai30
Le développement du logiciel a principalement été réalisé sur le temps de travail de salariés du 24ème.
### Financements
- 1 365 € HT de la société Logilab pour le développement du mode signature partagé à plusieurs
- 1 950 € HT de la société Logilab pour le développement de l'édition des métadonnées
- 100 € HT de don de la société Spirkop
- 100 € HT de don de la société PDG IT
- 1 040 € HT de la fondation NLNet pour l'internationalisation du logiciel
Les modules signature et organiser ont été réalisés sur le temps de travail de salariés du 24ème.

24
app.php
View file

@ -2,10 +2,16 @@
$f3 = require(__DIR__.'/vendor/fatfree/base.php');
session_start();
if(getenv("DEBUG")) {
$f3->set('DEBUG', getenv("DEBUG"));
}
$f3->set('LANGUAGES',
['fr' => 'Français',
'en' => 'English']);
$f3->set('XFRAME', null); // Allow use in an iframe
$f3->set('ROOT', __DIR__);
$f3->set('UI', $f3->get('ROOT')."/templates/");
@ -30,6 +36,24 @@ if($f3->get('DISABLE_ORGANIZATION')) {
$f3->set('disableOrganization', $f3->get('DISABLE_ORGANIZATION'));
}
if ($f3->get('GET.lang')) {
$lang = $f3->get('GET.lang');
changeLanguage($lang, $f3);
} elseif (isset($_SESSION['LANGUAGE'])) {
changeLanguage($_SESSION['LANGUAGE'], $f3);
} elseif (isset($_COOKIE['LANGUAGE'])) {
changeLanguage($_COOKIE['LANGUAGE'], $f3);
}
bindtextdomain('application', $f3->get('ROOT')."/locale/");
textdomain('application');
function changeLanguage($lang, $f3) {
$_SESSION['LANGUAGE'] = $lang;
setcookie("LANGUAGE", $lang, strtotime('+1 year'));
putenv("LANGUAGE=$lang");
$f3->set('LANGUAGE', $lang);
}
$f3->route('GET /',
function($f3) {
$f3->reroute($f3->get('REVERSE_PROXY_URL').'/signature');

502
locale/application.pot Normal file
View file

@ -0,0 +1,502 @@
# SOME DESCRIPTIVE TITLE.
# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
#
#, fuzzy
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-09-18 17:56+0200\n"
"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
"Language-Team: LANGUAGE <LL@li.org>\n"
"Language: \n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
#: templates/metadata.html.php:13
msgid "Editing PDF metadata"
msgstr ""
#: templates/metadata.html.php:18 templates/organization.html.php:18
#: templates/signature.html.php:16
msgid "Site not functional without JavaScript enabled"
msgstr ""
#: templates/metadata.html.php:24 templates/organization.html.php:24
#: templates/signature.html.php:23
msgid "Language"
msgstr ""
#: templates/metadata.html.php:35 templates/organization.html.php:35
#: templates/signature.html.php:34
#, php-format
msgid "%s Sign"
msgstr ""
#: templates/metadata.html.php:38 templates/organization.html.php:38
#: templates/signature.html.php:37
#, php-format
msgid "%s Organize"
msgstr ""
#: templates/metadata.html.php:41 templates/organization.html.php:41
#: templates/signature.html.php:40
#, php-format
msgid "%s Metadata"
msgstr ""
#: templates/metadata.html.php:45
#, php-format
msgid "%s Edit metadata"
msgstr ""
#: templates/metadata.html.php:46
msgid "Add, edit, or remove metadata from a PDF"
msgstr ""
#: templates/metadata.html.php:49 templates/metadata.html.php:50
#: templates/organization.html.php:49 templates/organization.html.php:50
#: templates/signature.html.php:49 templates/signature.html.php:50
msgid "Choose a PDF"
msgstr ""
#: templates/metadata.html.php:53 templates/organization.html.php:53
#: templates/signature.html.php:53
msgid "Test with a demo PDF"
msgstr ""
#: templates/metadata.html.php:59 templates/organization.html.php:59
#: templates/signature.html.php:59
msgid "Free open-source software"
msgstr ""
#: templates/metadata.html.php:59 templates/organization.html.php:59
#: templates/signature.html.php:59
msgid "under AGPL-3.0 license"
msgstr ""
#: templates/metadata.html.php:59 templates/organization.html.php:59
#: templates/signature.html.php:59
msgid "see the source code"
msgstr ""
#: templates/metadata.html.php:66
msgid "List of PDF metadata"
msgstr ""
#: templates/metadata.html.php:72
msgid "Add new metadata"
msgstr ""
#: templates/metadata.html.php:75
msgid "Key"
msgstr ""
#: templates/metadata.html.php:77
msgid "Value"
msgstr ""
#: templates/metadata.html.php:79
#, php-format
msgid "%s Add"
msgstr ""
#: templates/metadata.html.php:85
msgid "Close this PDF and return to the home page"
msgstr ""
#: templates/metadata.html.php:87
msgid "Edit metadata"
msgstr ""
#: templates/metadata.html.php:97
msgid "Save and download the PDF"
msgstr ""
#: templates/metadata.html.php:103 templates/signature.html.php:268
msgid "Download the PDF"
msgstr ""
#: templates/organization.html.php:13
msgid "Organize PDF"
msgstr ""
#: templates/organization.html.php:45
#, php-format
msgid "%s Organize PDF"
msgstr ""
#: templates/organization.html.php:46
msgid "Merge, sort, rotate, delete, extract pages"
msgstr ""
#: templates/organization.html.php:49
msgid "The PDF must not exceed "
msgstr ""
#: templates/organization.html.php:49
msgid "Mb"
msgstr ""
#: templates/organization.html.php:51
msgid ""
"The PDF will be processed by the server without being retained or stored"
msgstr ""
#: templates/organization.html.php:64
msgid "Touch a page to select it"
msgstr ""
#: templates/organization.html.php:75
msgid "Close this PDF and return to home"
msgstr ""
#: templates/organization.html.php:77
msgid "PDF organization"
msgstr ""
#: templates/organization.html.php:77 templates/signature.html.php:80
msgid "This PDF is stored on your computer to be signed by you only"
msgstr ""
#: templates/organization.html.php:86 templates/organization.html.php:118
#, php-format
msgid "%s Add a PDF"
msgstr ""
#: templates/organization.html.php:91
#, php-format
msgid "%s page(s) selected"
msgstr ""
#: templates/organization.html.php:93
#, php-format
msgid "%s Rotate 90°"
msgstr ""
#: templates/organization.html.php:94 templates/organization.html.php:125
#, php-format
msgid "%s Move"
msgstr ""
#: templates/organization.html.php:95 templates/organization.html.php:126
#, php-format
msgid "%s Delete"
msgstr ""
#: templates/organization.html.php:96
#, php-format
msgid "%s Extract and download"
msgstr ""
#: templates/organization.html.php:98
#, php-format
msgid "%s Cancel selection"
msgstr ""
#: templates/organization.html.php:106 templates/organization.html.php:132
#, php-format
msgid "%s Download the full PDF"
msgstr ""
#: templates/organization.html.php:122
msgid "No"
msgstr ""
#: templates/organization.html.php:122
msgid "page"
msgstr ""
#: templates/organization.html.php:122 templates/signature.html.php:199
msgid "Cancel"
msgstr ""
#: templates/organization.html.php:124
#, php-format
msgid "%s Turn"
msgstr ""
#: templates/organization.html.php:135
#, php-format
msgid "Download the selection"
msgstr ""
#: templates/organization.html.php:155
msgid "PDF documents"
msgstr ""
#: templates/organization.html.php:171
msgid "Select this page"
msgstr ""
#: templates/organization.html.php:172
msgid "Delete this page"
msgstr ""
#: templates/organization.html.php:173
msgid "Restore this page"
msgstr ""
#: templates/organization.html.php:174
msgid "Move this page"
msgstr ""
#: templates/organization.html.php:175
msgid "Move here"
msgstr ""
#: templates/organization.html.php:176
msgid "Turn this page"
msgstr ""
#: templates/organization.html.php:177
msgid "Download this page"
msgstr ""
#: templates/signature.html.php:45
#, php-format
msgid "%s Sign a PDF"
msgstr ""
#: templates/signature.html.php:46
msgid "Sign, initial, stamp, complete a document"
msgstr ""
#: templates/signature.html.php:49
msgid "The PDF should not exceed"
msgstr ""
#: templates/signature.html.php:49
msgid "MB and"
msgstr ""
#: templates/signature.html.php:49
msgid "pages"
msgstr ""
#: templates/signature.html.php:51
msgid "The PDF will be processed by the server without being stored or saved"
msgstr ""
#: templates/signature.html.php:66
msgid "How to sign?"
msgstr ""
#: templates/signature.html.php:67
msgid "By clicking directly on the document page"
msgstr ""
#: templates/signature.html.php:67
msgid "to insert the selected item in the right column"
msgstr ""
#: templates/signature.html.php:67
msgid "signature, initial, text, stamp, etc ..."
msgstr ""
#: templates/signature.html.php:78
msgid "Close this PDF and return to the homepage"
msgstr ""
#: templates/signature.html.php:80
msgid "PDF Signature"
msgstr ""
#: templates/signature.html.php:80
msgid "This PDF is shared with others to be signed by multiple people"
msgstr ""
#: templates/signature.html.php:87
msgid "Keep the selection active"
msgstr ""
#: templates/signature.html.php:92
#, php-format
msgid "%s Signature"
msgstr ""
#: templates/signature.html.php:92 templates/signature.html.php:97
#: templates/signature.html.php:102 templates/signature.html.php:200
msgid "Create"
msgstr ""
#: templates/signature.html.php:97
#, php-format
msgid "%s Initial"
msgstr ""
#: templates/signature.html.php:102
#, php-format
msgid "%s Stamp"
msgstr ""
#: templates/signature.html.php:106
#, php-format
msgid "%s Text"
msgstr ""
#: templates/signature.html.php:110
#, php-format
msgid "%s Check box"
msgstr ""
#: templates/signature.html.php:115
#, php-format
msgid "%s Create an element"
msgstr ""
#: templates/signature.html.php:120
#, php-format
msgid "%s Share to sign %s with multiple people"
msgstr ""
#: templates/signature.html.php:125 templates/signature.html.php:165
msgid "Download the signed PDF"
msgstr ""
#: templates/signature.html.php:130
#, php-format
msgid "You are %s to have signed this PDF"
msgstr ""
#: templates/signature.html.php:133
#, php-format
msgid "%s Download the PDF"
msgstr ""
#: templates/signature.html.php:138 templates/signature.html.php:163
msgid "Transmit my signature"
msgstr ""
#: templates/signature.html.php:146
#, php-format
msgid "%s Select a signature"
msgstr ""
#: templates/signature.html.php:175
msgid "Draw"
msgstr ""
#: templates/signature.html.php:175
msgid "freehand"
msgstr ""
#: templates/signature.html.php:176
msgid "Enter"
msgstr ""
#: templates/signature.html.php:176
msgid "text"
msgstr ""
#: templates/signature.html.php:177
msgid "Import"
msgstr ""
#: templates/signature.html.php:177
msgid "an image"
msgstr ""
#: templates/signature.html.php:181
msgid "Clear signature"
msgstr ""
#: templates/signature.html.php:185
msgid "My signature"
msgstr ""
#: templates/signature.html.php:211
#, php-format
msgid "%s Share this PDF to sign it with several people"
msgstr ""
#: templates/signature.html.php:215
msgid ""
"By enabling PDF sharing, you will be able to provide a link to the people of "
"your choice so that they can sign this PDF."
msgstr ""
#: templates/signature.html.php:216
#, php-format
msgid ""
"%s This sharing requires the PDF to be transferred and stored on the server "
"for future signers to access."
msgstr ""
#: templates/signature.html.php:217
#, php-format
msgid "%s The PDF will be kept"
msgstr ""
#: templates/signature.html.php:217
msgid "for one year"
msgstr ""
#: templates/signature.html.php:217
msgid "for six months"
msgstr ""
#: templates/signature.html.php:217
msgid "for one month"
msgstr ""
#: templates/signature.html.php:217
msgid "for one week"
msgstr ""
#: templates/signature.html.php:217
msgid "for one day"
msgstr ""
#: templates/signature.html.php:217
msgid "for one hour"
msgstr ""
#: templates/signature.html.php:217
msgid "after the last signature."
msgstr ""
#: templates/signature.html.php:223
#, php-format
msgid "%s Start sharing"
msgstr ""
#: templates/signature.html.php:235
#, php-format
msgid "%s Sign this PDF with multiple people"
msgstr ""
#: templates/signature.html.php:239
msgid "Multiple people can sign this PDF simultaneously."
msgstr ""
#: templates/signature.html.php:240
msgid ""
"To do so, simply share the link to this page with the people of your choice:"
msgstr ""
#: templates/signature.html.php:242
msgid "Sharing link"
msgstr ""
#: templates/signature.html.php:247
msgid ""
"Each of the signatories can download the latest version of the signed PDF at "
"any time."
msgstr ""
#: templates/signature.html.php:250
msgid "Close"
msgstr ""
#: templates/signature.html.php:261
msgid "Signed PDF"
msgstr ""
#: templates/signature.html.php:265
msgid "Your signature has been successfully recorded!"
msgstr ""

Binary file not shown.

View file

@ -0,0 +1,619 @@
# French translations for PACKAGE package
# Traductions françaises du paquet PACKAGE.
# Copyright (C) 2023 THE PACKAGE'S COPYRIGHT HOLDER
# This file is distributed under the same license as the PACKAGE package.
# tale-fau <tale-fau@talefau-hp-elitebook-840-g3>, 2023.
#
msgid ""
msgstr ""
"Project-Id-Version: PACKAGE VERSION\n"
"Report-Msgid-Bugs-To: \n"
"POT-Creation-Date: 2023-09-18 17:56+0200\n"
"PO-Revision-Date: 2023-09-07 13:19+0000\n"
"Last-Translator: 24ème <equipe@24eme.fr>\n"
"Language-Team: French <https://hosted.weblate.org/projects/signature-pdf/"
"application/fr/>\n"
"Language: fr_FR\n"
"MIME-Version: 1.0\n"
"Content-Type: text/plain; charset=UTF-8\n"
"Content-Transfer-Encoding: 8bit\n"
"Plural-Forms: nplurals=2; plural=n > 1;\n"
"X-Generator: Weblate 5.0.1-dev\n"
#: templates/metadata.html.php:13
msgid "Editing PDF metadata"
msgstr "Édition des métadonnées d'un PDF"
#: templates/metadata.html.php:18 templates/organization.html.php:18
#: templates/signature.html.php:16
msgid "Site not functional without JavaScript enabled"
msgstr "Site non fonctionnel sans JavaScript activé"
#: templates/metadata.html.php:24 templates/organization.html.php:24
#: templates/signature.html.php:23
msgid "Language"
msgstr "Langue"
#: templates/metadata.html.php:35 templates/organization.html.php:35
#: templates/signature.html.php:34
#, php-format
msgid "%s Sign"
msgstr "%s Signer"
#: templates/metadata.html.php:38 templates/organization.html.php:38
#: templates/signature.html.php:37
#, php-format
msgid "%s Organize"
msgstr "%s Organiser"
#: templates/metadata.html.php:41 templates/organization.html.php:41
#: templates/signature.html.php:40
#, php-format
msgid "%s Metadata"
msgstr "%s Metadonnées"
#: templates/metadata.html.php:45
#, php-format
msgid "%s Edit metadata"
msgstr "%s Éditer les métadonnées"
#: templates/metadata.html.php:46
msgid "Add, edit, or remove metadata from a PDF"
msgstr "Ajouter, modifier ou supprimer les métadonnées d'un PDF"
#: templates/metadata.html.php:49 templates/metadata.html.php:50
#: templates/organization.html.php:49 templates/organization.html.php:50
#: templates/signature.html.php:49 templates/signature.html.php:50
msgid "Choose a PDF"
msgstr "Choisir un PDF"
#: templates/metadata.html.php:53 templates/organization.html.php:53
#: templates/signature.html.php:53
msgid "Test with a demo PDF"
msgstr "Tester avec un PDF de démo"
#: templates/metadata.html.php:59 templates/organization.html.php:59
#: templates/signature.html.php:59
msgid "Free open-source software"
msgstr "Logiciel libre"
#: templates/metadata.html.php:59 templates/organization.html.php:59
#: templates/signature.html.php:59
msgid "under AGPL-3.0 license"
msgstr "sous license AGPL-3.0"
#: templates/metadata.html.php:59 templates/organization.html.php:59
#: templates/signature.html.php:59
msgid "see the source code"
msgstr "voir le code source"
#: templates/metadata.html.php:66
msgid "List of PDF metadata"
msgstr "Liste des métadonnées du PDF"
#: templates/metadata.html.php:72
msgid "Add new metadata"
msgstr "Ajouter une nouvelle métadonnée"
#: templates/metadata.html.php:75
msgid "Key"
msgstr "Clé"
#: templates/metadata.html.php:77
msgid "Value"
msgstr "Valeur"
#: templates/metadata.html.php:79
#, php-format
msgid "%s Add"
msgstr "%s Ajouter"
#: templates/metadata.html.php:85
msgid "Close this PDF and return to the home page"
msgstr "Fermer ce PDF et retourner à l'accueil"
#: templates/metadata.html.php:87
msgid "Edit metadata"
msgstr "Édition des métadonnées"
#: templates/metadata.html.php:97
msgid "Save and download the PDF"
msgstr "Enregistrer et télécharger le PDF"
#: templates/metadata.html.php:103 templates/signature.html.php:268
msgid "Download the PDF"
msgstr "Télécharger le PDF"
#: templates/organization.html.php:13
msgid "Organize PDF"
msgstr "Organiser un PDF"
#: templates/organization.html.php:45
#, php-format
msgid "%s Organize PDF"
msgstr "%s Organiser des PDF"
#: templates/organization.html.php:46
msgid "Merge, sort, rotate, delete, extract pages"
msgstr "Fusionner, trier, pivoter, supprimer, extraire des pages"
#: templates/organization.html.php:49
msgid "The PDF must not exceed "
msgstr "Le PDF ne doit pas dépasser "
#: templates/organization.html.php:49
msgid "Mb"
msgstr "Mo"
#: templates/organization.html.php:51
msgid ""
"The PDF will be processed by the server without being retained or stored"
msgstr "Le PDF sera traité par le serveur sans être conservé ni stocké"
#: templates/organization.html.php:64
msgid "Touch a page to select it"
msgstr "Toucher une page pour la sélectionner"
#: templates/organization.html.php:75
msgid "Close this PDF and return to home"
msgstr "Fermer ce PDF et retourner à l'accueil"
#: templates/organization.html.php:77
msgid "PDF organization"
msgstr "Organisation de PDF"
#: templates/organization.html.php:77 templates/signature.html.php:80
msgid "This PDF is stored on your computer to be signed by you only"
msgstr ""
"Ce PDF est stocké sur votre ordinateur pour être signé par vous uniquement"
#: templates/organization.html.php:86 templates/organization.html.php:118
#, php-format
msgid "%s Add a PDF"
msgstr "%s Ajouter un PDF"
#: templates/organization.html.php:91
#, php-format
msgid "%s page(s) selected"
msgstr "%s page(s) sélectionnée(s)"
#: templates/organization.html.php:93
#, php-format
msgid "%s Rotate 90°"
msgstr "%s Tourner de 90°"
#: templates/organization.html.php:94 templates/organization.html.php:125
#, php-format
msgid "%s Move"
msgstr "%s Déplacer"
#: templates/organization.html.php:95 templates/organization.html.php:126
#, php-format
msgid "%s Delete"
msgstr "%s Supprimer"
#: templates/organization.html.php:96
#, php-format
msgid "%s Extract and download"
msgstr "%s Extraire et télécharger"
#: templates/organization.html.php:98
#, php-format
msgid "%s Cancel selection"
msgstr "%s Annuler la sélection"
#: templates/organization.html.php:106 templates/organization.html.php:132
#, php-format
msgid "%s Download the full PDF"
msgstr "%s Télécharger le PDF complet"
#: templates/organization.html.php:122
msgid "No"
msgstr "Aucune"
#: templates/organization.html.php:122
msgid "page"
msgstr "page"
#: templates/organization.html.php:122 templates/signature.html.php:199
msgid "Cancel"
msgstr "Annuler"
#: templates/organization.html.php:124
#, php-format
msgid "%s Turn"
msgstr "%s Tourner"
#: templates/organization.html.php:135
#, php-format
msgid "Download the selection"
msgstr "Télécharger la sélection"
#: templates/organization.html.php:155
msgid "PDF documents"
msgstr "Documents PDF"
#: templates/organization.html.php:171
msgid "Select this page"
msgstr "Sélectionner cette page"
#: templates/organization.html.php:172
msgid "Delete this page"
msgstr "Supprimer cette page"
#: templates/organization.html.php:173
msgid "Restore this page"
msgstr "Restorer cette page"
#: templates/organization.html.php:174
msgid "Move this page"
msgstr "Déplacer cette page"
#: templates/organization.html.php:175
msgid "Move here"
msgstr "Déplacer ici"
#: templates/organization.html.php:176
msgid "Turn this page"
msgstr "Tourner cette page"
#: templates/organization.html.php:177
msgid "Download this page"
msgstr "Télécharger cette page"
#: templates/signature.html.php:45
#, php-format
msgid "%s Sign a PDF"
msgstr "%s Signer un PDF"
#: templates/signature.html.php:46
msgid "Sign, initial, stamp, complete a document"
msgstr "Signer, parapher, tamponner, compléter un document"
#: templates/signature.html.php:49
msgid "The PDF should not exceed"
msgstr "Le PDF ne doit pas dépasser "
#: templates/signature.html.php:49
msgid "MB and"
msgstr "Mo et"
#: templates/signature.html.php:49
msgid "pages"
msgstr "page"
#: templates/signature.html.php:51
msgid "The PDF will be processed by the server without being stored or saved"
msgstr "Le PDF sera traité par le serveur sans être conservé no stocké"
#: templates/signature.html.php:66
msgid "How to sign?"
msgstr "Comment signer ?"
#: templates/signature.html.php:67
msgid "By clicking directly on the document page"
msgstr "En cliquant directement sur la page du document"
#: templates/signature.html.php:67
msgid "to insert the selected item in the right column"
msgstr "pour insérer l'élément selectionné dans la colonne de droite"
#: templates/signature.html.php:67
msgid "signature, initial, text, stamp, etc ..."
msgstr "signature, paraphe, texte, tampon, etc ..."
#: templates/signature.html.php:78
msgid "Close this PDF and return to the homepage"
msgstr "Fermer ce PDF et retourner à l'accueil"
#: templates/signature.html.php:80
msgid "PDF Signature"
msgstr "Signature du PDF"
#: templates/signature.html.php:80
msgid "This PDF is shared with others to be signed by multiple people"
msgstr "Ce PDF est partagé avec d'autres personnes pour être signé à plusieurs"
#: templates/signature.html.php:87
msgid "Keep the selection active"
msgstr "Garder la sélection active"
#: templates/signature.html.php:92
#, php-format
msgid "%s Signature"
msgstr "%s Signature"
#: templates/signature.html.php:92 templates/signature.html.php:97
#: templates/signature.html.php:102 templates/signature.html.php:200
msgid "Create"
msgstr "Créer"
#: templates/signature.html.php:97
#, php-format
msgid "%s Initial"
msgstr "%s Paraphe"
#: templates/signature.html.php:102
#, php-format
msgid "%s Stamp"
msgstr "%s Tampon"
#: templates/signature.html.php:106
#, php-format
msgid "%s Text"
msgstr "%s Texte"
#: templates/signature.html.php:110
#, php-format
msgid "%s Check box"
msgstr "%s Case à cocher"
#: templates/signature.html.php:115
#, php-format
msgid "%s Create an element"
msgstr "%s Créer un élément"
#: templates/signature.html.php:120
#, php-format
msgid "%s Share to sign %s with multiple people"
msgstr "%s Partager pour signer %s à plusieurs"
#: templates/signature.html.php:125 templates/signature.html.php:165
msgid "Download the signed PDF"
msgstr "Télécharger le PDF signé"
#: templates/signature.html.php:130
#, php-format
msgid "You are %s to have signed this PDF"
msgstr "Vous êtes %s à avoir signé ce PDF"
#: templates/signature.html.php:133
#, php-format
msgid "%s Download the PDF"
msgstr "%s Télécharger le PDF"
#: templates/signature.html.php:138 templates/signature.html.php:163
msgid "Transmit my signature"
msgstr "Transmettre ma signature"
#: templates/signature.html.php:146
#, php-format
msgid "%s Select a signature"
msgstr "%s Sélectionner une signature"
#: templates/signature.html.php:175
msgid "Draw"
msgstr "Dessiner"
#: templates/signature.html.php:175
msgid "freehand"
msgstr "à main levée"
#: templates/signature.html.php:176
msgid "Enter"
msgstr "Saisir"
#: templates/signature.html.php:176
msgid "text"
msgstr "du texte"
#: templates/signature.html.php:177
msgid "Import"
msgstr "Importer"
#: templates/signature.html.php:177
msgid "an image"
msgstr "une image"
#: templates/signature.html.php:181
msgid "Clear signature"
msgstr "Effacer la signature"
#: templates/signature.html.php:185
msgid "My signature"
msgstr "Ma signature"
#: templates/signature.html.php:211
#, php-format
msgid "%s Share this PDF to sign it with several people"
msgstr "%s Partager ce PDF pour le signer à plusieurs"
#: templates/signature.html.php:215
msgid ""
"By enabling PDF sharing, you will be able to provide a link to the people of "
"your choice so that they can sign this PDF."
msgstr ""
"En activant le partage de ce PDF vous allez pouvoir proposer un lien aux "
"personnes de votre choix pour qu'elles puissent signer ce PDF."
#: templates/signature.html.php:216
#, php-format
msgid ""
"%s This sharing requires the PDF to be transferred and stored on the server "
"for future signers to access."
msgstr ""
"%s Ce partage nécessite que le PDF soit transféré et stocké sur le serveur "
"afin d'être accessible aux futurs signataires."
#: templates/signature.html.php:217
#, php-format
msgid "%s The PDF will be kept"
msgstr "%s Le PDF sera conservé"
#: templates/signature.html.php:217
msgid "for one year"
msgstr "pendant un an"
#: templates/signature.html.php:217
msgid "for six months"
msgstr "pendant six mois"
#: templates/signature.html.php:217
msgid "for one month"
msgstr "pendant un mois"
#: templates/signature.html.php:217
msgid "for one week"
msgstr "pendant une semaine"
#: templates/signature.html.php:217
msgid "for one day"
msgstr "pendant une journée"
#: templates/signature.html.php:217
msgid "for one hour"
msgstr "pendant une heure"
#: templates/signature.html.php:217
msgid "after the last signature."
msgstr "après la dernière signature"
#: templates/signature.html.php:223
#, php-format
msgid "%s Start sharing"
msgstr "%s Démarrer le partage"
#: templates/signature.html.php:235
#, php-format
msgid "%s Sign this PDF with multiple people"
msgstr "%s Signer ce PDF à plusieurs"
#: templates/signature.html.php:239
msgid "Multiple people can sign this PDF simultaneously."
msgstr "Plusieurs personnes peuvent signer ce PDF en même temps."
#: templates/signature.html.php:240
msgid ""
"To do so, simply share the link to this page with the people of your choice:"
msgstr ""
"Pour celà il vous suffit de partager avec les personnes de votre choix le "
"lien vers cette page :"
#: templates/signature.html.php:242
msgid "Sharing link"
msgstr "Lien à partager"
#: templates/signature.html.php:247
msgid ""
"Each of the signatories can download the latest version of the signed PDF at "
"any time."
msgstr ""
"Chacun des signataires pourra à tout moment télécharger la dernière version "
"du PDF signé."
#: templates/signature.html.php:250
msgid "Close"
msgstr "Fermer"
#: templates/signature.html.php:261
msgid "Signed PDF"
msgstr "PDF signé"
#: templates/signature.html.php:265
msgid "Your signature has been successfully recorded!"
msgstr "Votre signature a bien été prise en compte !"
#, php-format
#~ msgid "%s page selected"
#~ msgid_plural "%s pages selected"
#~ msgstr[0] "%s page sélectionnée"
#~ msgstr[1] "%s pages sélectionnées"
#~ msgid "page selected"
#~ msgstr "page sélectionnée"
#, php-format
#~ msgid "%s pages selected"
#~ msgstr "%s pages sélectionnées"
#~ msgid "Sign"
#~ msgstr "Signer"
#~ msgid "Organize"
#~ msgstr "Organiser"
#~ msgid "Metadata"
#~ msgstr "Métadonnées"
#~ msgid "Signature"
#~ msgstr "Signature"
#~ msgid "Initial"
#~ msgstr "Initiales"
#~ msgid "Stamp"
#~ msgstr "Tampon"
#~ msgid "Text"
#~ msgstr "Texte"
#~ msgid "Check box"
#~ msgstr "Case à cocher"
#~ msgid "Create an element"
#~ msgstr "Créer un élément"
#~ msgid "Share to sign %s with multiple people"
#~ msgstr "Partager pour signer %s à plusieurs"
#~ msgid "Select a signature"
#~ msgstr "Sélectionner une signature"
#~ msgid "Share this PDF to sign it with several people"
#~ msgstr "Partager ce PDF pour le signer à plusieurs"
#~ msgid ""
#~ "This sharing requires the PDF to be transferred and stored on the server "
#~ "for future signers to access."
#~ msgstr ""
#~ "Ce partage nécessite que le PDF soit transféré et stocké sur le serveur "
#~ "afin d'être accessible aux futurs signataires."
#~ msgid "The PDF will be kept"
#~ msgstr "Le PDF sera stocké"
#~ msgid "Start sharing"
#~ msgstr "Démarrer le partage"
#~ msgid "Sign this PDF with multiple people"
#~ msgstr "Signer ce PDF à plusieurs"
#~ msgid "Add a PDF"
#~ msgstr "Ajouter un PDF"
#~ msgid "Rotate 90°"
#~ msgstr "Tourner de 90°"
#~ msgid "Move"
#~ msgstr "Déplacer"
#~ msgid "Delete"
#~ msgstr "Supprimer"
#~ msgid "Extract and download"
#~ msgstr "Extraire et télécharger"
#~ msgid "Cancel selection"
#~ msgstr "Annuler la sélection"
#~ msgid "Download the full PDF"
#~ msgstr "Télécharger le PDF complet"
#~ msgid "Turn"
#~ msgstr "Tourner"
#~ msgid "Add"
#~ msgstr "Ajouter"
#~ msgid "Share to sign"
#~ msgstr "Partager pour signer"
#~ msgid "with multiple people"
#~ msgstr "à plusieurs"
#~ msgid "You are"
#~ msgstr "Vous êtes"
#, fuzzy
#~ msgid "to have signed this PDF"
#~ msgstr "à avoir signé ce PDF"

View file

@ -87,15 +87,15 @@ var loadPDF = async function(pdfBlob, filename, pdfIndex) {
let pageHTML = '<div class="position-relative mt-0 ms-1 me-0 mb-1 canvas-container d-flex align-items-center justify-content-center bg-transparent bg-opacity-25 border border-2 border-transparent" id="canvas-container-' + pageIndex +'" draggable="true">';
pageHTML += '<canvas class="canvas-pdf shadow-sm"></canvas>';
pageHTML += '<div title="Séléctionner cette page" class="position-absolute top-0 start-50 translate-middle-x p-2 ps-3 pe-3 mt-2 rounded-circle btn-select d-none"><i class="bi bi-check-square"></i></div>';
pageHTML += '<div title="Supprimer cette page" class="position-absolute top-50 start-0 translate-middle-y p-2 ps-3 pe-3 ms-2 rounded-circle btn-delete d-none"><i class="bi bi-trash"></i></div>';
pageHTML += '<div title="Restaurer cette page" class="position-absolute top-50 start-50 translate-middle p-2 ps-3 pe-3 rounded-circle container-resize btn-restore d-none"><i class="bi bi-recycle"></i></div>';
pageHTML += '<div title="Déplacer cette page" class="position-absolute top-50 start-50 translate-middle p-2 ps-3 pe-3 rounded-circle container-resize btn-drag d-none"><i class="bi bi-arrows-move"></i></div>';
pageHTML += '<div title="Déplacer ici" class="position-absolute start-0 top-50 translate-middle p-2 ps-3 pe-3 rounded-circle container-resize btn-drag-here-left bg-white shadow d-none" style="left: -5px !important;"><i class="bi bi-arrow-up-square"></i></div>';
pageHTML += '<div title="Déplacer ici" class="position-absolute start-100 top-50 translate-middle p-2 ps-3 pe-3 rounded-circle container-resize btn-drag-here-right bg-white shadow d-none" style="margin-left: 3px !important;"><i class="bi bi-arrow-up-square"></i></div>';
pageHTML += '<div title="Déplacer ici" class="position-absolute top-100 start-50 translate-middle p-2 ps-3 pe-3 rounded-circle container-resize btn-drag-here_mobile bg-white shadow d-none"><i class="bi bi-arrows-collapse"></i></div>';
pageHTML += '<div title="Tourner cette page" class="position-absolute top-50 end-0 translate-middle-y p-2 ps-3 pe-3 me-2 rounded-circle container-rotate btn-rotate d-none"><i class="bi bi-arrow-clockwise"></i></div>';
pageHTML += '<div title="Télécharger cette page" class="position-absolute bottom-0 start-50 translate-middle-x p-2 ps-3 pe-3 mb-3 rounded-circle btn-download d-none"><i class="bi bi-download"></i></div>';
pageHTML += '<div title="' + trad['Select this page'] + '" class="position-absolute top-0 start-50 translate-middle-x p-2 ps-3 pe-3 mt-2 rounded-circle btn-select d-none"><i class="bi bi-check-square"></i></div>';
pageHTML += '<div title="' + trad['Delete this page'] + '" class="position-absolute top-50 start-0 translate-middle-y p-2 ps-3 pe-3 ms-2 rounded-circle btn-delete d-none"><i class="bi bi-trash"></i></div>';
pageHTML += '<div title="' + trad['Restore this page'] + '" class="position-absolute top-50 start-50 translate-middle p-2 ps-3 pe-3 rounded-circle container-resize btn-restore d-none"><i class="bi bi-recycle"></i></div>';
pageHTML += '<div title="' + trad['Move this page'] + '" class="position-absolute top-50 start-50 translate-middle p-2 ps-3 pe-3 rounded-circle container-resize btn-drag d-none"><i class="bi bi-arrows-move"></i></div>';
pageHTML += '<div title="' + trad['Move here'] + '" class="position-absolute start-0 top-50 translate-middle p-2 ps-3 pe-3 rounded-circle container-resize btn-drag-here-left bg-white shadow d-none" style="left: -5px !important;"><i class="bi bi-arrow-up-square"></i></div>';
pageHTML += '<div title="' + trad['Move here'] + '" class="position-absolute start-100 top-50 translate-middle p-2 ps-3 pe-3 rounded-circle container-resize btn-drag-here-right bg-white shadow d-none" style="margin-left: 3px !important;"><i class="bi bi-arrow-up-square"></i></div>';
pageHTML += '<div title="' + trad['Move here'] + '" class="position-absolute top-100 start-50 translate-middle p-2 ps-3 pe-3 rounded-circle container-resize btn-drag-here_mobile bg-white shadow d-none"><i class="bi bi-arrows-collapse"></i></div>';
pageHTML += '<div title="' + trad['Turn this page'] + '" class="position-absolute top-50 end-0 translate-middle-y p-2 ps-3 pe-3 me-2 rounded-circle container-rotate btn-rotate d-none"><i class="bi bi-arrow-clockwise"></i></div>';
pageHTML += '<div title="' + trad['Download this page'] + '" class="position-absolute bottom-0 start-50 translate-middle-x p-2 ps-3 pe-3 mb-3 rounded-circle btn-download d-none"><i class="bi bi-download"></i></div>';
pageHTML += '<p class="page-title position-absolute text-center w-100 ps-2 pe-2 pb-0 pt-0 mb-1 bg-white opacity-75 d-none" style="bottom: -4px; font-size: 10px; text-overflow: ellipsis; white-space: nowrap; overflow: hidden;">Page '+page.pageNumber+' - '+filename+'</p>';
pageHTML += '<input form="form_pdf" class="checkbox-page d-none" role="switch" type="checkbox" checked="checked" value="'+pdfLetter+page.pageNumber+'" />';
pageHTML += '<input type="hidden" class="input-rotate" value="0" id="input_rotate_'+pageIndex+'" />';
@ -511,7 +511,7 @@ var updateGlobalState = function() {
button.classList.remove('btn-outline-primary');
button.setAttribute('disabled', 'disabled');
});
document.querySelector('#container_btn_select .card-header span').innerText = "Aucune";
document.querySelector('#container_btn_select .card-header span').innerText = "0";
document.querySelector('#container_btn_select .card-footer').classList.add('d-none');
document.querySelector('#top_bar_action').classList.remove('d-none');
document.querySelector('#top_bar_action_selection').classList.add('d-none');

View file

@ -1,6 +1,6 @@
<!doctype html>
<html lang="fr_FR">
<head>
<head>
<!-- Required meta tags -->
<meta charset="utf-8">
<meta name="viewport" content="width=device-width, initial-scale=1">
@ -10,98 +10,108 @@
<link href="<?php echo $REVERSE_PROXY_URL; ?>/css/app.css?<?php echo ($COMMIT) ? $COMMIT : filemtime($ROOT."/public/css/app.css") ?>" rel="stylesheet">
<link rel="icon" type="image/x-icon" href="<?php echo $REVERSE_PROXY_URL; ?>/favicon-metadata.ico">
<title>Édition des métadonnées d'un PDF</title>
</head>
<body>
<noscript>
<div class="alert alert-danger text-center" role="alert">
<i class="bi bi-exclamation-triangle"></i> Site non fonctionnel sans JavaScript activé
</div>
</noscript>
<div id="page-upload">
<ul class="nav justify-content-center nav-tabs mt-2">
<li class="nav-item">
<a class="nav-link" href="<?php echo $REVERSE_PROXY_URL; ?>/signature"><i class="bi bi-vector-pen"></i> Signer</a>
</li>
<li class="nav-item">
<a class="nav-link" href="<?php echo $REVERSE_PROXY_URL; ?>/organization"><i class="bi bi-ui-checks-grid"></i> Organiser</a>
</li>
<li class="nav-item">
<a class="nav-link active" href="<?php echo $REVERSE_PROXY_URL; ?>/metadata"><i class="bi bi-tags"></i> Metadonnées</a>
</li>
<title><?php echo _("Editing PDF metadata"); ?></title>
</head>
<body>
<noscript>
<div class="alert alert-danger text-center" role="alert">
<i class="bi bi-exclamation-triangle"></i> <?php echo _("Site not functional without JavaScript enabled"); ?>
</div>
</noscript>
<div id="page-upload">
<div class="dropdown position-absolute top-0 end-0 mt-2 me-2">
<button class="btn btn-outline-secondary btn-sm dropdown-toggle" type="button" id="dropdownMenuButton1" data-bs-toggle="dropdown" aria-expanded="false">
<span class="d-none d-md-inline"><?php echo _("Language"); ?></span>
<span class="d-md-none"><i class="bi bi-translate"></i></span>
</button>
<ul class="dropdown-menu" aria-labelledby="dropdownMenuButton1">
<?php foreach ($LANGUAGES as $key => $langue):?>
<li><a class="dropdown-item" href="?lang=<?php echo $key ?>"><?php echo $langue ?></a></li>
<?php endforeach; ?>
</ul>
<div class="px-4 py-4 text-center">
<h1 class="display-5 fw-bold mb-0 mt-3"><i class="bi bi-tags"></i> Éditer les métadonnées</h1>
<p class="fw-light mb-3 subtitle text-dark text-nowrap" style="overflow: hidden; text-overflow: ellipsis;">Ajouter, modifier ou supprimer les métadonnées d'un PDF</p>
<div class="col-md-6 col-lg-5 col-xl-4 col-xxl-3 mx-auto">
<div class="col-12">
<label class="form-label mt-3" for="input_pdf_upload">Choisir un PDF</label>
<input id="input_pdf_upload" placeholder="Choisir un PDF" class="form-control form-control-lg" type="file" accept=".pdf,application/pdf" />
<p class="mt-2 small fw-light text-dark">&nbsp;</p>
<?php if($PDF_DEMO_LINK): ?>
<a class="btn btn-sm btn-link opacity-75" href="#<?php echo $PDF_DEMO_LINK ?>">Tester avec un PDF de démo</a>
<?php endif; ?>
</div>
</div>
<ul class="nav justify-content-center nav-tabs mt-2">
<li class="nav-item">
<a class="nav-link" href="<?php echo $REVERSE_PROXY_URL; ?>/signature"> <?php echo sprintf(_("%s Sign"), '<i class="bi bi-vector-pen"></i>'); ?></a>
</li>
<li class="nav-item">
<a class="nav-link" href="<?php echo $REVERSE_PROXY_URL; ?>/organization"> <?php echo sprintf(_("%s Organize"), '<i class="bi bi-ui-checks-grid"></i>'); ?></a>
</li>
<li class="nav-item">
<a class="nav-link active" href="<?php echo $REVERSE_PROXY_URL; ?>/metadata"> <?php echo sprintf(_("%s Metadata"), '<i class="bi bi-tags"></i>'); ?></a>
</li>
</ul>
<div class="px-4 py-4 text-center">
<h1 class="display-5 fw-bold mb-0 mt-3"> <?php echo sprintf(_("%s Edit metadata"), '<i class="bi bi-tags"></i>'); ?></h1>
<p class="fw-light mb-3 subtitle text-dark text-nowrap" style="overflow: hidden; text-overflow: ellipsis;"><?php echo _("Add, edit, or remove metadata from a PDF"); ?></p>
<div class="col-md-6 col-lg-5 col-xl-4 col-xxl-3 mx-auto">
<div class="col-12">
<label class="form-label mt-3" for="input_pdf_upload"><?php echo _("Choose a PDF"); ?></label>
<input id="input_pdf_upload" placeholder="<?php echo _("Choose a PDF"); ?>" class="form-control form-control-lg" type="file" accept=".pdf,application/pdf" />
<p class="mt-2 small fw-light text-dark">&nbsp;</p>
<?php if($PDF_DEMO_LINK): ?>
<a class="btn btn-sm btn-link opacity-75" href="#<?php echo $PDF_DEMO_LINK ?>"><?php echo _("Test with a demo PDF"); ?></a>
<?php endif; ?>
</div>
</div>
<footer class="text-center text-muted mb-2 fixed-bottom opacity-75">
<small>Logiciel libre <span class="d-none d-md-inline">sous license AGPL-3.0</span> : <a href="https://github.com/24eme/signaturepdf">voir le code source </a><?php if($COMMIT): ?> <span class="d-none d-md-inline small">[<a href="https://github.com/24eme/signaturepdf/tree/<?php echo $COMMIT ?>"><?php echo $COMMIT ?></a>]</span><?php endif; ?></small>
</footer>
</div>
<div id="page-metadata" class="d-none">
<div id="div-margin-top" style="height: 88px;" class="d-md-none"></div>
<div style="width: 60%; overflow: auto;" class="vh-100" id="container-main">
<div id="form-metadata" class="mx-auto w-75 pt-3 pb-5">
<h3>Liste des métadonnées du PDF</h3>
<div id="form-metadata-container">
<footer class="text-center text-muted mb-2 fixed-bottom opacity-75">
<small><?php echo _("Free open-source software"); ?> <span class="d-none d-md-inline"><?php echo _("under AGPL-3.0 license"); ?></span> : <a href="https://github.com/24eme/signaturepdf"><?php echo _("see the source code"); ?></a><?php if($COMMIT): ?> <span class="d-none d-md-inline small">[<a href="https://github.com/24eme/signaturepdf/tree/<?php echo $COMMIT ?>"><?php echo $COMMIT ?></a>]</span><?php endif; ?></small>
</footer>
</div>
<div id="page-metadata" class="d-none">
<div id="div-margin-top" style="height: 88px;" class="d-md-none"></div>
<div style="width: 60%; overflow: auto;" class="vh-100" id="container-main">
<div id="form-metadata" class="mx-auto w-75 pt-3 pb-5">
<h3><?php echo _("List of PDF metadata"); ?></h3>
<div id="form-metadata-container">
</div>
<form id="form_metadata_add" class="position-relative">
<hr class="text-muted mt-4 mb-3" />
<div class="mb-3">
<label class="form-label text-muted" for="input_metadata_key"><?php echo _("Add new metadata"); ?></label>
<div class="form-floating">
<input id="input_metadata_key" name="metadata_key" type="text" class="form-control" required value="" style="border-bottom-right-radius: 0; border-bottom-left-radius: 0;">
<label><?php echo _("Key"); ?></label>
</div>
<form id="form_metadata_add" class="position-relative">
<hr class="text-muted mt-4 mb-3" />
<div class="mb-3">
<label class="form-label text-muted" for="input_metadata_key">Ajouter une nouvelle métadonnée</label>
<div class="form-floating">
<input id="input_metadata_key" name="metadata_key" type="text" class="form-control" required value="" style="border-bottom-right-radius: 0; border-bottom-left-radius: 0;">
<label>Clé</label>
</div>
<input id="input_metadata_value" readonly="readonly" style="border-top: 0; border-top-right-radius: 0; border-top-left-radius: 0;" name="metadata_value" type="text" class="form-control bg-light opacity-50" value="" placeholder="Valeur" style="border-bottom-right-radius: 0; border-bottom-left-radius: 0;">
</div>
<button type="submit" type="button" class="btn btn-outline-secondary float-end"><i class="bi bi-plus-circle"></i> Ajouter</button>
</form>
<input id="input_metadata_value" readonly="readonly" style="border-top: 0; border-top-right-radius: 0; border-top-left-radius: 0;" name="metadata_value" type="text" class="form-control bg-light opacity-50" value="" placeholder="<?php echo _("Value"); ?>" style="border-bottom-right-radius: 0; border-bottom-left-radius: 0;">
</div>
<button type="submit" type="button" class="btn btn-outline-secondary float-end"><?php echo sprintf(_("%s Add"), '<i class="bi bi-plus-circle"></i>'); ?></button>
</form>
</div>
<div id="div-margin-bottom" style="height: 55px;" class="d-md-none"></div>
<div style="width: 40%;" class="offcanvas offcanvas-end show d-none d-md-block shadow-sm" data-bs-backdrop="false" data-bs-scroll="true" data-bs-keyboard="false" tabindex="-1" id="sidebarTools" aria-labelledby="sidebarToolsLabel">
<a class="btn btn-close btn-sm position-absolute opacity-25 d-none d-sm-none d-md-block" title="Fermer ce PDF et retourner à l'accueil" style="position: absolute; top: 2px; right: 2px; font-size: 10px;" href="/metadata"></a>
<div class="offcanvas-header d-block mb-0 pb-0 border-bottom">
<h5 class="mb-1 d-block w-100" id="sidebarToolsLabel">Édition des métadonnées<span class="float-end me-2"><i class="bi bi-tags"></i></span></h5>
<button type="button" class="btn-close text-reset d-md-none" data-bs-dismiss="offcanvas" aria-label="Close"></button>
<p id="text_document_name" class="text-muted mb-2" style="text-overflow: ellipsis; white-space: nowrap; overflow: hidden;" title=""><i class="bi bi-files"></i> <span></span></p>
</div>
<div class="offcanvas-body bg-light" style="padding-bottom: 60px;">
<div id="container-pages">
</div>
</div>
<div class="position-absolute bg-white bottom-0 pb-2 ps-2 pe-2 w-100 border-top shadow-lg">
<div id="btn_container" class="d-grid gap-2 mt-2">
<button class="btn btn-primary" type="submit" id="save"><i class="bi bi-download"></i> Enregistrer et télécharger le PDF</button>
</div>
</div>
<div id="div-margin-bottom" style="height: 55px;" class="d-md-none"></div>
<div style="width: 40%;" class="offcanvas offcanvas-end show d-none d-md-block shadow-sm" data-bs-backdrop="false" data-bs-scroll="true" data-bs-keyboard="false" tabindex="-1" id="sidebarTools" aria-labelledby="sidebarToolsLabel">
<a class="btn btn-close btn-sm position-absolute opacity-25 d-none d-sm-none d-md-block" title="<?php echo _("Close this PDF and return to the home page"); ?>" style="position: absolute; top: 2px; right: 2px; font-size: 10px;" href="/metadata"></a>
<div class="offcanvas-header d-block mb-0 pb-0 border-bottom">
<h5 class="mb-1 d-block w-100" id="sidebarToolsLabel"><?php echo _("Edit metadata"); ?><span class=\"float-end me-2\"><i class=\"bi bi-tags\"></i></span></h5>
<button type="button" class="btn-close text-reset d-md-none" data-bs-dismiss="offcanvas" aria-label="Close"></button>
<p id="text_document_name" class="text-muted mb-2" style="text-overflow: ellipsis; white-space: nowrap; overflow: hidden;" title=""><i class="bi bi-files"></i> <span></span></p>
</div>
<div class="offcanvas-body bg-light" style="padding-bottom: 60px;">
<div id="container-pages">
</div>
</div>
<div id="bottom_bar" class="position-fixed bottom-0 start-0 bg-white w-100 p-2 shadow-sm d-md-none">
<div id="bottom_bar_action" class="d-grid gap-2">
<button class="btn btn-primary" id="save_mobile"><i class="bi bi-download"></i> Télécharger le PDF</button>
<div class="position-absolute bg-white bottom-0 pb-2 ps-2 pe-2 w-100 border-top shadow-lg">
<div id="btn_container" class="d-grid gap-2 mt-2">
<button class="btn btn-primary" type="submit" id="save"><i class="bi bi-download"></i> <?php echo _("Save and download the PDF"); ?></button>
</div>
</div>
</div>
<div id="bottom_bar" class="position-fixed bottom-0 start-0 bg-white w-100 p-2 shadow-sm d-md-none">
<div id="bottom_bar_action" class="d-grid gap-2">
<button class="btn btn-primary" id="save_mobile"><i class="bi bi-download"></i> <?php echo _("Download the PDF"); ?></button>
</div>
</div>
</div>
<span id="is_mobile" class="d-md-none"></span>
<script src="<?php echo $REVERSE_PROXY_URL; ?>/vendor/bootstrap.min.js?5.1.3"></script>
<script src="<?php echo $REVERSE_PROXY_URL; ?>/vendor/pdf.js?legacy"></script>
<script src="<?php echo $REVERSE_PROXY_URL; ?>/vendor/pdf-lib.min.js?1.17.1"></script>
<script>
<span id="is_mobile" class="d-md-none"></span>
<script src="<?php echo $REVERSE_PROXY_URL; ?>/vendor/bootstrap.bundle.min.js?5.1.3"></script>
<script src="<?php echo $REVERSE_PROXY_URL; ?>/vendor/pdf.js?legacy"></script>
<script src="<?php echo $REVERSE_PROXY_URL; ?>/vendor/pdf-lib.min.js?1.17.1"></script>
<script>
var defaultFields = <?php echo json_encode(isset($METADATA_DEFAULT_FIELDS) ? $METADATA_DEFAULT_FIELDS : array()); ?>;
</script>
<script src="<?php echo $REVERSE_PROXY_URL; ?>/js/metadata.js?<?php echo ($COMMIT) ? $COMMIT : filemtime($ROOT."/public/js/metadata.js") ?>"></script>
</body>
</script>
<script src="<?php echo $REVERSE_PROXY_URL; ?>/js/metadata.js?<?php echo ($COMMIT) ? $COMMIT : filemtime($ROOT."/public/js/metadata.js") ?>"></script>
</body>
</html>

View file

@ -10,47 +10,58 @@
<link href="<?php echo $REVERSE_PROXY_URL; ?>/css/app.css?<?php echo ($COMMIT) ? $COMMIT : filemtime($ROOT."/public/css/app.css") ?>" rel="stylesheet">
<link rel="icon" type="image/x-icon" href="<?php echo $REVERSE_PROXY_URL; ?>/favicon-organization.ico">
<title>Organiser un PDF</title>
<title><?php _("Organize PDF"); ?></title>
</head>
<body>
<noscript>
<div class="alert alert-danger text-center" role="alert">
<i class="bi bi-exclamation-triangle"></i> Site non fonctionnel sans JavaScript activé
<i class="bi bi-exclamation-triangle"></i><?php echo _("Site not functional without JavaScript enabled"); ?>
</div>
</noscript>
<div id="page-upload">
<div class="dropdown position-absolute top-0 end-0 mt-2 me-2">
<button class="btn btn-outline-secondary btn-sm dropdown-toggle" type="button" id="dropdownMenuButton1" data-bs-toggle="dropdown" aria-expanded="false">
<span class="d-none d-md-inline"><?php echo _("Language"); ?></span>
<span class="d-md-none"><i class="bi bi-translate"></i></span>
</button>
<ul class="dropdown-menu" aria-labelledby="dropdownMenuButton1">
<?php foreach ($LANGUAGES as $key => $langue):?>
<li><a class="dropdown-item" href="?lang=<?php echo $key ?>"><?php echo $langue ?></a></li>
<?php endforeach; ?>
</ul>
</div>
<ul class="nav justify-content-center nav-tabs mt-2">
<li class="nav-item">
<a class="nav-link" href="<?php echo $REVERSE_PROXY_URL; ?>/signature"><i class="bi bi-vector-pen"></i> Signer</a>
</li>
<li class="nav-item">
<a class="nav-link active" href="<?php echo $REVERSE_PROXY_URL; ?>/organization"><i class="bi bi-ui-checks-grid"></i> Organiser</a>
</li>
<li class="nav-item">
<a class="nav-link" href="<?php echo $REVERSE_PROXY_URL; ?>/metadata"><i class="bi bi-tags"></i> Metadonnées</a>
</li>
<li class="nav-item">
<a class="nav-link" href="<?php echo $REVERSE_PROXY_URL; ?>/signature"> <?php echo sprintf(_("%s Sign"), '<i class="bi bi-vector-pen"></i>'); ?></a>
</li>
<li class="nav-item">
<a class="nav-link active" href="<?php echo $REVERSE_PROXY_URL; ?>/organization"> <?php echo sprintf(_("%s Organize"), '<i class="bi bi-ui-checks-grid"></i>'); ?></a>
</li>
<li class="nav-item">
<a class="nav-link" href="<?php echo $REVERSE_PROXY_URL; ?>/metadata"> <?php echo sprintf(_("%s Metadata"), '<i class="bi bi-tags"></i>'); ?></a>
</li>
</ul>
<div class="px-4 py-4 text-center">
<h1 class="display-5 fw-bold mb-0 mt-3"><i class="bi bi-ui-checks-grid"></i> Organiser des PDF</h1>
<p class="fw-light mb-3 subtitle text-dark text-nowrap" style="overflow: hidden; text-overflow: ellipsis;">Fusionner, trier, pivoter, supprimer, extraire des pages</p>
<h1 class="display-5 fw-bold mb-0 mt-3"><?php echo sprintf(_("%s Organize PDF"), '<i class="bi bi-ui-checks-grid"></i>'); ?></h1>
<p class="fw-light mb-3 subtitle text-dark text-nowrap" style="overflow: hidden; text-overflow: ellipsis;"><?php echo _("Merge, sort, rotate, delete, extract pages"); ?></p>
<div class="col-md-6 col-lg-5 col-xl-4 col-xxl-3 mx-auto">
<div class="col-12">
<label class="form-label mt-3" for="input_pdf_upload">Choisir un PDF <small class="opacity-75" style="cursor: help" title="Le PDF ne doit pas dépasser <?php echo round($maxSize / 1024 / 1024) ?> Mo"><i class="bi bi-info-circle"></i></small></label>
<input id="input_pdf_upload" placeholder="Choisir un PDF" class="form-control form-control-lg" type="file" accept=".pdf,application/pdf" multiple="true" />
<p class="mt-2 small fw-light text-dark">Le PDF sera traité par le serveur sans être conservé ni stocké</p>
<label class="form-label mt-3" for="input_pdf_upload"><?php echo _("Choose a PDF"); ?> <small class="opacity-75" style="cursor: help" title="<?php echo _("The PDF must not exceed "); ?> <?php echo round($maxSize / 1024 / 1024) ?> <?php echo _("Mb"); ?>"><i class="bi bi-info-circle"></i></small></label>
<input id="input_pdf_upload" placeholder="<?php echo _("Choose a PDF"); ?>" class="form-control form-control-lg" type="file" accept=".pdf,application/pdf" multiple="true" />
<p class="mt-2 small fw-light text-dark"><?php echo _("The PDF will be processed by the server without being retained or stored"); ?></p>
<?php if($PDF_DEMO_LINK): ?>
<a class="btn btn-sm btn-link opacity-75" href="#<?php echo $PDF_DEMO_LINK ?>">Tester avec un PDF de démo</a>
<a class="btn btn-sm btn-link opacity-75" href="#<?php echo $PDF_DEMO_LINK ?>"><?php echo _("Test with a demo PDF"); ?></a>
<?php endif; ?>
</div>
</div>
</div>
<footer class="text-center text-muted mb-2 fixed-bottom opacity-75">
<small>Logiciel libre <span class="d-none d-md-inline">sous license AGPL-3.0</span> : <a href="https://github.com/24eme/signaturepdf">voir le code source </a><?php if($COMMIT): ?> <span class="d-none d-md-inline small">[<a href="https://github.com/24eme/signaturepdf/tree/<?php echo $COMMIT ?>"><?php echo $COMMIT ?></a>]</span><?php endif; ?></small>
<small><?php echo _("Free open-source software"); ?> <span class="d-none d-md-inline"><?php echo _("under AGPL-3.0 license"); ?></span> : <a href="https://github.com/24eme/signaturepdf"><?php echo _("see the source code"); ?></a><?php if($COMMIT): ?> <span class="d-none d-md-inline small">[<a href="https://github.com/24eme/signaturepdf/tree/<?php echo $COMMIT ?>"><?php echo $COMMIT ?></a>]</span><?php endif; ?></small>
</footer>
</div>
<div id="page-organization" style="padding-right: 350px;" class="d-none">
<div id="div-margin-top" style="height: 88px;" class="d-md-none"></div>
<div style="top: 62px;" class="w-100 position-absolute text-center text-muted opacity-50 d-md-none"><em>Toucher une page pour la sélectionner</em></div>
<div style="top: 62px;" class="w-100 position-absolute text-center text-muted opacity-50 d-md-none"><em><?php echo _("Touch a page to select it"); ?></em></div>
<div id="container-main">
<div id="container-pages" class="col-12 pt-1 vh-100 d-flex align-content-start flex-wrap position-relative" style="overflow-y: scroll; overflow-x: hidden;">
</div>
@ -61,9 +72,9 @@
</div>
<div id="div-margin-bottom" style="height: 55px;" class="d-md-none"></div>
<div class="offcanvas offcanvas-end show d-none d-md-block shadow-sm" data-bs-backdrop="false" data-bs-scroll="true" data-bs-keyboard="false" tabindex="-1" id="sidebarTools" aria-labelledby="sidebarToolsLabel">
<a class="btn btn-close btn-sm position-absolute opacity-25 d-none d-sm-none d-md-block" title="Fermer ce PDF et retourner à l'accueil" style="position: absolute; top: 2px; right: 2px; font-size: 10px;" href="<?php echo $REVERSE_PROXY_URL; ?>/organization"></a>
<a class="btn btn-close btn-sm position-absolute opacity-25 d-none d-sm-none d-md-block" title="<?php echo _("Close this PDF and return to home"); ?>" style="position: absolute; top: 2px; right: 2px; font-size: 10px;" href="<?php echo $REVERSE_PROXY_URL; ?>/organization"></a>
<div class="offcanvas-header mb-0 pb-0">
<h5 class="mb-1 d-block w-100" id="sidebarToolsLabel">Organisation de PDF <span class="float-end me-2" title="Ce PDF est stocké sur votre ordinateur pour être signé par vous uniquement"><i class="bi-ui-checks-grid"></i></span></h5>
<h5 class="mb-1 d-block w-100" id="sidebarToolsLabel"><?php echo _("PDF organization"); ?> <span class="float-end me-2" title="<?php echo _("This PDF is stored on your computer to be signed by you only"); ?>"><i class="bi-ui-checks-grid"></i></span></h5>
<button type="button" class="btn-close text-reset d-md-none" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div class="offcanvas-body pt-3" style="padding-bottom: 60px;">
@ -72,19 +83,19 @@
</ul>
</div>
<div class="d-grid gap-2 mt-2">
<button type="button" class="btn btn-sm btn-outline-dark" onclick="document.getElementById('input_pdf_upload_2').click();"><i class="bi bi-plus-circle"></i> Ajouter un PDF</button>
<button type="button" class="btn btn-sm btn-outline-dark" onclick="document.getElementById('input_pdf_upload_2').click();"><?php echo sprintf(_("%s Add a PDF"), '<i class="bi bi-plus-circle"></i>'); ?></button>
<input id="input_pdf_upload_2" class="form-control d-none" type="file" accept=".pdf,application/pdf" multiple="true">
</div>
<hr />
<div id="container_btn_select" class="opacity-50 card">
<div class="card-header small text-center p-1"><span>Aucune</span> page(s) sélectionnée(s) <button id="btn_cancel_select" type="button" class="btn-close btn-close-white float-end" aria-label="Close"></button></div>
<div class="card-header small text-center p-1"><?php echo sprintf(_("%s page(s) selected"), '<span>0</span>'); ?> <button id="btn_cancel_select" type="button" class="btn-close btn-close-white float-end" aria-label="Close"></button></div>
<div class="card-body d-grid gap-2 p-2">
<button id="btn_rotate_select" disabled="disabled" type="button" class="btn btn-sm btn-outline-secondary"><i class="bi bi-arrow-clockwise"></i> Tourner de 90°</button>
<button id="btn_drag_select" disabled="disabled" type="button" class="btn btn-sm btn-outline-secondary"><i class="bi bi-arrows-move"></i> Déplacer</button>
<button id="btn_delete_select" disabled="disabled" type="button" class="btn btn-sm btn-outline-secondary"><i class="bi bi-trash"></i> Supprimer</button>
<button id="save-select" class="btn btn-sm btn-outline-secondary" disabled="disabled" form="form_pdf" type="submit"><i class="bi bi-download"></i> Extraire et télécharger</button>
<button id="btn_rotate_select" disabled="disabled" type="button" class="btn btn-sm btn-outline-secondary"><?php echo sprintf(_("%s Rotate 90°"), '<i class="bi bi-arrow-clockwise"></i>'); ?></button>
<button id="btn_drag_select" disabled="disabled" type="button" class="btn btn-sm btn-outline-secondary"><?php echo sprintf(_("%s Move"), '<i class="bi bi-arrows-move"></i>'); ?></button>
<button id="btn_delete_select" disabled="disabled" type="button" class="btn btn-sm btn-outline-secondary"><?php echo sprintf(_("%s Delete"), '<i class="bi bi-trash"></i>'); ?></button>
<button id="save-select" class="btn btn-sm btn-outline-secondary" disabled="disabled" form="form_pdf" type="submit"><?php echo sprintf(_("%s Extract and download"), '<i class="bi bi-download"></i>'); ?></button>
</div>
<div class="card-footer d-none small text-center p-1 border-primary bg-primary bg-opacity-25"><a id="btn_cancel_select_footer" type="button" aria-label="Close" style="text-decoration: none;" class="text-primary"><i class="bi bi-x-lg"></i> Annuler la sélection</a></div>
<div class="card-footer d-none small text-center p-1 border-primary bg-primary bg-opacity-25"><a id="btn_cancel_select_footer" type="button" aria-label="Close" style="text-decoration: none;" class="text-primary"><?php echo sprintf(_("%s Cancel selection"), '<i class="bi bi-x-lg"></i>'); ?></a></div>
</div>
<div class="position-absolute bottom-0 pb-2 ps-0 pe-4 w-100">
@ -92,7 +103,7 @@
<input id="input_pdf" name="pdf[]" type="file" class="d-none" />
<input id="input_pages" type="hidden" value="" name="pages" />
<div id="btn_container" class="d-grid gap-2 mt-2">
<button class="btn btn-primary" type="submit" id="save"><i class="bi bi-download"></i> Télécharger le PDF complet</button>
<button class="btn btn-primary" type="submit" id="save"><?php echo sprintf(_("%s Download the full PDF"), '<i class="bi bi-download"></i>'); ?></button>
</div>
</form>
</div>
@ -104,24 +115,24 @@
<button id="btn_liste_pdf" type="button" data-bs-toggle="modal" data-bs-target="#modalFichier" class="btn btn-dark flex-grow-1 me-2" style="white-space: nowrap; overflow: hidden; text-overflow: ellipsis;">
<i class="bi bi-files"></i> <span id="liste_pdf_titre_mobile"></span>
</button>
<button type="button" class="btn btn-outline-dark position-relative" style="padding-left: 30px;" onclick="document.getElementById('input_pdf_upload_2').click(); this.blur();"><i class="bi bi-plus-circle position-absolute" style="left: 10px;"></i>Ajouter&nbsp;un&nbsp;PDF</button>
<button type="button" class="btn btn-outline-dark position-relative" style="padding-left: 30px;" onclick="document.getElementById('input_pdf_upload_2').click(); this.blur();"><?php echo sprintf(_("%s Add a PDF"), '<i class="bi bi-plus-circle position-absolute" style="left: 10px;"></i>'); ?></button>
</div>
</div>
<div id="top_bar_action_selection" class="d-none">
<div id="top_bar_action_selection_recap" class="bg-primary text-white text-center rounded-top p-1 position-relative"><button id="btn_liste_pdf_bar" type="button" style="text-decoration: none;left: 0px; top:0px;" class="btn bg-white bg-opacity-50 text-primary position-absolute p-0 ps-1 pe-1 mt-1 ms-1"><i class="bi bi-files"></i>&nbsp;<span></span> PDF</button><span id="top_bar_action_selection_recap_nb_pages">Aucune</span> page(s)<button id="btn_cancel_select_mobile" type="button" style="text-decoration: none;right: 0px; top:0px;" class="btn bg-white bg-opacity-50 text-primary position-absolute p-0 ps-1 pe-1 mt-1 me-1"><i class="bi bi-x-lg"></i>&nbsp;Annuler</button></div>
<div id="top_bar_action_selection_recap" class="bg-primary text-white text-center rounded-top p-1 position-relative"><button id="btn_liste_pdf_bar" type="button" style="text-decoration: none;left: 0px; top:0px;" class="btn bg-white bg-opacity-50 text-primary position-absolute p-0 ps-1 pe-1 mt-1 ms-1"><i class="bi bi-files"></i>&nbsp;<span></span> PDF</button><span id="top_bar_action_selection_recap_nb_pages"><?php echo _("No"); ?>></span> <?php echo _("page"); ?><button id="btn_cancel_select_mobile" type="button" style="text-decoration: none;right: 0px; top:0px;" class="btn bg-white bg-opacity-50 text-primary position-absolute p-0 ps-1 pe-1 mt-1 me-1"><i class="bi bi-x-lg"></i>&nbsp;<?php echo _("Cancel"); ?></button></div>
<div class="btn-group w-100">
<button id="btn_rotate_select_mobile" type="button" class="btn btn-outline-primary" style="border-top-left-radius: 0 !important;"><i class="bi bi-arrow-clockwise"></i> Tourner</button>
<button id="btn_drag_select_mobile" type="button" class="btn btn-outline-primary"><i class="bi bi-arrows-move"></i> Déplacer</button>
<button id="btn_delete_select_mobile" type="button" class="btn btn-outline-primary" style="border-top-right-radius: 0 !important;"><i class="bi bi-trash"></i> Supprimer</button>
<button id="btn_rotate_select_mobile" type="button" class="btn btn-outline-primary" style="border-top-left-radius: 0 !important;"><?php echo sprintf(_("%s Turn"), '<i class="bi bi-arrow-clockwise"></i>'); ?></button>
<button id="btn_drag_select_mobile" type="button" class="btn btn-outline-primary"><?php echo sprintf(_("%s Move"), '<i class="bi bi-arrows-move"></i>'); ?></button>
<button id="btn_delete_select_mobile" type="button" class="btn btn-outline-primary" style="border-top-right-radius: 0 !important;"><?php echo sprintf(_("%s Delete"), '<i class="bi bi-trash"></i>'); ?></button>
</div>
</div>
</div>
<div id="bottom_bar" class="position-fixed bottom-0 start-0 bg-white w-100 p-2 shadow-sm d-md-none">
<div id="bottom_bar_action" class="d-grid gap-2">
<button class="btn btn-primary" type="submit" id="save_mobile"><i class="bi bi-download"></i> Télécharger le PDF complet</button>
<button class="btn btn-primary" type="submit" id="save_mobile"><?php echo sprintf(_("%s Download the full PDF"), '<i class="bi bi-download"></i>'); ?></button>
</div>
<div id="bottom_bar_action_selection" class="d-grid gap-2 d-none">
<button id="save-select_mobile" class="btn btn-outline-primary" type="submit" form="form_pdf"><i class="bi bi-download"></i> Télécharger la sélection</button>
<button id="save-select_mobile" class="btn btn-outline-primary" type="submit" form="form_pdf"><?php echo sprintf(_("Download the selection"), '<i class="bi bi-download"></i>'); ?></button>
</div>
</div>
</div>
@ -129,7 +140,7 @@
<div class="modal-dialog modal-dialog-scrollable modal-xl modal-fullscreen-md-down">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title">Déplacement de page(s)</h5>
<h5 class="modal-title"><?php echo("Page move"); ?></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body bg-light ps-5">
@ -141,7 +152,7 @@
<div class="modal-dialog">
<div class="modal-content">
<div class="modal-header">
<h1 class="modal-title fs-5" id="exampleModalLabel">Documents PDF</h1>
<h1 class="modal-title fs-5" id="exampleModalLabel"><?php echo _("PDF documents"); ?></h1>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
@ -152,10 +163,19 @@
<span id="is_mobile" class="d-md-none"></span>
<script src="<?php echo $REVERSE_PROXY_URL; ?>/vendor/bootstrap.min.js?5.1.3"></script>
<script src="<?php echo $REVERSE_PROXY_URL; ?>/vendor/bootstrap.bundle.min.js?5.1.3"></script>
<script src="<?php echo $REVERSE_PROXY_URL; ?>/vendor/pdf.js?legacy"></script>
<script>
var maxSize = <?php echo $maxSize ?>;
var trad = <?php echo json_encode([
'Select this page' => _('Select this page'),
'Delete this page' => _('Delete this page'),
'Restore this page' => _('Restore this page'),
'Move this page' => _('Move this page'),
'Move here' => _('Move here'),
'Turn this page' => _('Turn this page'),
'Download this page' => _('Download this page')
]); ?>;
</script>
<script src="<?php echo $REVERSE_PROXY_URL; ?>/js/organization.js?<?php echo ($COMMIT) ? $COMMIT : filemtime($ROOT."/public/js/organization.js") ?>"></script>
</body>

View file

@ -9,122 +9,133 @@
<link href="<?php echo $REVERSE_PROXY_URL; ?>/vendor/bootstrap-icons.css?1.8.1" rel="stylesheet">
<link href="<?php echo $REVERSE_PROXY_URL; ?>/css/app.css?<?php echo ($COMMIT) ? $COMMIT : filemtime($ROOT."/public/css/app.css") ?>" rel="stylesheet">
<title>Signature PDF</title>
</head>
<body>
<noscript>
<div class="alert alert-danger text-center" role="alert">
<i class="bi bi-exclamation-triangle"></i> Site non fonctionnel sans JavaScript activé
</head>
<body>
<noscript>
<div class="alert alert-danger text-center" role="alert">
<i class="bi bi-exclamation-triangle"></i> <?php echo _("Site not functional without JavaScript enabled"); ?>
</div>
</noscript>
<div id="page-upload">
<?php if(!$disableOrganization): ?>
<div class="dropdown position-absolute top-0 end-0 mt-2 me-2">
<button class="btn btn-outline-secondary btn-sm dropdown-toggle" type="button" id="dropdownMenuButton1" data-bs-toggle="dropdown" aria-expanded="false">
<span class="d-none d-md-inline"><?php echo _("Language"); ?></span>
<span class="d-md-none"><i class="bi bi-translate"></i></span>
</button>
<ul class="dropdown-menu" aria-labelledby="dropdownMenuButton1">
<?php foreach ($LANGUAGES as $key => $langue):?>
<li><a class="dropdown-item" href="?lang=<?php echo $key ?>"><?php echo $langue ?></a></li>
<?php endforeach; ?>
</ul>
</div>
</noscript>
<div id="page-upload">
<?php if(!$disableOrganization): ?>
<ul class="nav justify-content-center nav-tabs mt-2">
<li class="nav-item">
<a class="nav-link active" href="<?php echo $REVERSE_PROXY_URL; ?>/signature"><i class="bi bi-vector-pen"></i> Signer</a>
</li>
<li class="nav-item">
<a class="nav-link" href="<?php echo $REVERSE_PROXY_URL; ?>/organization"><i class="bi bi-ui-checks-grid"></i> Organiser</a>
</li>
<li class="nav-item">
<a class="nav-link" href="<?php echo $REVERSE_PROXY_URL; ?>/metadata"><i class="bi bi-tags"></i> Metadonnées</a>
</li>
<li class="nav-item">
<a class="nav-link active" href="<?php echo $REVERSE_PROXY_URL; ?>/signature"> <?php echo sprintf(_("%s Sign"), '<i class="bi bi-vector-pen"></i>'); ?></a>
</li>
<li class="nav-item">
<a class="nav-link" href="<?php echo $REVERSE_PROXY_URL; ?>/organization"> <?php echo sprintf(_("%s Organize"), '<i class="bi bi-ui-checks-grid"></i>'); ?></a>
</li>
<li class="nav-item">
<a class="nav-link" href="<?php echo $REVERSE_PROXY_URL; ?>/metadata"> <?php echo sprintf(_("%s Metadata"), '<i class="bi bi-tags"></i>'); ?></a>
</li>
</ul>
<?php endif; ?>
<div class="px-4 py-4 text-center">
<h1 class="display-5 fw-bold mb-0 mt-3"><i class="bi bi-vector-pen"></i> Signer un PDF</h1>
<p class="fw-light mb-3 subtitle text-dark text-nowrap" style="overflow: hidden; text-overflow: ellipsis;">Signer, parapher, tamponner, compléter un document</p>
<div class="col-md-6 col-lg-5 col-xl-4 col-xxl-3 mx-auto">
<div class="col-12">
<label class="form-label mt-3" for="input_pdf_upload">Choisir un PDF <small class="opacity-75" style="cursor: help" title="Le PDF ne doit pas dépasser <?php echo round($maxSize / 1024 / 1024) ?> Mo et <?php echo $maxPage ?> pages"><i class="bi bi-info-circle"></i></small></label>
<input id="input_pdf_upload" placeholder="Choisir un PDF" class="form-control form-control-lg" type="file" accept=".pdf,application/pdf" />
<p class="mt-2 small fw-light text-dark">Le PDF sera traité par le serveur sans être conservé ni stocké</p>
<?php if($PDF_DEMO_LINK): ?>
<a class="btn btn-sm btn-link opacity-75" href="#<?php echo $PDF_DEMO_LINK ?>">Tester avec un PDF de démo</a>
<?php endif; ?>
</div>
<?php endif; ?>
<div class="px-4 py-4 text-center">
<h1 class="display-5 fw-bold mb-0 mt-3"><?php echo sprintf(_("%s Sign a PDF"), '<i class="bi bi-vector-pen"></i>'); ?></h1>
<p class="fw-light mb-3 subtitle text-dark text-nowrap" style="overflow: hidden; text-overflow: ellipsis;"><?php echo _("Sign, initial, stamp, complete a document") ?></p>
<div class="col-md-6 col-lg-5 col-xl-4 col-xxl-3 mx-auto">
<div class="col-12">
<label class="form-label mt-3" for="input_pdf_upload"><?php echo _("Choose a PDF"); ?> <small class="opacity-75" style="cursor: help" title="<?php echo _("The PDF should not exceed"); ?> <?php echo round($maxSize / 1024 / 1024) ?> <?php echo _("MB and"); ?> <?php echo $maxPage ?> <?php echo _("pages"); ?>"><i class="bi bi-info-circle"></i></small></label>
<input id="input_pdf_upload" placeholder="<?php echo _("Choose a PDF") ?>" class="form-control form-control-lg" type="file" accept=".pdf,application/pdf" />
<p class="mt-2 small fw-light text-dark"><?php echo _("The PDF will be processed by the server without being stored or saved") ?></p>
<?php if($PDF_DEMO_LINK): ?>
<a class="btn btn-sm btn-link opacity-75" href="#<?php echo $PDF_DEMO_LINK ?>"><?php echo _("Test with a demo PDF") ?></a>
<?php endif; ?>
</div>
</div>
<footer class="text-center text-muted mb-2 fixed-bottom opacity-75">
<small>Logiciel libre <span class="d-none d-md-inline">sous license AGPL-3.0</span> : <a href="https://github.com/24eme/signaturepdf">voir le code source </a><?php if($COMMIT): ?> <span class="d-none d-md-inline small">[<a href="https://github.com/24eme/signaturepdf/tree/<?php echo $COMMIT ?>"><?php echo $COMMIT ?></a>]</span><?php endif; ?></small>
</footer>
</div>
<div id="page-signature" style="padding-right: 350px;" class="d-none">
<?php if(isset($hash)): ?>
<footer class="text-center text-muted mb-2 fixed-bottom opacity-75">
<small><?php echo _("Free open-source software"); ?> <span class="d-none d-md-inline"><?php echo _("under AGPL-3.0 license"); ?></span> : <a href="https://github.com/24eme/signaturepdf"><?php echo _("see the source code"); ?></a><?php if($COMMIT): ?> <span class="d-none d-md-inline small">[<a href="https://github.com/24eme/signaturepdf/tree/<?php echo $COMMIT ?>"><?php echo $COMMIT ?></a>]</span><?php endif; ?></small>
</footer>
</div>
<div id="page-signature" style="padding-right: 350px;" class="d-none">
<?php if(isset($hash)): ?>
<div id="alert-signature-help" class="position-relative d-none">
<div class="alert alert-primary alert-dismissible position-absolute top-0 start-50 translate-middle-x text-center mt-4 pb-2 w-50 opacity-100" style="z-index: 100;" role="alert">
<h5 class="alert-heading">Comment signer ?</h5>
<strong>En cliquant directement sur la page du document</strong> pour insérer l'élément séléctionné dans la colonne de droite <small>(signature, paraphe, texte, tampon, etc ...)</small>
<h5 class="alert-heading"><?php echo _("How to sign?") ?></h5>
<strong><?php echo _("By clicking directly on the document page"); ?></strong> <?php echo _("to insert the selected item in the right column"); ?> <small>(<?php echo _("signature, initial, text, stamp, etc ..."); ?>)</small>
<div class="mt-1 fs-3"><i class="bi bi-box-arrow-down"></i></div>
<button type="button" class="btn-close btn-sm" aria-label="Close"></button>
</div>
</div>
<?php endif; ?>
<div style="height: 65px;" class="d-md-none"></div>
<div id="container-pages" class="col-12 pt-1 pb-1 text-center vh-100">
<?php endif; ?>
<div style="height: 65px;" class="d-md-none"></div>
<div id="container-pages" class="col-12 pt-1 pb-1 text-center vh-100">
</div>
<div style="height: 55px;" class="d-md-none"></div>
<div class="offcanvas offcanvas-end show d-none d-md-block shadow-sm" data-bs-backdrop="false" data-bs-scroll="true" data-bs-keyboard="false" tabindex="-1" id="sidebarTools" aria-labelledby="sidebarToolsLabel">
<a class="btn btn-close btn-sm position-absolute opacity-25 d-none d-sm-none d-md-block" title="<?php echo _("Close this PDF and return to the homepage"); ?>" style="position: absolute; top: 2px; right: 2px; font-size: 10px;" href="<?php echo $REVERSE_PROXY_URL; ?>/signature"></a>
<div class="offcanvas-header mb-0 pb-0">
<h5 class="mb-1 d-block w-100" id="sidebarToolsLabel"><?php echo _("PDF Signature"); ?> <?php if(isset($hash)): ?><span class="float-end small me-2" title="<?php echo _("This PDF is shared with others to be signed by multiple people"); ?>"><span class="nblayers"></span> <i class="bi bi-people-fill"></i></span><?php else: ?><span class="float-end me-2" title="<?php echo _("This PDF is stored on your computer to be signed by you only"); ?>"><i class="bi bi-person-workspace"></i></span><?php endif; ?></h5>
<button type="button" class="btn-close text-reset d-md-none" data-bs-dismiss="offcanvas" aria-label="Close"></button>
</div>
<div style="height: 55px;" class="d-md-none"></div>
<div class="offcanvas offcanvas-end show d-none d-md-block shadow-sm" data-bs-backdrop="false" data-bs-scroll="true" data-bs-keyboard="false" tabindex="-1" id="sidebarTools" aria-labelledby="sidebarToolsLabel">
<a class="btn btn-close btn-sm position-absolute opacity-25 d-none d-sm-none d-md-block" title="Fermer ce PDF et retourner à l'accueil" style="position: absolute; top: 2px; right: 2px; font-size: 10px;" href="<?php echo $REVERSE_PROXY_URL; ?>/signature"></a>
<div class="offcanvas-header mb-0 pb-0">
<h5 class="mb-1 d-block w-100" id="sidebarToolsLabel">Signature du PDF <?php if(isset($hash)): ?><span class="float-end small me-2" title="Ce PDF est partagé avec d'autres personnes pour être signé à plusieurs"><span class="nblayers"></span> <i class="bi bi-people-fill"></i></span><?php else: ?><span class="float-end me-2" title="Ce PDF est stocké sur votre ordinateur pour être signé par vous uniquement"><i class="bi bi-person-workspace"></i></span><?php endif; ?></h5>
<button type="button" class="btn-close text-reset d-md-none" data-bs-dismiss="offcanvas" aria-label="Close"></button>
<div class="offcanvas-body pt-0">
<p id="text_document_name" class="text-muted" style="text-overflow: ellipsis; white-space: nowrap; overflow: hidden;" title=""><i class="bi bi-files"></i> <span></span></p>
<div class="form-check form-switch mb-2 small d-none">
<input class="form-check-input" type="checkbox" id="add-lock-checkbox" disabled="disabled">
<label style="cursor: pointer;" class="form-check-label" for="add-lock-checkbox"> <?php echo _("Keep the selection active"); ?></label>
</div>
<div class="offcanvas-body pt-0">
<p id="text_document_name" class="text-muted" style="text-overflow: ellipsis; white-space: nowrap; overflow: hidden;" title=""><i class="bi bi-files"></i> <span></span></p>
<div class="form-check form-switch mb-2 small d-none">
<input class="form-check-input" type="checkbox" id="add-lock-checkbox" disabled="disabled">
<label style="cursor: pointer;" class="form-check-label" for="add-lock-checkbox"> Garder la séléction active</label>
</div>
<div id="svg_list_signature" class="list-item-add"></div>
<div class="d-grid gap-2 mb-2 list-item-add">
<input type="radio" class="btn-check" id="radio_svg_signature_add" name="svg_2_add" autocomplete="off" value="signature">
<label data-bs-toggle="modal" data-bs-target="#modalAddSvg" data-type="signature" class="btn btn-outline-secondary text-black text-start btn-add-svg-type" for="radio_svg_signature_add" id="label_svg_signature_add"><i class="bi bi-vector-pen"></i> Signature <small class="text-muted float-end">Créer</small></label>
</div>
<div id="svg_list_initials" class="list-item-add"></div>
<div class="d-grid gap-2 mb-2 list-item-add">
<input type="radio" class="btn-check" id="radio_svg_initials_add" name="svg_2_add" autocomplete="off" value="intials">
<label data-bs-toggle="modal" data-bs-target="#modalAddSvg" data-type="initials" data-modalnav="#nav-type-tab" class="btn btn-outline-secondary text-black text-start btn-add-svg-type" for="radio_svg_initials_add" id="label_svg_initials_add"><i class="bi bi-type"></i> Paraphe <small class="text-muted float-end">Créer</small></label>
</div>
<div id="svg_list_rubber_stamber" class="list-item-add"></div>
<div class="d-grid gap-2 mb-2 list-item-add">
<input type="radio" class="btn-check" id="radio_svg_rubber_stamber_add" name="svg_2_add" autocomplete="off" value="rubber_stamber">
<label data-bs-toggle="modal" data-bs-target="#modalAddSvg" data-type="rubber_stamber" data-modalnav="#nav-import-tab" class="btn btn-outline-secondary text-black text-start btn-add-svg-type" for="radio_svg_rubber_stamber_add" id="label_svg_rubber_stamber_add"><i class="bi bi-card-text"></i> Tampon <small class="text-muted float-end">Créer</small></label>
</div>
<div class="d-grid gap-2 mb-2 list-item-add">
<div id="svg_list_signature" class="list-item-add"></div>
<div class="d-grid gap-2 mb-2 list-item-add">
<input type="radio" class="btn-check" id="radio_svg_signature_add" name="svg_2_add" autocomplete="off" value="signature">
<label data-bs-toggle="modal" data-bs-target="#modalAddSvg" data-type="signature" class="btn btn-outline-secondary text-black text-start btn-add-svg-type" for="radio_svg_signature_add" id="label_svg_signature_add"><?php echo sprintf(_("%s Signature"), '<i class="bi bi-vector-pen"></i>'); ?> <small class="text-muted float-end"><?php echo _("Create"); ?></small></label>
</div>
<div id="svg_list_initials" class="list-item-add"></div>
<div class="d-grid gap-2 mb-2 list-item-add">
<input type="radio" class="btn-check" id="radio_svg_initials_add" name="svg_2_add" autocomplete="off" value="intials">
<label data-bs-toggle="modal" data-bs-target="#modalAddSvg" data-type="initials" data-modalnav="#nav-type-tab" class="btn btn-outline-secondary text-black text-start btn-add-svg-type" for="radio_svg_initials_add" id="label_svg_initials_add"><?php echo sprintf(_("%s Initial"), '<i class="bi bi-type"></i>'); ?> <small class="text-muted float-end"><?php echo _("Create"); ?></small></label>
</div>
<div id="svg_list_rubber_stamber" class="list-item-add"></div>
<div class="d-grid gap-2 mb-2 list-item-add">
<input type="radio" class="btn-check" id="radio_svg_rubber_stamber_add" name="svg_2_add" autocomplete="off" value="rubber_stamber">
<label data-bs-toggle="modal" data-bs-target="#modalAddSvg" data-type="rubber_stamber" data-modalnav="#nav-import-tab" class="btn btn-outline-secondary text-black text-start btn-add-svg-type" for="radio_svg_rubber_stamber_add" id="label_svg_rubber_stamber_add"><?php echo sprintf(_("%s Stamp"), '<i class="bi bi-card-text"></i>'); ?> <small class="text-muted float-end"><?php echo _("Create"); ?></small></label>
</div>
<div class="d-grid gap-2 mb-2 list-item-add">
<input type="radio" class="btn-check" id="radio_svg_text" data-svg="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0iY3VycmVudENvbG9yIiBjbGFzcz0iYmkgYmktdGV4dGFyZWEtdCIgdmlld0JveD0iMCAwIDE2IDE2Ij48cGF0aCBkPSJNMS41IDIuNUExLjUgMS41IDAgMCAxIDMgMWgxMGExLjUgMS41IDAgMCAxIDEuNSAxLjV2My41NjNhMiAyIDAgMCAxIDAgMy44NzRWMTMuNUExLjUgMS41IDAgMCAxIDEzIDE1SDNhMS41IDEuNSAwIDAgMS0xLjUtMS41VjkuOTM3YTIgMiAwIDAgMSAwLTMuODc0VjIuNXptMSAzLjU2M2EyIDIgMCAwIDEgMCAzLjg3NFYxMy41YS41LjUgMCAwIDAgLjUuNWgxMGEuNS41IDAgMCAwIC41LS41VjkuOTM3YTIgMiAwIDAgMSAwLTMuODc0VjIuNUEuNS41IDAgMCAwIDEzIDJIM2EuNS41IDAgMCAwLS41LjV2My41NjN6TTIgN2ExIDEgMCAxIDAgMCAyIDEgMSAwIDAgMCAwLTJ6bTEyIDBhMSAxIDAgMSAwIDAgMiAxIDEgMCAwIDAgMC0yeiIvPjxwYXRoIGQ9Ik0xMS40MzQgNEg0LjU2Nkw0LjUgNS45OTRoLjM4NmMuMjEtMS4yNTIuNjEyLTEuNDQ2IDIuMTczLTEuNDk1bC4zNDMtLjAxMXY2LjM0M2MwIC41MzctLjExNi42NjUtMS4wNDkuNzQ4VjEyaDMuMjk0di0uNDIxYy0uOTM4LS4wODMtMS4wNTQtLjIxLTEuMDU0LS43NDhWNC40ODhsLjM0OC4wMWMxLjU2LjA1IDEuOTYzLjI0NCAyLjE3MyAxLjQ5NmguMzg2TDExLjQzNCA0eiIvPjwvc3ZnPgo=" name="svg_2_add" autocomplete="off" value="text">
<label draggable="true" id="label_svg_text" class="btn btn-outline-secondary text-black text-start btn-svg" for="radio_svg_text"><i class="bi bi-textarea-t"></i> Texte</label>
<label draggable="true" id="label_svg_text" class="btn btn-outline-secondary text-black text-start btn-svg" for="radio_svg_text"><?php echo sprintf(_("%s Text"), '<i class="bi bi-textarea-t"></i>'); ?></label>
</div>
<div class="d-grid gap-2 mb-2 list-item-add">
<input type="radio" class="btn-check" id="radio_svg_check" data-height="18" name="svg_2_add" autocomplete="off" value="data:image/svg+xml;base64,PHN2ZyB4bWxucz0iaHR0cDovL3d3dy53My5vcmcvMjAwMC9zdmciIHdpZHRoPSIxNiIgaGVpZ2h0PSIxNiIgZmlsbD0iY3VycmVudENvbG9yIiBjbGFzcz0iYmkgYmktY2hlY2stbGciIHZpZXdCb3g9IjAgMCAxNiAxNiI+CiAgPHBhdGggZD0iTTEyLjczNiAzLjk3YS43MzMuNzMzIDAgMCAxIDEuMDQ3IDBjLjI4Ni4yODkuMjkuNzU2LjAxIDEuMDVMNy44OCAxMi4wMWEuNzMzLjczMyAwIDAgMS0xLjA2NS4wMkwzLjIxNyA4LjM4NGEuNzU3Ljc1NyAwIDAgMSAwLTEuMDYuNzMzLjczMyAwIDAgMSAxLjA0NyAwbDMuMDUyIDMuMDkzIDUuNC02LjQyNWEuMjQ3LjI0NyAwIDAgMSAuMDItLjAyMloiLz4KPC9zdmc+Cg==">
<label draggable="true" id="label_svg_check" class="btn btn-outline-secondary text-black text-start btn-svg" for="radio_svg_check"><i class="bi bi-check-square"></i> Case à cocher</label>
<label draggable="true" id="label_svg_check" class="btn btn-outline-secondary text-black text-start btn-svg" for="radio_svg_check"><?php echo sprintf(_("%s Check box"), '<i class="bi bi-check-square"></i>'); ?></label>
</div>
<div id="svg_list" class="d-grid gap-2 mt-2 mb-2 list-item-add"></div>
<div class="d-grid gap-2 mt-2">
<button type="button" id="btn-add-svg" class="btn btn-sm btn-light" data-bs-toggle="modal" data-bs-target="#modalAddSvg"><i class="bi bi-plus-circle"></i> Créer un élément</button>
<button type="button" id="btn-add-svg" class="btn btn-sm btn-light" data-bs-toggle="modal" data-bs-target="#modalAddSvg"><?php echo sprintf(_("%s Create an element"), '<i class="bi bi-plus-circle"></i>'); ?></button>
</div>
<div id="form_block" class="position-absolute bottom-0 pb-2 ps-0 pe-4 w-100">
<?php if(!isset($hash)): ?>
<?php if(!isset($noSharingMode)): ?>
<button class="btn btn-outline-dark w-100" type="button" data-bs-toggle="modal" data-bs-target="#modal-start-share"><i class="bi bi-share"></i> Partager pour signer <i class="bi bi-people-fill"></i> à plusieurs</button>
<button class="btn btn-outline-dark w-100" type="button" data-bs-toggle="modal" data-bs-target="#modal-start-share"><?php echo sprintf(_("%s Share to sign %s with multiple people"), '<i class="bi bi-share"></i>',"<i class='bi bi-people-fill'></i>"); ?></button>
<?php endif; ?>
<form id="form_pdf" action="<?php echo $REVERSE_PROXY_URL; ?>/sign" method="post" enctype="multipart/form-data" class="d-none d-sm-none d-md-block">
<input id="input_pdf" name="pdf" type="file" class="d-none" />
<input id="input_svg" name="svg[]" type="file" class="d-none" />
<button class="btn btn-primary w-100 mt-2" disabled="disabled" type="submit" id="save"><i class="bi bi-download"></i> Télécharger le PDF signé</button>
<button class="btn btn-primary w-100 mt-2" disabled="disabled" type="submit" id="save"><i class="bi bi-download"></i> <?php echo _("Download the signed PDF"); ?></button>
</form>
<?php elseif(!isset($noSharingMode)): ?>
<div class="d-none d-sm-none d-md-block position-relative">
<a id="btn-signature-help" class="position-absolute top-0 end-0 text-dark" href="" style="z-index: 5;"><i class="bi bi-question-circle"></i></a>
<p id="nblayers_text" class="small d-none mb-2 opacity-75">Vous êtes <span class="badge rounded-pill border border-dark text-dark"><span class="nblayers">0</span> <i class="bi bi-people-fill"></i></span> à avoir signé ce PDF</p>
<p id="nblayers_text" class="small d-none mb-2 opacity-75"><?php echo sprintf(_("You are %s to have signed this PDF"), "<span class='badge rounded-pill border border-dark text-dark'><span class='nblayers'>0</span> <i class='bi bi-people-fill'></i></span>"); ?></p>
</div>
<div class="btn-group w-100">
<a id="btn_download" class="btn btn-outline-dark w-100" href="<?php echo $REVERSE_PROXY_URL; ?>/signature/<?php echo $hash ?>/pdf"><i class="bi bi-download"></i> Télécharger le PDF</a>
<a id="btn_download" class="btn btn-outline-dark w-100" href="<?php echo $REVERSE_PROXY_URL; ?>/signature/<?php echo $hash ?>/pdf"><?php echo sprintf(_("%s Download the PDF"), '<i class="bi bi-download"></i>'); ?></a>
<button class="btn btn-outline-dark" type="button" id="btn_share" data-bs-toggle="modal" data-bs-target="#modal-share-informations"><i class="bi bi-share"></i></button>
</div>
<form id="form_pdf" action="<?php echo $REVERSE_PROXY_URL; ?>/signature/<?php echo $hash ?>/save" method="post" enctype="multipart/form-data" class="d-none d-sm-none d-md-block">
<input id="input_svg" name="svg[]" type="file" class="d-none" />
<button class="btn btn-primary w-100 mt-2" disabled="disabled" type="submit" id="save"><i class="bi bi-cloud-upload"></i> Transmettre ma signature</button>
<button class="btn btn-primary w-100 mt-2" disabled="disabled" type="submit" id="save"><i class="bi bi-cloud-upload"></i> <?php echo _("Transmit my signature"); ?></button>
</form>
<?php endif; ?>
</div>
@ -132,7 +143,7 @@
</div>
<div class="position-fixed top-0 start-0 bg-white w-100 p-2 shadow-sm d-md-none">
<div class="d-grid gap-2">
<button id="btn_svn_select" class="btn btn-light btn-lg" data-bs-toggle="offcanvas" data-bs-target="#sidebarTools" aria-controls="sidebarTools"><i class="bi bi-hand-index"></i> Séléctionner une signature</button>
<button id="btn_svn_select" class="btn btn-light btn-lg" data-bs-toggle="offcanvas" data-bs-target="#sidebarTools" aria-controls="sidebarTools"><?php echo sprintf(_("%s Select a signature"), '<i class="bi bi-hand-index"></i>'); ?></button>
</div>
<div id="svg_selected_container" class="text-center d-none position-relative">
<img id="svg_selected" src="" style="height: 48px;" class="img-fluid"/>
@ -149,9 +160,9 @@
</div>
<div class="d-grid gap-2">
<?php if(isset($hash)): ?>
<button class="btn btn-primary" disabled="disabled" type="submit" id="save_mobile"><i class="bi bi-cloud-upload"></i> Transmettre ma signature</button>
<button class="btn btn-primary" disabled="disabled" type="submit" id="save_mobile"><i class="bi bi-cloud-upload"></i> <?php echo _("Transmit my signature"); ?></button>
<?php else: ?>
<button class="btn btn-primary" disabled="disabled" type="submit" id="save_mobile"><i class="bi bi-download"></i> Télécharger le PDF signé</button>
<button class="btn btn-primary" disabled="disabled" type="submit" id="save_mobile"><i class="bi bi-download"></i> <?php echo _("Download the signed PDF"); ?></button>
<?php endif; ?>
</div>
</div>
@ -161,17 +172,17 @@
<div class="modal-content">
<div class="modal-body">
<nav class="nav nav-tabs" id="nav-tab" role="tablist">
<button class="nav-link active ps-2 ps-md-3 pe-2 pe-md-3" id="nav-draw-tab" data-bs-toggle="tab" data-bs-target="#nav-draw" type="button" role="tab" aria-controls="nav-draw" aria-selected="true"><i class="bi bi-vector-pen"></i> Dessiner<br /><small>à main levée</small></button>
<button class="nav-link ps-2 ps-md-3 pe-2 pe-md-3" id="nav-type-tab" data-bs-toggle="tab" data-bs-target="#nav-type" type="button" role="tab" aria-controls="nav-type" aria-selected="false"><i class="bi bi-fonts"></i> Saisir<br /><small>du texte</small></button>
<button class="nav-link ps-2 ps-md-3 pe-2 pe-md-3" id="nav-import-tab" data-bs-toggle="tab" data-bs-target="#nav-import" type="button" role="tab" aria-controls="nav-import" aria-selected="false"><i class="bi bi-image"></i> Importer<br /><small>une image</small></button>
<button class="nav-link active ps-2 ps-md-3 pe-2 pe-md-3" id="nav-draw-tab" data-bs-toggle="tab" data-bs-target="#nav-draw" type="button" role="tab" aria-controls="nav-draw" aria-selected="true"><i class="bi bi-vector-pen"></i> <?php echo _("Draw"); ?><br /><small><?php echo _("freehand"); ?></small></button>
<button class="nav-link ps-2 ps-md-3 pe-2 pe-md-3" id="nav-type-tab" data-bs-toggle="tab" data-bs-target="#nav-type" type="button" role="tab" aria-controls="nav-type" aria-selected="false"><i class="bi bi-fonts"></i> <?php echo _("Enter"); ?><br /><small><?php echo _("text"); ?></small></button>
<button class="nav-link ps-2 ps-md-3 pe-2 pe-md-3" id="nav-import-tab" data-bs-toggle="tab" data-bs-target="#nav-import" type="button" role="tab" aria-controls="nav-import" aria-selected="false"><i class="bi bi-image"></i> <?php echo _("Import"); ?><br /><small><?php echo _("an image"); ?></small></button>
</nav>
<div class="tab-content mt-3" id="nav-svg-add">
<div class="tab-pane fade show active" id="nav-draw" role="tabpanel" aria-labelledby="nav-draw-tab">
<small id="signature-pad-reset" class="text-muted opacity-75 position-absolute" style="right: 25px; bottom: 25px; cursor: pointer;" title="Effacer la signature"><i class="bi bi-trash"></i></small>
<small id="signature-pad-reset" class="text-muted opacity-75 position-absolute" style="right: 25px; bottom: 25px; cursor: pointer;" title="<?php echo _("Clear signature"); ?>"><i class="bi bi-trash"></i></small>
<canvas id="signature-pad" class="border bg-light" width="462" height="200"></canvas>
</div>
<div class="tab-pane fade" id="nav-type" role="tabpanel" aria-labelledby="nav-type-tab">
<input id="input-text-signature" type="text" class="form-control form-control-lg" placeholder="Ma signature" />
<input id="input-text-signature" type="text" class="form-control form-control-lg" placeholder="<?php echo _("My signature"); ?>" />
</div>
<div class="tab-pane fade" id="nav-import" role="tabpanel" aria-labelledby="nav-import-tab">
<div class="text-center">
@ -185,8 +196,8 @@
<input id="input-svg-type" type="hidden" />
</div>
<div class="modal-footer d-block">
<button tabindex="-1" type="button" class="btn btn-light col-4" data-bs-dismiss="modal">Annuler</button>
<button id="btn_modal_ajouter" type="button" disabled="disabled" data-bs-dismiss="modal" class="btn btn-primary float-end col-4"><span id="btn_modal_ajouter_spinner" class="spinner-border spinner-border-sm d-none"></span><span id="btn_modal_ajouter_check" class="bi bi-check-circle"></span> Créer</button>
<button tabindex="-1" type="button" class="btn btn-light col-4" data-bs-dismiss="modal"><?php echo _("Cancel"); ?></button>
<button id="btn_modal_ajouter" type="button" disabled="disabled" data-bs-dismiss="modal" class="btn btn-primary float-end col-4"><span id="btn_modal_ajouter_spinner" class="spinner-border spinner-border-sm d-none"></span><span id="btn_modal_ajouter_check" class="bi bi-check-circle"></span> <?php echo _("Create"); ?></button>
</div>
</div>
</div>
@ -197,19 +208,19 @@
<div class="modal-dialog modal-md">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><i class="bi bi-share"></i> Partager ce PDF pour le signer à plusieurs </h5>
<h5 class="modal-title"><?php echo sprintf(_("%s Share this PDF to sign it with several people"), '<i class="bi bi-share"></i>'); ?> </h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>En activant le partage de ce PDF vous allez pouvoir proposer un lien aux personnes de votre choix pour qu'elles puissent signer ce PDF.</p>
<p><i class="bi bi-hdd-network"></i> Ce partage nécessite que le PDF soit transféré et stocké sur le serveur afin d'être accessible aux futurs signataires.</p>
<p class="mb-0"><i class="bi bi-hourglass-split"></i> Le PDF sera conservé <select name="duration" form="form_sharing"><option value="+1 year">un an</option><option value="+6 month">six mois</option><option value="+1 month" selected="selected">un mois</option><option value="+1 week">une semaine</option><option value="+1 day">un jour</option><option value="+1 hour">une heure</option></select> après la dernière signature.</p>
<p><?php echo _("By enabling PDF sharing, you will be able to provide a link to the people of your choice so that they can sign this PDF."); ?></p>
<p><?php echo sprintf(_("%s This sharing requires the PDF to be transferred and stored on the server for future signers to access."), '<i class="bi bi-hdd-network"></i>'); ?></p>
<p class="mb-0"><?php echo sprintf(_("%s The PDF will be kept"), '<i class="bi bi-hourglass-split"></i>'); ?> <select name='duration' form='form_sharing'><option value='+1 year'><?php echo _("for one year"); ?></option><option value='+6 month'><?php echo _("for six months"); ?></option><option value='+1 month' selected='selected'><?php echo _("for one month"); ?></option><option value='+1 week'><?php echo _("for one week"); ?></option><option value='+1 day'><?php echo _("for one day"); ?></option><option value='+1 hour'><?php echo _("for one hour"); ?></option></select> <?php echo _("after the last signature."); ?></p>
</div>
<div class="modal-footer text-center d-block">
<form id="form_sharing" clas action="<?php echo $REVERSE_PROXY_URL; ?>/share" method="post" enctype="multipart/form-data">
<input id="input_pdf_share" name="pdf" type="file" class="d-none" />
<input id="input_svg_share" name="svg[]" type="file" class="d-none" />
<button class="btn col-9 col-md-6 btn-primary" type="submit" id="save_share"><i class="bi bi-cloud-upload"></i> Démarrer le partage</button>
<button class="btn col-9 col-md-6 btn-primary" type="submit" id="save_share"><?php echo sprintf(_("%s Start sharing"), '<i class="bi bi-cloud-upload"></i>'); ?></button>
</form>
</div>
</div>
@ -221,22 +232,22 @@
<div class="modal-dialog modal-md">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><i class="bi bi-people-fill"></i> Signer ce PDF à plusieurs</h5>
<h5 class="modal-title"><?php echo sprintf(_("%s Sign this PDF with multiple people"), '<i class="bi bi-people-fill"></i>'); ?></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p>Plusieurs personnes peuvent signer ce PDF en même temps.</p>
<p>Pour cela il vous suffit de partager avec les personnes de votre choix le lien vers cette page :</p>
<p><?php echo _("Multiple people can sign this PDF simultaneously."); ?></p>
<p><?php echo _("To do so, simply share the link to this page with the people of your choice:"); ?></p>
<div class="input-group mb-3">
<span class="input-group-text">Lien à partager</span>
<span class="input-group-text"><?php echo _("Sharing link"); ?></span>
<input id="input-share-link" type="text" onclick="this.select(); this.setSelectionRange(0, 99999);" readonly="readonly" class="form-control bg-light font-monospace" value="">
<button onclick="navigator.clipboard.writeText(document.getElementById('input-share-link').value); this.innerText = 'Copié !';" autofocus="autofocus" class="btn btn-primary" type="button" id="btn-copy-share-link"><i class="bi bi-clipboard"></i> Copier</button>
<script>document.querySelector('#input-share-link').value = document.location.href.replace(/#.*/, '');</script>
</div>
<p class="mb-0">Chacun des signataires pourra à tout moment télécharger la dernière version du PDF signé.</p>
<p class="mb-0"><?php echo _("Each of the signatories can download the latest version of the signed PDF at any time."); ?></p>
</div>
<div class="modal-footer text-start">
<button type="button" class="btn btn-light" data-bs-dismiss="modal">Fermer</button>
<button type="button" class="btn btn-light" data-bs-dismiss="modal"><?php echo _("Close"); ?></button>
</div>
</div>
</div>
@ -247,14 +258,14 @@
<div class="modal-dialog modal-md">
<div class="modal-content">
<div class="modal-header">
<h5 class="modal-title"><i class="bi bi-file-earmark-check"></i> PDF signé</h5>
<h5 class="modal-title"><i class="bi bi-file-earmark-check"></i> <?php echo _("Signed PDF"); ?></h5>
<button type="button" class="btn-close" data-bs-dismiss="modal" aria-label="Close"></button>
</div>
<div class="modal-body">
<p class="mb-1"><i class="bi bi-check-circle text-success"></i> Votre signature a bien été prise en compte&nbsp;!</p>
<p class="mb-1"><i class="bi bi-check-circle text-success"></i> <?php echo _("Your signature has been successfully recorded!"); ?></p>
</div>
<div class="modal-footer text-center d-block">
<a class="btn btn-outline-dark" href="<?php echo $REVERSE_PROXY_URL; ?>/signature/<?php echo $hash ?>/pdf"><i class="bi bi-download"></i> Télécharger le PDF</a>
<a class="btn btn-outline-dark" href="<?php echo $REVERSE_PROXY_URL; ?>/signature/<?php echo $hash ?>/pdf"><i class="bi bi-download"></i> <?php echo _("Download the PDF"); ?></a>
</div>
</div>
</div>
@ -263,7 +274,7 @@
<span id="is_mobile" class="d-md-none"></span>
<script src="<?php echo $REVERSE_PROXY_URL; ?>/vendor/bootstrap.min.js?5.1.3"></script>
<script src="<?php echo $REVERSE_PROXY_URL; ?>/vendor/bootstrap.bundle.min.js?5.1.3"></script>
<script src="<?php echo $REVERSE_PROXY_URL; ?>/vendor/pdf.js?legacy"></script>
<script src="<?php echo $REVERSE_PROXY_URL; ?>/vendor/fabric.min.js?4.6.0"></script>
<script src="<?php echo $REVERSE_PROXY_URL; ?>/vendor/signature_pad.umd.min.js?3.0.0-beta.3"></script>