mirror of
https://github.com/Stirling-Tools/Stirling-PDF.git
synced 2025-06-22 23:45:02 +00:00
Merge branch 'main' into saml
This commit is contained in:
commit
329f755823
14
README.md
14
README.md
@ -192,7 +192,7 @@ Stirling-PDF currently supports 37 languages!
|
|||||||
| Language | Progress |
|
| Language | Progress |
|
||||||
| -------------------------------------------- | -------------------------------------- |
|
| -------------------------------------------- | -------------------------------------- |
|
||||||
| Arabic (العربية) (ar_AR) |  |
|
| Arabic (العربية) (ar_AR) |  |
|
||||||
| Azerbaijani (Azərbaycan Dili) (az_AZ) |  |
|
| Azerbaijani (Azərbaycan Dili) (az_AZ) |  |
|
||||||
| Basque (Euskara) (eu_ES) |  |
|
| Basque (Euskara) (eu_ES) |  |
|
||||||
| Bulgarian (Български) (bg_BG) |  |
|
| Bulgarian (Български) (bg_BG) |  |
|
||||||
| Catalan (Català) (ca_CA) |  |
|
| Catalan (Català) (ca_CA) |  |
|
||||||
@ -206,23 +206,23 @@ Stirling-PDF currently supports 37 languages!
|
|||||||
| German (Deutsch) (de_DE) |  |
|
| German (Deutsch) (de_DE) |  |
|
||||||
| Greek (Ελληνικά) (el_GR) |  |
|
| Greek (Ελληνικά) (el_GR) |  |
|
||||||
| Hindi (हिंदी) (hi_IN) |  |
|
| Hindi (हिंदी) (hi_IN) |  |
|
||||||
| Hungarian (Magyar) (hu_HU) |  |
|
| Hungarian (Magyar) (hu_HU) |  |
|
||||||
| Indonesian (Bahasa Indonesia) (id_ID) |  |
|
| Indonesian (Bahasa Indonesia) (id_ID) |  |
|
||||||
| Irish (Gaeilge) (ga_IE) |  |
|
| Irish (Gaeilge) (ga_IE) |  |
|
||||||
| Italian (Italiano) (it_IT) |  |
|
| Italian (Italiano) (it_IT) |  |
|
||||||
| Japanese (日本語) (ja_JP) |  |
|
| Japanese (日本語) (ja_JP) |  |
|
||||||
| Korean (한국어) (ko_KR) |  |
|
| Korean (한국어) (ko_KR) |  |
|
||||||
| Norwegian (Norsk) (no_NB) |  |
|
| Norwegian (Norsk) (no_NB) |  |
|
||||||
| Polish (Polski) (pl_PL) |  |
|
| Polish (Polski) (pl_PL) |  |
|
||||||
| Portuguese (Português) (pt_PT) |  |
|
| Portuguese (Português) (pt_PT) |  |
|
||||||
| Portuguese Brazilian (Português) (pt_BR) |  |
|
| Portuguese Brazilian (Português) (pt_BR) |  |
|
||||||
| Romanian (Română) (ro_RO) |  |
|
| Romanian (Română) (ro_RO) |  |
|
||||||
| Russian (Русский) (ru_RU) |  |
|
| Russian (Русский) (ru_RU) |  |
|
||||||
| Serbian Latin alphabet (Srpski) (sr_LATN_RS) |  |
|
| Serbian Latin alphabet (Srpski) (sr_LATN_RS) |  |
|
||||||
| Simplified Chinese (简体中文) (zh_CN) |  |
|
| Simplified Chinese (简体中文) (zh_CN) |  |
|
||||||
| Slovakian (Slovensky) (sk_SK) |  |
|
| Slovakian (Slovensky) (sk_SK) |  |
|
||||||
| Spanish (Español) (es_ES) |  |
|
| Spanish (Español) (es_ES) |  |
|
||||||
| Swedish (Svenska) (sv_SE) |  |
|
| Swedish (Svenska) (sv_SE) |  |
|
||||||
| Thai (ไทย) (th_TH) |  |
|
| Thai (ไทย) (th_TH) |  |
|
||||||
| Traditional Chinese (繁體中文) (zh_TW) |  |
|
| Traditional Chinese (繁體中文) (zh_TW) |  |
|
||||||
| Turkish (Türkçe) (tr_TR) |  |
|
| Turkish (Türkçe) (tr_TR) |  |
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=تحريك إلى اليسار
|
|||||||
multiTool.moveRight=تحريك إلى اليمين
|
multiTool.moveRight=تحريك إلى اليمين
|
||||||
multiTool.delete=حذف
|
multiTool.delete=حذف
|
||||||
multiTool.dragDropMessage=الصفحات المحددة
|
multiTool.dragDropMessage=الصفحات المحددة
|
||||||
|
multiTool.undo=تراجع
|
||||||
|
multiTool.redo=إعادة إجراء
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=هذه الميزة متوفرة في <a href="{0}">صفحة الأدوات المتعددة</a> لدينا. اطلع عليها للحصول على واجهة مستخدم محسّنة لكل صفحة وميزات إضافية!
|
multiTool-advert.message=هذه الميزة متوفرة في <a href="{0}">صفحة الأدوات المتعددة</a> لدينا. اطلع عليها للحصول على واجهة مستخدم محسّنة لكل صفحة وميزات إضافية!
|
||||||
|
@ -34,10 +34,10 @@ sizes.small=Kiçik
|
|||||||
sizes.medium=Orta
|
sizes.medium=Orta
|
||||||
sizes.large=Böyük
|
sizes.large=Böyük
|
||||||
sizes.x-large=Ekstra Böyük
|
sizes.x-large=Ekstra Böyük
|
||||||
error.pdfPassword=PDF sənədi şifrələnmişdir və şifrə təmin edilməmişdir və ya yanlışdır.
|
error.pdfPassword=PDF sənədi şifrlənmişdir və şifr təmin edilməmişdir və ya yanlışdır.
|
||||||
delete=Sil
|
delete=Sil
|
||||||
username=İstifadəçi Adı
|
username=İstifadəçi Adı
|
||||||
password=Şifrə
|
password=Şifr
|
||||||
welcome=Xoş gəldiniz
|
welcome=Xoş gəldiniz
|
||||||
property=Xüsusiyyət
|
property=Xüsusiyyət
|
||||||
black=Qara
|
black=Qara
|
||||||
@ -53,11 +53,11 @@ no=Xeyr
|
|||||||
changedCredsMessage=Etibarnamələr dəyişdirildi!
|
changedCredsMessage=Etibarnamələr dəyişdirildi!
|
||||||
notAuthenticatedMessage=İstifadəçinin kimliyi təsdiqlənməyib.
|
notAuthenticatedMessage=İstifadəçinin kimliyi təsdiqlənməyib.
|
||||||
userNotFoundMessage=İstifadəçi tapılmadı.
|
userNotFoundMessage=İstifadəçi tapılmadı.
|
||||||
incorrectPasswordMessage=Cari şifrə yanlışdır.
|
incorrectPasswordMessage=Cari şifr yanlışdır.
|
||||||
usernameExistsMessage=İstifadəçi adı mövcuddur.
|
usernameExistsMessage=İstifadəçi adı mövcuddur.
|
||||||
invalidUsernameMessage=Yanlış istifadəçi adı, istifadəçi adı sadəcə hərflərdən, rəqəmlərdən və @._+- xüsusi simvollarından ibarət ola bilər və ya düzgün email ünvanı olmalıdır.
|
invalidUsernameMessage=Yanlış istifadəçi adı, istifadəçi adı sadəcə hərflərdən, rəqəmlərdən və @._+- xüsusi simvollarından ibarət ola bilər və ya düzgün email ünvanı olmalıdır.
|
||||||
invalidPasswordMessage=Şifrə boş olmamalıdır, başlanğıc və sonunda boşluqdan istifadə edilməməlidir.
|
invalidPasswordMessage=Şifr boş olmamalıdır, başlanğıc və sonunda boşluqdan istifadə edilməməlidir.
|
||||||
confirmPasswordErrorMessage=Yeni Şifrə və Yeni Şifrəni Doğrula uyğun olmalıdır.
|
confirmPasswordErrorMessage=Yeni Şifr və Yeni Şifri Doğrula uyğun olmalıdır.
|
||||||
deleteCurrentUserMessage=Hazırda daxil olmuş istifadəçini silmək mümkün deyil.
|
deleteCurrentUserMessage=Hazırda daxil olmuş istifadəçini silmək mümkün deyil.
|
||||||
deleteUsernameExistsMessage=İstifadəçi adı mövcud deyildir və silinə bilməz.
|
deleteUsernameExistsMessage=İstifadəçi adı mövcud deyildir və silinə bilməz.
|
||||||
downgradeCurrentUserMessage=Cari istifadəçinin rolunu aşağı salmaq mümkün deyil
|
downgradeCurrentUserMessage=Cari istifadəçinin rolunu aşağı salmaq mümkün deyil
|
||||||
@ -70,8 +70,8 @@ oops=Oops!
|
|||||||
help=Yardım
|
help=Yardım
|
||||||
goHomepage=Ana səhifəyə get
|
goHomepage=Ana səhifəyə get
|
||||||
joinDiscord=Discord serverimizə qatıl
|
joinDiscord=Discord serverimizə qatıl
|
||||||
seeDockerHub=Docker Hub'a bax
|
seeDockerHub=Docker Hub-a bax
|
||||||
visitGithub=Github Repository'ə Baş Çək
|
visitGithub=Github Repository-ə Baş Çək
|
||||||
donate=İanə Ver
|
donate=İanə Ver
|
||||||
color=Rəng
|
color=Rəng
|
||||||
sponsor=Sponsor
|
sponsor=Sponsor
|
||||||
@ -126,9 +126,9 @@ enterpriseEdition.ssoAdvert=Daha çox istifadəçi-idarəetmə xüsusiyyətləri
|
|||||||
#################
|
#################
|
||||||
# Analytics #
|
# Analytics #
|
||||||
#################
|
#################
|
||||||
analytics.title=Stirling PDF'i daha yaxşı etmək istəyirsinizmi?
|
analytics.title=Stirling PDF-i daha yaxşı etmək istəyirsinizmi?
|
||||||
analytics.paragraph1=Stirling PDF bizə məhsulu inkişaf etdirməyə kömək etmək üçün analitikaya üstünlük verib. Biz heç bir şəxsi məlumatı və ya fayl məzmununu izləmirik.
|
analytics.paragraph1=Stirling PDF bizə məhsulu inkişaf etdirməyə kömək etmək üçün analitikaya üstünlük verib. Biz heç bir şəxsi məlumatı və ya fayl məzmununu izləmirik.
|
||||||
analytics.paragraph2=Zəhmət olmasa, Stringling-PDF'ə inkişaf etməkdə və istifadəçilərimizi daha yaxşı anlamaqda yardım etmək üçün analitikanı aktivləşdirməyi nəzərə alın.
|
analytics.paragraph2=Zəhmət olmasa, Stringling-PDF-ə inkişaf etməkdə və istifadəçilərimizi daha yaxşı anlamaqda yardım etmək üçün analitikanı aktivləşdirməyi nəzərə alın.
|
||||||
analytics.enable=Analitikanı aktivləşdir
|
analytics.enable=Analitikanı aktivləşdir
|
||||||
analytics.disable=Analitikanı deaktivləşdir
|
analytics.disable=Analitikanı deaktivləşdir
|
||||||
analytics.settings=Analitikanın parametrlərini config/settings.yml faylından dəyişə bilərsiniz.
|
analytics.settings=Analitikanın parametrlərini config/settings.yml faylından dəyişə bilərsiniz.
|
||||||
@ -141,11 +141,11 @@ navbar.darkmode=Qaranlıq Tema
|
|||||||
navbar.language=Dillər
|
navbar.language=Dillər
|
||||||
navbar.settings=Parametrlər
|
navbar.settings=Parametrlər
|
||||||
navbar.allTools=Alətlər
|
navbar.allTools=Alətlər
|
||||||
navbar.multiTool=Çox Alət
|
navbar.multiTool=Multi-Alət
|
||||||
navbar.search=Axtar
|
navbar.search=Axtar
|
||||||
navbar.sections.organize=Təşkil et
|
navbar.sections.organize=Təşkil et
|
||||||
navbar.sections.convertTo=PDF'ə Çevir
|
navbar.sections.convertTo=PDF-ə Çevir
|
||||||
navbar.sections.convertFrom=PDF'dən Çevir
|
navbar.sections.convertFrom=PDF-dən Çevir
|
||||||
navbar.sections.security=İmza & Təhlükəsizlik
|
navbar.sections.security=İmza & Təhlükəsizlik
|
||||||
navbar.sections.advance=Qabaqcıl
|
navbar.sections.advance=Qabaqcıl
|
||||||
navbar.sections.edit=Bax & Redaktə et
|
navbar.sections.edit=Bax & Redaktə et
|
||||||
@ -171,11 +171,11 @@ settings.cacheInputs.help=Gələcək əməliyyatlar üçün əvvəllər istifad
|
|||||||
|
|
||||||
changeCreds.title=Məlumatları dəyişdirin
|
changeCreds.title=Məlumatları dəyişdirin
|
||||||
changeCreds.header=Hesab Məlumatlarınızı Yeniləyin
|
changeCreds.header=Hesab Məlumatlarınızı Yeniləyin
|
||||||
changeCreds.changePassword=Siz standart giriş məlumatlarından istifadə edirsiniz. Zəhmət olmasa, yeni şifrə daxil edin
|
changeCreds.changePassword=Siz standart giriş məlumatlarından istifadə edirsiniz. Zəhmət olmasa, yeni şifr daxil edin
|
||||||
changeCreds.newUsername=Yeni İstifadəçi Adı
|
changeCreds.newUsername=Yeni İstifadəçi Adı
|
||||||
changeCreds.oldPassword=Cari Şifrə
|
changeCreds.oldPassword=Cari Şifr
|
||||||
changeCreds.newPassword=Yeni Şifrə
|
changeCreds.newPassword=Yeni Şifr
|
||||||
changeCreds.confirmNewPassword=Yeni Şifrəni Təsdiqləyin
|
changeCreds.confirmNewPassword=Yeni Şifri Təsdiqləyin
|
||||||
changeCreds.submit=Dəyişiklikləri Təsdiqlə
|
changeCreds.submit=Dəyişiklikləri Təsdiqlə
|
||||||
|
|
||||||
|
|
||||||
@ -186,11 +186,11 @@ account.adminSettings=Admin Paramterləri - İstifadəçilər Əlavə Et və Onl
|
|||||||
account.userControlSettings=İstifadəçi İdarəetmə Parametrləri
|
account.userControlSettings=İstifadəçi İdarəetmə Parametrləri
|
||||||
account.changeUsername=İstifadəçi Adını Dəyiş
|
account.changeUsername=İstifadəçi Adını Dəyiş
|
||||||
account.newUsername=Yeni İstifadəçi Adı
|
account.newUsername=Yeni İstifadəçi Adı
|
||||||
account.password=Təsdiqləmə Şifrəsi
|
account.password=Təsdiqləmə Şifri
|
||||||
account.oldPassword=Keçmiş Şifrə
|
account.oldPassword=Keçmiş Şifr
|
||||||
account.newPassword=Yeni Şifrə
|
account.newPassword=Yeni Şifr
|
||||||
account.changePassword=Şifrəni Dəyiş
|
account.changePassword=Şifri Dəyiş
|
||||||
account.confirmNewPassword=Yeni Şifrəni Təsdiqlə
|
account.confirmNewPassword=Yeni Şifri Təsdiqlə
|
||||||
account.signOut=Çıxış
|
account.signOut=Çıxış
|
||||||
account.yourApiKey=Sizin API Açarınız
|
account.yourApiKey=Sizin API Açarınız
|
||||||
account.syncTitle=Brauzer parametrlərini hesabla sinxronlaşdırın
|
account.syncTitle=Brauzer parametrlərini hesabla sinxronlaşdırın
|
||||||
@ -543,7 +543,7 @@ login.title=Daxil olun
|
|||||||
login.header=Daxil olun
|
login.header=Daxil olun
|
||||||
login.signin=Daxil olun
|
login.signin=Daxil olun
|
||||||
login.rememberme=Məni xatırla
|
login.rememberme=Məni xatırla
|
||||||
login.invalid=Etibarsız istifadəçi adı və ya şifrə.
|
login.invalid=Etibarsız istifadəçi adı və ya şifr.
|
||||||
login.locked=Sizin hesabınız kilidlənmişdir.
|
login.locked=Sizin hesabınız kilidlənmişdir.
|
||||||
login.signinTitle=Zəhmət olmasa, daxil olun
|
login.signinTitle=Zəhmət olmasa, daxil olun
|
||||||
login.ssoSignIn=Single Sign-on vasitəsilə daxil olun
|
login.ssoSignIn=Single Sign-on vasitəsilə daxil olun
|
||||||
@ -581,8 +581,8 @@ showJS.submit=Göstər
|
|||||||
|
|
||||||
|
|
||||||
#pdfToSinglePage
|
#pdfToSinglePage
|
||||||
pdfToSinglePage.title=PDF'dən Tək Səhifəyə
|
pdfToSinglePage.title=PDF-dən Tək Səhifəyə
|
||||||
pdfToSinglePage.header=PDF'dən Tək Səhifəyə
|
pdfToSinglePage.header=PDF-dən Tək Səhifəyə
|
||||||
pdfToSinglePage.submit=Tək Səhifəyə Çevir
|
pdfToSinglePage.submit=Tək Səhifəyə Çevir
|
||||||
|
|
||||||
|
|
||||||
@ -601,8 +601,8 @@ getPdfInfo.downloadJson=JSON yüklə
|
|||||||
|
|
||||||
|
|
||||||
#markdown-to-pdf
|
#markdown-to-pdf
|
||||||
MarkdownToPDF.title=Markdown'dan PDF'ə
|
MarkdownToPDF.title=Markdown-dan PDF-ə
|
||||||
MarkdownToPDF.header=Markdown'dan PDF'ə
|
MarkdownToPDF.header=Markdown-dan PDF-ə
|
||||||
MarkdownToPDF.submit=Çevir
|
MarkdownToPDF.submit=Çevir
|
||||||
MarkdownToPDF.help=İş davam edir
|
MarkdownToPDF.help=İş davam edir
|
||||||
MarkdownToPDF.credit=WeasyPrint İstifadə Edir
|
MarkdownToPDF.credit=WeasyPrint İstifadə Edir
|
||||||
@ -617,8 +617,8 @@ URLToPDF.credit=WeasyPrint İstifadə Edir
|
|||||||
|
|
||||||
|
|
||||||
#html-to-pdf
|
#html-to-pdf
|
||||||
HTMLToPDF.title=HTML'dən PDF'ə
|
HTMLToPDF.title=HTML-dən PDF-ə
|
||||||
HTMLToPDF.header=HTML'dən PDF'ə
|
HTMLToPDF.header=HTML-dən PDF-ə
|
||||||
HTMLToPDF.help=HTML fayllarını və tərkibində mütləq html/css/images və s. olan ZIP fayllarını qəbul edir
|
HTMLToPDF.help=HTML fayllarını və tərkibində mütləq html/css/images və s. olan ZIP fayllarını qəbul edir
|
||||||
HTMLToPDF.submit=Çevir
|
HTMLToPDF.submit=Çevir
|
||||||
HTMLToPDF.credit=WeasyPrint İstifadə Edir
|
HTMLToPDF.credit=WeasyPrint İstifadə Edir
|
||||||
@ -656,14 +656,14 @@ AddStampRequest.submit=Təsdiqlə
|
|||||||
|
|
||||||
|
|
||||||
#sanitizePDF
|
#sanitizePDF
|
||||||
sanitizePDF.title=PDF'i Təmizlə
|
sanitizePDF.title=PDF-i Təmizlə
|
||||||
sanitizePDF.header=PDF Faylını Təmizlə
|
sanitizePDF.header=PDF Faylını Təmizlə
|
||||||
sanitizePDF.selectText.1=JavaScript Fəaliyyətlərini Sil
|
sanitizePDF.selectText.1=JavaScript Fəaliyyətlərini Sil
|
||||||
sanitizePDF.selectText.2=Daxil Edilmiş Faylları Sil
|
sanitizePDF.selectText.2=Daxil Edilmiş Faylları Sil
|
||||||
sanitizePDF.selectText.3=Metadatanı Sil
|
sanitizePDF.selectText.3=Metadatanı Sil
|
||||||
sanitizePDF.selectText.4=Linkləri Sil
|
sanitizePDF.selectText.4=Linkləri Sil
|
||||||
sanitizePDF.selectText.5=Şriftləri Sil
|
sanitizePDF.selectText.5=Şriftləri Sil
|
||||||
sanitizePDF.submit=PDF'i Təmizlə
|
sanitizePDF.submit=PDF-i Təmizlə
|
||||||
|
|
||||||
|
|
||||||
#addPageNumbers
|
#addPageNumbers
|
||||||
@ -683,7 +683,7 @@ addPageNumbers.submit=Səhifə Nömrələri əlavə edin
|
|||||||
|
|
||||||
#auto-rename
|
#auto-rename
|
||||||
auto-rename.title=Avtomatik Yenidən Adlandır
|
auto-rename.title=Avtomatik Yenidən Adlandır
|
||||||
auto-rename.header=Pdf'in Adını Avtomatik Yenidən Adlandır
|
auto-rename.header=Pdf-in Adını Avtomatik Yenidən Adlandır
|
||||||
auto-rename.submit=Avtomatik Yenidən Adlandır
|
auto-rename.submit=Avtomatik Yenidən Adlandır
|
||||||
|
|
||||||
|
|
||||||
@ -698,7 +698,7 @@ adjustContrast.download=Yüklə
|
|||||||
|
|
||||||
#crop
|
#crop
|
||||||
crop.title=Kəs
|
crop.title=Kəs
|
||||||
crop.header=Pdf'ləri Kəs
|
crop.header=Pdf-ləri Kəs
|
||||||
crop.submit=Təsdiq Et
|
crop.submit=Təsdiq Et
|
||||||
|
|
||||||
|
|
||||||
@ -722,8 +722,8 @@ pipeline.title=Pipeline
|
|||||||
|
|
||||||
|
|
||||||
#pageLayout
|
#pageLayout
|
||||||
pageLayout.title=Çoxsəhifəli Sxem
|
pageLayout.title=Çoxsəhifəli Tərtibat
|
||||||
pageLayout.header=Çoxsəhifəli Sxem
|
pageLayout.header=Çoxsəhifəli Tərtibat
|
||||||
pageLayout.pagesPerSheet=Vərəqdəki Səhifə Sayı:
|
pageLayout.pagesPerSheet=Vərəqdəki Səhifə Sayı:
|
||||||
pageLayout.addBorder=Çərçivə Əlavə Et
|
pageLayout.addBorder=Çərçivə Əlavə Et
|
||||||
pageLayout.submit=Təsdiq et
|
pageLayout.submit=Təsdiq et
|
||||||
@ -739,22 +739,22 @@ scalePages.submit=Təsdiq edin
|
|||||||
|
|
||||||
|
|
||||||
#certSign
|
#certSign
|
||||||
certSign.title=Certificate Signing
|
certSign.title=Sertifikatla İmzala
|
||||||
certSign.header=Sign a PDF with your certificate (Work in progress)
|
certSign.header=PDF-i Sertifikatınızla İmzalayın (İşlənilir)
|
||||||
certSign.selectPDF=Select a PDF File for Signing:
|
certSign.selectPDF=İmzalamaq üçün PDF Faylı seçin:
|
||||||
certSign.jksNote=Note: If your certificate type is not listed below, please convert it to a Java Keystore (.jks) file using the keytool command line tool. Then, choose the .jks file option below.
|
certSign.jksNote=Note: Əgər sertifikatınızın tipi aşağıda göstərilməyibsə, zəhmət olmasa "Keytool command line tool" istifadə edərək onu "Java Keystroke" (.jks) faylına çevirin. Sonra, aşağıdan .jks faylını seçin.
|
||||||
certSign.selectKey=Select Your Private Key File (PKCS#8 format, could be .pem or .der):
|
certSign.selectKey=Şəxsi Açar faylınızı seçin (PKCS#8 format, .pem və ya .der ola bilər):
|
||||||
certSign.selectCert=Select Your Certificate File (X.509 format, could be .pem or .der):
|
certSign.selectCert=Sertifikat faylınızı seçin (X.509 format, .pem və ya .der ola bilər):
|
||||||
certSign.selectP12=Select Your PKCS#12 Keystore File (.p12 or .pfx) (Optional, If provided, it should contain your private key and certificate):
|
certSign.selectP12=PKCS#12 Keystore Faylınızı seçin (.p12 və ya .pfx) (İstəyə bağlı, əgər təmin olunarsa, şəxsi açar və sertifikatınızı ehtiva etməlidir):
|
||||||
certSign.selectJKS=Select Your Java Keystore File (.jks or .keystore):
|
certSign.selectJKS=Java Keystore Faylınızı seçin (.jks və ya .keystore):
|
||||||
certSign.certType=Certificate Type
|
certSign.certType=Sertifikat Tipi
|
||||||
certSign.password=Enter Your Keystore or Private Key Password (If Any):
|
certSign.password=Keystore və ya Şəxsi Açar daxil edin (Əgər varsa):
|
||||||
certSign.showSig=Show Signature
|
certSign.showSig=İmzanı Göstər
|
||||||
certSign.reason=Reason
|
certSign.reason=Səbəb
|
||||||
certSign.location=Location
|
certSign.location=Məkan
|
||||||
certSign.name=Name
|
certSign.name=Ad
|
||||||
certSign.showLogo=Show Logo
|
certSign.showLogo=Loqonu Göstər
|
||||||
certSign.submit=Sign PDF
|
certSign.submit=PDF-i İmzala
|
||||||
|
|
||||||
|
|
||||||
#removeCertSign
|
#removeCertSign
|
||||||
@ -765,13 +765,13 @@ removeCertSign.submit=İmzanı silin
|
|||||||
|
|
||||||
|
|
||||||
#removeBlanks
|
#removeBlanks
|
||||||
removeBlanks.title=Remove Blanks
|
removeBlanks.title=Boş Səhifələri Sil
|
||||||
removeBlanks.header=Remove Blank Pages
|
removeBlanks.header=Boş SƏhifələri Silir
|
||||||
removeBlanks.threshold=Pixel Whiteness Threshold:
|
removeBlanks.threshold=Minimal Piksel Bəyazlığı:
|
||||||
removeBlanks.thresholdDesc=Threshold for determining how white a white pixel must be to be classed as 'White'. 0 = Black, 255 pure white.
|
removeBlanks.thresholdDesc=Pikselin "Ağ" hesab olunması üçün minimal nə qədər bəyaz olmalı olduğunu təyin edin. 0 = Qara, 255 Ağappaq.
|
||||||
removeBlanks.whitePercent=White Percent (%):
|
removeBlanks.whitePercent=Bəyaz Faizi (%):
|
||||||
removeBlanks.whitePercentDesc=Percent of page that must be 'white' pixels to be removed
|
removeBlanks.whitePercentDesc=Silinmək üçün səhifənin neçə faizi "ağ" piksellərdən təşkil olunmalıdır
|
||||||
removeBlanks.submit=Remove Blanks
|
removeBlanks.submit=Boş Səhifələri Sil
|
||||||
|
|
||||||
|
|
||||||
#removeAnnotations
|
#removeAnnotations
|
||||||
@ -781,16 +781,16 @@ removeAnnotations.submit=Sil
|
|||||||
|
|
||||||
|
|
||||||
#compare
|
#compare
|
||||||
compare.title=Compare
|
compare.title=Müqayisə Et
|
||||||
compare.header=Compare PDFs
|
compare.header=PDF-ləri Müqayisə Et
|
||||||
compare.highlightColor.1=Highlight Color 1:
|
compare.highlightColor.1=Önə Çıxarma Rəngi 1:
|
||||||
compare.highlightColor.2=Highlight Color 2:
|
compare.highlightColor.2=Önə Çıxarma Rəngi 2:
|
||||||
compare.document.1=Document 1
|
compare.document.1=Sənəd 1
|
||||||
compare.document.2=Document 2
|
compare.document.2=Sənəd 2
|
||||||
compare.submit=Compare
|
compare.submit=Müqayisə Et
|
||||||
compare.complex.message=One or both of the provided documents are large files, accuracy of comparison may be reduced
|
compare.complex.message=Fayllardan biri və ya ikisi də böyük fayldır. Müqayisə effektivliyi azala bilər.
|
||||||
compare.large.file.message=One or Both of the provided documents are too large to process
|
compare.large.file.message=Fayllardan biri və ya ikisi də işləmək üçün çox böyükdür.
|
||||||
compare.no.text.message=One or both of the selected PDFs have no text content. Please choose PDFs with text for comparison.
|
compare.no.text.message=Fayllardan birində və ya ikisində də mətn məzmunu yoxdur. Zəhmət olmasa, müqayisə üçün mətn məzmunlu PDF seçin.
|
||||||
|
|
||||||
#BookToPDF
|
#BookToPDF
|
||||||
BookToPDF.title=Kitabları və Komiksləri PDF-ə
|
BookToPDF.title=Kitabları və Komiksləri PDF-ə
|
||||||
@ -818,12 +818,12 @@ sign.save=İmzanı yadda Saxla
|
|||||||
sign.personalSigs=Şəxsi İmzalar
|
sign.personalSigs=Şəxsi İmzalar
|
||||||
sign.sharedSigs=Paylaşılan İmzalar
|
sign.sharedSigs=Paylaşılan İmzalar
|
||||||
sign.noSavedSigs=Saxlanmış imza tapılmadı
|
sign.noSavedSigs=Saxlanmış imza tapılmadı
|
||||||
sign.addToAll=Add to all pages
|
sign.addToAll=Bütün səhiflərə əlavə et
|
||||||
sign.delete=Delete
|
sign.delete=Sil
|
||||||
sign.first=First page
|
sign.first=İlk səhifə
|
||||||
sign.last=Last page
|
sign.last=Son səhifə
|
||||||
sign.next=Next page
|
sign.next=Növbəti səhifə
|
||||||
sign.previous=Previous page
|
sign.previous=Əvvəlki səhifə
|
||||||
|
|
||||||
#repair
|
#repair
|
||||||
repair.title=Bərpa Et
|
repair.title=Bərpa Et
|
||||||
@ -839,37 +839,37 @@ flatten.submit=Düzləşdirin
|
|||||||
|
|
||||||
|
|
||||||
#ScannerImageSplit
|
#ScannerImageSplit
|
||||||
ScannerImageSplit.selectText.1=Angle Threshold:
|
ScannerImageSplit.selectText.1=Bucaq Aşağı Limiti:
|
||||||
ScannerImageSplit.selectText.2=Sets the minimum absolute angle required for the image to be rotated (default: 10).
|
ScannerImageSplit.selectText.2=Şəklin fırladılması üçün lazım olan minimal mütləq bucağı təyin edir (defolt: 10).
|
||||||
ScannerImageSplit.selectText.3=Tolerance:
|
ScannerImageSplit.selectText.3=Rəng Toleransı:
|
||||||
ScannerImageSplit.selectText.4=Determines the range of color variation around the estimated background color (default: 30).
|
ScannerImageSplit.selectText.4=Təxmin olunan arxaplan rənginin ətrafındakı rəng fərqliliyi intervalını təyin edir (defolt: 30).
|
||||||
ScannerImageSplit.selectText.5=Minimum Area:
|
ScannerImageSplit.selectText.5=Minimal Sahə:
|
||||||
ScannerImageSplit.selectText.6=Sets the minimum area threshold for a photo (default: 10000).
|
ScannerImageSplit.selectText.6=Foto üçün minimal sahənin aşağı limitini təyin edir (defolt: 10000).
|
||||||
ScannerImageSplit.selectText.7=Minimum Contour Area:
|
ScannerImageSplit.selectText.7=Minimal Kontur Sahəsi:
|
||||||
ScannerImageSplit.selectText.8=Sets the minimum contour area threshold for a photo
|
ScannerImageSplit.selectText.8=Fotonun kontur sahəsi üçün minimal aşağı limiti təyin edir
|
||||||
ScannerImageSplit.selectText.9=Border Size:
|
ScannerImageSplit.selectText.9=Sərhəd Ölçüsü:
|
||||||
ScannerImageSplit.selectText.10=Sets the size of the border added and removed to prevent white borders in the output (default: 1).
|
ScannerImageSplit.selectText.10=Faylda ağ sərhədlərin olmasının qarşısını almaq üçün əlavə ediləcək sərhədin ölçüsünü təyin edir (defolt: 1).
|
||||||
ScannerImageSplit.info=Python is not installed. It is required to run.
|
ScannerImageSplit.info=Python yüklənməyib. İşə salmaq üçün Python lazımdır.
|
||||||
|
|
||||||
|
|
||||||
#OCR
|
#OCR
|
||||||
ocr.title=OCR / Scan Cleanup
|
ocr.title=OST (OCR) / Skan Təmizləmə
|
||||||
ocr.header=Cleanup Scans / OCR (Optical Character Recognition)
|
ocr.header=Skanları Təmizlə / OST (Optik Simvol Tanınması)
|
||||||
ocr.selectText.1=Select languages that are to be detected within the PDF (Ones listed are the ones currently detected):
|
ocr.selectText.1=PDF-də aşkar olunacaq dilləri seçin (Göstərilmiş dillər hazırda aşkar olunmuşlardır):
|
||||||
ocr.selectText.2=Produce text file containing OCR text alongside the OCR'ed PDF
|
ocr.selectText.2=OST-lənmiş PDF ilə yanaşı daxilində OST edilmiş mətn olan PDF yaradın
|
||||||
ocr.selectText.3=Correct pages were scanned at a skewed angle by rotating them back into place
|
ocr.selectText.3=Əyri skan olunmuş səhifələri yerinə fırladaraq düzəldin
|
||||||
ocr.selectText.4=Clean page so its less likely that OCR will find text in background noise. (No output change)
|
ocr.selectText.4=OST-in arxaplandakı artıq mətni aşkar etməsinin qarşısını almaq üçün səhifəni təmizləyin. (Çıxış dəyişmir)
|
||||||
ocr.selectText.5=Clean page so its less likely that OCR will find text in background noise, maintains cleanup in output.
|
ocr.selectText.5=OST-in arxaplandakı artıq mətni aşkar etməsinin qarşısını almaq üçün səhifəni təmizləyin, təmizləməni çıxışa verilən faylda saxlayır.
|
||||||
ocr.selectText.6=Ignores pages that have interactive text on them, only OCRs pages that are images
|
ocr.selectText.6=Üzərində interaktiv yazı olan səhifələri nəzərə almır, yalnız şəkil olan səhifələri OST edir.
|
||||||
ocr.selectText.7=Force OCR, will OCR Every page removing all original text elements
|
ocr.selectText.7=OST-ə məcbur et, bütün orijinal mətn elementlərini silərək hər səhifəni OST edir
|
||||||
ocr.selectText.8=Normal (Will error if PDF contains text)
|
ocr.selectText.8=Normal (PDF-də mətn varsa, xəta verəcək)
|
||||||
ocr.selectText.9=Additional Settings
|
ocr.selectText.9=Əlavə Parametrlər
|
||||||
ocr.selectText.10=OCR Mode
|
ocr.selectText.10=OST (OCR) Rejimi
|
||||||
ocr.selectText.11=Remove images after OCR (Removes ALL images, only useful if part of conversion step)
|
ocr.selectText.11=OST-dən sonra şəkilləri sil (BÜTÜN şəkilləri silir, ancaq çevirmə prosesinin bir hissəsi olduqda işə yarayır)
|
||||||
ocr.selectText.12=Render Type (Advanced)
|
ocr.selectText.12=Render Tipi (Qabaqcıl)
|
||||||
ocr.help=Please read this documentation on how to use this for other languages and/or use not in docker
|
ocr.help=Bunu digər dillər üçün necə istifadə etmək və/və ya docker-də istifadə etməmək üçün bu dokumentasiyanı oxuyun
|
||||||
ocr.credit=This service uses qpdf and Tesseract for OCR.
|
ocr.credit=Bu servis OST (OCR) üçün "OCRmyPDF" və "Tesseract" istifadə edir.
|
||||||
ocr.submit=Process PDF with OCR
|
ocr.submit=PDF-i OST ilə işlə
|
||||||
|
|
||||||
|
|
||||||
#extractImages
|
#extractImages
|
||||||
@ -890,15 +890,15 @@ fileToPDF.submit=PDF-ə Çevir
|
|||||||
|
|
||||||
|
|
||||||
#compress
|
#compress
|
||||||
compress.title=Compress
|
compress.title=Sıxışdır
|
||||||
compress.header=Compress PDF
|
compress.header=PDF-i Sıxışdır
|
||||||
compress.credit=This service uses qpdf for PDF Compress/Optimisation.
|
compress.credit=Bu servis PDF sıxışdırılması/Optimizasiyası üçün Ghostscript istifadə edir.
|
||||||
compress.selectText.1=Manual Mode - From 1 to 4
|
compress.selectText.1=Manual Mod - 1-dən 4-ə
|
||||||
compress.selectText.2=Optimization level:
|
compress.selectText.2=Optimizasiya səviyyəsi:
|
||||||
compress.selectText.3=4 (Terrible for text images)
|
compress.selectText.3=4 (Mətn şəkilləri üçün yaxşı deyil)
|
||||||
compress.selectText.4=Auto mode - Auto adjusts quality to get PDF to exact size
|
compress.selectText.4=Avto mod - PDF-in dəqiq ölçüsünü əldə etmək üçün keyfiyyəti avtomatik tənzimləyir
|
||||||
compress.selectText.5=Expected PDF Size (e.g. 25MB, 10.8MB, 25KB)
|
compress.selectText.5=Gözlənilən PDF Ölçüsü (məsələn, 25MB, 10.8MB, 25KB)
|
||||||
compress.submit=Compress
|
compress.submit=Sıxışdır
|
||||||
|
|
||||||
|
|
||||||
#Add image
|
#Add image
|
||||||
@ -919,35 +919,35 @@ merge.submit=Birləşdirin
|
|||||||
|
|
||||||
|
|
||||||
#pdfOrganiser
|
#pdfOrganiser
|
||||||
pdfOrganiser.title=Page Organiser
|
pdfOrganiser.title=Səhifə Tənzimləyicisi
|
||||||
pdfOrganiser.header=PDF Page Organiser
|
pdfOrganiser.header=PDF Səhifə Tənzimləyicisi
|
||||||
pdfOrganiser.submit=Rearrange Pages
|
pdfOrganiser.submit=Səhifələri Yenidən Təşkil Edin
|
||||||
pdfOrganiser.mode=Mode
|
pdfOrganiser.mode=Rejim
|
||||||
pdfOrganiser.mode.1=Custom Page Order
|
pdfOrganiser.mode.1=Fərdi Səhifə Düzülüşü
|
||||||
pdfOrganiser.mode.2=Reverse Order
|
pdfOrganiser.mode.2=Tərs Düzülüş
|
||||||
pdfOrganiser.mode.3=Duplex Sort
|
pdfOrganiser.mode.3=İkitərəfli Çeşidləmə
|
||||||
pdfOrganiser.mode.4=Booklet Sort
|
pdfOrganiser.mode.4=Kitabça Çeşidləmə
|
||||||
pdfOrganiser.mode.5=Side Stitch Booklet Sort
|
pdfOrganiser.mode.5=Yan Tikiş Kitabçasının Çeşidlənməsi
|
||||||
pdfOrganiser.mode.6=Odd-Even Split
|
pdfOrganiser.mode.6=Tək-Cüt Bölünmə
|
||||||
pdfOrganiser.mode.7=Remove First
|
pdfOrganiser.mode.7=Birincini Sil
|
||||||
pdfOrganiser.mode.8=Remove Last
|
pdfOrganiser.mode.8=Sonuncunu Sil
|
||||||
pdfOrganiser.mode.9=Remove First and Last
|
pdfOrganiser.mode.9=Birinci və Sonuncunu Sil
|
||||||
pdfOrganiser.mode.10=Odd-Even Merge
|
pdfOrganiser.mode.10=Tək-Cüt Birləşdirmə
|
||||||
pdfOrganiser.placeholder=(e.g. 1,3,2 or 4-8,2,10-12 or 2n-1)
|
pdfOrganiser.placeholder=(məs., 1,3,2 və ya 4-8,2,10-12 və ya 2n-1)
|
||||||
|
|
||||||
|
|
||||||
#multiTool
|
#multiTool
|
||||||
multiTool.title=PDF Multi Tool
|
multiTool.title=PDF Multi-Alət
|
||||||
multiTool.header=PDF Multi Tool
|
multiTool.header=PDF Multi-Alət
|
||||||
multiTool.uploadPrompts=File Name
|
multiTool.uploadPrompts=Fayl Adı
|
||||||
multiTool.selectAll=Select All
|
multiTool.selectAll=Hamısını Seç
|
||||||
multiTool.deselectAll=Deselect All
|
multiTool.deselectAll=Hamısını Seçməni Ləğv Et
|
||||||
multiTool.selectPages=Page Select
|
multiTool.selectPages=Səhifə Seçimi
|
||||||
multiTool.selectedPages=Selected Pages
|
multiTool.selectedPages=Seçilmiş Səhifələr
|
||||||
multiTool.page=Page
|
multiTool.page=Səhifə
|
||||||
multiTool.deleteSelected=Delete Selected
|
multiTool.deleteSelected=Seçilmişi Sil
|
||||||
multiTool.downloadAll=Export
|
multiTool.downloadAll=İxrac Et
|
||||||
multiTool.downloadSelected=Export Selected
|
multiTool.downloadSelected=Seçilmişi İxrac Et
|
||||||
|
|
||||||
multiTool.insertPageBreak=Insert Page Break
|
multiTool.insertPageBreak=Insert Page Break
|
||||||
multiTool.addFile=Add File
|
multiTool.addFile=Add File
|
||||||
@ -957,10 +957,12 @@ multiTool.split=Split
|
|||||||
multiTool.moveLeft=Move Left
|
multiTool.moveLeft=Move Left
|
||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Seçilmiş Səhifə(lər)
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=Bu xüsusiyyət bizim <a href="{0}">multi-alət səhifə</a>mizdə də mövcuddur. Əlavə xüsusiyyətlər və səhifə-səhifə interfeys üçün sınaqdan keçirin!
|
||||||
|
|
||||||
#view pdf
|
#view pdf
|
||||||
viewPdf.title=PDF-ə baxın
|
viewPdf.title=PDF-ə baxın
|
||||||
@ -982,32 +984,32 @@ rotate.submit=Fırladın
|
|||||||
|
|
||||||
|
|
||||||
#split-pdfs
|
#split-pdfs
|
||||||
split.title=Split PDF
|
split.title=PDF-i Bölün
|
||||||
split.header=Split PDF
|
split.header=PDF-i Bölün
|
||||||
split.desc.1=The numbers you select are the page number you wish to do a split on
|
split.desc.1=Seçdiyiniz Nömrələr Bölmək İstədiyiniz Səhifə Nömrəsidir
|
||||||
split.desc.2=As such selecting 1,3,7-9 would split a 10 page document into 6 separate PDFS with:
|
split.desc.2=Beləliklə, 1,3,7-9 Seçimi 10 Səhifəlik Sənədi 6 Ayrı PDF-ə Böləcək:
|
||||||
split.desc.3=Document #1: Page 1
|
split.desc.3=Sənəd #1: Səhifə 1
|
||||||
split.desc.4=Document #2: Page 2 and 3
|
split.desc.4=Sənəd #2: Səhifə 2 və 3
|
||||||
split.desc.5=Document #3: Page 4, 5, 6 and 7
|
split.desc.5=Sənəd #3: Səhifə 4, 5, 6 və 7
|
||||||
split.desc.6=Document #4: Page 8
|
split.desc.6=Sənəd #4: Səhifə 8
|
||||||
split.desc.7=Document #5: Page 9
|
split.desc.7=Sənəd #5: Səhifə 9
|
||||||
split.desc.8=Document #6: Page 10
|
split.desc.8=Sənəd #6: Səhifə 10
|
||||||
split.splitPages=Enter pages to split on:
|
split.splitPages=Bölünəcək Səhifələri Daxil Edin:
|
||||||
split.submit=Split
|
split.submit=Bölün
|
||||||
|
|
||||||
|
|
||||||
#merge
|
#merge
|
||||||
imageToPDF.title=Image to PDF
|
imageToPDF.title=Şəkli PDF-ə
|
||||||
imageToPDF.header=Image to PDF
|
imageToPDF.header=Şəkli PDF-ə
|
||||||
imageToPDF.submit=Convert
|
imageToPDF.submit=Çevir
|
||||||
imageToPDF.selectLabel=Image Fit Options
|
imageToPDF.selectLabel=Şəkil Uyğunluğu Seçimləri
|
||||||
imageToPDF.fillPage=Fill Page
|
imageToPDF.fillPage=Səhifəni Doldur
|
||||||
imageToPDF.fitDocumentToImage=Fit Page to Image
|
imageToPDF.fitDocumentToImage=Şəklə Uyğun Səhifə
|
||||||
imageToPDF.maintainAspectRatio=Maintain Aspect Ratios
|
imageToPDF.maintainAspectRatio=Aspekt Nisbətlərini Qoruyun
|
||||||
imageToPDF.selectText.2=Auto rotate PDF
|
imageToPDF.selectText.2=PDF-i Avtomatik Fırlat
|
||||||
imageToPDF.selectText.3=Multi file logic (Only enabled if working with multiple images)
|
imageToPDF.selectText.3=Çoxsaylı Fayl Məntiqi (Yalnız Birdən Çox Şəkil İlə İşləyərkən Aktivdir)
|
||||||
imageToPDF.selectText.4=Merge into single PDF
|
imageToPDF.selectText.4=Tək Bir PDF-ə Birləşdir
|
||||||
imageToPDF.selectText.5=Convert to separate PDFs
|
imageToPDF.selectText.5=Ayrı PDF-lərə Çevirin
|
||||||
|
|
||||||
|
|
||||||
#pdfToImage
|
#pdfToImage
|
||||||
@ -1026,97 +1028,97 @@ pdfToImage.info=Python Yüklü Deyil.WebP Çevirməsi Üçün Vacibdir
|
|||||||
|
|
||||||
|
|
||||||
#addPassword
|
#addPassword
|
||||||
addPassword.title=Add Password
|
addPassword.title=Şifr Əlavə Et
|
||||||
addPassword.header=Add password (Encrypt)
|
addPassword.header=Şifr Əlavə Et (Şifrləmə)
|
||||||
addPassword.selectText.1=Select PDF to encrypt
|
addPassword.selectText.1=Şifrlənəcək PDF-i seç
|
||||||
addPassword.selectText.2=User Password
|
addPassword.selectText.2=İstifadəçi Şifri
|
||||||
addPassword.selectText.3=Encryption Key Length
|
addPassword.selectText.3=Şifrləmə Açarı Uzunluğu
|
||||||
addPassword.selectText.4=Higher values are stronger, but lower values have better compatibility.
|
addPassword.selectText.4=Böyük dəyərlər daha güclüdür, lakin kiçik dəyərlərin uyğunluğu yüksəkdir.
|
||||||
addPassword.selectText.5=Permissions to set (Recommended to be used along with Owner password)
|
addPassword.selectText.5=Təyin olunacaq icazə (Sahib (Owner) Şifri ilə birgə istifadə olunması tövsiyə olunur.)
|
||||||
addPassword.selectText.6=Prevent assembly of document
|
addPassword.selectText.6=Sənədin strukturunun dəyişilməsinin qarşısını al
|
||||||
addPassword.selectText.7=Prevent content extraction
|
addPassword.selectText.7=Məzmun xaric edilməsinin qarşısını al
|
||||||
addPassword.selectText.8=Prevent extraction for accessibility
|
addPassword.selectText.8=Əlçatanlıq üçün xaricetmənin qarşısını al
|
||||||
addPassword.selectText.9=Prevent filling in form
|
addPassword.selectText.9=Anketin doldurulmasının qarşısını al
|
||||||
addPassword.selectText.10=Prevent modification
|
addPassword.selectText.10=Modifikasiyanın qarşısını al
|
||||||
addPassword.selectText.11=Prevent annotation modification
|
addPassword.selectText.11=Sitat modifikasiyasının qarşısını al
|
||||||
addPassword.selectText.12=Prevent printing
|
addPassword.selectText.12=Çap etmənin qarşısını al
|
||||||
addPassword.selectText.13=Prevent printing different formats
|
addPassword.selectText.13=Müxtəlif formatların çap edilməsinin qarşısını al
|
||||||
addPassword.selectText.14=Owner Password
|
addPassword.selectText.14=Sahib Şifri
|
||||||
addPassword.selectText.15=Restricts what can be done with the document once it is opened (Not supported by all readers)
|
addPassword.selectText.15=Sənəd açıldıqdan sonra onunla nə edilə biləcəyini limitləndir (Bütün oxuyucular dəstəkləmir)
|
||||||
addPassword.selectText.16=Restricts the opening of the document itself
|
addPassword.selectText.16=Sənədin özünün açılmağını limitləndirir
|
||||||
addPassword.submit=Encrypt
|
addPassword.submit=Şifrlə
|
||||||
|
|
||||||
|
|
||||||
#watermark
|
#watermark
|
||||||
watermark.title=Add Watermark
|
watermark.title=Watermark Əlavə Et
|
||||||
watermark.header=Add Watermark
|
watermark.header=Watermark Əlavə Et
|
||||||
watermark.selectText.1=Select PDF to add watermark to:
|
watermark.selectText.1=Watermark əlavə olunacaq PDF-i seç
|
||||||
watermark.selectText.2=Watermark Text:
|
watermark.selectText.2=Watermark Mətni:
|
||||||
watermark.selectText.3=Font Size:
|
watermark.selectText.3=Şrift Ölçüsü:
|
||||||
watermark.selectText.4=Rotation (0-360):
|
watermark.selectText.4=Fırlatma (0-360):
|
||||||
watermark.selectText.5=widthSpacer (Space between each watermark horizontally):
|
watermark.selectText.5=enBoşluq (Üfuqi olaraq watermark-lar arasındakı məsafə):
|
||||||
watermark.selectText.6=heightSpacer (Space between each watermark vertically):
|
watermark.selectText.6=uzunluqBoşluq (Şaquli olaraq watermark-lar arasındakı məsafə):
|
||||||
watermark.selectText.7=Opacity (0% - 100%):
|
watermark.selectText.7=Şəffaflıq (0% - 100%):
|
||||||
watermark.selectText.8=Watermark Type:
|
watermark.selectText.8=Watermark Tipi:
|
||||||
watermark.selectText.9=Watermark Image:
|
watermark.selectText.9=Watermark Şəkili:
|
||||||
watermark.selectText.10=Convert PDF to PDF-Image
|
watermark.selectText.10=PDF-i PDF-Şəkil-ə çevir
|
||||||
watermark.submit=Add Watermark
|
watermark.submit=Watermark Əlavə Et
|
||||||
watermark.type.1=Text
|
watermark.type.1=Mətn
|
||||||
watermark.type.2=Image
|
watermark.type.2=Şəkil
|
||||||
|
|
||||||
|
|
||||||
#Change permissions
|
#Change permissions
|
||||||
permissions.title=Change Permissions
|
permissions.title=İcazələri Dəyişdir
|
||||||
permissions.header=Change Permissions
|
permissions.header=İcazələri Dəyişdir
|
||||||
permissions.warning=Warning to have these permissions be unchangeable it is recommended to set them with a password via the add-password page
|
permissions.warning=Bu İcazələrin Dəyişməz Olması İlə Bağlı Xəbərdarlıq Edərək, Onları Parol Əlavə Et Səhifəsi Vasitəsilə Parolla Təyin Etmək Tövsiyə Olunur.
|
||||||
permissions.selectText.1=Select PDF to change permissions
|
permissions.selectText.1=İcazələri Dəyişdirmək Üçün PDF-i Seç
|
||||||
permissions.selectText.2=Permissions to set
|
permissions.selectText.2=Tənzimlənmiş İcazələr
|
||||||
permissions.selectText.3=Prevent assembly of document
|
permissions.selectText.3=Sənədin Yığılmasının Qarşısını Al
|
||||||
permissions.selectText.4=Prevent content extraction
|
permissions.selectText.4=Məzmunun Çıxarılmasının Qarşısını Al
|
||||||
permissions.selectText.5=Prevent extraction for accessibility
|
permissions.selectText.5=Əlçatanlıq Üçün Çıxarılmasının Qarşısını Alın
|
||||||
permissions.selectText.6=Prevent filling in form
|
permissions.selectText.6=Formanın Doldurulmasının Qarşısını Alır
|
||||||
permissions.selectText.7=Prevent modification
|
permissions.selectText.7=Modifikasiyanın Qarşısını Al
|
||||||
permissions.selectText.8=Prevent annotation modification
|
permissions.selectText.8=Annotasiyanın Dəyişdirilməsinin Qarşısını Almaq
|
||||||
permissions.selectText.9=Prevent printing
|
permissions.selectText.9=Çapın Qarşısını Al
|
||||||
permissions.selectText.10=Prevent printing different formats
|
permissions.selectText.10=Fərqli Formatlarda Çapın Qarşısını Al
|
||||||
permissions.submit=Change
|
permissions.submit=Dəyiş
|
||||||
|
|
||||||
|
|
||||||
#remove password
|
#remove password
|
||||||
removePassword.title=Remove password
|
removePassword.title=Şifri Sil
|
||||||
removePassword.header=Remove password (Decrypt)
|
removePassword.header=Şifri Sil (Deşifr)
|
||||||
removePassword.selectText.1=Select PDF to Decrypt
|
removePassword.selectText.1=Deşifr Üçün PDF-i Seç
|
||||||
removePassword.selectText.2=Password
|
removePassword.selectText.2=Şifr
|
||||||
removePassword.submit=Remove
|
removePassword.submit=Sil
|
||||||
|
|
||||||
|
|
||||||
#changeMetadata
|
#changeMetadata
|
||||||
changeMetadata.title=Change Metadata
|
changeMetadata.title=Metadata-nı Dəyiş
|
||||||
changeMetadata.header=Change Metadata
|
changeMetadata.header=Metadata-nı Dəyiş
|
||||||
changeMetadata.selectText.1=Please edit the variables you wish to change
|
changeMetadata.selectText.1=Dəyişmək istədiyiniz dəyişənləri redaktə edin
|
||||||
changeMetadata.selectText.2=Delete all metadata
|
changeMetadata.selectText.2=Bütün Metadata-nı Sil
|
||||||
changeMetadata.selectText.3=Show Custom Metadata:
|
changeMetadata.selectText.3=Fərdi Metadatanı göstərin:
|
||||||
changeMetadata.author=Author:
|
changeMetadata.author=Müəllif:
|
||||||
changeMetadata.creationDate=Creation Date (yyyy/MM/dd HH:mm:ss):
|
changeMetadata.creationDate=Yaradılma Tarixi (yyyy/MM/dd HH:mm:ss):
|
||||||
changeMetadata.creator=Creator:
|
changeMetadata.creator=Yaradıcı:
|
||||||
changeMetadata.keywords=Keywords:
|
changeMetadata.keywords=Açar Sözlər:
|
||||||
changeMetadata.modDate=Modification Date (yyyy/MM/dd HH:mm:ss):
|
changeMetadata.modDate=Dəyişiklik Tarixi (yyyy/MM/dd HH:mm:ss):
|
||||||
changeMetadata.producer=Producer:
|
changeMetadata.producer=İstehsalçı:
|
||||||
changeMetadata.subject=Subject:
|
changeMetadata.subject=Mövzu:
|
||||||
changeMetadata.trapped=Trapped:
|
changeMetadata.trapped=Tələ:
|
||||||
changeMetadata.selectText.4=Other Metadata:
|
changeMetadata.selectText.4=Digər Metadata:
|
||||||
changeMetadata.selectText.5=Add Custom Metadata Entry
|
changeMetadata.selectText.5=Xüsusi Metadata girişi əlavə edin
|
||||||
changeMetadata.submit=Change
|
changeMetadata.submit=Dəyiş
|
||||||
|
|
||||||
|
|
||||||
#pdfToPDFA
|
#pdfToPDFA
|
||||||
pdfToPDFA.title=PDF To PDF/A
|
pdfToPDFA.title=PDF-i PDF/A-ya
|
||||||
pdfToPDFA.header=PDF To PDF/A
|
pdfToPDFA.header=PDF-i PDF/A-ya
|
||||||
pdfToPDFA.credit=This service uses qpdf for PDF/A conversion
|
pdfToPDFA.credit=Bu Servis PDF/A Çevirmək Üçün ghostscript İşlədir
|
||||||
pdfToPDFA.submit=Convert
|
pdfToPDFA.submit=Çevir
|
||||||
pdfToPDFA.tip=Currently does not work for multiple inputs at once
|
pdfToPDFA.tip=Hazırda Birdən Çox Giriş Üçün İşləmir
|
||||||
pdfToPDFA.outputFormat=Output format
|
pdfToPDFA.outputFormat=Çıxış Formatı
|
||||||
pdfToPDFA.pdfWithDigitalSignature=The PDF contains a digital signature. This will be removed in the next step.
|
pdfToPDFA.pdfWithDigitalSignature=PDF Rəqəmsal İmza Ehtiva Edir.Bu, növbəti addımda silinəcək.
|
||||||
|
|
||||||
|
|
||||||
#PDFToWord
|
#PDFToWord
|
||||||
@ -1263,8 +1265,8 @@ splitByChapters.submit=PDF-i Ayır
|
|||||||
|
|
||||||
|
|
||||||
#release notes
|
#release notes
|
||||||
releases.footer=Releases
|
releases.footer=Buraxılışlar
|
||||||
releases.title=Release Notes
|
releases.title=Buraxılış Qeydləri
|
||||||
releases.header=Release Notes
|
releases.header=Buraxılış Qeydləri
|
||||||
releases.current.version=Current Release
|
releases.current.version=Hazırki Buraxılış
|
||||||
releases.note=Release notes are only available in English
|
releases.note=Buraxılış Qeydləri yalnız ingiliscə mövcuddur
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=Diese Funktion ist auch auf unserer <a href="{0}">PDF-Multitool-Seite</a> verfügbar. Probieren Sie sie aus, denn sie bietet eine verbesserte Benutzeroberfläche und zusätzliche Funktionen!
|
multiTool-advert.message=Diese Funktion ist auch auf unserer <a href="{0}">PDF-Multitool-Seite</a> verfügbar. Probieren Sie sie aus, denn sie bietet eine verbesserte Benutzeroberfläche und zusätzliche Funktionen!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Déplacer vers la gauche
|
|||||||
multiTool.moveRight=Déplacer vers la droite
|
multiTool.moveRight=Déplacer vers la droite
|
||||||
multiTool.delete=Supprimer
|
multiTool.delete=Supprimer
|
||||||
multiTool.dragDropMessage=Page(s) sélectionnées
|
multiTool.dragDropMessage=Page(s) sélectionnées
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=Cette fonctionnalité est aussi disponible dans la <a href="{0}">page de l'outil multifonction</a>. Allez-y pour une interface page par page améliorée et des fonctionnalités additionnelles !
|
multiTool-advert.message=Cette fonctionnalité est aussi disponible dans la <a href="{0}">page de l'outil multifonction</a>. Allez-y pour une interface page par page améliorée et des fonctionnalités additionnelles !
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Sposta a sinistra
|
|||||||
multiTool.moveRight=Sposta a destra
|
multiTool.moveRight=Sposta a destra
|
||||||
multiTool.delete=Elimina
|
multiTool.delete=Elimina
|
||||||
multiTool.dragDropMessage=Pagina(e) selezionata(e)
|
multiTool.dragDropMessage=Pagina(e) selezionata(e)
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=Questa funzione è disponibile anche nella nostra <a href="{0}">pagina multi-strumento</a>. Scoprila per un'interfaccia utente pagina per pagina migliorata e funzionalità aggiuntive!
|
multiTool-advert.message=Questa funzione è disponibile anche nella nostra <a href="{0}">pagina multi-strumento</a>. Scoprila per un'interfaccia utente pagina per pagina migliorata e funzionalità aggiuntive!
|
||||||
@ -1263,8 +1265,8 @@ splitByChapters.submit=Dividi PDF
|
|||||||
|
|
||||||
|
|
||||||
#release notes
|
#release notes
|
||||||
releases.footer=Releases
|
releases.footer=Rilasci
|
||||||
releases.title=Release Notes
|
releases.title=Note di rilascio
|
||||||
releases.header=Release Notes
|
releases.header=Note di rilascio
|
||||||
releases.current.version=Current Release
|
releases.current.version=Rilascio corrente
|
||||||
releases.note=Release notes are only available in English
|
releases.note=Le note di rilascio sono disponibili solo in inglese
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -958,6 +958,8 @@ multiTool.moveLeft=Move Left
|
|||||||
multiTool.moveRight=Move Right
|
multiTool.moveRight=Move Right
|
||||||
multiTool.delete=Delete
|
multiTool.delete=Delete
|
||||||
multiTool.dragDropMessage=Page(s) Selected
|
multiTool.dragDropMessage=Page(s) Selected
|
||||||
|
multiTool.undo=Undo
|
||||||
|
multiTool.redo=Redo
|
||||||
|
|
||||||
#multiTool-advert
|
#multiTool-advert
|
||||||
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
multiTool-advert.message=This feature is also available in our <a href="{0}">multi-tool page</a>. Check it out for enhanced page-by-page UI and additional features!
|
||||||
|
@ -87,7 +87,7 @@ function setupFileInput(chooser) {
|
|||||||
if (element instanceof HTMLInputElement && element.hasAttribute("multiple")) {
|
if (element instanceof HTMLInputElement && element.hasAttribute("multiple")) {
|
||||||
allFiles = isDragAndDrop ? allFiles : [... allFiles, ... element.files];
|
allFiles = isDragAndDrop ? allFiles : [... allFiles, ... element.files];
|
||||||
} else {
|
} else {
|
||||||
allFiles = isDragAndDrop ? allFiles : [element.files[0]];
|
allFiles = Array.from(isDragAndDrop ? allFiles : [element.files[0]]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!isDragAndDrop) {
|
if (!isDragAndDrop) {
|
||||||
|
@ -1,12 +1,20 @@
|
|||||||
|
import { DeletePageCommand } from "./commands/delete-page.js";
|
||||||
|
import { SelectPageCommand } from "./commands/select.js";
|
||||||
|
import { SplitFileCommand } from "./commands/split.js";
|
||||||
|
import { UndoManager } from "./UndoManager.js";
|
||||||
|
|
||||||
class PdfActionsManager {
|
class PdfActionsManager {
|
||||||
pageDirection;
|
pageDirection;
|
||||||
pagesContainer;
|
pagesContainer;
|
||||||
static selectedPages = []; // Static property shared across all instances
|
static selectedPages = []; // Static property shared across all instances
|
||||||
|
undoManager;
|
||||||
|
|
||||||
constructor(id) {
|
constructor(id, undoManager) {
|
||||||
this.pagesContainer = document.getElementById(id);
|
this.pagesContainer = document.getElementById(id);
|
||||||
this.pageDirection = document.documentElement.getAttribute("dir");
|
this.pageDirection = document.documentElement.getAttribute("dir");
|
||||||
|
|
||||||
|
this.undoManager = undoManager || new UndoManager();
|
||||||
|
|
||||||
var styleElement = document.createElement("link");
|
var styleElement = document.createElement("link");
|
||||||
styleElement.rel = "stylesheet";
|
styleElement.rel = "stylesheet";
|
||||||
styleElement.href = "css/pdfActions.css";
|
styleElement.href = "css/pdfActions.css";
|
||||||
@ -27,7 +35,8 @@ class PdfActionsManager {
|
|||||||
|
|
||||||
const sibling = imgContainer.previousSibling;
|
const sibling = imgContainer.previousSibling;
|
||||||
if (sibling) {
|
if (sibling) {
|
||||||
this.movePageTo(imgContainer, sibling, true);
|
let movePageCommand = this.movePageTo(imgContainer, sibling, true, true);
|
||||||
|
this._pushUndoClearRedo(movePageCommand);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -35,7 +44,12 @@ class PdfActionsManager {
|
|||||||
var imgContainer = this.getPageContainer(e.target);
|
var imgContainer = this.getPageContainer(e.target);
|
||||||
const sibling = imgContainer.nextSibling;
|
const sibling = imgContainer.nextSibling;
|
||||||
if (sibling) {
|
if (sibling) {
|
||||||
this.movePageTo(imgContainer, sibling.nextSibling, true);
|
let movePageCommand = this.movePageTo(
|
||||||
|
imgContainer,
|
||||||
|
sibling.nextSibling,
|
||||||
|
true
|
||||||
|
);
|
||||||
|
this._pushUndoClearRedo(movePageCommand);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -43,30 +57,27 @@ class PdfActionsManager {
|
|||||||
var imgContainer = this.getPageContainer(e.target);
|
var imgContainer = this.getPageContainer(e.target);
|
||||||
const img = imgContainer.querySelector("img");
|
const img = imgContainer.querySelector("img");
|
||||||
|
|
||||||
this.rotateElement(img, -90);
|
let rotateCommand = this.rotateElement(img, -90);
|
||||||
|
this._pushUndoClearRedo(rotateCommand);
|
||||||
}
|
}
|
||||||
|
|
||||||
rotateCWButtonCallback(e) {
|
rotateCWButtonCallback(e) {
|
||||||
var imgContainer = this.getPageContainer(e.target);
|
var imgContainer = this.getPageContainer(e.target);
|
||||||
const img = imgContainer.querySelector("img");
|
const img = imgContainer.querySelector("img");
|
||||||
|
|
||||||
this.rotateElement(img, 90);
|
let rotateCommand = this.rotateElement(img, 90);
|
||||||
|
this._pushUndoClearRedo(rotateCommand);
|
||||||
}
|
}
|
||||||
|
|
||||||
deletePageButtonCallback(e) {
|
deletePageButtonCallback(e) {
|
||||||
var imgContainer = this.getPageContainer(e.target);
|
let imgContainer = this.getPageContainer(e.target);
|
||||||
this.pagesContainer.removeChild(imgContainer);
|
let deletePageCommand = new DeletePageCommand(
|
||||||
if (this.pagesContainer.childElementCount === 0) {
|
imgContainer,
|
||||||
const filenameInput = document.getElementById("filename-input");
|
this.pagesContainer
|
||||||
const filenameParagraph = document.getElementById("filename");
|
);
|
||||||
const downloadBtn = document.getElementById("export-button");
|
deletePageCommand.execute();
|
||||||
|
|
||||||
filenameInput.disabled = true;
|
this._pushUndoClearRedo(deletePageCommand);
|
||||||
filenameInput.value = "";
|
|
||||||
filenameParagraph.innerText = "";
|
|
||||||
|
|
||||||
downloadBtn.disabled = true;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
insertFileButtonCallback(e) {
|
insertFileButtonCallback(e) {
|
||||||
@ -81,7 +92,15 @@ class PdfActionsManager {
|
|||||||
|
|
||||||
splitFileButtonCallback(e) {
|
splitFileButtonCallback(e) {
|
||||||
var imgContainer = this.getPageContainer(e.target);
|
var imgContainer = this.getPageContainer(e.target);
|
||||||
imgContainer.classList.toggle("split-before");
|
|
||||||
|
let splitFileCommand = new SplitFileCommand(imgContainer, "split-before");
|
||||||
|
splitFileCommand.execute();
|
||||||
|
|
||||||
|
this._pushUndoClearRedo(splitFileCommand);
|
||||||
|
}
|
||||||
|
|
||||||
|
_pushUndoClearRedo(command) {
|
||||||
|
this.undoManager.pushUndoClearRedo(command);
|
||||||
}
|
}
|
||||||
|
|
||||||
setActions({ movePageTo, addFiles, rotateElement }) {
|
setActions({ movePageTo, addFiles, rotateElement }) {
|
||||||
@ -159,25 +178,10 @@ class PdfActionsManager {
|
|||||||
|
|
||||||
selectCheckbox.onchange = () => {
|
selectCheckbox.onchange = () => {
|
||||||
const pageNumber = Array.from(div.parentNode.children).indexOf(div) + 1;
|
const pageNumber = Array.from(div.parentNode.children).indexOf(div) + 1;
|
||||||
if (selectCheckbox.checked) {
|
let selectPageCommand = new SelectPageCommand(pageNumber, selectCheckbox);
|
||||||
//adds to array of selected pages
|
selectPageCommand.execute();
|
||||||
window.selectedPages.push(pageNumber);
|
|
||||||
} else {
|
|
||||||
//remove page from selected pages array
|
|
||||||
const index = window.selectedPages.indexOf(pageNumber);
|
|
||||||
if (index !== -1) {
|
|
||||||
window.selectedPages.splice(index, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
if (window.selectedPages.length > 0 && !window.selectPage) {
|
this._pushUndoClearRedo(selectPageCommand);
|
||||||
window.toggleSelectPageVisibility();
|
|
||||||
}
|
|
||||||
if (window.selectedPages.length == 0 && window.selectPage) {
|
|
||||||
window.toggleSelectPageVisibility();
|
|
||||||
}
|
|
||||||
|
|
||||||
window.updateSelectedPagesDisplay();
|
|
||||||
};
|
};
|
||||||
|
|
||||||
const insertFileButtonContainer = document.createElement("div");
|
const insertFileButtonContainer = document.createElement("div");
|
||||||
|
@ -1,11 +1,18 @@
|
|||||||
|
import { MovePageUpCommand, MovePageDownCommand } from "./commands/move-page.js";
|
||||||
|
import { RemoveSelectedCommand } from "./commands/remove.js";
|
||||||
|
import { RotateAllCommand, RotateElementCommand } from "./commands/rotate.js";
|
||||||
|
import { SplitAllCommand } from "./commands/split.js";
|
||||||
|
import { UndoManager } from "./UndoManager.js";
|
||||||
|
|
||||||
class PdfContainer {
|
class PdfContainer {
|
||||||
fileName;
|
fileName;
|
||||||
pagesContainer;
|
pagesContainer;
|
||||||
pagesContainerWrapper;
|
pagesContainerWrapper;
|
||||||
pdfAdapters;
|
pdfAdapters;
|
||||||
downloadLink;
|
downloadLink;
|
||||||
|
undoManager;
|
||||||
|
|
||||||
constructor(id, wrapperId, pdfAdapters) {
|
constructor(id, wrapperId, pdfAdapters, undoManager) {
|
||||||
this.pagesContainer = document.getElementById(id);
|
this.pagesContainer = document.getElementById(id);
|
||||||
this.pagesContainerWrapper = document.getElementById(wrapperId);
|
this.pagesContainerWrapper = document.getElementById(wrapperId);
|
||||||
this.downloadLink = null;
|
this.downloadLink = null;
|
||||||
@ -31,6 +38,8 @@ class PdfContainer {
|
|||||||
this.removeAllElements = this.removeAllElements.bind(this);
|
this.removeAllElements = this.removeAllElements.bind(this);
|
||||||
this.resetPages = this.resetPages.bind(this);
|
this.resetPages = this.resetPages.bind(this);
|
||||||
|
|
||||||
|
this.undoManager = undoManager || new UndoManager();
|
||||||
|
|
||||||
this.pdfAdapters = pdfAdapters;
|
this.pdfAdapters = pdfAdapters;
|
||||||
|
|
||||||
this.pdfAdapters.forEach((adapter) => {
|
this.pdfAdapters.forEach((adapter) => {
|
||||||
@ -58,6 +67,33 @@ class PdfContainer {
|
|||||||
window.removeAllElements = this.removeAllElements;
|
window.removeAllElements = this.removeAllElements;
|
||||||
window.resetPages = this.resetPages;
|
window.resetPages = this.resetPages;
|
||||||
|
|
||||||
|
let undoBtn = document.getElementById('undo-btn');
|
||||||
|
let redoBtn = document.getElementById('redo-btn');
|
||||||
|
|
||||||
|
document.addEventListener('undo-manager-update', (e) => {
|
||||||
|
let canUndo = e.detail.canUndo;
|
||||||
|
let canRedo = e.detail.canRedo;
|
||||||
|
|
||||||
|
undoBtn.disabled = !canUndo;
|
||||||
|
redoBtn.disabled = !canRedo;
|
||||||
|
})
|
||||||
|
|
||||||
|
window.undo = () => {
|
||||||
|
if (undoManager.canUndo()) undoManager.undo();
|
||||||
|
else {
|
||||||
|
undoBtn.disabled = !undoManager.canUndo();
|
||||||
|
redoBtn.disabled = !undoManager.canRedo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
window.redo = () => {
|
||||||
|
if (undoManager.canRedo()) undoManager.redo();
|
||||||
|
else {
|
||||||
|
undoBtn.disabled = !undoManager.canUndo();
|
||||||
|
redoBtn.disabled = !undoManager.canRedo();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
const filenameInput = document.getElementById("filename-input");
|
const filenameInput = document.getElementById("filename-input");
|
||||||
const downloadBtn = document.getElementById("export-button");
|
const downloadBtn = document.getElementById("export-button");
|
||||||
|
|
||||||
@ -68,32 +104,28 @@ class PdfContainer {
|
|||||||
downloadBtn.disabled = true;
|
downloadBtn.disabled = true;
|
||||||
}
|
}
|
||||||
|
|
||||||
movePageTo(startElement, endElement, scrollTo = false) {
|
movePageTo(startElement, endElement, scrollTo = false, moveUp = false) {
|
||||||
const childArray = Array.from(this.pagesContainer.childNodes);
|
let movePageCommand;
|
||||||
const startIndex = childArray.indexOf(startElement);
|
if (moveUp) {
|
||||||
const endIndex = childArray.indexOf(endElement);
|
movePageCommand = new MovePageUpCommand(
|
||||||
|
startElement,
|
||||||
// Check & remove page number elements here too if they exist because Firefox doesn't fire the relevant event on page move.
|
endElement,
|
||||||
const pageNumberElement = startElement.querySelector(".page-number");
|
this.pagesContainer,
|
||||||
if (pageNumberElement) {
|
this.pagesContainerWrapper,
|
||||||
startElement.removeChild(pageNumberElement);
|
scrollTo
|
||||||
}
|
);
|
||||||
|
|
||||||
this.pagesContainer.removeChild(startElement);
|
|
||||||
if (!endElement) {
|
|
||||||
this.pagesContainer.append(startElement);
|
|
||||||
} else {
|
} else {
|
||||||
this.pagesContainer.insertBefore(startElement, endElement);
|
movePageCommand = new MovePageDownCommand(
|
||||||
|
startElement,
|
||||||
|
endElement,
|
||||||
|
this.pagesContainer,
|
||||||
|
this.pagesContainerWrapper,
|
||||||
|
scrollTo
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (scrollTo) {
|
movePageCommand.execute();
|
||||||
const { width } = startElement.getBoundingClientRect();
|
return movePageCommand;
|
||||||
const vector = endIndex !== -1 && startIndex > endIndex ? 0 - width : width;
|
|
||||||
|
|
||||||
this.pagesContainerWrapper.scroll({
|
|
||||||
left: this.pagesContainerWrapper.scrollLeft + vector,
|
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
addFiles(nextSiblingElement, blank = false) {
|
addFiles(nextSiblingElement, blank = false) {
|
||||||
@ -165,56 +197,22 @@ class PdfContainer {
|
|||||||
|
|
||||||
|
|
||||||
async addFilesBlank(nextSiblingElement) {
|
async addFilesBlank(nextSiblingElement) {
|
||||||
const pdfContent = `
|
let doc = await PDFLib.PDFDocument.create();
|
||||||
%PDF-1.4
|
let docBytes = await doc.save();
|
||||||
1 0 obj
|
|
||||||
<< /Type /Catalog /Pages 2 0 R >>
|
const url = URL.createObjectURL(new Blob([docBytes], { type: 'application/pdf' }));
|
||||||
endobj
|
|
||||||
2 0 obj
|
const renderer = await this.toRenderer(url);
|
||||||
<< /Type /Pages /Kids [3 0 R] /Count 1 >>
|
|
||||||
endobj
|
await this.addPdfFile(renderer, doc, nextSiblingElement);
|
||||||
3 0 obj
|
|
||||||
<< /Type /Page /Parent 2 0 R /MediaBox [0 0 595 842] /Contents 5 0 R >>
|
|
||||||
endobj
|
|
||||||
5 0 obj
|
|
||||||
<< /Length 44 >>
|
|
||||||
stream
|
|
||||||
0 0 0 595 0 842 re
|
|
||||||
W
|
|
||||||
n
|
|
||||||
endstream
|
|
||||||
endobj
|
|
||||||
xref
|
|
||||||
0 6
|
|
||||||
0000000000 65535 f
|
|
||||||
0000000010 00000 n
|
|
||||||
0000000071 00000 n
|
|
||||||
0000000121 00000 n
|
|
||||||
0000000205 00000 n
|
|
||||||
0000000400 00000 n
|
|
||||||
trailer
|
|
||||||
<< /Size 6 /Root 1 0 R >>
|
|
||||||
startxref
|
|
||||||
278
|
|
||||||
%%EOF
|
|
||||||
`;
|
|
||||||
const blob = new Blob([pdfContent], { type: 'application/pdf' });
|
|
||||||
const url = URL.createObjectURL(blob);
|
|
||||||
const file = new File([blob], "blank_page.pdf", { type: "application/pdf" });
|
|
||||||
await this.addPdfFile(file, nextSiblingElement);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
rotateElement(element, deg) {
|
rotateElement(element, deg) {
|
||||||
var lastTransform = element.style.rotate;
|
let rotateCommand = new RotateElementCommand(element, deg);
|
||||||
if (!lastTransform) {
|
rotateCommand.execute();
|
||||||
lastTransform = "0";
|
|
||||||
}
|
|
||||||
const lastAngle = parseInt(lastTransform.replace(/[^\d-]/g, ""));
|
|
||||||
const newAngle = lastAngle + deg;
|
|
||||||
|
|
||||||
element.style.rotate = newAngle + "deg";
|
|
||||||
|
|
||||||
|
return rotateCommand;
|
||||||
}
|
}
|
||||||
|
|
||||||
async addPdfFile(renderer, pdfDocument, nextSiblingElement) {
|
async addPdfFile(renderer, pdfDocument, nextSiblingElement) {
|
||||||
@ -309,6 +307,7 @@ class PdfContainer {
|
|||||||
}
|
}
|
||||||
|
|
||||||
rotateAll(deg) {
|
rotateAll(deg) {
|
||||||
|
let elementsToRotate = [];
|
||||||
for (let i = 0; i < this.pagesContainer.childNodes.length; i++) {
|
for (let i = 0; i < this.pagesContainer.childNodes.length; i++) {
|
||||||
const child = this.pagesContainer.children[i];
|
const child = this.pagesContainer.children[i];
|
||||||
if (!child) continue;
|
if (!child) continue;
|
||||||
@ -320,8 +319,13 @@ class PdfContainer {
|
|||||||
const img = child.querySelector("img");
|
const img = child.querySelector("img");
|
||||||
if (!img) continue;
|
if (!img) continue;
|
||||||
|
|
||||||
this.rotateElement(img, deg);
|
elementsToRotate.push(img);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
let rotateAllCommand = new RotateAllCommand(elementsToRotate, deg);
|
||||||
|
rotateAllCommand.execute();
|
||||||
|
|
||||||
|
this.undoManager.pushUndoClearRedo(rotateAllCommand);
|
||||||
}
|
}
|
||||||
|
|
||||||
removeAllElements(){
|
removeAllElements(){
|
||||||
@ -336,34 +340,13 @@ class PdfContainer {
|
|||||||
|
|
||||||
deleteSelected() {
|
deleteSelected() {
|
||||||
window.selectedPages.sort((a, b) => a - b);
|
window.selectedPages.sort((a, b) => a - b);
|
||||||
let deletions = 0;
|
let removeSelectedCommand = new RemoveSelectedCommand(
|
||||||
|
this.pagesContainer,
|
||||||
|
window.selectedPages,
|
||||||
|
this.updatePageNumbersAndCheckboxes
|
||||||
|
);
|
||||||
|
|
||||||
window.selectedPages.forEach((pageIndex) => {
|
this.undoManager.pushUndoClearRedo(removeSelectedCommand);
|
||||||
const adjustedIndex = pageIndex - 1 - deletions;
|
|
||||||
const child = this.pagesContainer.children[adjustedIndex];
|
|
||||||
if (child) {
|
|
||||||
this.pagesContainer.removeChild(child);
|
|
||||||
deletions++;
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
if (this.pagesContainer.childElementCount === 0) {
|
|
||||||
const filenameInput = document.getElementById("filename-input");
|
|
||||||
const filenameParagraph = document.getElementById("filename");
|
|
||||||
const downloadBtn = document.getElementById("export-button");
|
|
||||||
|
|
||||||
if (filenameInput)
|
|
||||||
filenameInput.disabled = true;
|
|
||||||
filenameInput.value = "";
|
|
||||||
if (filenameParagraph)
|
|
||||||
filenameParagraph.innerText = "";
|
|
||||||
|
|
||||||
downloadBtn.disabled = true;
|
|
||||||
}
|
|
||||||
|
|
||||||
window.selectedPages = [];
|
|
||||||
this.updatePageNumbersAndCheckboxes();
|
|
||||||
document.dispatchEvent(new Event("selectedPagesUpdated"));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
toggleSelectAll() {
|
toggleSelectAll() {
|
||||||
@ -531,33 +514,16 @@ class PdfContainer {
|
|||||||
|
|
||||||
splitAll() {
|
splitAll() {
|
||||||
const allPages = this.pagesContainer.querySelectorAll(".page-container");
|
const allPages = this.pagesContainer.querySelectorAll(".page-container");
|
||||||
|
let splitAllCommand = new SplitAllCommand(
|
||||||
|
allPages,
|
||||||
|
window.selectPage,
|
||||||
|
window.selectedPages,
|
||||||
|
"split-before"
|
||||||
|
);
|
||||||
|
splitAllCommand.execute();
|
||||||
|
|
||||||
if (!window.selectPage) {
|
this.undoManager.pushUndoClearRedo(splitAllCommand);
|
||||||
const hasSplit = this.pagesContainer.querySelectorAll(".split-before").length > 0;
|
|
||||||
if (hasSplit) {
|
|
||||||
allPages.forEach(page => {
|
|
||||||
page.classList.remove("split-before");
|
|
||||||
});
|
|
||||||
} else {
|
|
||||||
allPages.forEach(page => {
|
|
||||||
page.classList.add("split-before");
|
|
||||||
});
|
|
||||||
}
|
}
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
allPages.forEach((page, index) => {
|
|
||||||
const pageIndex = index;
|
|
||||||
if (window.selectPage && !window.selectedPages.includes(pageIndex)) return;
|
|
||||||
|
|
||||||
if (page.classList.contains("split-before")) {
|
|
||||||
page.classList.remove("split-before");
|
|
||||||
} else {
|
|
||||||
page.classList.add("split-before");
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
async splitPDF(baseDocBytes, splitters) {
|
async splitPDF(baseDocBytes, splitters) {
|
||||||
const baseDocument = await PDFLib.PDFDocument.load(baseDocBytes);
|
const baseDocument = await PDFLib.PDFDocument.load(baseDocBytes);
|
||||||
|
65
src/main/resources/static/js/multitool/UndoManager.js
Normal file
65
src/main/resources/static/js/multitool/UndoManager.js
Normal file
@ -0,0 +1,65 @@
|
|||||||
|
export class UndoManager {
|
||||||
|
_undoStack;
|
||||||
|
_redoStack;
|
||||||
|
|
||||||
|
constructor() {
|
||||||
|
this._undoStack = [];
|
||||||
|
this._redoStack = [];
|
||||||
|
}
|
||||||
|
|
||||||
|
pushUndo(command) {
|
||||||
|
this._undoStack.push(command);
|
||||||
|
this._dispatchStateChange();
|
||||||
|
}
|
||||||
|
|
||||||
|
pushRedo(command) {
|
||||||
|
this._redoStack.push(command);
|
||||||
|
this._dispatchStateChange();
|
||||||
|
}
|
||||||
|
|
||||||
|
pushUndoClearRedo(command) {
|
||||||
|
this._undoStack.push(command);
|
||||||
|
this._redoStack = [];
|
||||||
|
this._dispatchStateChange();
|
||||||
|
}
|
||||||
|
|
||||||
|
undo() {
|
||||||
|
if (!this.canUndo()) return;
|
||||||
|
|
||||||
|
let cmd = this._undoStack.pop();
|
||||||
|
cmd.undo();
|
||||||
|
|
||||||
|
this._redoStack.push(cmd);
|
||||||
|
this._dispatchStateChange();
|
||||||
|
}
|
||||||
|
|
||||||
|
canUndo() {
|
||||||
|
return this._undoStack && this._undoStack.length > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
redo() {
|
||||||
|
if (!this.canRedo()) return;
|
||||||
|
|
||||||
|
let cmd = this._redoStack.pop();
|
||||||
|
cmd.redo();
|
||||||
|
|
||||||
|
this._undoStack.push(cmd);
|
||||||
|
this._dispatchStateChange();
|
||||||
|
}
|
||||||
|
|
||||||
|
canRedo() {
|
||||||
|
return this._redoStack && this._redoStack.length > 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
_dispatchStateChange() {
|
||||||
|
document.dispatchEvent(
|
||||||
|
new CustomEvent("undo-manager-update", {
|
||||||
|
bubbles: true,
|
||||||
|
detail: {
|
||||||
|
canUndo: this.canUndo(),
|
||||||
|
canRedo: this.canRedo(),
|
||||||
|
},
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
@ -0,0 +1,5 @@
|
|||||||
|
export class Command {
|
||||||
|
execute() {}
|
||||||
|
undo() {}
|
||||||
|
redo() {}
|
||||||
|
}
|
@ -0,0 +1,74 @@
|
|||||||
|
import { Command } from "./command.js";
|
||||||
|
|
||||||
|
export class DeletePageCommand extends Command {
|
||||||
|
constructor(element, pagesContainer) {
|
||||||
|
super();
|
||||||
|
|
||||||
|
this.element = element;
|
||||||
|
this.pagesContainer = pagesContainer;
|
||||||
|
|
||||||
|
this.filenameInputValue = document.getElementById("filename-input").value;
|
||||||
|
|
||||||
|
const filenameParagraph = document.getElementById("filename");
|
||||||
|
this.filenameParagraphText = filenameParagraph ? filenameParagraph.innerText : "";
|
||||||
|
}
|
||||||
|
|
||||||
|
execute() {
|
||||||
|
this.nextSibling = this.element.nextSibling;
|
||||||
|
|
||||||
|
this.pagesContainer.removeChild(this.element);
|
||||||
|
if (this.pagesContainer.childElementCount === 0) {
|
||||||
|
const filenameInput = document.getElementById("filename-input");
|
||||||
|
const filenameParagraph = document.getElementById("filename");
|
||||||
|
const downloadBtn = document.getElementById("export-button");
|
||||||
|
|
||||||
|
filenameInput.disabled = true;
|
||||||
|
filenameInput.value = "";
|
||||||
|
filenameParagraph.innerText = "";
|
||||||
|
|
||||||
|
downloadBtn.disabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
undo() {
|
||||||
|
let node = this.nextSibling;
|
||||||
|
if (node) this.pagesContainer.insertBefore(this.element, node);
|
||||||
|
else this.pagesContainer.appendChild(this.element);
|
||||||
|
|
||||||
|
const pageNumberElement = this.element.querySelector(".page-number");
|
||||||
|
if (pageNumberElement) {
|
||||||
|
this.element.removeChild(pageNumberElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
const filenameInput = document.getElementById("filename-input");
|
||||||
|
const filenameParagraph = document.getElementById("filename");
|
||||||
|
const downloadBtn = document.getElementById("export-button");
|
||||||
|
|
||||||
|
filenameInput.disabled = false;
|
||||||
|
filenameInput.value = this.filenameInputValue;
|
||||||
|
if (this.filenameParagraph)
|
||||||
|
filenameParagraph.innerText = this.filenameParagraphText;
|
||||||
|
|
||||||
|
downloadBtn.disabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
redo() {
|
||||||
|
const pageNumberElement = this.element.querySelector(".page-number");
|
||||||
|
if (pageNumberElement) {
|
||||||
|
this.element.removeChild(pageNumberElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.pagesContainer.removeChild(this.element);
|
||||||
|
if (this.pagesContainer.childElementCount === 0) {
|
||||||
|
const filenameInput = document.getElementById("filename-input");
|
||||||
|
const filenameParagraph = document.getElementById("filename");
|
||||||
|
const downloadBtn = document.getElementById("export-button");
|
||||||
|
|
||||||
|
filenameInput.disabled = true;
|
||||||
|
filenameInput.value = "";
|
||||||
|
filenameParagraph.innerText = "";
|
||||||
|
|
||||||
|
downloadBtn.disabled = true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
133
src/main/resources/static/js/multitool/commands/move-page.js
Normal file
133
src/main/resources/static/js/multitool/commands/move-page.js
Normal file
@ -0,0 +1,133 @@
|
|||||||
|
import { Command } from "./command.js";
|
||||||
|
|
||||||
|
export class AbstractMovePageCommand extends Command {
|
||||||
|
constructor(
|
||||||
|
startElement,
|
||||||
|
endElement,
|
||||||
|
pagesContainer,
|
||||||
|
pagesContainerWrapper,
|
||||||
|
scrollTo = false
|
||||||
|
) {
|
||||||
|
super();
|
||||||
|
|
||||||
|
this.pagesContainer = pagesContainer;
|
||||||
|
const childArray = Array.from(this.pagesContainer.childNodes);
|
||||||
|
|
||||||
|
this.startIndex = childArray.indexOf(startElement);
|
||||||
|
this.endIndex = childArray.indexOf(endElement);
|
||||||
|
|
||||||
|
this.startElement = startElement;
|
||||||
|
this.endElement = endElement;
|
||||||
|
|
||||||
|
this.scrollTo = scrollTo;
|
||||||
|
this.pagesContainerWrapper = pagesContainerWrapper;
|
||||||
|
}
|
||||||
|
|
||||||
|
execute() {
|
||||||
|
// Check & remove page number elements here too if they exist because Firefox doesn't fire the relevant event on page move.
|
||||||
|
const pageNumberElement = this.startElement.querySelector(".page-number");
|
||||||
|
if (pageNumberElement) {
|
||||||
|
this.startElement.removeChild(pageNumberElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.pagesContainer.removeChild(this.startElement);
|
||||||
|
if (!this.endElement) {
|
||||||
|
this.pagesContainer.append(this.startElement);
|
||||||
|
} else {
|
||||||
|
this.pagesContainer.insertBefore(this.startElement, this.endElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.scrollTo) {
|
||||||
|
const { width } = this.startElement.getBoundingClientRect();
|
||||||
|
const vector =
|
||||||
|
this.endIndex !== -1 && this.startIndex > this.endIndex
|
||||||
|
? 0 - width
|
||||||
|
: width;
|
||||||
|
|
||||||
|
this.pagesContainerWrapper.scroll({
|
||||||
|
left: this.pagesContainerWrapper.scrollLeft + vector,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
undo() {
|
||||||
|
// Requires overriding in child classes
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
redo() {
|
||||||
|
this.execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class MovePageUpCommand extends AbstractMovePageCommand {
|
||||||
|
constructor(
|
||||||
|
startElement,
|
||||||
|
endElement,
|
||||||
|
pagesContainer,
|
||||||
|
pagesContainerWrapper,
|
||||||
|
scrollTo = false
|
||||||
|
) {
|
||||||
|
super(startElement, endElement, pagesContainer, pagesContainerWrapper, scrollTo);
|
||||||
|
}
|
||||||
|
|
||||||
|
undo() {
|
||||||
|
if (this.endElement) {
|
||||||
|
this.pagesContainer.removeChild(this.endElement);
|
||||||
|
this.startElement.insertAdjacentElement("beforebegin", this.endElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.scrollTo) {
|
||||||
|
const { width } = this.startElement.getBoundingClientRect();
|
||||||
|
const vector =
|
||||||
|
this.endIndex === -1 || this.startIndex <= this.endIndex
|
||||||
|
? 0 - width
|
||||||
|
: width;
|
||||||
|
|
||||||
|
this.pagesContainerWrapper.scroll({
|
||||||
|
left: this.pagesContainerWrapper.scrollLeft - vector,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
redo() {
|
||||||
|
this.execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class MovePageDownCommand extends AbstractMovePageCommand {
|
||||||
|
constructor(
|
||||||
|
startElement,
|
||||||
|
endElement,
|
||||||
|
pagesContainer,
|
||||||
|
pagesContainerWrapper,
|
||||||
|
scrollTo = false
|
||||||
|
) {
|
||||||
|
super(startElement, endElement, pagesContainer, pagesContainerWrapper, scrollTo);
|
||||||
|
}
|
||||||
|
|
||||||
|
undo() {
|
||||||
|
let previousElement = this.startElement.previousSibling;
|
||||||
|
|
||||||
|
if (this.startElement) {
|
||||||
|
this.pagesContainer.removeChild(this.startElement);
|
||||||
|
previousElement.insertAdjacentElement("beforebegin", this.startElement);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.scrollTo) {
|
||||||
|
const { width } = this.startElement.getBoundingClientRect();
|
||||||
|
const vector =
|
||||||
|
this.endIndex === -1 || this.startIndex <= this.endIndex
|
||||||
|
? 0 - width
|
||||||
|
: width;
|
||||||
|
|
||||||
|
this.pagesContainerWrapper.scroll({
|
||||||
|
left: this.pagesContainerWrapper.scrollLeft - vector,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
redo() {
|
||||||
|
this.execute();
|
||||||
|
}
|
||||||
|
}
|
101
src/main/resources/static/js/multitool/commands/remove.js
Normal file
101
src/main/resources/static/js/multitool/commands/remove.js
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
import { Command } from "./command.js";
|
||||||
|
|
||||||
|
export class RemoveSelectedCommand extends Command {
|
||||||
|
constructor(pagesContainer, selectedPages, updatePageNumbersAndCheckboxes) {
|
||||||
|
super();
|
||||||
|
this.pagesContainer = pagesContainer;
|
||||||
|
this.selectedPages = selectedPages;
|
||||||
|
|
||||||
|
this.deletedChildren = [];
|
||||||
|
|
||||||
|
if (updatePageNumbersAndCheckboxes) {
|
||||||
|
this.updatePageNumbersAndCheckboxes = updatePageNumbersAndCheckboxes;
|
||||||
|
} else {
|
||||||
|
const pageDivs = document.querySelectorAll(".pdf-actions_container");
|
||||||
|
|
||||||
|
pageDivs.forEach((div, index) => {
|
||||||
|
const pageNumber = index + 1;
|
||||||
|
const checkbox = div.querySelector(".pdf-actions_checkbox");
|
||||||
|
checkbox.id = `selectPageCheckbox-${pageNumber}`;
|
||||||
|
checkbox.setAttribute("data-page-number", pageNumber);
|
||||||
|
checkbox.checked = window.selectedPages.includes(pageNumber);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
const filenameInput = document.getElementById("filename-input");
|
||||||
|
const filenameParagraph = document.getElementById("filename");
|
||||||
|
|
||||||
|
this.originalFilenameInputValue = filenameInput ? filenameInput.value : "";
|
||||||
|
if (filenameParagraph)
|
||||||
|
this.originalFilenameParagraphText = filenameParagraph.innerText;
|
||||||
|
}
|
||||||
|
|
||||||
|
execute() {
|
||||||
|
let deletions = 0;
|
||||||
|
|
||||||
|
this.selectedPages.forEach((pageIndex) => {
|
||||||
|
const adjustedIndex = pageIndex - 1 - deletions;
|
||||||
|
const child = this.pagesContainer.children[adjustedIndex];
|
||||||
|
if (child) {
|
||||||
|
this.pagesContainer.removeChild(child);
|
||||||
|
deletions++;
|
||||||
|
|
||||||
|
this.deletedChildren.push({
|
||||||
|
idx: adjustedIndex,
|
||||||
|
childNode: child,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
if (this.pagesContainer.childElementCount === 0) {
|
||||||
|
const filenameInput = document.getElementById("filename-input");
|
||||||
|
const filenameParagraph = document.getElementById("filename");
|
||||||
|
const downloadBtn = document.getElementById("export-button");
|
||||||
|
|
||||||
|
if (filenameInput) filenameInput.disabled = true;
|
||||||
|
filenameInput.value = "";
|
||||||
|
if (filenameParagraph) filenameParagraph.innerText = "";
|
||||||
|
|
||||||
|
downloadBtn.disabled = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.selectedPages = [];
|
||||||
|
this.updatePageNumbersAndCheckboxes();
|
||||||
|
document.dispatchEvent(new Event("selectedPagesUpdated"));
|
||||||
|
}
|
||||||
|
|
||||||
|
undo() {
|
||||||
|
while (this.deletedChildren.length > 0) {
|
||||||
|
let deletedChild = this.deletedChildren.pop();
|
||||||
|
if (this.pagesContainer.children.length <= deletedChild.idx)
|
||||||
|
this.pagesContainer.appendChild(deletedChild.childNode);
|
||||||
|
else {
|
||||||
|
this.pagesContainer.insertBefore(
|
||||||
|
deletedChild.childNode,
|
||||||
|
this.pagesContainer.children[deletedChild.idx]
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this.pagesContainer.childElementCount > 0) {
|
||||||
|
const filenameInput = document.getElementById("filename-input");
|
||||||
|
const filenameParagraph = document.getElementById("filename");
|
||||||
|
const downloadBtn = document.getElementById("export-button");
|
||||||
|
|
||||||
|
if (filenameInput) filenameInput.disabled = false;
|
||||||
|
filenameInput.value = this.originalFilenameInputValue;
|
||||||
|
if (filenameParagraph)
|
||||||
|
filenameParagraph.innerText = this.originalFilenameParagraphText;
|
||||||
|
|
||||||
|
downloadBtn.disabled = false;
|
||||||
|
}
|
||||||
|
|
||||||
|
window.selectedPages = this.selectedPages;
|
||||||
|
this.updatePageNumbersAndCheckboxes();
|
||||||
|
document.dispatchEvent(new Event("selectedPagesUpdated"));
|
||||||
|
}
|
||||||
|
|
||||||
|
redo() {
|
||||||
|
this.execute();
|
||||||
|
}
|
||||||
|
}
|
74
src/main/resources/static/js/multitool/commands/rotate.js
Normal file
74
src/main/resources/static/js/multitool/commands/rotate.js
Normal file
@ -0,0 +1,74 @@
|
|||||||
|
import { Command } from "./command.js";
|
||||||
|
|
||||||
|
export class RotateElementCommand extends Command {
|
||||||
|
constructor(element, degree) {
|
||||||
|
super();
|
||||||
|
this.element = element;
|
||||||
|
this.degree = degree;
|
||||||
|
}
|
||||||
|
|
||||||
|
execute() {
|
||||||
|
let lastTransform = this.element.style.rotate;
|
||||||
|
if (!lastTransform) {
|
||||||
|
lastTransform = "0";
|
||||||
|
}
|
||||||
|
const lastAngle = parseInt(lastTransform.replace(/[^\d-]/g, ""));
|
||||||
|
const newAngle = lastAngle + parseInt(this.degree);
|
||||||
|
|
||||||
|
this.element.style.rotate = newAngle + "deg";
|
||||||
|
}
|
||||||
|
|
||||||
|
undo() {
|
||||||
|
let lastTransform = this.element.style.rotate;
|
||||||
|
if (!lastTransform) {
|
||||||
|
lastTransform = "0";
|
||||||
|
}
|
||||||
|
|
||||||
|
const currentAngle = parseInt(lastTransform.replace(/[^\d-]/g, ""));
|
||||||
|
const undoAngle = currentAngle + -parseInt(this.degree);
|
||||||
|
|
||||||
|
this.element.style.rotate = undoAngle + "deg";
|
||||||
|
}
|
||||||
|
|
||||||
|
redo() {
|
||||||
|
this.execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class RotateAllCommand extends Command {
|
||||||
|
constructor(elements, degree) {
|
||||||
|
super();
|
||||||
|
this.elements = elements;
|
||||||
|
this.degree = degree;
|
||||||
|
}
|
||||||
|
|
||||||
|
execute() {
|
||||||
|
for (let element of this.elements) {
|
||||||
|
let lastTransform = element.style.rotate;
|
||||||
|
if (!lastTransform) {
|
||||||
|
lastTransform = "0";
|
||||||
|
}
|
||||||
|
const lastAngle = parseInt(lastTransform.replace(/[^\d-]/g, ""));
|
||||||
|
const newAngle = lastAngle + this.degree;
|
||||||
|
|
||||||
|
element.style.rotate = newAngle + "deg";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
undo() {
|
||||||
|
for (let element of this.elements) {
|
||||||
|
let lastTransform = element.style.rotate;
|
||||||
|
if (!lastTransform) {
|
||||||
|
lastTransform = "0";
|
||||||
|
}
|
||||||
|
const currentAngle = parseInt(lastTransform.replace(/[^\d-]/g, ""));
|
||||||
|
const undoAngle = currentAngle + -this.degree;
|
||||||
|
|
||||||
|
element.style.rotate = undoAngle + "deg";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
redo() {
|
||||||
|
this.execute();
|
||||||
|
}
|
||||||
|
}
|
59
src/main/resources/static/js/multitool/commands/select.js
Normal file
59
src/main/resources/static/js/multitool/commands/select.js
Normal file
@ -0,0 +1,59 @@
|
|||||||
|
import { Command } from "./command.js";
|
||||||
|
|
||||||
|
export class SelectPageCommand extends Command {
|
||||||
|
constructor(pageNumber, checkbox) {
|
||||||
|
super();
|
||||||
|
this.pageNumber = pageNumber;
|
||||||
|
this.selectCheckbox = checkbox;
|
||||||
|
}
|
||||||
|
|
||||||
|
execute() {
|
||||||
|
if (this.selectCheckbox.checked) {
|
||||||
|
//adds to array of selected pages
|
||||||
|
window.selectedPages.push(this.pageNumber);
|
||||||
|
} else {
|
||||||
|
//remove page from selected pages array
|
||||||
|
const index = window.selectedPages.indexOf(this.pageNumber);
|
||||||
|
if (index !== -1) {
|
||||||
|
window.selectedPages.splice(index, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window.selectedPages.length > 0 && !window.selectPage) {
|
||||||
|
window.toggleSelectPageVisibility();
|
||||||
|
}
|
||||||
|
if (window.selectedPages.length == 0 && window.selectPage) {
|
||||||
|
window.toggleSelectPageVisibility();
|
||||||
|
}
|
||||||
|
|
||||||
|
window.updateSelectedPagesDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
undo() {
|
||||||
|
this.selectCheckbox.checked = !this.selectCheckbox.checked;
|
||||||
|
if (this.selectCheckbox.checked) {
|
||||||
|
//adds to array of selected pages
|
||||||
|
window.selectedPages.push(this.pageNumber);
|
||||||
|
} else {
|
||||||
|
//remove page from selected pages array
|
||||||
|
const index = window.selectedPages.indexOf(this.pageNumber);
|
||||||
|
if (index !== -1) {
|
||||||
|
window.selectedPages.splice(index, 1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (window.selectedPages.length > 0 && !window.selectPage) {
|
||||||
|
window.toggleSelectPageVisibility();
|
||||||
|
}
|
||||||
|
if (window.selectedPages.length == 0 && window.selectPage) {
|
||||||
|
window.toggleSelectPageVisibility();
|
||||||
|
}
|
||||||
|
|
||||||
|
window.updateSelectedPagesDisplay();
|
||||||
|
}
|
||||||
|
|
||||||
|
redo() {
|
||||||
|
this.selectCheckbox.checked = !this.selectCheckbox.checked;
|
||||||
|
this.execute();
|
||||||
|
}
|
||||||
|
}
|
101
src/main/resources/static/js/multitool/commands/split.js
Normal file
101
src/main/resources/static/js/multitool/commands/split.js
Normal file
@ -0,0 +1,101 @@
|
|||||||
|
import { Command } from "./command.js";
|
||||||
|
|
||||||
|
export class SplitFileCommand extends Command {
|
||||||
|
constructor(element, splitClass) {
|
||||||
|
super();
|
||||||
|
this.element = element;
|
||||||
|
this.splitClass = splitClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
execute() {
|
||||||
|
this.element.classList.toggle(this.splitClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
undo() {
|
||||||
|
this.element.classList.toggle(this.splitClass);
|
||||||
|
}
|
||||||
|
|
||||||
|
redo() {
|
||||||
|
this.execute();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export class SplitAllCommand extends Command {
|
||||||
|
constructor(elements, isSelectedInWindow, selectedPages, splitClass) {
|
||||||
|
super();
|
||||||
|
this.elements = elements;
|
||||||
|
this.isSelectedInWindow = isSelectedInWindow;
|
||||||
|
this.selectedPages = selectedPages;
|
||||||
|
this.splitClass = splitClass;
|
||||||
|
}
|
||||||
|
|
||||||
|
execute() {
|
||||||
|
if (!this.isSelectedInWindow) {
|
||||||
|
const hasSplit = this._hasSplit(this.elements, this.splitClass);
|
||||||
|
if (hasSplit) {
|
||||||
|
this.elements.forEach((page) => {
|
||||||
|
page.classList.remove(this.splitClass);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.elements.forEach((page) => {
|
||||||
|
page.classList.add(this.splitClass);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.elements.forEach((page, index) => {
|
||||||
|
const pageIndex = index;
|
||||||
|
if (this.isSelectedInWindow && !this.selectedPages.includes(pageIndex))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (page.classList.contains(this.splitClass)) {
|
||||||
|
page.classList.remove(this.splitClass);
|
||||||
|
} else {
|
||||||
|
page.classList.add(this.splitClass);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
_hasSplit() {
|
||||||
|
if (!this.elements || this.elements.length == 0) return false;
|
||||||
|
|
||||||
|
for (const node of this.elements) {
|
||||||
|
if (node.classList.contains(this.splitClass)) return true;
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
undo() {
|
||||||
|
if (!this.isSelectedInWindow) {
|
||||||
|
const hasSplit = this._hasSplit(this.elements, this.splitClass);
|
||||||
|
if (hasSplit) {
|
||||||
|
this.elements.forEach((page) => {
|
||||||
|
page.classList.remove(this.splitClass);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
this.elements.forEach((page) => {
|
||||||
|
page.classList.add(this.splitClass);
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
this.elements.forEach((page, index) => {
|
||||||
|
const pageIndex = index;
|
||||||
|
if (this.isSelectedInWindow && !this.selectedPages.includes(pageIndex))
|
||||||
|
return;
|
||||||
|
|
||||||
|
if (page.classList.contains(this.splitClass)) {
|
||||||
|
page.classList.remove(this.splitClass);
|
||||||
|
} else {
|
||||||
|
page.classList.add(this.splitClass);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
redo() {
|
||||||
|
this.execute();
|
||||||
|
}
|
||||||
|
}
|
@ -57,6 +57,27 @@
|
|||||||
</span>
|
</span>
|
||||||
<span class="btn-tooltip" th:text="#{multiTool.insertPageBreak}"></span>
|
<span class="btn-tooltip" th:text="#{multiTool.insertPageBreak}"></span>
|
||||||
</button>
|
</button>
|
||||||
|
<button id="undo-btn" class="btn btn-secondary" onclick="undo()" disabled>
|
||||||
|
<span class="material-symbols-rounded">
|
||||||
|
undo
|
||||||
|
</span>
|
||||||
|
<span class="btn-tooltip">
|
||||||
|
<div th:text="#{multiTool.undo}"></div>
|
||||||
|
<div class="text-uppercase" th:text="'(CTRL + Z)'"></div>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
|
||||||
|
<button id="redo-btn" class="btn btn-secondary" onclick="redo()" disabled>
|
||||||
|
<span class="material-symbols-rounded">
|
||||||
|
redo
|
||||||
|
</span>
|
||||||
|
<span class="btn-tooltip">
|
||||||
|
<div th:text="#{multiTool.redo}"></div>
|
||||||
|
<div class="text-uppercase" th:text="'(CTRL + Y)'"></div>
|
||||||
|
</span>
|
||||||
|
</button>
|
||||||
|
</button>
|
||||||
|
|
||||||
<button id="select-pages-container" class="btn btn-secondary enable-on-file"
|
<button id="select-pages-container" class="btn btn-secondary enable-on-file"
|
||||||
onclick="toggleSelectPageVisibility()" disabled>
|
onclick="toggleSelectPageVisibility()" disabled>
|
||||||
<span id="select-pages-button" class="material-symbols-rounded">
|
<span id="select-pages-button" class="material-symbols-rounded">
|
||||||
@ -139,7 +160,9 @@
|
|||||||
split: '[[#{multiTool.split}]]',
|
split: '[[#{multiTool.split}]]',
|
||||||
addFile: '[[#{multiTool.addFile}]]',
|
addFile: '[[#{multiTool.addFile}]]',
|
||||||
insertPageBreak:'[[#{multiTool.insertPageBreak}]]',
|
insertPageBreak:'[[#{multiTool.insertPageBreak}]]',
|
||||||
dragDropMessage:'[[#{multiTool.dragDropMessage}]]'
|
dragDropMessage:'[[#{multiTool.dragDropMessage}]]',
|
||||||
|
undo: '[[#{multiTool.undo}]]',
|
||||||
|
redo: '[[#{multiTool.redo}]]'
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
@ -155,17 +178,20 @@
|
|||||||
});
|
});
|
||||||
</script>
|
</script>
|
||||||
<script type="module">
|
<script type="module">
|
||||||
|
import { UndoManager } from './js/multitool/UndoManager.js';
|
||||||
import PdfContainer from './js/multitool/PdfContainer.js';
|
import PdfContainer from './js/multitool/PdfContainer.js';
|
||||||
import DragDropManager from "./js/multitool/DragDropManager.js";
|
import DragDropManager from "./js/multitool/DragDropManager.js";
|
||||||
import ImageHighlighter from "./js/multitool/ImageHighlighter.js";
|
import ImageHighlighter from "./js/multitool/ImageHighlighter.js";
|
||||||
import PdfActionsManager from './js/multitool/PdfActionsManager.js';
|
import PdfActionsManager from './js/multitool/PdfActionsManager.js';
|
||||||
import FileDragManager from './js/multitool/fileInput.js';
|
import FileDragManager from './js/multitool/fileInput.js';
|
||||||
// enables drag and drop
|
// enables drag and drop
|
||||||
|
|
||||||
|
var undoManager = new UndoManager();
|
||||||
const dragDropManager = new DragDropManager('drag-container', 'pages-container');
|
const dragDropManager = new DragDropManager('drag-container', 'pages-container');
|
||||||
// enables image highlight on click
|
// enables image highlight on click
|
||||||
const imageHighlighter = new ImageHighlighter('image-highlighter');
|
const imageHighlighter = new ImageHighlighter('image-highlighter');
|
||||||
// enables the default action buttons on each file
|
// enables the default action buttons on each file
|
||||||
const pdfActionsManager = new PdfActionsManager('pages-container');
|
const pdfActionsManager = new PdfActionsManager('pages-container', undoManager);
|
||||||
const fileDragManager = new FileDragManager();
|
const fileDragManager = new FileDragManager();
|
||||||
// Scroll the wrapper horizontally
|
// Scroll the wrapper horizontally
|
||||||
|
|
||||||
@ -178,10 +204,23 @@
|
|||||||
imageHighlighter,
|
imageHighlighter,
|
||||||
pdfActionsManager,
|
pdfActionsManager,
|
||||||
fileDragManager
|
fileDragManager
|
||||||
]
|
],
|
||||||
|
undoManager
|
||||||
)
|
)
|
||||||
|
|
||||||
fileDragManager.setCallback(async (files) => pdfContainer.addFilesFromFiles(files));
|
fileDragManager.setCallback(async (files) => pdfContainer.addFilesFromFiles(files));
|
||||||
|
document.addEventListener('keydown', function(event) {
|
||||||
|
let targetElementId = event.target.id;
|
||||||
|
|
||||||
|
// To avoid undoing/redoing the page when the user is simply undoing/redoing text
|
||||||
|
const isFilenameInputField = (targetElementId === 'filename-input') && (event.target === document.activeElement);
|
||||||
|
|
||||||
|
const isUndo = (event.ctrlKey && event.key === 'z');
|
||||||
|
const isRedo = (event.ctrlKey && event.key == 'y');
|
||||||
|
if (isUndo && !isFilenameInputField)
|
||||||
|
undoManager.undo();
|
||||||
|
else if (isRedo && !isFilenameInputField) undoManager.redo();
|
||||||
|
});
|
||||||
</script>
|
</script>
|
||||||
</body>
|
</body>
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user