feat: add "Add Page Labels" tool to the application
- Introduced a new tool for adding page labels to PDF documents, allowing users to apply Roman numerals, prefixes, and custom numbering ranges. - Created a new HTML page for the tool with a user-friendly interface for file upload and label rule configuration. - Implemented logic for handling file uploads, processing PDF files, and applying page labels based on user-defined rules. - Added necessary types and utility functions for managing page label styles and normalization of start values. - Updated main application configuration to include the new tool in the navigation. - Added tests for page label utilities to ensure correct functionality.
This commit is contained in:
@@ -86,6 +86,65 @@
|
||||
"name": "أرقام الصفحات",
|
||||
"subtitle": "إدراج أرقام الصفحات في مستندك."
|
||||
},
|
||||
"addPageLabels": {
|
||||
"name": "إضافة تسميات الصفحات",
|
||||
"subtitle": "تطبيق تسميات صفحات PDF باستخدام الأرقام الرومانية والبادئات وقيم البدء المخصصة.",
|
||||
"uploadHint": "ملف PDF",
|
||||
"howLabelsWorkTitle": "كيف تعمل التسميات",
|
||||
"howLabelsWorkStep1": "اترك نطاق الصفحات فارغًا لتسمية جميع الصفحات.",
|
||||
"howLabelsWorkStep2": "استخدم أنماطًا مثل الأرقام الرومانية للمقدمات والترقيم العشري للمحتوى الرئيسي.",
|
||||
"howLabelsWorkStep3": "استخدم البادئة مع قيمة بدء 0 لإنشاء تسميات مثل A-0 وA-1 وA-2.",
|
||||
"howLabelsWorkStep4": "فعّل التقدّم عندما تستخدم قاعدة واحدة نطاقًا غير متصل مثل 1-9,30-40 أو الصفحات الفردية.",
|
||||
"labelRulesTitle": "قواعد التسميات",
|
||||
"addRule": "إضافة قاعدة",
|
||||
"removeExistingLabels": "إزالة تسميات الصفحات الحالية قبل تطبيق هذه القواعد",
|
||||
"cpdfNote": "تستخدم هذه الأداة CoherentPDF داخل متصفحك. إذا لم يكن CoherentPDF مهيأً، فسيُطلب منك إعداده في إعدادات WASM.",
|
||||
"processButton": "إضافة تسميات الصفحات",
|
||||
"howItWorksUploadTitle": "رفع الملف",
|
||||
"howItWorksUploadDescription": "اختر ملف PDF الذي تريد إعادة تسميته.",
|
||||
"howItWorksDefineTitle": "تحديد القواعد",
|
||||
"howItWorksDefineDescription": "اضبط قاعدة واحدة أو أكثر لتسميات الصفحات مع نطاقات الصفحات والأنماط والبادئات وقيم البدء.",
|
||||
"howItWorksDownloadTitle": "تنزيل",
|
||||
"howItWorksDownloadDescription": "احفظ ملف PDF المحدّث مع تسميات صفحاته الجديدة.",
|
||||
"relatedToolsTitle": "أدوات PDF ذات الصلة",
|
||||
"faqWhatIsQuestion": "ما هي تسمية الصفحة؟",
|
||||
"faqWhatIsAnswer": "تسمية الصفحة هي الترقيم الذي تعرضه برامج قراءة PDF في الصور المصغّرة والتنقل بين الصفحات ومربعات حوار الطباعة. وهي لا تضيف نصًا جديدًا مطبوعًا على الصفحة نفسها.",
|
||||
"faqMixQuestion": "هل يمكنني مزج الأرقام الرومانية مع الأرقام العادية؟",
|
||||
"faqMixAnswer": "نعم. أضف قواعد متعددة، مثل 1-4 بنمط LowercaseRoman و5-20 بنمط DecimalArabic.",
|
||||
"faqPrivacyQuestion": "هل تظل ملفاتي خاصة؟",
|
||||
"faqPrivacyAnswer": "نعم. تتم المعالجة داخل متصفحك باستخدام CoherentPDF WASM. لا يغادر ملف PDF جهازك.",
|
||||
"invalidFileTitle": "ملف غير صالح",
|
||||
"invalidFileMessage": "يرجى رفع ملف PDF صالح.",
|
||||
"loadingPdf": "جارٍ تحميل ملف PDF...",
|
||||
"protectedPdfTitle": "ملف PDF محمي",
|
||||
"protectedPdfMessage": "هذا الملف محمي بكلمة مرور. يرجى استخدام أداة فك التشفير أو تغيير الأذونات أولاً.",
|
||||
"loadErrorMessage": "تعذر تحميل ملف PDF. قد يكون الملف غير صالح أو تالفًا أو محميًا بكلمة مرور.",
|
||||
"fileMeta": "{{size}} • {{count}} صفحات",
|
||||
"ruleTitle": "قاعدة التسمية {{number}}",
|
||||
"pageRangeLabel": "نطاق الصفحات",
|
||||
"pageRangePlaceholder": "جميع الصفحات، أو مثلًا 1-4، 7، فردي",
|
||||
"labelStyleLabel": "نمط التسمية",
|
||||
"labelPrefixLabel": "بادئة التسمية",
|
||||
"labelPrefixPlaceholder": "بادئة اختيارية، مثل A-",
|
||||
"startValueLabel": "قيمة البدء",
|
||||
"continueNumbering": "متابعة الترقيم عبر النطاقات غير المتصلة",
|
||||
"examplesNote": "أمثلة: 1-4 للمقدمة بالأرقام الرومانية، و15-20 مع البادئة A- وقيمة بدء 0، أو الصفحات الفردية مع تفعيل المتابعة.",
|
||||
"uploadFirstMessage": "يرجى رفع ملف PDF أولاً.",
|
||||
"applyingLabels": "جارٍ تطبيق تسميات الصفحات...",
|
||||
"invalidRangeMessage": "القاعدة {{number}} تحتوي على نطاق صفحات غير صالح: {{range}}",
|
||||
"allPages": "كل الصفحات",
|
||||
"emptyOutputMessage": "أنتج CoherentPDF ملفًا فارغًا.",
|
||||
"successMessage": "تمت إضافة تسميات الصفحات بنجاح!",
|
||||
"processErrorMessage": "تعذر إضافة تسميات الصفحات.",
|
||||
"styleOptions": {
|
||||
"DecimalArabic": "أرقام عشرية",
|
||||
"LowercaseRoman": "أرقام رومانية صغيرة",
|
||||
"UppercaseRoman": "أرقام رومانية كبيرة",
|
||||
"LowercaseLetters": "حروف صغيرة",
|
||||
"UppercaseLetters": "حروف كبيرة",
|
||||
"NoLabelPrefixOnly": "بادئة فقط بدون ترقيم"
|
||||
}
|
||||
},
|
||||
"batesNumbering": {
|
||||
"name": "ترقيم بيتس",
|
||||
"subtitle": "إضافة أرقام بيتس التسلسلية عبر ملف PDF واحد أو أكثر."
|
||||
|
||||
@@ -86,6 +86,65 @@
|
||||
"name": "Нумары старонак",
|
||||
"subtitle": "Уставіць у дакумент нумары старонак."
|
||||
},
|
||||
"addPageLabels": {
|
||||
"name": "Дадаць пазнакі старонак",
|
||||
"subtitle": "Ужывайце пазнакі старонак PDF з рымскімі лічбамі, прэфіксамі і карыстальніцкім пачаткам.",
|
||||
"uploadHint": "PDF-файл",
|
||||
"howLabelsWorkTitle": "Як працуюць пазнакі",
|
||||
"howLabelsWorkStep1": "Пакіньце дыяпазон старонак пустым, каб пазначыць усе старонкі.",
|
||||
"howLabelsWorkStep2": "Выкарыстоўвайце стылі, напрыклад рымскія лічбы для ўступных старонак і дзесятковую нумарацыю для асноўнай часткі.",
|
||||
"howLabelsWorkStep3": "Выкарыстоўвайце прэфікс са значэннем пачатку 0, каб стварыць пазнакі накшталт A-0, A-1, A-2.",
|
||||
"howLabelsWorkStep4": "Уключыце працяг нумарацыі, калі адно правіла выкарыстоўвае разарваны дыяпазон, напрыклад 1-9,30-40 або няцотныя старонкі.",
|
||||
"labelRulesTitle": "Правілы пазнак",
|
||||
"addRule": "Дадаць правіла",
|
||||
"removeExistingLabels": "Выдаліць існуючыя пазнакі старонак перад ужываннем гэтых правіл",
|
||||
"cpdfNote": "Гэты інструмент выкарыстоўвае CoherentPDF у вашым браўзеры. Калі CoherentPDF не настроены, вам будзе прапанавана наладзіць яго ў наладах WASM.",
|
||||
"processButton": "Дадаць пазнакі старонак",
|
||||
"howItWorksUploadTitle": "Загрузіць файл",
|
||||
"howItWorksUploadDescription": "Выберыце PDF, які хочаце перапазначыць.",
|
||||
"howItWorksDefineTitle": "Вызначыць правілы",
|
||||
"howItWorksDefineDescription": "Наладзьце адно або некалькі правіл пазнак старонак з дыяпазонамі, стылямі, прэфіксамі і пачатковымі значэннямі.",
|
||||
"howItWorksDownloadTitle": "Спампаваць",
|
||||
"howItWorksDownloadDescription": "Захавайце абноўлены PDF з новымі пазнакамі старонак.",
|
||||
"relatedToolsTitle": "Звязаныя інструменты PDF",
|
||||
"faqWhatIsQuestion": "Што такое пазнака старонкі?",
|
||||
"faqWhatIsAnswer": "Пазнака старонкі - гэта нумарацыя, якую чытачы PDF паказваюць у мініяцюрах, навігацыі па старонках і дыялогах друку. Яна не друкуе новы тэкст на самой старонцы.",
|
||||
"faqMixQuestion": "Ці можна спалучаць рымскія і звычайныя лічбы?",
|
||||
"faqMixAnswer": "Так. Дадайце некалькі правіл, напрыклад 1-4 з LowercaseRoman і 5-20 з DecimalArabic.",
|
||||
"faqPrivacyQuestion": "Ці застаюцца мае файлы прыватнымі?",
|
||||
"faqPrivacyAnswer": "Так. Апрацоўка адбываецца ў вашым браўзеры з дапамогай CoherentPDF WASM. Ваш PDF не пакідае прыладу.",
|
||||
"invalidFileTitle": "Няправільны файл",
|
||||
"invalidFileMessage": "Калі ласка, загрузіце сапраўдны PDF-файл.",
|
||||
"loadingPdf": "Загрузка PDF...",
|
||||
"protectedPdfTitle": "Абаронены PDF",
|
||||
"protectedPdfMessage": "Гэты PDF абаронены паролем. Спачатку выкарыстайце інструмент расшыфроўкі або змены дазволаў.",
|
||||
"loadErrorMessage": "Не ўдалося загрузіць PDF. Файл можа быць няправільным, пашкоджаным або абароненым паролем.",
|
||||
"fileMeta": "{{size}} • {{count}} старонак",
|
||||
"ruleTitle": "Правіла пазнакі {{number}}",
|
||||
"pageRangeLabel": "Дыяпазон старонак",
|
||||
"pageRangePlaceholder": "Усе старонкі, або напр. 1-4, 7, няцотныя",
|
||||
"labelStyleLabel": "Стыль пазнакі",
|
||||
"labelPrefixLabel": "Прэфікс пазнакі",
|
||||
"labelPrefixPlaceholder": "Неабавязковы прэфікс, напр. A-",
|
||||
"startValueLabel": "Пачатковае значэнне",
|
||||
"continueNumbering": "Працягваць нумарацыю праз разарваныя дыяпазоны",
|
||||
"examplesNote": "Прыклады: 1-4 для рымскай нумарацыі ўступных старонак, 15-20 з прэфіксам A- і пачаткам 0, або няцотныя старонкі з уключаным працягам.",
|
||||
"uploadFirstMessage": "Спачатку загрузіце PDF-файл.",
|
||||
"applyingLabels": "Ужыванне пазнак старонак...",
|
||||
"invalidRangeMessage": "Правіла {{number}} мае няправільны дыяпазон старонак: {{range}}",
|
||||
"allPages": "усе старонкі",
|
||||
"emptyOutputMessage": "CoherentPDF стварыў пусты файл.",
|
||||
"successMessage": "Пазнакі старонак паспяхова дададзены!",
|
||||
"processErrorMessage": "Не ўдалося дадаць пазнакі старонак.",
|
||||
"styleOptions": {
|
||||
"DecimalArabic": "Дзесятковыя лічбы",
|
||||
"LowercaseRoman": "Малыя рымскія лічбы",
|
||||
"UppercaseRoman": "Вялікія рымскія лічбы",
|
||||
"LowercaseLetters": "Малыя літары",
|
||||
"UppercaseLetters": "Вялікія літары",
|
||||
"NoLabelPrefixOnly": "Толькі прэфікс без нумара"
|
||||
}
|
||||
},
|
||||
"batesNumbering": {
|
||||
"name": "Нумарацыя Бейтса",
|
||||
"subtitle": "Дадаць паслядоўныя нумары Бейтса да аднаго або некалькіх файлаў PDF."
|
||||
|
||||
@@ -86,6 +86,65 @@
|
||||
"name": "Sidetal",
|
||||
"subtitle": "Indsæt sidetal i dokumentet."
|
||||
},
|
||||
"addPageLabels": {
|
||||
"name": "Tilføj sideetiketter",
|
||||
"subtitle": "Anvend PDF-sideetiketter med romertal, præfikser og brugerdefinerede startværdier.",
|
||||
"uploadHint": "PDF-fil",
|
||||
"howLabelsWorkTitle": "Sådan virker etiketter",
|
||||
"howLabelsWorkStep1": "Lad sideområde stå tomt for at mærke alle sider.",
|
||||
"howLabelsWorkStep2": "Brug stilarter som romertal til forord og decimalnummerering til hovedindholdet.",
|
||||
"howLabelsWorkStep3": "Brug præfiks med startværdi 0 for at lave etiketter som A-0, A-1, A-2.",
|
||||
"howLabelsWorkStep4": "Aktivér fortsættelse, når én regel bruger et usammenhængende område som 1-9,30-40 eller ulige sider.",
|
||||
"labelRulesTitle": "Etiketregler",
|
||||
"addRule": "Tilføj regel",
|
||||
"removeExistingLabels": "Fjern eksisterende sideetiketter, før disse regler anvendes",
|
||||
"cpdfNote": "Dette værktøj bruger CoherentPDF i din browser. Hvis CoherentPDF ikke er konfigureret, bliver du bedt om at sætte det op i WASM-indstillinger.",
|
||||
"processButton": "Tilføj sideetiketter",
|
||||
"howItWorksUploadTitle": "Upload fil",
|
||||
"howItWorksUploadDescription": "Vælg den PDF, du vil ommærke.",
|
||||
"howItWorksDefineTitle": "Definér regler",
|
||||
"howItWorksDefineDescription": "Opsæt en eller flere regler for sideetiketter med sideområder, stilarter, præfikser og startværdier.",
|
||||
"howItWorksDownloadTitle": "Download",
|
||||
"howItWorksDownloadDescription": "Gem den opdaterede PDF med sine nye sideetiketter.",
|
||||
"relatedToolsTitle": "Relaterede PDF-værktøjer",
|
||||
"faqWhatIsQuestion": "Hvad er en sideetiket?",
|
||||
"faqWhatIsAnswer": "En sideetiket er den nummerering, som PDF-læsere viser i miniaturevisninger, sidenavigation og udskriftsdialoger. Den tilføjer ikke ny tekst på selve siden.",
|
||||
"faqMixQuestion": "Kan jeg blande romertal og almindelige tal?",
|
||||
"faqMixAnswer": "Ja. Tilføj flere regler, f.eks. 1-4 med LowercaseRoman og 5-20 med DecimalArabic.",
|
||||
"faqPrivacyQuestion": "Forbliver mine filer private?",
|
||||
"faqPrivacyAnswer": "Ja. Behandlingen sker i din browser med CoherentPDF WASM. Din PDF forlader ikke din enhed.",
|
||||
"invalidFileTitle": "Ugyldig fil",
|
||||
"invalidFileMessage": "Upload venligst en gyldig PDF-fil.",
|
||||
"loadingPdf": "Indlæser PDF...",
|
||||
"protectedPdfTitle": "Beskyttet PDF",
|
||||
"protectedPdfMessage": "Denne PDF er adgangskodebeskyttet. Brug først værktøjet Dekryptér eller Ændr tilladelser.",
|
||||
"loadErrorMessage": "PDF-filen kunne ikke indlæses. Filen kan være ugyldig, beskadiget eller adgangskodebeskyttet.",
|
||||
"fileMeta": "{{size}} • {{count}} sider",
|
||||
"ruleTitle": "Etiketregel {{number}}",
|
||||
"pageRangeLabel": "Sideområde",
|
||||
"pageRangePlaceholder": "Alle sider, eller f.eks. 1-4, 7, ulige",
|
||||
"labelStyleLabel": "Etiketstil",
|
||||
"labelPrefixLabel": "Etiketpræfiks",
|
||||
"labelPrefixPlaceholder": "Valgfrit præfiks, f.eks. A-",
|
||||
"startValueLabel": "Startværdi",
|
||||
"continueNumbering": "Fortsæt nummerering på tværs af usammenhængende områder",
|
||||
"examplesNote": "Eksempler: 1-4 til romertal i forord, 15-20 med præfikset A- og startværdi 0, eller ulige sider med fortsættelse aktiveret.",
|
||||
"uploadFirstMessage": "Upload først en PDF-fil.",
|
||||
"applyingLabels": "Anvender sideetiketter...",
|
||||
"invalidRangeMessage": "Regel {{number}} har et ugyldigt sideområde: {{range}}",
|
||||
"allPages": "alle sider",
|
||||
"emptyOutputMessage": "CoherentPDF producerede en tom fil.",
|
||||
"successMessage": "Sideetiketter blev tilføjet!",
|
||||
"processErrorMessage": "Kunne ikke tilføje sideetiketter.",
|
||||
"styleOptions": {
|
||||
"DecimalArabic": "Decimaltal",
|
||||
"LowercaseRoman": "Små romertal",
|
||||
"UppercaseRoman": "Store romertal",
|
||||
"LowercaseLetters": "Små bogstaver",
|
||||
"UppercaseLetters": "Store bogstaver",
|
||||
"NoLabelPrefixOnly": "Kun præfiks uden nummer"
|
||||
}
|
||||
},
|
||||
"batesNumbering": {
|
||||
"name": "Bates-nummerering",
|
||||
"subtitle": "Tilføj sekventielle Bates-numre på tværs af en eller flere PDF-filer."
|
||||
|
||||
@@ -86,6 +86,65 @@
|
||||
"name": "Seitenzahlen",
|
||||
"subtitle": "Seitenzahlen in Ihr Dokument einfügen."
|
||||
},
|
||||
"addPageLabels": {
|
||||
"name": "Seitenbeschriftungen hinzufügen",
|
||||
"subtitle": "PDF-Seitenbeschriftungen mit römischen Zahlen, Präfixen und benutzerdefinierten Startwerten anwenden.",
|
||||
"uploadHint": "PDF-Datei",
|
||||
"howLabelsWorkTitle": "So funktionieren Seitenbeschriftungen",
|
||||
"howLabelsWorkStep1": "Lassen Sie den Seitenbereich leer, um alle Seiten zu beschriften.",
|
||||
"howLabelsWorkStep2": "Verwenden Sie Stile wie römische Zahlen für Vorspannseiten und Dezimalzahlen für den Hauptteil.",
|
||||
"howLabelsWorkStep3": "Verwenden Sie ein Präfix mit dem Startwert 0, um Beschriftungen wie A-0, A-1, A-2 zu erzeugen.",
|
||||
"howLabelsWorkStep4": "Aktivieren Sie die fortlaufende Nummerierung, wenn eine Regel einen nicht zusammenhängenden Bereich wie 1-9,30-40 oder ungerade Seiten verwendet.",
|
||||
"labelRulesTitle": "Beschriftungsregeln",
|
||||
"addRule": "Regel hinzufügen",
|
||||
"removeExistingLabels": "Vor dem Anwenden dieser Regeln vorhandene Seitenbeschriftungen entfernen",
|
||||
"cpdfNote": "Dieses Werkzeug verwendet CoherentPDF in Ihrem Browser. Wenn CoherentPDF nicht konfiguriert ist, werden Sie aufgefordert, es in den WASM-Einstellungen einzurichten.",
|
||||
"processButton": "Seitenbeschriftungen hinzufügen",
|
||||
"howItWorksUploadTitle": "Datei hochladen",
|
||||
"howItWorksUploadDescription": "Wählen Sie die PDF-Datei aus, die Sie neu beschriften möchten.",
|
||||
"howItWorksDefineTitle": "Regeln festlegen",
|
||||
"howItWorksDefineDescription": "Legen Sie eine oder mehrere Regeln für Seitenbeschriftungen mit Seitenbereichen, Stilen, Präfixen und Startwerten fest.",
|
||||
"howItWorksDownloadTitle": "Herunterladen",
|
||||
"howItWorksDownloadDescription": "Speichern Sie die aktualisierte PDF mit ihren neuen Seitenbeschriftungen.",
|
||||
"relatedToolsTitle": "Verwandte PDF-Werkzeuge",
|
||||
"faqWhatIsQuestion": "Was ist eine Seitenbeschriftung?",
|
||||
"faqWhatIsAnswer": "Eine Seitenbeschriftung ist die Nummerierung, die PDF-Reader in Miniaturansichten, der Seitennavigation und Druckdialogen anzeigen. Sie druckt keinen neuen Text auf die Seite selbst.",
|
||||
"faqMixQuestion": "Kann ich römische Ziffern und normale Zahlen mischen?",
|
||||
"faqMixAnswer": "Ja. Fügen Sie mehrere Regeln hinzu, zum Beispiel 1-4 mit LowercaseRoman und 5-20 mit DecimalArabic.",
|
||||
"faqPrivacyQuestion": "Bleiben meine Dateien privat?",
|
||||
"faqPrivacyAnswer": "Ja. Die Verarbeitung erfolgt in Ihrem Browser mit CoherentPDF WASM. Ihre PDF verlässt Ihr Gerät nicht.",
|
||||
"invalidFileTitle": "Ungültige Datei",
|
||||
"invalidFileMessage": "Bitte laden Sie eine gültige PDF-Datei hoch.",
|
||||
"loadingPdf": "PDF wird geladen...",
|
||||
"protectedPdfTitle": "Geschützte PDF",
|
||||
"protectedPdfMessage": "Diese PDF ist passwortgeschützt. Bitte verwenden Sie zuerst das Werkzeug Entschlüsseln oder Berechtigungen ändern.",
|
||||
"loadErrorMessage": "Die PDF-Datei konnte nicht geladen werden. Die Datei ist möglicherweise ungültig, beschädigt oder passwortgeschützt.",
|
||||
"fileMeta": "{{size}} • {{count}} Seiten",
|
||||
"ruleTitle": "Beschriftungsregel {{number}}",
|
||||
"pageRangeLabel": "Seitenbereich",
|
||||
"pageRangePlaceholder": "Alle Seiten oder z. B. 1-4, 7, ungerade",
|
||||
"labelStyleLabel": "Beschriftungsstil",
|
||||
"labelPrefixLabel": "Beschriftungspräfix",
|
||||
"labelPrefixPlaceholder": "Optionales Präfix, z. B. A-",
|
||||
"startValueLabel": "Startwert",
|
||||
"continueNumbering": "Nummerierung über nicht zusammenhängende Bereiche hinweg fortsetzen",
|
||||
"examplesNote": "Beispiele: 1-4 für römisch nummerierte Vorspannseiten, 15-20 mit Präfix A- und Startwert 0 oder ungerade Seiten mit aktivierter Fortsetzung.",
|
||||
"uploadFirstMessage": "Bitte laden Sie zuerst eine PDF-Datei hoch.",
|
||||
"applyingLabels": "Seitenbeschriftungen werden angewendet...",
|
||||
"invalidRangeMessage": "Regel {{number}} hat einen ungültigen Seitenbereich: {{range}}",
|
||||
"allPages": "alle Seiten",
|
||||
"emptyOutputMessage": "CoherentPDF hat eine leere Datei erzeugt.",
|
||||
"successMessage": "Seitenbeschriftungen wurden erfolgreich hinzugefügt!",
|
||||
"processErrorMessage": "Seitenbeschriftungen konnten nicht hinzugefügt werden.",
|
||||
"styleOptions": {
|
||||
"DecimalArabic": "Dezimalzahlen",
|
||||
"LowercaseRoman": "Kleine römische Zahlen",
|
||||
"UppercaseRoman": "Große römische Zahlen",
|
||||
"LowercaseLetters": "Kleinbuchstaben",
|
||||
"UppercaseLetters": "Großbuchstaben",
|
||||
"NoLabelPrefixOnly": "Nur Präfix ohne Nummer"
|
||||
}
|
||||
},
|
||||
"batesNumbering": {
|
||||
"name": "Bates-Nummerierung",
|
||||
"subtitle": "Fortlaufende Bates-Nummern über eine oder mehrere PDF-Dateien hinzufügen."
|
||||
|
||||
@@ -86,6 +86,65 @@
|
||||
"name": "Page Numbers",
|
||||
"subtitle": "Insert page numbers into your document."
|
||||
},
|
||||
"addPageLabels": {
|
||||
"name": "Add Page Labels",
|
||||
"subtitle": "Apply PDF page labels with Roman numerals, prefixes, and custom starts.",
|
||||
"uploadHint": "PDF file",
|
||||
"howLabelsWorkTitle": "How labels work",
|
||||
"howLabelsWorkStep1": "Leave Page Range empty to label all pages.",
|
||||
"howLabelsWorkStep2": "Use styles like Roman numerals for front matter and decimal numbering for the main body.",
|
||||
"howLabelsWorkStep3": "Use Prefix with Start Value 0 to create labels such as A-0, A-1, A-2.",
|
||||
"howLabelsWorkStep4": "Enable progress when one rule uses a disjoint range such as 1-9,30-40 or odd.",
|
||||
"labelRulesTitle": "Label Rules",
|
||||
"addRule": "Add Rule",
|
||||
"removeExistingLabels": "Remove existing page labels before applying these rules",
|
||||
"cpdfNote": "This tool uses CoherentPDF in your browser. If CoherentPDF is not configured, you will be prompted to set it up in WASM Settings.",
|
||||
"processButton": "Add Page Labels",
|
||||
"howItWorksUploadTitle": "Upload File",
|
||||
"howItWorksUploadDescription": "Choose the PDF you want to relabel.",
|
||||
"howItWorksDefineTitle": "Define Rules",
|
||||
"howItWorksDefineDescription": "Set one or more page label rules with page ranges, styles, prefixes, and starting values.",
|
||||
"howItWorksDownloadTitle": "Download",
|
||||
"howItWorksDownloadDescription": "Save the updated PDF with its new page labels.",
|
||||
"relatedToolsTitle": "Related PDF Tools",
|
||||
"faqWhatIsQuestion": "What is a page label?",
|
||||
"faqWhatIsAnswer": "A page label is the numbering shown by PDF readers in thumbnails, page navigation, and print dialogs. It does not print new text onto the page itself.",
|
||||
"faqMixQuestion": "Can I mix Roman numerals and normal numbers?",
|
||||
"faqMixAnswer": "Yes. Add multiple rules, such as 1-4 with LowercaseRoman and 5-20 with DecimalArabic.",
|
||||
"faqPrivacyQuestion": "Do my files stay private?",
|
||||
"faqPrivacyAnswer": "Yes. The processing happens in your browser using CoherentPDF WASM. Your PDF does not leave your device.",
|
||||
"invalidFileTitle": "Invalid File",
|
||||
"invalidFileMessage": "Please upload a valid PDF file.",
|
||||
"loadingPdf": "Loading PDF...",
|
||||
"protectedPdfTitle": "Protected PDF",
|
||||
"protectedPdfMessage": "This PDF is password-protected. Please use the Decrypt or Change Permissions tool first.",
|
||||
"loadErrorMessage": "Failed to load PDF file. The file may be invalid, corrupted, or password-protected.",
|
||||
"fileMeta": "{{size}} • {{count}} pages",
|
||||
"ruleTitle": "Label Rule {{number}}",
|
||||
"pageRangeLabel": "Page Range",
|
||||
"pageRangePlaceholder": "All pages, or e.g. 1-4, 7, odd",
|
||||
"labelStyleLabel": "Label Style",
|
||||
"labelPrefixLabel": "Label Prefix",
|
||||
"labelPrefixPlaceholder": "Optional prefix, e.g. A-",
|
||||
"startValueLabel": "Start Value",
|
||||
"continueNumbering": "Continue numbering across disjoint ranges",
|
||||
"examplesNote": "Examples: 1-4 for Roman front matter, 15-20 with prefix A- and start value 0, or odd with progress enabled.",
|
||||
"uploadFirstMessage": "Please upload a PDF file first.",
|
||||
"applyingLabels": "Applying page labels...",
|
||||
"invalidRangeMessage": "Rule {{number}} has an invalid page range: {{range}}",
|
||||
"allPages": "all pages",
|
||||
"emptyOutputMessage": "CoherentPDF produced an empty file.",
|
||||
"successMessage": "Page labels added successfully!",
|
||||
"processErrorMessage": "Could not add page labels.",
|
||||
"styleOptions": {
|
||||
"DecimalArabic": "Decimal Arabic",
|
||||
"LowercaseRoman": "Lowercase Roman",
|
||||
"UppercaseRoman": "Uppercase Roman",
|
||||
"LowercaseLetters": "Lowercase Letters",
|
||||
"UppercaseLetters": "Uppercase Letters",
|
||||
"NoLabelPrefixOnly": "No Label Prefix Only"
|
||||
}
|
||||
},
|
||||
"batesNumbering": {
|
||||
"name": "Bates Numbering",
|
||||
"subtitle": "Add sequential Bates numbers across one or more PDF files."
|
||||
|
||||
@@ -86,6 +86,65 @@
|
||||
"name": "Números de Página",
|
||||
"subtitle": "Inserta números de página en tu documento."
|
||||
},
|
||||
"addPageLabels": {
|
||||
"name": "Agregar etiquetas de página",
|
||||
"subtitle": "Aplica etiquetas de página PDF con números romanos, prefijos y valores iniciales personalizados.",
|
||||
"uploadHint": "Archivo PDF",
|
||||
"howLabelsWorkTitle": "Cómo funcionan las etiquetas",
|
||||
"howLabelsWorkStep1": "Deja vacío el rango de páginas para etiquetar todas las páginas.",
|
||||
"howLabelsWorkStep2": "Usa estilos como números romanos para las páginas preliminares y numeración decimal para el cuerpo principal.",
|
||||
"howLabelsWorkStep3": "Usa un prefijo con valor inicial 0 para crear etiquetas como A-0, A-1 y A-2.",
|
||||
"howLabelsWorkStep4": "Activa la progresión cuando una regla use un rango discontinuo como 1-9,30-40 o páginas impares.",
|
||||
"labelRulesTitle": "Reglas de etiquetas",
|
||||
"addRule": "Agregar regla",
|
||||
"removeExistingLabels": "Eliminar las etiquetas de página existentes antes de aplicar estas reglas",
|
||||
"cpdfNote": "Esta herramienta usa CoherentPDF en tu navegador. Si CoherentPDF no está configurado, se te pedirá configurarlo en Ajustes de WASM.",
|
||||
"processButton": "Agregar etiquetas de página",
|
||||
"howItWorksUploadTitle": "Subir archivo",
|
||||
"howItWorksUploadDescription": "Elige el PDF que quieres volver a etiquetar.",
|
||||
"howItWorksDefineTitle": "Definir reglas",
|
||||
"howItWorksDefineDescription": "Configura una o más reglas de etiquetas de página con rangos, estilos, prefijos y valores iniciales.",
|
||||
"howItWorksDownloadTitle": "Descargar",
|
||||
"howItWorksDownloadDescription": "Guarda el PDF actualizado con sus nuevas etiquetas de página.",
|
||||
"relatedToolsTitle": "Herramientas PDF relacionadas",
|
||||
"faqWhatIsQuestion": "¿Qué es una etiqueta de página?",
|
||||
"faqWhatIsAnswer": "Una etiqueta de página es la numeración que los lectores PDF muestran en miniaturas, navegación de páginas y cuadros de impresión. No imprime texto nuevo sobre la propia página.",
|
||||
"faqMixQuestion": "¿Puedo mezclar números romanos y números normales?",
|
||||
"faqMixAnswer": "Sí. Agrega varias reglas, como 1-4 con LowercaseRoman y 5-20 con DecimalArabic.",
|
||||
"faqPrivacyQuestion": "¿Mis archivos siguen siendo privados?",
|
||||
"faqPrivacyAnswer": "Sí. El procesamiento ocurre en tu navegador usando CoherentPDF WASM. Tu PDF no sale de tu dispositivo.",
|
||||
"invalidFileTitle": "Archivo no válido",
|
||||
"invalidFileMessage": "Por favor, sube un archivo PDF válido.",
|
||||
"loadingPdf": "Cargando PDF...",
|
||||
"protectedPdfTitle": "PDF protegido",
|
||||
"protectedPdfMessage": "Este PDF está protegido con contraseña. Usa primero la herramienta Desencriptar o Cambiar permisos.",
|
||||
"loadErrorMessage": "No se pudo cargar el archivo PDF. El archivo puede ser inválido, estar dañado o protegido con contraseña.",
|
||||
"fileMeta": "{{size}} • {{count}} páginas",
|
||||
"ruleTitle": "Regla de etiqueta {{number}}",
|
||||
"pageRangeLabel": "Rango de páginas",
|
||||
"pageRangePlaceholder": "Todas las páginas, o por ejemplo 1-4, 7, impares",
|
||||
"labelStyleLabel": "Estilo de etiqueta",
|
||||
"labelPrefixLabel": "Prefijo de etiqueta",
|
||||
"labelPrefixPlaceholder": "Prefijo opcional, por ejemplo A-",
|
||||
"startValueLabel": "Valor inicial",
|
||||
"continueNumbering": "Continuar la numeración en rangos discontinuos",
|
||||
"examplesNote": "Ejemplos: 1-4 para preliminares en números romanos, 15-20 con prefijo A- y valor inicial 0, o páginas impares con progresión activada.",
|
||||
"uploadFirstMessage": "Primero sube un archivo PDF.",
|
||||
"applyingLabels": "Aplicando etiquetas de página...",
|
||||
"invalidRangeMessage": "La regla {{number}} tiene un rango de páginas no válido: {{range}}",
|
||||
"allPages": "todas las páginas",
|
||||
"emptyOutputMessage": "CoherentPDF produjo un archivo vacío.",
|
||||
"successMessage": "¡Las etiquetas de página se agregaron correctamente!",
|
||||
"processErrorMessage": "No se pudieron agregar las etiquetas de página.",
|
||||
"styleOptions": {
|
||||
"DecimalArabic": "Números decimales",
|
||||
"LowercaseRoman": "Números romanos en minúscula",
|
||||
"UppercaseRoman": "Números romanos en mayúscula",
|
||||
"LowercaseLetters": "Letras minúsculas",
|
||||
"UppercaseLetters": "Letras mayúsculas",
|
||||
"NoLabelPrefixOnly": "Solo prefijo sin numeración"
|
||||
}
|
||||
},
|
||||
"batesNumbering": {
|
||||
"name": "Numeración Bates",
|
||||
"subtitle": "Añadir números Bates secuenciales en uno o más archivos PDF."
|
||||
|
||||
@@ -86,6 +86,65 @@
|
||||
"name": "Numéros de page",
|
||||
"subtitle": "Insérer une numérotation dans le document."
|
||||
},
|
||||
"addPageLabels": {
|
||||
"name": "Ajouter des étiquettes de page",
|
||||
"subtitle": "Appliquer des étiquettes de page PDF avec chiffres romains, préfixes et valeurs de départ personnalisées.",
|
||||
"uploadHint": "Fichier PDF",
|
||||
"howLabelsWorkTitle": "Comment fonctionnent les étiquettes",
|
||||
"howLabelsWorkStep1": "Laissez la plage de pages vide pour étiqueter toutes les pages.",
|
||||
"howLabelsWorkStep2": "Utilisez des styles comme les chiffres romains pour les pages liminaires et la numérotation décimale pour le corps principal.",
|
||||
"howLabelsWorkStep3": "Utilisez un préfixe avec une valeur de départ de 0 pour créer des étiquettes comme A-0, A-1, A-2.",
|
||||
"howLabelsWorkStep4": "Activez la progression lorsqu'une règle utilise une plage discontinue comme 1-9,30-40 ou les pages impaires.",
|
||||
"labelRulesTitle": "Règles d'étiquetage",
|
||||
"addRule": "Ajouter une règle",
|
||||
"removeExistingLabels": "Supprimer les étiquettes de page existantes avant d'appliquer ces règles",
|
||||
"cpdfNote": "Cet outil utilise CoherentPDF dans votre navigateur. Si CoherentPDF n'est pas configuré, il vous sera demandé de le configurer dans les paramètres WASM.",
|
||||
"processButton": "Ajouter des étiquettes de page",
|
||||
"howItWorksUploadTitle": "Téléverser le fichier",
|
||||
"howItWorksUploadDescription": "Choisissez le PDF que vous voulez réétiqueter.",
|
||||
"howItWorksDefineTitle": "Définir les règles",
|
||||
"howItWorksDefineDescription": "Configurez une ou plusieurs règles d'étiquetage avec des plages de pages, des styles, des préfixes et des valeurs de départ.",
|
||||
"howItWorksDownloadTitle": "Télécharger",
|
||||
"howItWorksDownloadDescription": "Enregistrez le PDF mis à jour avec ses nouvelles étiquettes de page.",
|
||||
"relatedToolsTitle": "Outils PDF associés",
|
||||
"faqWhatIsQuestion": "Qu'est-ce qu'une étiquette de page ?",
|
||||
"faqWhatIsAnswer": "Une étiquette de page est la numérotation affichée par les lecteurs PDF dans les miniatures, la navigation entre les pages et les boîtes de dialogue d'impression. Elle n'imprime pas de nouveau texte sur la page elle-même.",
|
||||
"faqMixQuestion": "Puis-je mélanger chiffres romains et nombres classiques ?",
|
||||
"faqMixAnswer": "Oui. Ajoutez plusieurs règles, par exemple 1-4 avec LowercaseRoman et 5-20 avec DecimalArabic.",
|
||||
"faqPrivacyQuestion": "Mes fichiers restent-ils privés ?",
|
||||
"faqPrivacyAnswer": "Oui. Le traitement s'effectue dans votre navigateur avec CoherentPDF WASM. Votre PDF ne quitte pas votre appareil.",
|
||||
"invalidFileTitle": "Fichier invalide",
|
||||
"invalidFileMessage": "Veuillez téléverser un fichier PDF valide.",
|
||||
"loadingPdf": "Chargement du PDF...",
|
||||
"protectedPdfTitle": "PDF protégé",
|
||||
"protectedPdfMessage": "Ce PDF est protégé par mot de passe. Veuillez d'abord utiliser l'outil Déchiffrer ou Modifier les autorisations.",
|
||||
"loadErrorMessage": "Impossible de charger le fichier PDF. Le fichier est peut-être invalide, corrompu ou protégé par mot de passe.",
|
||||
"fileMeta": "{{size}} • {{count}} pages",
|
||||
"ruleTitle": "Règle d'étiquetage {{number}}",
|
||||
"pageRangeLabel": "Plage de pages",
|
||||
"pageRangePlaceholder": "Toutes les pages, ou par ex. 1-4, 7, impaires",
|
||||
"labelStyleLabel": "Style d'étiquette",
|
||||
"labelPrefixLabel": "Préfixe d'étiquette",
|
||||
"labelPrefixPlaceholder": "Préfixe facultatif, par ex. A-",
|
||||
"startValueLabel": "Valeur de départ",
|
||||
"continueNumbering": "Continuer la numérotation sur des plages discontinues",
|
||||
"examplesNote": "Exemples : 1-4 pour un avant-propos en chiffres romains, 15-20 avec le préfixe A- et la valeur de départ 0, ou les pages impaires avec progression activée.",
|
||||
"uploadFirstMessage": "Veuillez d'abord téléverser un fichier PDF.",
|
||||
"applyingLabels": "Application des étiquettes de page...",
|
||||
"invalidRangeMessage": "La règle {{number}} a une plage de pages invalide : {{range}}",
|
||||
"allPages": "toutes les pages",
|
||||
"emptyOutputMessage": "CoherentPDF a produit un fichier vide.",
|
||||
"successMessage": "Les étiquettes de page ont été ajoutées avec succès !",
|
||||
"processErrorMessage": "Impossible d'ajouter les étiquettes de page.",
|
||||
"styleOptions": {
|
||||
"DecimalArabic": "Nombres décimaux",
|
||||
"LowercaseRoman": "Chiffres romains minuscules",
|
||||
"UppercaseRoman": "Chiffres romains majuscules",
|
||||
"LowercaseLetters": "Lettres minuscules",
|
||||
"UppercaseLetters": "Lettres majuscules",
|
||||
"NoLabelPrefixOnly": "Préfixe seul sans numérotation"
|
||||
}
|
||||
},
|
||||
"batesNumbering": {
|
||||
"name": "Numérotation Bates",
|
||||
"subtitle": "Ajouter des numéros Bates séquentiels sur un ou plusieurs fichiers PDF."
|
||||
|
||||
@@ -86,6 +86,65 @@
|
||||
"name": "Nomor Halaman",
|
||||
"subtitle": "Sisipkan nomor halaman ke dokumen Anda."
|
||||
},
|
||||
"addPageLabels": {
|
||||
"name": "Tambahkan label halaman",
|
||||
"subtitle": "Terapkan label halaman PDF dengan angka Romawi, prefiks, dan nilai awal khusus.",
|
||||
"uploadHint": "File PDF",
|
||||
"howLabelsWorkTitle": "Cara kerja label",
|
||||
"howLabelsWorkStep1": "Biarkan Rentang Halaman kosong untuk memberi label pada semua halaman.",
|
||||
"howLabelsWorkStep2": "Gunakan gaya seperti angka Romawi untuk halaman awal dan penomoran desimal untuk isi utama.",
|
||||
"howLabelsWorkStep3": "Gunakan Prefiks dengan Nilai Awal 0 untuk membuat label seperti A-0, A-1, A-2.",
|
||||
"howLabelsWorkStep4": "Aktifkan progres saat satu aturan menggunakan rentang terputus seperti 1-9,30-40 atau halaman ganjil.",
|
||||
"labelRulesTitle": "Aturan Label",
|
||||
"addRule": "Tambah Aturan",
|
||||
"removeExistingLabels": "Hapus label halaman yang ada sebelum menerapkan aturan ini",
|
||||
"cpdfNote": "Alat ini menggunakan CoherentPDF di browser Anda. Jika CoherentPDF belum dikonfigurasi, Anda akan diminta menyiapkannya di Pengaturan WASM.",
|
||||
"processButton": "Tambahkan label halaman",
|
||||
"howItWorksUploadTitle": "Unggah File",
|
||||
"howItWorksUploadDescription": "Pilih PDF yang ingin Anda beri label ulang.",
|
||||
"howItWorksDefineTitle": "Tentukan Aturan",
|
||||
"howItWorksDefineDescription": "Atur satu atau lebih aturan label halaman dengan rentang halaman, gaya, prefiks, dan nilai awal.",
|
||||
"howItWorksDownloadTitle": "Unduh",
|
||||
"howItWorksDownloadDescription": "Simpan PDF yang telah diperbarui dengan label halamannya yang baru.",
|
||||
"relatedToolsTitle": "Alat PDF Terkait",
|
||||
"faqWhatIsQuestion": "Apa itu label halaman?",
|
||||
"faqWhatIsAnswer": "Label halaman adalah penomoran yang ditampilkan pembaca PDF di thumbnail, navigasi halaman, dan dialog cetak. Ini tidak mencetak teks baru ke halaman itu sendiri.",
|
||||
"faqMixQuestion": "Bisakah saya mencampur angka Romawi dan angka biasa?",
|
||||
"faqMixAnswer": "Ya. Tambahkan beberapa aturan, misalnya 1-4 dengan LowercaseRoman dan 5-20 dengan DecimalArabic.",
|
||||
"faqPrivacyQuestion": "Apakah file saya tetap pribadi?",
|
||||
"faqPrivacyAnswer": "Ya. Pemrosesan terjadi di browser Anda menggunakan CoherentPDF WASM. PDF Anda tidak meninggalkan perangkat Anda.",
|
||||
"invalidFileTitle": "File Tidak Valid",
|
||||
"invalidFileMessage": "Silakan unggah file PDF yang valid.",
|
||||
"loadingPdf": "Memuat PDF...",
|
||||
"protectedPdfTitle": "PDF Terproteksi",
|
||||
"protectedPdfMessage": "PDF ini dilindungi kata sandi. Gunakan alat Dekripsi atau Ubah Izin terlebih dahulu.",
|
||||
"loadErrorMessage": "Gagal memuat file PDF. File mungkin tidak valid, rusak, atau dilindungi kata sandi.",
|
||||
"fileMeta": "{{size}} • {{count}} halaman",
|
||||
"ruleTitle": "Aturan Label {{number}}",
|
||||
"pageRangeLabel": "Rentang Halaman",
|
||||
"pageRangePlaceholder": "Semua halaman, atau mis. 1-4, 7, ganjil",
|
||||
"labelStyleLabel": "Gaya Label",
|
||||
"labelPrefixLabel": "Prefiks Label",
|
||||
"labelPrefixPlaceholder": "Prefiks opsional, mis. A-",
|
||||
"startValueLabel": "Nilai Awal",
|
||||
"continueNumbering": "Lanjutkan penomoran di rentang yang terputus",
|
||||
"examplesNote": "Contoh: 1-4 untuk bagian depan dengan angka Romawi, 15-20 dengan prefiks A- dan nilai awal 0, atau halaman ganjil dengan progres diaktifkan.",
|
||||
"uploadFirstMessage": "Silakan unggah file PDF terlebih dahulu.",
|
||||
"applyingLabels": "Menerapkan label halaman...",
|
||||
"invalidRangeMessage": "Aturan {{number}} memiliki rentang halaman yang tidak valid: {{range}}",
|
||||
"allPages": "semua halaman",
|
||||
"emptyOutputMessage": "CoherentPDF menghasilkan file kosong.",
|
||||
"successMessage": "Label halaman berhasil ditambahkan!",
|
||||
"processErrorMessage": "Tidak dapat menambahkan label halaman.",
|
||||
"styleOptions": {
|
||||
"DecimalArabic": "Angka desimal",
|
||||
"LowercaseRoman": "Angka Romawi huruf kecil",
|
||||
"UppercaseRoman": "Angka Romawi huruf besar",
|
||||
"LowercaseLetters": "Huruf kecil",
|
||||
"UppercaseLetters": "Huruf besar",
|
||||
"NoLabelPrefixOnly": "Hanya prefiks tanpa nomor"
|
||||
}
|
||||
},
|
||||
"batesNumbering": {
|
||||
"name": "Penomoran Bates",
|
||||
"subtitle": "Tambahkan nomor Bates berurutan pada satu atau lebih file PDF."
|
||||
|
||||
@@ -86,6 +86,65 @@
|
||||
"name": "Numeri di Pagina",
|
||||
"subtitle": "Inserisci i numeri di pagina nel tuo documento."
|
||||
},
|
||||
"addPageLabels": {
|
||||
"name": "Aggiungi etichette di pagina",
|
||||
"subtitle": "Applica etichette di pagina PDF con numeri romani, prefissi e valori iniziali personalizzati.",
|
||||
"uploadHint": "File PDF",
|
||||
"howLabelsWorkTitle": "Come funzionano le etichette",
|
||||
"howLabelsWorkStep1": "Lascia vuoto Intervallo pagine per etichettare tutte le pagine.",
|
||||
"howLabelsWorkStep2": "Usa stili come i numeri romani per le pagine introduttive e la numerazione decimale per il corpo principale.",
|
||||
"howLabelsWorkStep3": "Usa un prefisso con Valore iniziale 0 per creare etichette come A-0, A-1, A-2.",
|
||||
"howLabelsWorkStep4": "Abilita la progressione quando una regola usa un intervallo discontinuo come 1-9,30-40 o le pagine dispari.",
|
||||
"labelRulesTitle": "Regole etichette",
|
||||
"addRule": "Aggiungi regola",
|
||||
"removeExistingLabels": "Rimuovi le etichette di pagina esistenti prima di applicare queste regole",
|
||||
"cpdfNote": "Questo strumento usa CoherentPDF nel tuo browser. Se CoherentPDF non è configurato, ti verrà chiesto di configurarlo nelle impostazioni WASM.",
|
||||
"processButton": "Aggiungi etichette di pagina",
|
||||
"howItWorksUploadTitle": "Carica file",
|
||||
"howItWorksUploadDescription": "Scegli il PDF che vuoi rietichettare.",
|
||||
"howItWorksDefineTitle": "Definisci le regole",
|
||||
"howItWorksDefineDescription": "Imposta una o più regole per le etichette di pagina con intervalli di pagine, stili, prefissi e valori iniziali.",
|
||||
"howItWorksDownloadTitle": "Scarica",
|
||||
"howItWorksDownloadDescription": "Salva il PDF aggiornato con le sue nuove etichette di pagina.",
|
||||
"relatedToolsTitle": "Strumenti PDF correlati",
|
||||
"faqWhatIsQuestion": "Che cos'è un'etichetta di pagina?",
|
||||
"faqWhatIsAnswer": "Un'etichetta di pagina è la numerazione mostrata dai lettori PDF nelle miniature, nella navigazione delle pagine e nelle finestre di stampa. Non stampa nuovo testo sulla pagina stessa.",
|
||||
"faqMixQuestion": "Posso mescolare numeri romani e numeri normali?",
|
||||
"faqMixAnswer": "Sì. Aggiungi più regole, ad esempio 1-4 con LowercaseRoman e 5-20 con DecimalArabic.",
|
||||
"faqPrivacyQuestion": "I miei file restano privati?",
|
||||
"faqPrivacyAnswer": "Sì. L'elaborazione avviene nel tuo browser usando CoherentPDF WASM. Il tuo PDF non lascia il tuo dispositivo.",
|
||||
"invalidFileTitle": "File non valido",
|
||||
"invalidFileMessage": "Carica un file PDF valido.",
|
||||
"loadingPdf": "Caricamento PDF...",
|
||||
"protectedPdfTitle": "PDF protetto",
|
||||
"protectedPdfMessage": "Questo PDF è protetto da password. Usa prima lo strumento Decripta o Modifica permessi.",
|
||||
"loadErrorMessage": "Impossibile caricare il file PDF. Il file potrebbe essere non valido, danneggiato o protetto da password.",
|
||||
"fileMeta": "{{size}} • {{count}} pagine",
|
||||
"ruleTitle": "Regola etichetta {{number}}",
|
||||
"pageRangeLabel": "Intervallo pagine",
|
||||
"pageRangePlaceholder": "Tutte le pagine, oppure ad es. 1-4, 7, dispari",
|
||||
"labelStyleLabel": "Stile etichetta",
|
||||
"labelPrefixLabel": "Prefisso etichetta",
|
||||
"labelPrefixPlaceholder": "Prefisso facoltativo, ad es. A-",
|
||||
"startValueLabel": "Valore iniziale",
|
||||
"continueNumbering": "Continua la numerazione su intervalli discontinui",
|
||||
"examplesNote": "Esempi: 1-4 per il frontespizio in numeri romani, 15-20 con prefisso A- e valore iniziale 0, oppure pagine dispari con progressione attiva.",
|
||||
"uploadFirstMessage": "Carica prima un file PDF.",
|
||||
"applyingLabels": "Applicazione etichette di pagina...",
|
||||
"invalidRangeMessage": "La regola {{number}} ha un intervallo di pagine non valido: {{range}}",
|
||||
"allPages": "tutte le pagine",
|
||||
"emptyOutputMessage": "CoherentPDF ha prodotto un file vuoto.",
|
||||
"successMessage": "Etichette di pagina aggiunte con successo!",
|
||||
"processErrorMessage": "Impossibile aggiungere le etichette di pagina.",
|
||||
"styleOptions": {
|
||||
"DecimalArabic": "Numeri decimali",
|
||||
"LowercaseRoman": "Numeri romani minuscoli",
|
||||
"UppercaseRoman": "Numeri romani maiuscoli",
|
||||
"LowercaseLetters": "Lettere minuscole",
|
||||
"UppercaseLetters": "Lettere maiuscole",
|
||||
"NoLabelPrefixOnly": "Solo prefisso senza numero"
|
||||
}
|
||||
},
|
||||
"batesNumbering": {
|
||||
"name": "Numerazione Bates",
|
||||
"subtitle": "Aggiungi numeri Bates sequenziali su uno o più file PDF."
|
||||
|
||||
@@ -86,6 +86,65 @@
|
||||
"name": "페이지 번호",
|
||||
"subtitle": "문서에 페이지 번호를 삽입합니다."
|
||||
},
|
||||
"addPageLabels": {
|
||||
"name": "페이지 레이블 추가",
|
||||
"subtitle": "로마 숫자, 접두사, 사용자 지정 시작값으로 PDF 페이지 레이블을 적용합니다.",
|
||||
"uploadHint": "PDF 파일",
|
||||
"howLabelsWorkTitle": "레이블 작동 방식",
|
||||
"howLabelsWorkStep1": "모든 페이지에 레이블을 적용하려면 페이지 범위를 비워 두세요.",
|
||||
"howLabelsWorkStep2": "앞부분에는 로마 숫자, 본문에는 십진 번호 같은 스타일을 사용하세요.",
|
||||
"howLabelsWorkStep3": "시작값 0과 함께 접두사를 사용하면 A-0, A-1, A-2 같은 레이블을 만들 수 있습니다.",
|
||||
"howLabelsWorkStep4": "하나의 규칙이 1-9,30-40 또는 홀수 페이지 같은 비연속 범위를 사용할 때 진행 옵션을 켜세요.",
|
||||
"labelRulesTitle": "레이블 규칙",
|
||||
"addRule": "규칙 추가",
|
||||
"removeExistingLabels": "이 규칙을 적용하기 전에 기존 페이지 레이블 제거",
|
||||
"cpdfNote": "이 도구는 브라우저에서 CoherentPDF를 사용합니다. CoherentPDF가 구성되지 않은 경우 WASM 설정에서 설정하라는 안내가 표시됩니다.",
|
||||
"processButton": "페이지 레이블 추가",
|
||||
"howItWorksUploadTitle": "파일 업로드",
|
||||
"howItWorksUploadDescription": "레이블을 다시 지정할 PDF를 선택하세요.",
|
||||
"howItWorksDefineTitle": "규칙 정의",
|
||||
"howItWorksDefineDescription": "페이지 범위, 스타일, 접두사, 시작값으로 하나 이상의 페이지 레이블 규칙을 설정하세요.",
|
||||
"howItWorksDownloadTitle": "다운로드",
|
||||
"howItWorksDownloadDescription": "새 페이지 레이블이 적용된 업데이트된 PDF를 저장하세요.",
|
||||
"relatedToolsTitle": "관련 PDF 도구",
|
||||
"faqWhatIsQuestion": "페이지 레이블이란 무엇인가요?",
|
||||
"faqWhatIsAnswer": "페이지 레이블은 PDF 리더가 썸네일, 페이지 탐색, 인쇄 대화상자에서 보여주는 번호입니다. 페이지 자체에 새 텍스트를 인쇄하지는 않습니다.",
|
||||
"faqMixQuestion": "로마 숫자와 일반 숫자를 섞어 사용할 수 있나요?",
|
||||
"faqMixAnswer": "예. LowercaseRoman으로 1-4, DecimalArabic으로 5-20 같은 여러 규칙을 추가하면 됩니다.",
|
||||
"faqPrivacyQuestion": "내 파일은 비공개로 유지되나요?",
|
||||
"faqPrivacyAnswer": "예. 처리는 CoherentPDF WASM을 사용해 브라우저에서 이루어집니다. PDF 파일은 기기를 떠나지 않습니다.",
|
||||
"invalidFileTitle": "잘못된 파일",
|
||||
"invalidFileMessage": "올바른 PDF 파일을 업로드하세요.",
|
||||
"loadingPdf": "PDF 불러오는 중...",
|
||||
"protectedPdfTitle": "보호된 PDF",
|
||||
"protectedPdfMessage": "이 PDF는 암호로 보호되어 있습니다. 먼저 복호화 또는 권한 변경 도구를 사용하세요.",
|
||||
"loadErrorMessage": "PDF 파일을 불러오지 못했습니다. 파일이 잘못되었거나 손상되었거나 암호로 보호되어 있을 수 있습니다.",
|
||||
"fileMeta": "{{size}} • {{count}}페이지",
|
||||
"ruleTitle": "레이블 규칙 {{number}}",
|
||||
"pageRangeLabel": "페이지 범위",
|
||||
"pageRangePlaceholder": "모든 페이지 또는 예: 1-4, 7, 홀수",
|
||||
"labelStyleLabel": "레이블 스타일",
|
||||
"labelPrefixLabel": "레이블 접두사",
|
||||
"labelPrefixPlaceholder": "선택 접두사, 예: A-",
|
||||
"startValueLabel": "시작값",
|
||||
"continueNumbering": "비연속 범위에서도 번호 이어가기",
|
||||
"examplesNote": "예: 앞부분 1-4는 로마 숫자, 15-20은 접두사 A-와 시작값 0, 또는 진행 옵션을 켠 홀수 페이지.",
|
||||
"uploadFirstMessage": "먼저 PDF 파일을 업로드하세요.",
|
||||
"applyingLabels": "페이지 레이블 적용 중...",
|
||||
"invalidRangeMessage": "규칙 {{number}}에 잘못된 페이지 범위가 있습니다: {{range}}",
|
||||
"allPages": "모든 페이지",
|
||||
"emptyOutputMessage": "CoherentPDF가 빈 파일을 생성했습니다.",
|
||||
"successMessage": "페이지 레이블이 성공적으로 추가되었습니다!",
|
||||
"processErrorMessage": "페이지 레이블을 추가할 수 없습니다.",
|
||||
"styleOptions": {
|
||||
"DecimalArabic": "십진 숫자",
|
||||
"LowercaseRoman": "소문자 로마 숫자",
|
||||
"UppercaseRoman": "대문자 로마 숫자",
|
||||
"LowercaseLetters": "소문자 알파벳",
|
||||
"UppercaseLetters": "대문자 알파벳",
|
||||
"NoLabelPrefixOnly": "번호 없이 접두사만"
|
||||
}
|
||||
},
|
||||
"batesNumbering": {
|
||||
"name": "베이츠 번호 매기기",
|
||||
"subtitle": "하나 이상의 PDF에 순차적 베이츠 번호를 추가합니다."
|
||||
|
||||
@@ -86,6 +86,65 @@
|
||||
"name": "Paginanummers",
|
||||
"subtitle": "Paginanummers aan een document toevoegen."
|
||||
},
|
||||
"addPageLabels": {
|
||||
"name": "Paginelabels toevoegen",
|
||||
"subtitle": "Pas PDF-paginalabels toe met Romeinse cijfers, voorvoegsels en aangepaste startwaarden.",
|
||||
"uploadHint": "PDF-bestand",
|
||||
"howLabelsWorkTitle": "Hoe labels werken",
|
||||
"howLabelsWorkStep1": "Laat Paginabereik leeg om alle pagina's te labelen.",
|
||||
"howLabelsWorkStep2": "Gebruik stijlen zoals Romeinse cijfers voor voorwerk en decimale nummering voor het hoofdgedeelte.",
|
||||
"howLabelsWorkStep3": "Gebruik Voorvoegsel met Startwaarde 0 om labels zoals A-0, A-1 en A-2 te maken.",
|
||||
"howLabelsWorkStep4": "Schakel voortgang in wanneer één regel een onderbroken bereik gebruikt, zoals 1-9,30-40 of oneven pagina's.",
|
||||
"labelRulesTitle": "Labelregels",
|
||||
"addRule": "Regel toevoegen",
|
||||
"removeExistingLabels": "Bestaande paginalabels verwijderen voordat deze regels worden toegepast",
|
||||
"cpdfNote": "Deze tool gebruikt CoherentPDF in je browser. Als CoherentPDF niet is geconfigureerd, word je gevraagd dit in te stellen in de WASM-instellingen.",
|
||||
"processButton": "Paginelabels toevoegen",
|
||||
"howItWorksUploadTitle": "Bestand uploaden",
|
||||
"howItWorksUploadDescription": "Kies de PDF die je opnieuw wilt labelen.",
|
||||
"howItWorksDefineTitle": "Regels definiëren",
|
||||
"howItWorksDefineDescription": "Stel een of meer paginalabelregels in met paginabereiken, stijlen, voorvoegsels en startwaarden.",
|
||||
"howItWorksDownloadTitle": "Downloaden",
|
||||
"howItWorksDownloadDescription": "Sla de bijgewerkte PDF op met de nieuwe paginalabels.",
|
||||
"relatedToolsTitle": "Gerelateerde PDF-tools",
|
||||
"faqWhatIsQuestion": "Wat is een paginalabel?",
|
||||
"faqWhatIsAnswer": "Een paginalabel is de nummering die PDF-lezers tonen in miniaturen, paginanavigatie en afdrukvensters. Er wordt geen nieuwe tekst op de pagina zelf afgedrukt.",
|
||||
"faqMixQuestion": "Kan ik Romeinse cijfers en gewone nummers combineren?",
|
||||
"faqMixAnswer": "Ja. Voeg meerdere regels toe, zoals 1-4 met LowercaseRoman en 5-20 met DecimalArabic.",
|
||||
"faqPrivacyQuestion": "Blijven mijn bestanden privé?",
|
||||
"faqPrivacyAnswer": "Ja. De verwerking gebeurt in je browser met CoherentPDF WASM. Je PDF verlaat je apparaat niet.",
|
||||
"invalidFileTitle": "Ongeldig bestand",
|
||||
"invalidFileMessage": "Upload een geldig PDF-bestand.",
|
||||
"loadingPdf": "PDF laden...",
|
||||
"protectedPdfTitle": "Beveiligde PDF",
|
||||
"protectedPdfMessage": "Deze PDF is met een wachtwoord beveiligd. Gebruik eerst de tool Ontgrendelen of Machtigingen wijzigen.",
|
||||
"loadErrorMessage": "Het PDF-bestand kon niet worden geladen. Het bestand is mogelijk ongeldig, beschadigd of met een wachtwoord beveiligd.",
|
||||
"fileMeta": "{{size}} • {{count}} pagina's",
|
||||
"ruleTitle": "Labelregel {{number}}",
|
||||
"pageRangeLabel": "Paginabereik",
|
||||
"pageRangePlaceholder": "Alle pagina's, of bijv. 1-4, 7, oneven",
|
||||
"labelStyleLabel": "Labelstijl",
|
||||
"labelPrefixLabel": "Labelvoorvoegsel",
|
||||
"labelPrefixPlaceholder": "Optioneel voorvoegsel, bijv. A-",
|
||||
"startValueLabel": "Startwaarde",
|
||||
"continueNumbering": "Nummering voortzetten over onderbroken bereiken",
|
||||
"examplesNote": "Voorbeelden: 1-4 voor voorwerk met Romeinse cijfers, 15-20 met voorvoegsel A- en startwaarde 0, of oneven pagina's met voortgang ingeschakeld.",
|
||||
"uploadFirstMessage": "Upload eerst een PDF-bestand.",
|
||||
"applyingLabels": "Paginelabels toepassen...",
|
||||
"invalidRangeMessage": "Regel {{number}} heeft een ongeldig paginabereik: {{range}}",
|
||||
"allPages": "alle pagina's",
|
||||
"emptyOutputMessage": "CoherentPDF heeft een leeg bestand geproduceerd.",
|
||||
"successMessage": "Paginelabels zijn succesvol toegevoegd!",
|
||||
"processErrorMessage": "Kon de paginalabels niet toevoegen.",
|
||||
"styleOptions": {
|
||||
"DecimalArabic": "Decimale cijfers",
|
||||
"LowercaseRoman": "Kleine Romeinse cijfers",
|
||||
"UppercaseRoman": "Grote Romeinse cijfers",
|
||||
"LowercaseLetters": "Kleine letters",
|
||||
"UppercaseLetters": "Hoofdletters",
|
||||
"NoLabelPrefixOnly": "Alleen voorvoegsel zonder nummer"
|
||||
}
|
||||
},
|
||||
"batesNumbering": {
|
||||
"name": "Bates-nummering",
|
||||
"subtitle": "Opeenvolgende Bates-nummering toevoegen aan een of meer PDF-bestanden."
|
||||
|
||||
@@ -86,6 +86,65 @@
|
||||
"name": "Números de Página",
|
||||
"subtitle": "Insira números de página no seu documento."
|
||||
},
|
||||
"addPageLabels": {
|
||||
"name": "Adicionar rótulos de página",
|
||||
"subtitle": "Aplique rótulos de página PDF com números romanos, prefixos e valores iniciais personalizados.",
|
||||
"uploadHint": "Arquivo PDF",
|
||||
"howLabelsWorkTitle": "Como os rótulos funcionam",
|
||||
"howLabelsWorkStep1": "Deixe Intervalo de páginas vazio para rotular todas as páginas.",
|
||||
"howLabelsWorkStep2": "Use estilos como números romanos para as páginas iniciais e numeração decimal para o corpo principal.",
|
||||
"howLabelsWorkStep3": "Use Prefixo com Valor inicial 0 para criar rótulos como A-0, A-1 e A-2.",
|
||||
"howLabelsWorkStep4": "Ative a progressão quando uma regra usar um intervalo descontínuo como 1-9,30-40 ou páginas ímpares.",
|
||||
"labelRulesTitle": "Regras de rótulo",
|
||||
"addRule": "Adicionar regra",
|
||||
"removeExistingLabels": "Remover rótulos de página existentes antes de aplicar estas regras",
|
||||
"cpdfNote": "Esta ferramenta usa o CoherentPDF no seu navegador. Se o CoherentPDF não estiver configurado, você será solicitado a configurá-lo nas Configurações WASM.",
|
||||
"processButton": "Adicionar rótulos de página",
|
||||
"howItWorksUploadTitle": "Enviar arquivo",
|
||||
"howItWorksUploadDescription": "Escolha o PDF que você deseja rotular novamente.",
|
||||
"howItWorksDefineTitle": "Definir regras",
|
||||
"howItWorksDefineDescription": "Configure uma ou mais regras de rótulo de página com intervalos de páginas, estilos, prefixos e valores iniciais.",
|
||||
"howItWorksDownloadTitle": "Baixar",
|
||||
"howItWorksDownloadDescription": "Salve o PDF atualizado com seus novos rótulos de página.",
|
||||
"relatedToolsTitle": "Ferramentas PDF relacionadas",
|
||||
"faqWhatIsQuestion": "O que é um rótulo de página?",
|
||||
"faqWhatIsAnswer": "Um rótulo de página é a numeração mostrada pelos leitores de PDF nas miniaturas, na navegação de páginas e nas caixas de diálogo de impressão. Ele não imprime novo texto na própria página.",
|
||||
"faqMixQuestion": "Posso misturar números romanos e números normais?",
|
||||
"faqMixAnswer": "Sim. Adicione várias regras, como 1-4 com LowercaseRoman e 5-20 com DecimalArabic.",
|
||||
"faqPrivacyQuestion": "Meus arquivos permanecem privados?",
|
||||
"faqPrivacyAnswer": "Sim. O processamento acontece no seu navegador usando CoherentPDF WASM. Seu PDF não sai do seu dispositivo.",
|
||||
"invalidFileTitle": "Arquivo inválido",
|
||||
"invalidFileMessage": "Envie um arquivo PDF válido.",
|
||||
"loadingPdf": "Carregando PDF...",
|
||||
"protectedPdfTitle": "PDF protegido",
|
||||
"protectedPdfMessage": "Este PDF está protegido por senha. Use primeiro a ferramenta Descriptografar ou Alterar permissões.",
|
||||
"loadErrorMessage": "Falha ao carregar o arquivo PDF. O arquivo pode ser inválido, estar corrompido ou protegido por senha.",
|
||||
"fileMeta": "{{size}} • {{count}} páginas",
|
||||
"ruleTitle": "Regra de rótulo {{number}}",
|
||||
"pageRangeLabel": "Intervalo de páginas",
|
||||
"pageRangePlaceholder": "Todas as páginas, ou por ex. 1-4, 7, ímpares",
|
||||
"labelStyleLabel": "Estilo do rótulo",
|
||||
"labelPrefixLabel": "Prefixo do rótulo",
|
||||
"labelPrefixPlaceholder": "Prefixo opcional, ex. A-",
|
||||
"startValueLabel": "Valor inicial",
|
||||
"continueNumbering": "Continuar a numeração em intervalos descontínuos",
|
||||
"examplesNote": "Exemplos: 1-4 para páginas iniciais em algarismos romanos, 15-20 com prefixo A- e valor inicial 0, ou páginas ímpares com progressão ativada.",
|
||||
"uploadFirstMessage": "Envie primeiro um arquivo PDF.",
|
||||
"applyingLabels": "Aplicando rótulos de página...",
|
||||
"invalidRangeMessage": "A regra {{number}} tem um intervalo de páginas inválido: {{range}}",
|
||||
"allPages": "todas as páginas",
|
||||
"emptyOutputMessage": "O CoherentPDF produziu um arquivo vazio.",
|
||||
"successMessage": "Rótulos de página adicionados com sucesso!",
|
||||
"processErrorMessage": "Não foi possível adicionar os rótulos de página.",
|
||||
"styleOptions": {
|
||||
"DecimalArabic": "Números decimais",
|
||||
"LowercaseRoman": "Números romanos minúsculos",
|
||||
"UppercaseRoman": "Números romanos maiúsculos",
|
||||
"LowercaseLetters": "Letras minúsculas",
|
||||
"UppercaseLetters": "Letras maiúsculas",
|
||||
"NoLabelPrefixOnly": "Somente prefixo sem numeração"
|
||||
}
|
||||
},
|
||||
"batesNumbering": {
|
||||
"name": "Numeração Bates",
|
||||
"subtitle": "Adicionar números Bates sequenciais em um ou mais arquivos PDF."
|
||||
|
||||
@@ -86,6 +86,65 @@
|
||||
"name": "Нумерация страниц",
|
||||
"subtitle": "Пронумеровать страницы."
|
||||
},
|
||||
"addPageLabels": {
|
||||
"name": "Добавить метки страниц",
|
||||
"subtitle": "Применяйте метки страниц PDF с римскими цифрами, префиксами и пользовательскими начальными значениями.",
|
||||
"uploadHint": "PDF-файл",
|
||||
"howLabelsWorkTitle": "Как работают метки",
|
||||
"howLabelsWorkStep1": "Оставьте диапазон страниц пустым, чтобы проставить метки на всех страницах.",
|
||||
"howLabelsWorkStep2": "Используйте стили вроде римских цифр для вводных страниц и десятичную нумерацию для основной части.",
|
||||
"howLabelsWorkStep3": "Используйте префикс со стартовым значением 0, чтобы создавать метки вроде A-0, A-1, A-2.",
|
||||
"howLabelsWorkStep4": "Включите продолжение нумерации, если одно правило использует несмежный диапазон, например 1-9,30-40 или нечётные страницы.",
|
||||
"labelRulesTitle": "Правила меток",
|
||||
"addRule": "Добавить правило",
|
||||
"removeExistingLabels": "Удалить существующие метки страниц перед применением этих правил",
|
||||
"cpdfNote": "Этот инструмент использует CoherentPDF в вашем браузере. Если CoherentPDF не настроен, вам будет предложено настроить его в параметрах WASM.",
|
||||
"processButton": "Добавить метки страниц",
|
||||
"howItWorksUploadTitle": "Загрузить файл",
|
||||
"howItWorksUploadDescription": "Выберите PDF, для которого нужно изменить метки страниц.",
|
||||
"howItWorksDefineTitle": "Задать правила",
|
||||
"howItWorksDefineDescription": "Настройте одно или несколько правил меток страниц с диапазонами, стилями, префиксами и начальными значениями.",
|
||||
"howItWorksDownloadTitle": "Скачать",
|
||||
"howItWorksDownloadDescription": "Сохраните обновлённый PDF с новыми метками страниц.",
|
||||
"relatedToolsTitle": "Похожие PDF-инструменты",
|
||||
"faqWhatIsQuestion": "Что такое метка страницы?",
|
||||
"faqWhatIsAnswer": "Метка страницы — это нумерация, которую PDF-ридеры показывают в миниатюрах, навигации по страницам и диалогах печати. Она не печатает новый текст на самой странице.",
|
||||
"faqMixQuestion": "Можно ли смешивать римские цифры и обычные числа?",
|
||||
"faqMixAnswer": "Да. Добавьте несколько правил, например 1-4 с LowercaseRoman и 5-20 с DecimalArabic.",
|
||||
"faqPrivacyQuestion": "Мои файлы останутся приватными?",
|
||||
"faqPrivacyAnswer": "Да. Обработка происходит в вашем браузере с использованием CoherentPDF WASM. Ваш PDF не покидает устройство.",
|
||||
"invalidFileTitle": "Недопустимый файл",
|
||||
"invalidFileMessage": "Пожалуйста, загрузите корректный PDF-файл.",
|
||||
"loadingPdf": "Загрузка PDF...",
|
||||
"protectedPdfTitle": "Защищённый PDF",
|
||||
"protectedPdfMessage": "Этот PDF защищён паролем. Сначала используйте инструмент Расшифровать или Изменить разрешения.",
|
||||
"loadErrorMessage": "Не удалось загрузить PDF-файл. Файл может быть повреждён, некорректен или защищён паролем.",
|
||||
"fileMeta": "{{size}} • {{count}} стр.",
|
||||
"ruleTitle": "Правило метки {{number}}",
|
||||
"pageRangeLabel": "Диапазон страниц",
|
||||
"pageRangePlaceholder": "Все страницы, например 1-4, 7, нечётные",
|
||||
"labelStyleLabel": "Стиль метки",
|
||||
"labelPrefixLabel": "Префикс метки",
|
||||
"labelPrefixPlaceholder": "Необязательный префикс, например A-",
|
||||
"startValueLabel": "Начальное значение",
|
||||
"continueNumbering": "Продолжать нумерацию через несмежные диапазоны",
|
||||
"examplesNote": "Примеры: 1-4 для вводных страниц римскими цифрами, 15-20 с префиксом A- и начальным значением 0, или нечётные страницы с включённым продолжением.",
|
||||
"uploadFirstMessage": "Сначала загрузите PDF-файл.",
|
||||
"applyingLabels": "Применение меток страниц...",
|
||||
"invalidRangeMessage": "Правило {{number}} содержит недопустимый диапазон страниц: {{range}}",
|
||||
"allPages": "все страницы",
|
||||
"emptyOutputMessage": "CoherentPDF создал пустой файл.",
|
||||
"successMessage": "Метки страниц успешно добавлены!",
|
||||
"processErrorMessage": "Не удалось добавить метки страниц.",
|
||||
"styleOptions": {
|
||||
"DecimalArabic": "Десятичные числа",
|
||||
"LowercaseRoman": "Строчные римские цифры",
|
||||
"UppercaseRoman": "Прописные римские цифры",
|
||||
"LowercaseLetters": "Строчные буквы",
|
||||
"UppercaseLetters": "Прописные буквы",
|
||||
"NoLabelPrefixOnly": "Только префикс без номера"
|
||||
}
|
||||
},
|
||||
"addWatermark": {
|
||||
"name": "Добавление водяных знаков",
|
||||
"subtitle": "Наложить текст или изображение на страницы документа."
|
||||
|
||||
@@ -86,6 +86,65 @@
|
||||
"name": "Sidnummer",
|
||||
"subtitle": "Infoga sidnummer i ditt dokument."
|
||||
},
|
||||
"addPageLabels": {
|
||||
"name": "Lägg till sidetiketter",
|
||||
"subtitle": "Använd PDF-sidetiketter med romerska siffror, prefix och anpassade startvärden.",
|
||||
"uploadHint": "PDF-fil",
|
||||
"howLabelsWorkTitle": "Så fungerar etiketter",
|
||||
"howLabelsWorkStep1": "Lämna Sidintervall tomt för att märka alla sidor.",
|
||||
"howLabelsWorkStep2": "Använd stilar som romerska siffror för inledningen och decimalnumrering för huvuddelen.",
|
||||
"howLabelsWorkStep3": "Använd Prefix med Startvärde 0 för att skapa etiketter som A-0, A-1 och A-2.",
|
||||
"howLabelsWorkStep4": "Aktivera fortlöpning när en regel använder ett osammanhängande intervall som 1-9,30-40 eller udda sidor.",
|
||||
"labelRulesTitle": "Etikettregler",
|
||||
"addRule": "Lägg till regel",
|
||||
"removeExistingLabels": "Ta bort befintliga sidetiketter innan dessa regler tillämpas",
|
||||
"cpdfNote": "Det här verktyget använder CoherentPDF i din webbläsare. Om CoherentPDF inte är konfigurerat blir du ombedd att ställa in det i WASM-inställningar.",
|
||||
"processButton": "Lägg till sidetiketter",
|
||||
"howItWorksUploadTitle": "Ladda upp fil",
|
||||
"howItWorksUploadDescription": "Välj PDF-filen du vill märka om.",
|
||||
"howItWorksDefineTitle": "Definiera regler",
|
||||
"howItWorksDefineDescription": "Ställ in en eller flera regler för sidetiketter med sidintervall, stilar, prefix och startvärden.",
|
||||
"howItWorksDownloadTitle": "Ladda ner",
|
||||
"howItWorksDownloadDescription": "Spara den uppdaterade PDF-filen med sina nya sidetiketter.",
|
||||
"relatedToolsTitle": "Relaterade PDF-verktyg",
|
||||
"faqWhatIsQuestion": "Vad är en sidetikett?",
|
||||
"faqWhatIsAnswer": "En sidetikett är den numrering som PDF-läsare visar i miniatyrer, sidnavigering och utskriftsdialoger. Den skriver inte ut ny text på själva sidan.",
|
||||
"faqMixQuestion": "Kan jag blanda romerska siffror och vanliga siffror?",
|
||||
"faqMixAnswer": "Ja. Lägg till flera regler, till exempel 1-4 med LowercaseRoman och 5-20 med DecimalArabic.",
|
||||
"faqPrivacyQuestion": "Förblir mina filer privata?",
|
||||
"faqPrivacyAnswer": "Ja. Bearbetningen sker i din webbläsare med CoherentPDF WASM. Din PDF lämnar inte din enhet.",
|
||||
"invalidFileTitle": "Ogiltig fil",
|
||||
"invalidFileMessage": "Ladda upp en giltig PDF-fil.",
|
||||
"loadingPdf": "Läser in PDF...",
|
||||
"protectedPdfTitle": "Skyddad PDF",
|
||||
"protectedPdfMessage": "Den här PDF-filen är lösenordsskyddad. Använd först verktyget Dekryptera eller Ändra behörigheter.",
|
||||
"loadErrorMessage": "Det gick inte att läsa in PDF-filen. Filen kan vara ogiltig, skadad eller lösenordsskyddad.",
|
||||
"fileMeta": "{{size}} • {{count}} sidor",
|
||||
"ruleTitle": "Etikettregel {{number}}",
|
||||
"pageRangeLabel": "Sidintervall",
|
||||
"pageRangePlaceholder": "Alla sidor, eller t.ex. 1-4, 7, udda",
|
||||
"labelStyleLabel": "Etikettstil",
|
||||
"labelPrefixLabel": "Etikettprefix",
|
||||
"labelPrefixPlaceholder": "Valfritt prefix, t.ex. A-",
|
||||
"startValueLabel": "Startvärde",
|
||||
"continueNumbering": "Fortsätt numreringen över osammanhängande intervall",
|
||||
"examplesNote": "Exempel: 1-4 för inledande sidor med romerska siffror, 15-20 med prefixet A- och startvärde 0, eller udda sidor med fortlöpning aktiverad.",
|
||||
"uploadFirstMessage": "Ladda först upp en PDF-fil.",
|
||||
"applyingLabels": "Tillämpa sidetiketter...",
|
||||
"invalidRangeMessage": "Regel {{number}} har ett ogiltigt sidintervall: {{range}}",
|
||||
"allPages": "alla sidor",
|
||||
"emptyOutputMessage": "CoherentPDF skapade en tom fil.",
|
||||
"successMessage": "Sidetiketter lades till!",
|
||||
"processErrorMessage": "Det gick inte att lägga till sidetiketter.",
|
||||
"styleOptions": {
|
||||
"DecimalArabic": "Decimala siffror",
|
||||
"LowercaseRoman": "Små romerska siffror",
|
||||
"UppercaseRoman": "Stora romerska siffror",
|
||||
"LowercaseLetters": "Små bokstäver",
|
||||
"UppercaseLetters": "Stora bokstäver",
|
||||
"NoLabelPrefixOnly": "Endast prefix utan nummer"
|
||||
}
|
||||
},
|
||||
"batesNumbering": {
|
||||
"name": "Bates-numrering",
|
||||
"subtitle": "Lägg till sekventiella Bates-nummer över en eller flera PDF-filer."
|
||||
|
||||
@@ -86,6 +86,65 @@
|
||||
"name": "Sayfa Numaraları",
|
||||
"subtitle": "Belgenize sayfa numaraları ekleyin."
|
||||
},
|
||||
"addPageLabels": {
|
||||
"name": "Sayfa etiketleri ekle",
|
||||
"subtitle": "Roma rakamları, önekler ve özel başlangıç değerleriyle PDF sayfa etiketleri uygulayın.",
|
||||
"uploadHint": "PDF dosyası",
|
||||
"howLabelsWorkTitle": "Etiketler nasıl çalışır",
|
||||
"howLabelsWorkStep1": "Tüm sayfaları etiketlemek için Sayfa Aralığını boş bırakın.",
|
||||
"howLabelsWorkStep2": "Ön sayfalar için Roma rakamları, ana bölüm için ondalık numaralandırma gibi stiller kullanın.",
|
||||
"howLabelsWorkStep3": "A-0, A-1, A-2 gibi etiketler oluşturmak için Başlangıç Değeri 0 ile Önek kullanın.",
|
||||
"howLabelsWorkStep4": "Tek bir kural 1-9,30-40 veya tek sayfalar gibi kesik bir aralık kullandığında ilerlemeyi etkinleştirin.",
|
||||
"labelRulesTitle": "Etiket Kuralları",
|
||||
"addRule": "Kural Ekle",
|
||||
"removeExistingLabels": "Bu kuralları uygulamadan önce mevcut sayfa etiketlerini kaldır",
|
||||
"cpdfNote": "Bu araç tarayıcınızda CoherentPDF kullanır. CoherentPDF yapılandırılmadıysa WASM Ayarlarında kurmanız istenir.",
|
||||
"processButton": "Sayfa etiketleri ekle",
|
||||
"howItWorksUploadTitle": "Dosya Yükle",
|
||||
"howItWorksUploadDescription": "Yeniden etiketlemek istediğiniz PDF'yi seçin.",
|
||||
"howItWorksDefineTitle": "Kuralları Tanımla",
|
||||
"howItWorksDefineDescription": "Sayfa aralıkları, stiller, önekler ve başlangıç değerleriyle bir veya daha fazla sayfa etiketi kuralı ayarlayın.",
|
||||
"howItWorksDownloadTitle": "İndir",
|
||||
"howItWorksDownloadDescription": "Yeni sayfa etiketleriyle güncellenmiş PDF'yi kaydedin.",
|
||||
"relatedToolsTitle": "İlgili PDF Araçları",
|
||||
"faqWhatIsQuestion": "Sayfa etiketi nedir?",
|
||||
"faqWhatIsAnswer": "Sayfa etiketi, PDF okuyucuların küçük resimlerde, sayfa gezintisinde ve yazdırma pencerelerinde gösterdiği numaralandırmadır. Sayfanın üzerine yeni metin basmaz.",
|
||||
"faqMixQuestion": "Roma rakamları ile normal sayıları karıştırabilir miyim?",
|
||||
"faqMixAnswer": "Evet. Örneğin 1-4 için LowercaseRoman ve 5-20 için DecimalArabic gibi birden fazla kural ekleyin.",
|
||||
"faqPrivacyQuestion": "Dosyalarım gizli kalır mı?",
|
||||
"faqPrivacyAnswer": "Evet. İşleme CoherentPDF WASM kullanılarak tarayıcınızda yapılır. PDF'niz cihazınızdan çıkmaz.",
|
||||
"invalidFileTitle": "Geçersiz Dosya",
|
||||
"invalidFileMessage": "Lütfen geçerli bir PDF dosyası yükleyin.",
|
||||
"loadingPdf": "PDF yükleniyor...",
|
||||
"protectedPdfTitle": "Korumalı PDF",
|
||||
"protectedPdfMessage": "Bu PDF parola korumalıdır. Önce Şifre Çözme veya İzinleri Değiştir aracını kullanın.",
|
||||
"loadErrorMessage": "PDF dosyası yüklenemedi. Dosya geçersiz, bozuk veya parola korumalı olabilir.",
|
||||
"fileMeta": "{{size}} • {{count}} sayfa",
|
||||
"ruleTitle": "Etiket Kuralı {{number}}",
|
||||
"pageRangeLabel": "Sayfa Aralığı",
|
||||
"pageRangePlaceholder": "Tüm sayfalar veya örn. 1-4, 7, tek",
|
||||
"labelStyleLabel": "Etiket Stili",
|
||||
"labelPrefixLabel": "Etiket Ön Eki",
|
||||
"labelPrefixPlaceholder": "İsteğe bağlı önek, örn. A-",
|
||||
"startValueLabel": "Başlangıç Değeri",
|
||||
"continueNumbering": "Kesik aralıklarda numaralandırmayı sürdür",
|
||||
"examplesNote": "Örnekler: Roma rakamlı ön sayfalar için 1-4, A- öneki ve 0 başlangıç değeriyle 15-20 veya ilerleme açıkken tek sayfalar.",
|
||||
"uploadFirstMessage": "Önce bir PDF dosyası yükleyin.",
|
||||
"applyingLabels": "Sayfa etiketleri uygulanıyor...",
|
||||
"invalidRangeMessage": "{{number}} numaralı kuralda geçersiz bir sayfa aralığı var: {{range}}",
|
||||
"allPages": "tüm sayfalar",
|
||||
"emptyOutputMessage": "CoherentPDF boş bir dosya üretti.",
|
||||
"successMessage": "Sayfa etiketleri başarıyla eklendi!",
|
||||
"processErrorMessage": "Sayfa etiketleri eklenemedi.",
|
||||
"styleOptions": {
|
||||
"DecimalArabic": "Ondalık sayılar",
|
||||
"LowercaseRoman": "Küçük Roma rakamları",
|
||||
"UppercaseRoman": "Büyük Roma rakamları",
|
||||
"LowercaseLetters": "Küçük harfler",
|
||||
"UppercaseLetters": "Büyük harfler",
|
||||
"NoLabelPrefixOnly": "Numarasız yalnızca önek"
|
||||
}
|
||||
},
|
||||
"batesNumbering": {
|
||||
"name": "Bates Numaralandırma",
|
||||
"subtitle": "Bir veya daha fazla PDF dosyasına sıralı Bates numaraları ekleyin."
|
||||
|
||||
@@ -86,6 +86,65 @@
|
||||
"name": "Số trang",
|
||||
"subtitle": "Chèn số trang vào tài liệu của bạn."
|
||||
},
|
||||
"addPageLabels": {
|
||||
"name": "Thêm nhãn trang",
|
||||
"subtitle": "Áp dụng nhãn trang PDF với số La Mã, tiền tố và giá trị bắt đầu tùy chỉnh.",
|
||||
"uploadHint": "Tệp PDF",
|
||||
"howLabelsWorkTitle": "Cách nhãn hoạt động",
|
||||
"howLabelsWorkStep1": "Để trống Phạm vi trang để gắn nhãn cho tất cả các trang.",
|
||||
"howLabelsWorkStep2": "Dùng các kiểu như số La Mã cho phần mở đầu và đánh số thập phân cho phần nội dung chính.",
|
||||
"howLabelsWorkStep3": "Dùng Tiền tố với Giá trị bắt đầu 0 để tạo các nhãn như A-0, A-1, A-2.",
|
||||
"howLabelsWorkStep4": "Bật tiến trình khi một quy tắc dùng phạm vi rời rạc như 1-9,30-40 hoặc các trang lẻ.",
|
||||
"labelRulesTitle": "Quy tắc nhãn",
|
||||
"addRule": "Thêm quy tắc",
|
||||
"removeExistingLabels": "Xóa nhãn trang hiện có trước khi áp dụng các quy tắc này",
|
||||
"cpdfNote": "Công cụ này dùng CoherentPDF trong trình duyệt của bạn. Nếu CoherentPDF chưa được cấu hình, bạn sẽ được nhắc thiết lập trong Cài đặt WASM.",
|
||||
"processButton": "Thêm nhãn trang",
|
||||
"howItWorksUploadTitle": "Tải tệp lên",
|
||||
"howItWorksUploadDescription": "Chọn tệp PDF mà bạn muốn gắn nhãn lại.",
|
||||
"howItWorksDefineTitle": "Xác định quy tắc",
|
||||
"howItWorksDefineDescription": "Thiết lập một hoặc nhiều quy tắc nhãn trang với phạm vi trang, kiểu, tiền tố và giá trị bắt đầu.",
|
||||
"howItWorksDownloadTitle": "Tải xuống",
|
||||
"howItWorksDownloadDescription": "Lưu tệp PDF đã cập nhật với các nhãn trang mới.",
|
||||
"relatedToolsTitle": "Công cụ PDF liên quan",
|
||||
"faqWhatIsQuestion": "Nhãn trang là gì?",
|
||||
"faqWhatIsAnswer": "Nhãn trang là kiểu đánh số mà trình đọc PDF hiển thị trong hình thu nhỏ, điều hướng trang và hộp thoại in. Nó không in thêm văn bản mới lên chính trang đó.",
|
||||
"faqMixQuestion": "Tôi có thể trộn số La Mã và số thường không?",
|
||||
"faqMixAnswer": "Có. Hãy thêm nhiều quy tắc, chẳng hạn 1-4 với LowercaseRoman và 5-20 với DecimalArabic.",
|
||||
"faqPrivacyQuestion": "Các tệp của tôi có được giữ riêng tư không?",
|
||||
"faqPrivacyAnswer": "Có. Việc xử lý diễn ra trong trình duyệt của bạn bằng CoherentPDF WASM. Tệp PDF của bạn không rời khỏi thiết bị.",
|
||||
"invalidFileTitle": "Tệp không hợp lệ",
|
||||
"invalidFileMessage": "Vui lòng tải lên một tệp PDF hợp lệ.",
|
||||
"loadingPdf": "Đang tải PDF...",
|
||||
"protectedPdfTitle": "PDF được bảo vệ",
|
||||
"protectedPdfMessage": "Tệp PDF này được bảo vệ bằng mật khẩu. Hãy dùng công cụ Giải mã hoặc Thay đổi quyền trước.",
|
||||
"loadErrorMessage": "Không thể tải tệp PDF. Tệp có thể không hợp lệ, bị hỏng hoặc được bảo vệ bằng mật khẩu.",
|
||||
"fileMeta": "{{size}} • {{count}} trang",
|
||||
"ruleTitle": "Quy tắc nhãn {{number}}",
|
||||
"pageRangeLabel": "Phạm vi trang",
|
||||
"pageRangePlaceholder": "Tất cả các trang, hoặc ví dụ 1-4, 7, lẻ",
|
||||
"labelStyleLabel": "Kiểu nhãn",
|
||||
"labelPrefixLabel": "Tiền tố nhãn",
|
||||
"labelPrefixPlaceholder": "Tiền tố tùy chọn, ví dụ A-",
|
||||
"startValueLabel": "Giá trị bắt đầu",
|
||||
"continueNumbering": "Tiếp tục đánh số qua các phạm vi rời rạc",
|
||||
"examplesNote": "Ví dụ: 1-4 cho phần mở đầu bằng số La Mã, 15-20 với tiền tố A- và giá trị bắt đầu 0, hoặc các trang lẻ khi đã bật tiến trình.",
|
||||
"uploadFirstMessage": "Vui lòng tải lên tệp PDF trước.",
|
||||
"applyingLabels": "Đang áp dụng nhãn trang...",
|
||||
"invalidRangeMessage": "Quy tắc {{number}} có phạm vi trang không hợp lệ: {{range}}",
|
||||
"allPages": "tất cả các trang",
|
||||
"emptyOutputMessage": "CoherentPDF đã tạo ra một tệp rỗng.",
|
||||
"successMessage": "Đã thêm nhãn trang thành công!",
|
||||
"processErrorMessage": "Không thể thêm nhãn trang.",
|
||||
"styleOptions": {
|
||||
"DecimalArabic": "Số thập phân",
|
||||
"LowercaseRoman": "Số La Mã thường",
|
||||
"UppercaseRoman": "Số La Mã hoa",
|
||||
"LowercaseLetters": "Chữ thường",
|
||||
"UppercaseLetters": "Chữ hoa",
|
||||
"NoLabelPrefixOnly": "Chỉ tiền tố, không đánh số"
|
||||
}
|
||||
},
|
||||
"batesNumbering": {
|
||||
"name": "Đánh số Bates",
|
||||
"subtitle": "Thêm số Bates tuần tự trên một hoặc nhiều tệp PDF."
|
||||
|
||||
@@ -86,6 +86,65 @@
|
||||
"name": "頁碼",
|
||||
"subtitle": "在你的文件中插入頁碼。"
|
||||
},
|
||||
"addPageLabels": {
|
||||
"name": "新增頁面標籤",
|
||||
"subtitle": "使用羅馬數字、前綴與自訂起始值套用 PDF 頁面標籤。",
|
||||
"uploadHint": "PDF 檔案",
|
||||
"howLabelsWorkTitle": "頁面標籤的運作方式",
|
||||
"howLabelsWorkStep1": "將頁面範圍留空即可為所有頁面套用標籤。",
|
||||
"howLabelsWorkStep2": "前置頁可使用羅馬數字,正文則可使用十進位編號等樣式。",
|
||||
"howLabelsWorkStep3": "將前綴搭配起始值 0,可建立像 A-0、A-1、A-2 這樣的標籤。",
|
||||
"howLabelsWorkStep4": "當某條規則使用 1-9,30-40 或奇數頁等不連續範圍時,請啟用連續編號。",
|
||||
"labelRulesTitle": "標籤規則",
|
||||
"addRule": "新增規則",
|
||||
"removeExistingLabels": "套用這些規則前先移除現有頁面標籤",
|
||||
"cpdfNote": "此工具會在你的瀏覽器中使用 CoherentPDF。若 CoherentPDF 尚未設定,系統會提示你在 WASM 設定中完成設定。",
|
||||
"processButton": "新增頁面標籤",
|
||||
"howItWorksUploadTitle": "上傳檔案",
|
||||
"howItWorksUploadDescription": "選擇你要重新標記的 PDF 檔案。",
|
||||
"howItWorksDefineTitle": "定義規則",
|
||||
"howItWorksDefineDescription": "設定一條或多條頁面標籤規則,包括頁面範圍、樣式、前綴與起始值。",
|
||||
"howItWorksDownloadTitle": "下載",
|
||||
"howItWorksDownloadDescription": "儲存套用新頁面標籤後的 PDF。",
|
||||
"relatedToolsTitle": "相關 PDF 工具",
|
||||
"faqWhatIsQuestion": "什麼是頁面標籤?",
|
||||
"faqWhatIsAnswer": "頁面標籤是 PDF 閱讀器在縮圖、頁面導覽與列印對話框中顯示的編號。它不會在頁面本身額外列印新文字。",
|
||||
"faqMixQuestion": "我可以混用羅馬數字和一般數字嗎?",
|
||||
"faqMixAnswer": "可以。你可以新增多條規則,例如 1-4 使用 LowercaseRoman,5-20 使用 DecimalArabic。",
|
||||
"faqPrivacyQuestion": "我的檔案會保持私密嗎?",
|
||||
"faqPrivacyAnswer": "會。處理程序會在你的瀏覽器中使用 CoherentPDF WASM 完成,PDF 不會離開你的裝置。",
|
||||
"invalidFileTitle": "無效檔案",
|
||||
"invalidFileMessage": "請上傳有效的 PDF 檔案。",
|
||||
"loadingPdf": "正在載入 PDF...",
|
||||
"protectedPdfTitle": "受保護的 PDF",
|
||||
"protectedPdfMessage": "此 PDF 受密碼保護。請先使用解密或變更權限工具。",
|
||||
"loadErrorMessage": "無法載入 PDF 檔案。該檔案可能無效、毀損或受密碼保護。",
|
||||
"fileMeta": "{{size}} • {{count}} 頁",
|
||||
"ruleTitle": "標籤規則 {{number}}",
|
||||
"pageRangeLabel": "頁面範圍",
|
||||
"pageRangePlaceholder": "所有頁面,或例如 1-4、7、奇數頁",
|
||||
"labelStyleLabel": "標籤樣式",
|
||||
"labelPrefixLabel": "標籤前綴",
|
||||
"labelPrefixPlaceholder": "可選前綴,例如 A-",
|
||||
"startValueLabel": "起始值",
|
||||
"continueNumbering": "在不連續範圍中持續編號",
|
||||
"examplesNote": "例如:1-4 用於前言的羅馬數字頁碼、15-20 使用前綴 A- 且起始值為 0,或啟用連續編號的奇數頁。",
|
||||
"uploadFirstMessage": "請先上傳 PDF 檔案。",
|
||||
"applyingLabels": "正在套用頁面標籤...",
|
||||
"invalidRangeMessage": "規則 {{number}} 的頁面範圍無效:{{range}}",
|
||||
"allPages": "所有頁面",
|
||||
"emptyOutputMessage": "CoherentPDF 產生了空白檔案。",
|
||||
"successMessage": "頁面標籤新增成功!",
|
||||
"processErrorMessage": "無法新增頁面標籤。",
|
||||
"styleOptions": {
|
||||
"DecimalArabic": "十進位數字",
|
||||
"LowercaseRoman": "小寫羅馬數字",
|
||||
"UppercaseRoman": "大寫羅馬數字",
|
||||
"LowercaseLetters": "小寫字母",
|
||||
"UppercaseLetters": "大寫字母",
|
||||
"NoLabelPrefixOnly": "僅前綴,無編號"
|
||||
}
|
||||
},
|
||||
"batesNumbering": {
|
||||
"name": "Bates編號",
|
||||
"subtitle": "在一個或多個PDF檔案中新增連續的Bates編號。"
|
||||
|
||||
@@ -86,6 +86,65 @@
|
||||
"name": "页码",
|
||||
"subtitle": "将页码插入到您的文档中。"
|
||||
},
|
||||
"addPageLabels": {
|
||||
"name": "添加页面标签",
|
||||
"subtitle": "使用罗马数字、前缀和自定义起始值应用 PDF 页面标签。",
|
||||
"uploadHint": "PDF 文件",
|
||||
"howLabelsWorkTitle": "页面标签的工作方式",
|
||||
"howLabelsWorkStep1": "将页面范围留空即可为所有页面添加标签。",
|
||||
"howLabelsWorkStep2": "前置页可使用罗马数字,正文部分可使用十进制编号等样式。",
|
||||
"howLabelsWorkStep3": "将前缀与起始值 0 结合使用,可创建 A-0、A-1、A-2 之类的标签。",
|
||||
"howLabelsWorkStep4": "当某条规则使用 1-9,30-40 或奇数页之类的不连续范围时,请启用连续编号。",
|
||||
"labelRulesTitle": "标签规则",
|
||||
"addRule": "添加规则",
|
||||
"removeExistingLabels": "应用这些规则前先移除现有页面标签",
|
||||
"cpdfNote": "此工具会在您的浏览器中使用 CoherentPDF。如果尚未配置 CoherentPDF,系统会提示您在 WASM 设置中完成配置。",
|
||||
"processButton": "添加页面标签",
|
||||
"howItWorksUploadTitle": "上传文件",
|
||||
"howItWorksUploadDescription": "选择您想重新标记的 PDF 文件。",
|
||||
"howItWorksDefineTitle": "定义规则",
|
||||
"howItWorksDefineDescription": "设置一条或多条页面标签规则,包括页面范围、样式、前缀和起始值。",
|
||||
"howItWorksDownloadTitle": "下载",
|
||||
"howItWorksDownloadDescription": "保存带有新页面标签的更新后 PDF。",
|
||||
"relatedToolsTitle": "相关 PDF 工具",
|
||||
"faqWhatIsQuestion": "什么是页面标签?",
|
||||
"faqWhatIsAnswer": "页面标签是 PDF 阅读器在缩略图、页面导航和打印对话框中显示的编号。它不会在页面上额外打印新文字。",
|
||||
"faqMixQuestion": "我可以混用罗马数字和普通数字吗?",
|
||||
"faqMixAnswer": "可以。您可以添加多条规则,例如 1-4 使用 LowercaseRoman,5-20 使用 DecimalArabic。",
|
||||
"faqPrivacyQuestion": "我的文件会保持私密吗?",
|
||||
"faqPrivacyAnswer": "会。处理过程在您的浏览器中使用 CoherentPDF WASM 完成,您的 PDF 不会离开您的设备。",
|
||||
"invalidFileTitle": "无效文件",
|
||||
"invalidFileMessage": "请上传有效的 PDF 文件。",
|
||||
"loadingPdf": "正在加载 PDF...",
|
||||
"protectedPdfTitle": "受保护的 PDF",
|
||||
"protectedPdfMessage": "此 PDF 受密码保护。请先使用解密或更改权限工具。",
|
||||
"loadErrorMessage": "无法加载 PDF 文件。该文件可能无效、损坏或受密码保护。",
|
||||
"fileMeta": "{{size}} • {{count}} 页",
|
||||
"ruleTitle": "标签规则 {{number}}",
|
||||
"pageRangeLabel": "页面范围",
|
||||
"pageRangePlaceholder": "所有页面,或例如 1-4、7、奇数页",
|
||||
"labelStyleLabel": "标签样式",
|
||||
"labelPrefixLabel": "标签前缀",
|
||||
"labelPrefixPlaceholder": "可选前缀,例如 A-",
|
||||
"startValueLabel": "起始值",
|
||||
"continueNumbering": "在不连续范围中继续编号",
|
||||
"examplesNote": "示例:1-4 用于罗马数字前言部分,15-20 使用前缀 A- 且起始值为 0,或者启用连续编号的奇数页。",
|
||||
"uploadFirstMessage": "请先上传 PDF 文件。",
|
||||
"applyingLabels": "正在应用页面标签...",
|
||||
"invalidRangeMessage": "规则 {{number}} 的页面范围无效:{{range}}",
|
||||
"allPages": "所有页面",
|
||||
"emptyOutputMessage": "CoherentPDF 生成了一个空文件。",
|
||||
"successMessage": "页面标签添加成功!",
|
||||
"processErrorMessage": "无法添加页面标签。",
|
||||
"styleOptions": {
|
||||
"DecimalArabic": "十进制数字",
|
||||
"LowercaseRoman": "小写罗马数字",
|
||||
"UppercaseRoman": "大写罗马数字",
|
||||
"LowercaseLetters": "小写字母",
|
||||
"UppercaseLetters": "大写字母",
|
||||
"NoLabelPrefixOnly": "仅前缀,无编号"
|
||||
}
|
||||
},
|
||||
"batesNumbering": {
|
||||
"name": "Bates编号",
|
||||
"subtitle": "在一个或多个PDF文件中添加连续的Bates编号。"
|
||||
|
||||
@@ -108,6 +108,13 @@ const baseCategories = [
|
||||
icon: 'ph-list-numbers',
|
||||
subtitle: 'Insert page numbers into your document.',
|
||||
},
|
||||
{
|
||||
href: import.meta.env.BASE_URL + 'add-page-labels.html',
|
||||
name: 'Add Page Labels',
|
||||
icon: 'ph-text-aa',
|
||||
subtitle:
|
||||
'Apply PDF page labels with Roman numerals, prefixes, and custom starts.',
|
||||
},
|
||||
{
|
||||
href: import.meta.env.BASE_URL + 'bates-numbering.html',
|
||||
name: 'Bates Numbering',
|
||||
|
||||
565
src/js/logic/add-page-labels-page.ts
Normal file
565
src/js/logic/add-page-labels-page.ts
Normal file
@@ -0,0 +1,565 @@
|
||||
import { createIcons, icons } from 'lucide';
|
||||
import { PDFDocument } from 'pdf-lib';
|
||||
import type {
|
||||
AddPageLabelsState,
|
||||
LabelRule,
|
||||
PageLabelStyleName,
|
||||
} from '@/types';
|
||||
import { showAlert, showLoader, hideLoader } from '../ui.js';
|
||||
import { t } from '../i18n/index.js';
|
||||
import {
|
||||
downloadFile,
|
||||
formatBytes,
|
||||
readFileAsArrayBuffer,
|
||||
} from '../utils/helpers.js';
|
||||
import { getCpdf, isCpdfAvailable } from '../utils/cpdf-helper.js';
|
||||
import { showWasmRequiredDialog } from '../utils/wasm-provider.js';
|
||||
import {
|
||||
PAGE_LABEL_STYLE_OPTIONS,
|
||||
normalizePageLabelStartValue,
|
||||
resolvePageLabelStyle,
|
||||
} from '../utils/page-labels.js';
|
||||
|
||||
type AddPageLabelsCpdf = {
|
||||
setSlow?: () => void;
|
||||
fromMemory(data: Uint8Array, userpw: string): CoherentPdf;
|
||||
removePageLabels(pdf: CoherentPdf): void;
|
||||
parsePagespec(pdf: CoherentPdf, pagespec: string): CpdfPageRange;
|
||||
all(pdf: CoherentPdf): CpdfPageRange;
|
||||
addPageLabels(
|
||||
pdf: CoherentPdf,
|
||||
style: CpdfLabelStyle,
|
||||
prefix: string,
|
||||
offset: number,
|
||||
range: CpdfPageRange,
|
||||
progress: boolean
|
||||
): void;
|
||||
toMemory(pdf: CoherentPdf, linearize: boolean, makeId: boolean): Uint8Array;
|
||||
deletePdf(pdf: CoherentPdf): void;
|
||||
decimalArabic: CpdfLabelStyle;
|
||||
lowercaseRoman: CpdfLabelStyle;
|
||||
uppercaseRoman: CpdfLabelStyle;
|
||||
lowercaseLetters: CpdfLabelStyle;
|
||||
uppercaseLetters: CpdfLabelStyle;
|
||||
noLabelPrefixOnly?: CpdfLabelStyle;
|
||||
};
|
||||
|
||||
let labelRuleCounter = 0;
|
||||
|
||||
const translate = (
|
||||
key: string,
|
||||
fallback: string,
|
||||
options?: Record<string, unknown>
|
||||
) => {
|
||||
const translation = t(key, options);
|
||||
return translation && translation !== key ? translation : fallback;
|
||||
};
|
||||
|
||||
const STYLE_LABEL_FALLBACKS: Record<PageLabelStyleName, string> = {
|
||||
DecimalArabic: 'Decimal Arabic',
|
||||
LowercaseRoman: 'Lowercase Roman',
|
||||
UppercaseRoman: 'Uppercase Roman',
|
||||
LowercaseLetters: 'Lowercase Letters',
|
||||
UppercaseLetters: 'Uppercase Letters',
|
||||
NoLabelPrefixOnly: 'No Label Prefix Only',
|
||||
};
|
||||
|
||||
const pageState: AddPageLabelsState = {
|
||||
file: null,
|
||||
pageCount: 0,
|
||||
rules: [createLabelRule()],
|
||||
};
|
||||
|
||||
if (document.readyState === 'loading') {
|
||||
document.addEventListener('DOMContentLoaded', initializePage);
|
||||
} else {
|
||||
initializePage();
|
||||
}
|
||||
|
||||
function createLabelRule(overrides: Partial<LabelRule> = {}): LabelRule {
|
||||
labelRuleCounter += 1;
|
||||
|
||||
return {
|
||||
id: `label-rule-${labelRuleCounter}`,
|
||||
pageRange: '',
|
||||
style: 'DecimalArabic',
|
||||
prefix: '',
|
||||
startValue: 1,
|
||||
progress: false,
|
||||
...overrides,
|
||||
};
|
||||
}
|
||||
|
||||
function initializePage() {
|
||||
createIcons({ icons });
|
||||
|
||||
const fileInput = document.getElementById('file-input') as HTMLInputElement;
|
||||
const dropZone = document.getElementById(
|
||||
'drop-zone'
|
||||
) as HTMLDivElement | null;
|
||||
const backBtn = document.getElementById('back-to-tools');
|
||||
const processBtn = document.getElementById('process-btn');
|
||||
const addRuleBtn = document.getElementById('add-rule-btn');
|
||||
|
||||
if (fileInput) {
|
||||
fileInput.addEventListener('change', handleFileUpload);
|
||||
fileInput.addEventListener('click', () => {
|
||||
fileInput.value = '';
|
||||
});
|
||||
}
|
||||
|
||||
if (dropZone) {
|
||||
dropZone.addEventListener('dragover', (event) => {
|
||||
event.preventDefault();
|
||||
dropZone.classList.add('border-indigo-500');
|
||||
});
|
||||
|
||||
dropZone.addEventListener('dragleave', () => {
|
||||
dropZone.classList.remove('border-indigo-500');
|
||||
});
|
||||
|
||||
dropZone.addEventListener('drop', (event) => {
|
||||
event.preventDefault();
|
||||
dropZone.classList.remove('border-indigo-500');
|
||||
if (event.dataTransfer?.files.length) {
|
||||
handleFiles(event.dataTransfer.files);
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
if (backBtn) {
|
||||
backBtn.addEventListener('click', () => {
|
||||
window.location.href = import.meta.env.BASE_URL;
|
||||
});
|
||||
}
|
||||
|
||||
if (addRuleBtn) {
|
||||
addRuleBtn.addEventListener('click', () => {
|
||||
pageState.rules.push(createLabelRule());
|
||||
renderRules();
|
||||
});
|
||||
}
|
||||
|
||||
if (processBtn) {
|
||||
processBtn.addEventListener('click', addPageLabels);
|
||||
}
|
||||
|
||||
renderRules();
|
||||
}
|
||||
|
||||
function handleFileUpload(event: Event) {
|
||||
const input = event.target as HTMLInputElement;
|
||||
if (input.files?.length) {
|
||||
handleFiles(input.files);
|
||||
}
|
||||
}
|
||||
|
||||
async function handleFiles(files: FileList) {
|
||||
const file = files[0];
|
||||
if (
|
||||
!file ||
|
||||
(file.type !== 'application/pdf' &&
|
||||
!file.name.toLowerCase().endsWith('.pdf'))
|
||||
) {
|
||||
showAlert(
|
||||
translate('tools:addPageLabels.invalidFileTitle', 'Invalid File'),
|
||||
translate(
|
||||
'tools:addPageLabels.invalidFileMessage',
|
||||
'Please upload a valid PDF file.'
|
||||
)
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
showLoader(translate('tools:addPageLabels.loadingPdf', 'Loading PDF...'));
|
||||
try {
|
||||
const arrayBuffer = await readFileAsArrayBuffer(file);
|
||||
const pdfDoc = await PDFDocument.load(arrayBuffer as ArrayBuffer, {
|
||||
ignoreEncryption: true,
|
||||
throwOnInvalidObject: false,
|
||||
});
|
||||
|
||||
if (pdfDoc.isEncrypted) {
|
||||
showAlert(
|
||||
translate('tools:addPageLabels.protectedPdfTitle', 'Protected PDF'),
|
||||
translate(
|
||||
'tools:addPageLabels.protectedPdfMessage',
|
||||
'This PDF is password-protected. Please use the Decrypt or Change Permissions tool first.'
|
||||
)
|
||||
);
|
||||
resetState();
|
||||
return;
|
||||
}
|
||||
|
||||
pageState.file = file;
|
||||
pageState.pageCount = pdfDoc.getPageCount();
|
||||
|
||||
updateFileDisplay();
|
||||
document.getElementById('options-panel')?.classList.remove('hidden');
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
showAlert(
|
||||
translate('common.error', 'Error'),
|
||||
translate(
|
||||
'tools:addPageLabels.loadErrorMessage',
|
||||
'Failed to load PDF file. The file may be invalid, corrupted, or password-protected.'
|
||||
)
|
||||
);
|
||||
} finally {
|
||||
hideLoader();
|
||||
}
|
||||
}
|
||||
|
||||
function updateFileDisplay() {
|
||||
const fileDisplayArea = document.getElementById('file-display-area');
|
||||
if (!fileDisplayArea || !pageState.file) return;
|
||||
|
||||
fileDisplayArea.innerHTML = '';
|
||||
|
||||
const fileDiv = document.createElement('div');
|
||||
fileDiv.className =
|
||||
'flex items-center justify-between bg-gray-700 p-3 rounded-lg';
|
||||
|
||||
const infoContainer = document.createElement('div');
|
||||
infoContainer.className = 'flex flex-col flex-1 min-w-0';
|
||||
|
||||
const nameSpan = document.createElement('div');
|
||||
nameSpan.className = 'truncate font-medium text-gray-200 text-sm mb-1';
|
||||
nameSpan.textContent = pageState.file.name;
|
||||
|
||||
const metaSpan = document.createElement('div');
|
||||
metaSpan.className = 'text-xs text-gray-400';
|
||||
metaSpan.textContent = translate(
|
||||
'tools:addPageLabels.fileMeta',
|
||||
`${formatBytes(pageState.file.size)} • ${pageState.pageCount} pages`,
|
||||
{
|
||||
size: formatBytes(pageState.file.size),
|
||||
count: pageState.pageCount,
|
||||
}
|
||||
);
|
||||
|
||||
infoContainer.append(nameSpan, metaSpan);
|
||||
|
||||
const removeBtn = document.createElement('button');
|
||||
removeBtn.className = 'ml-4 text-red-400 hover:text-red-300 flex-shrink-0';
|
||||
removeBtn.innerHTML = '<i data-lucide="trash-2" class="w-4 h-4"></i>';
|
||||
removeBtn.onclick = resetState;
|
||||
|
||||
fileDiv.append(infoContainer, removeBtn);
|
||||
fileDisplayArea.appendChild(fileDiv);
|
||||
createIcons({ icons });
|
||||
}
|
||||
|
||||
function resetState() {
|
||||
pageState.file = null;
|
||||
pageState.pageCount = 0;
|
||||
pageState.rules = [createLabelRule()];
|
||||
|
||||
const fileDisplayArea = document.getElementById('file-display-area');
|
||||
if (fileDisplayArea) fileDisplayArea.innerHTML = '';
|
||||
|
||||
const fileInput = document.getElementById('file-input') as HTMLInputElement;
|
||||
if (fileInput) fileInput.value = '';
|
||||
|
||||
document.getElementById('options-panel')?.classList.add('hidden');
|
||||
renderRules();
|
||||
}
|
||||
|
||||
function renderRules() {
|
||||
const ruleList = document.getElementById('label-rules');
|
||||
if (!ruleList) return;
|
||||
|
||||
ruleList.innerHTML = '';
|
||||
|
||||
pageState.rules.forEach((rule, index) => {
|
||||
const card = document.createElement('div');
|
||||
card.className =
|
||||
'rounded-lg border border-gray-700 bg-gray-900 p-4 space-y-4';
|
||||
|
||||
const header = document.createElement('div');
|
||||
header.className = 'flex items-center justify-between gap-4';
|
||||
|
||||
const title = document.createElement('div');
|
||||
title.className = 'text-sm font-semibold text-white';
|
||||
title.textContent = translate(
|
||||
'tools:addPageLabels.ruleTitle',
|
||||
`Label Rule ${index + 1}`,
|
||||
{ number: index + 1 }
|
||||
);
|
||||
|
||||
const removeBtn = document.createElement('button');
|
||||
removeBtn.type = 'button';
|
||||
removeBtn.className =
|
||||
'text-red-400 hover:text-red-300 disabled:text-gray-600 disabled:cursor-not-allowed';
|
||||
removeBtn.disabled = pageState.rules.length === 1;
|
||||
removeBtn.innerHTML = '<i data-lucide="trash-2" class="w-4 h-4"></i>';
|
||||
removeBtn.addEventListener('click', () => {
|
||||
if (pageState.rules.length === 1) {
|
||||
return;
|
||||
}
|
||||
pageState.rules = pageState.rules.filter((entry) => entry.id !== rule.id);
|
||||
renderRules();
|
||||
});
|
||||
|
||||
header.append(title, removeBtn);
|
||||
|
||||
const rangeGroup = document.createElement('div');
|
||||
const rangeLabel = document.createElement('label');
|
||||
rangeLabel.className = 'block mb-2 text-sm font-medium text-gray-300';
|
||||
rangeLabel.textContent = translate(
|
||||
'tools:addPageLabels.pageRangeLabel',
|
||||
'Page Range'
|
||||
);
|
||||
const rangeInput = document.createElement('input');
|
||||
rangeInput.type = 'text';
|
||||
rangeInput.value = rule.pageRange;
|
||||
rangeInput.placeholder = translate(
|
||||
'tools:addPageLabels.pageRangePlaceholder',
|
||||
'All pages, or e.g. 1-4, 7, odd'
|
||||
);
|
||||
rangeInput.className =
|
||||
'w-full bg-gray-700 border border-gray-600 text-white rounded-lg p-2.5 focus:ring-indigo-500 focus:border-indigo-500';
|
||||
rangeInput.addEventListener('input', (event) => {
|
||||
rule.pageRange = (event.target as HTMLInputElement).value;
|
||||
});
|
||||
rangeGroup.append(rangeLabel, rangeInput);
|
||||
|
||||
const styleGrid = document.createElement('div');
|
||||
styleGrid.className = 'grid grid-cols-1 md:grid-cols-2 gap-4';
|
||||
|
||||
const styleGroup = document.createElement('div');
|
||||
const styleLabel = document.createElement('label');
|
||||
styleLabel.className = 'block mb-2 text-sm font-medium text-gray-300';
|
||||
styleLabel.textContent = translate(
|
||||
'tools:addPageLabels.labelStyleLabel',
|
||||
'Label Style'
|
||||
);
|
||||
const styleSelect = document.createElement('select');
|
||||
styleSelect.className =
|
||||
'w-full bg-gray-700 border border-gray-600 text-white rounded-lg p-2.5 focus:ring-indigo-500 focus:border-indigo-500';
|
||||
|
||||
PAGE_LABEL_STYLE_OPTIONS.forEach((styleName) => {
|
||||
const option = document.createElement('option');
|
||||
option.value = styleName;
|
||||
option.textContent = translate(
|
||||
`tools:addPageLabels.styleOptions.${styleName}`,
|
||||
STYLE_LABEL_FALLBACKS[styleName]
|
||||
);
|
||||
option.selected = styleName === rule.style;
|
||||
styleSelect.appendChild(option);
|
||||
});
|
||||
|
||||
styleSelect.addEventListener('change', (event) => {
|
||||
rule.style = (event.target as HTMLSelectElement)
|
||||
.value as PageLabelStyleName;
|
||||
});
|
||||
styleGroup.append(styleLabel, styleSelect);
|
||||
|
||||
const prefixGroup = document.createElement('div');
|
||||
const prefixLabel = document.createElement('label');
|
||||
prefixLabel.className = 'block mb-2 text-sm font-medium text-gray-300';
|
||||
prefixLabel.textContent = translate(
|
||||
'tools:addPageLabels.labelPrefixLabel',
|
||||
'Label Prefix'
|
||||
);
|
||||
const prefixInput = document.createElement('input');
|
||||
prefixInput.type = 'text';
|
||||
prefixInput.value = rule.prefix;
|
||||
prefixInput.placeholder = translate(
|
||||
'tools:addPageLabels.labelPrefixPlaceholder',
|
||||
'Optional prefix, e.g. A-'
|
||||
);
|
||||
prefixInput.className =
|
||||
'w-full bg-gray-700 border border-gray-600 text-white rounded-lg p-2.5 focus:ring-indigo-500 focus:border-indigo-500';
|
||||
prefixInput.addEventListener('input', (event) => {
|
||||
rule.prefix = (event.target as HTMLInputElement).value;
|
||||
});
|
||||
prefixGroup.append(prefixLabel, prefixInput);
|
||||
|
||||
styleGrid.append(styleGroup, prefixGroup);
|
||||
|
||||
const startGrid = document.createElement('div');
|
||||
startGrid.className = 'grid grid-cols-1 md:grid-cols-2 gap-4';
|
||||
|
||||
const startGroup = document.createElement('div');
|
||||
const startLabel = document.createElement('label');
|
||||
startLabel.className = 'block mb-2 text-sm font-medium text-gray-300';
|
||||
startLabel.textContent = translate(
|
||||
'tools:addPageLabels.startValueLabel',
|
||||
'Start Value'
|
||||
);
|
||||
const startInput = document.createElement('input');
|
||||
startInput.type = 'number';
|
||||
startInput.min = '0';
|
||||
startInput.step = '1';
|
||||
startInput.value = String(rule.startValue);
|
||||
startInput.className =
|
||||
'w-full bg-gray-700 border border-gray-600 text-white rounded-lg p-2.5 focus:ring-indigo-500 focus:border-indigo-500';
|
||||
startInput.addEventListener('input', (event) => {
|
||||
rule.startValue = normalizePageLabelStartValue(
|
||||
parseInt((event.target as HTMLInputElement).value, 10)
|
||||
);
|
||||
});
|
||||
startGroup.append(startLabel, startInput);
|
||||
|
||||
const progressGroup = document.createElement('div');
|
||||
progressGroup.className = 'flex items-end';
|
||||
const progressLabel = document.createElement('label');
|
||||
progressLabel.className =
|
||||
'flex w-full items-center gap-3 rounded-lg border border-gray-700 bg-gray-800 px-4 py-3 text-sm text-gray-300';
|
||||
const progressInput = document.createElement('input');
|
||||
progressInput.type = 'checkbox';
|
||||
progressInput.checked = rule.progress;
|
||||
progressInput.className =
|
||||
'h-4 w-4 rounded border-gray-500 bg-gray-700 text-indigo-600 focus:ring-indigo-500';
|
||||
progressInput.addEventListener('change', (event) => {
|
||||
rule.progress = (event.target as HTMLInputElement).checked;
|
||||
});
|
||||
const progressText = document.createElement('span');
|
||||
progressText.textContent = translate(
|
||||
'tools:addPageLabels.continueNumbering',
|
||||
'Continue numbering across disjoint ranges'
|
||||
);
|
||||
progressLabel.append(progressInput, progressText);
|
||||
progressGroup.appendChild(progressLabel);
|
||||
|
||||
startGrid.append(startGroup, progressGroup);
|
||||
|
||||
const note = document.createElement('p');
|
||||
note.className = 'text-xs text-gray-500';
|
||||
note.textContent = translate(
|
||||
'tools:addPageLabels.examplesNote',
|
||||
'Examples: 1-4 for Roman front matter, 15-20 with prefix A- and start value 0, or odd with progress enabled.'
|
||||
);
|
||||
|
||||
card.append(header, rangeGroup, styleGrid, startGrid, note);
|
||||
ruleList.appendChild(card);
|
||||
});
|
||||
|
||||
createIcons({ icons });
|
||||
}
|
||||
|
||||
async function addPageLabels() {
|
||||
if (!pageState.file) {
|
||||
showAlert(
|
||||
translate('common.error', 'Error'),
|
||||
translate(
|
||||
'tools:addPageLabels.uploadFirstMessage',
|
||||
'Please upload a PDF file first.'
|
||||
)
|
||||
);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!isCpdfAvailable()) {
|
||||
showWasmRequiredDialog('cpdf');
|
||||
return;
|
||||
}
|
||||
|
||||
showLoader(
|
||||
translate('tools:addPageLabels.applyingLabels', 'Applying page labels...')
|
||||
);
|
||||
|
||||
const removeExistingLabels =
|
||||
(
|
||||
document.getElementById(
|
||||
'remove-existing-labels'
|
||||
) as HTMLInputElement | null
|
||||
)?.checked ?? true;
|
||||
|
||||
let cpdf: AddPageLabelsCpdf | null = null;
|
||||
let pdf: CoherentPdf | null = null;
|
||||
|
||||
try {
|
||||
cpdf = await getCpdf();
|
||||
cpdf.setSlow?.();
|
||||
|
||||
const inputBytes = new Uint8Array(await pageState.file.arrayBuffer());
|
||||
pdf = cpdf.fromMemory(inputBytes, '');
|
||||
|
||||
if (removeExistingLabels) {
|
||||
cpdf.removePageLabels(pdf);
|
||||
}
|
||||
|
||||
for (let index = 0; index < pageState.rules.length; index += 1) {
|
||||
const rule = pageState.rules[index];
|
||||
const trimmedRange = rule.pageRange.trim();
|
||||
|
||||
let range: CpdfPageRange;
|
||||
try {
|
||||
range = trimmedRange
|
||||
? cpdf.parsePagespec(pdf, trimmedRange)
|
||||
: cpdf.all(pdf);
|
||||
} catch (error) {
|
||||
throw new Error(
|
||||
translate(
|
||||
'tools:addPageLabels.invalidRangeMessage',
|
||||
`Rule ${index + 1} has an invalid page range: ${trimmedRange || 'all pages'}`,
|
||||
{
|
||||
number: index + 1,
|
||||
range:
|
||||
trimmedRange ||
|
||||
translate('tools:addPageLabels.allPages', 'all pages'),
|
||||
}
|
||||
),
|
||||
{ cause: error }
|
||||
);
|
||||
}
|
||||
|
||||
cpdf.addPageLabels(
|
||||
pdf,
|
||||
resolvePageLabelStyle(cpdf, rule.style),
|
||||
rule.prefix.trim(),
|
||||
normalizePageLabelStartValue(rule.startValue),
|
||||
range,
|
||||
rule.progress
|
||||
);
|
||||
}
|
||||
|
||||
const outputBytes = new Uint8Array(cpdf.toMemory(pdf, false, false));
|
||||
if (!outputBytes || outputBytes.length === 0) {
|
||||
throw new Error(
|
||||
translate(
|
||||
'tools:addPageLabels.emptyOutputMessage',
|
||||
'CoherentPDF produced an empty file.'
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
downloadFile(
|
||||
new Blob([outputBytes], { type: 'application/pdf' }),
|
||||
'page-labels-added.pdf'
|
||||
);
|
||||
showAlert(
|
||||
translate('common.success', 'Success'),
|
||||
translate(
|
||||
'tools:addPageLabels.successMessage',
|
||||
'Page labels added successfully!'
|
||||
),
|
||||
'success',
|
||||
() => {
|
||||
resetState();
|
||||
}
|
||||
);
|
||||
} catch (error) {
|
||||
console.error(error);
|
||||
const message =
|
||||
error instanceof Error
|
||||
? error.message
|
||||
: translate(
|
||||
'tools:addPageLabels.processErrorMessage',
|
||||
'Could not add page labels.'
|
||||
);
|
||||
showAlert(translate('common.error', 'Error'), message);
|
||||
} finally {
|
||||
if (cpdf && pdf) {
|
||||
try {
|
||||
cpdf.deletePdf(pdf);
|
||||
} catch (cleanupError) {
|
||||
console.warn('Failed to cleanup CoherentPDF document:', cleanupError);
|
||||
}
|
||||
}
|
||||
|
||||
hideLoader();
|
||||
}
|
||||
}
|
||||
@@ -153,6 +153,7 @@ const init = async () => {
|
||||
'Edit Bookmarks': 'tools:editBookmarks',
|
||||
'Table of Contents': 'tools:tableOfContents',
|
||||
'Page Numbers': 'tools:pageNumbers',
|
||||
'Add Page Labels': 'tools:addPageLabels',
|
||||
'Add Watermark': 'tools:addWatermark',
|
||||
'Header & Footer': 'tools:headerFooter',
|
||||
'Invert Colors': 'tools:invertColors',
|
||||
|
||||
22
src/js/types/add-page-labels-type.ts
Normal file
22
src/js/types/add-page-labels-type.ts
Normal file
@@ -0,0 +1,22 @@
|
||||
export type PageLabelStyleName =
|
||||
| 'DecimalArabic'
|
||||
| 'LowercaseRoman'
|
||||
| 'UppercaseRoman'
|
||||
| 'LowercaseLetters'
|
||||
| 'UppercaseLetters'
|
||||
| 'NoLabelPrefixOnly';
|
||||
|
||||
export interface LabelRule {
|
||||
id: string;
|
||||
pageRange: string;
|
||||
style: PageLabelStyleName;
|
||||
prefix: string;
|
||||
startValue: number;
|
||||
progress: boolean;
|
||||
}
|
||||
|
||||
export interface AddPageLabelsState {
|
||||
file: File | null;
|
||||
pageCount: number;
|
||||
rules: LabelRule[];
|
||||
}
|
||||
@@ -51,3 +51,4 @@ export * from './scanner-effect-type.ts';
|
||||
export * from './adjust-colors-type.ts';
|
||||
export * from './bates-numbering-type.ts';
|
||||
export * from './page-preview-type.ts';
|
||||
export * from './add-page-labels-type.ts';
|
||||
|
||||
54
src/js/utils/page-labels.ts
Normal file
54
src/js/utils/page-labels.ts
Normal file
@@ -0,0 +1,54 @@
|
||||
import type { PageLabelStyleName } from '@/types';
|
||||
|
||||
export const PAGE_LABEL_STYLE_OPTIONS = [
|
||||
'DecimalArabic',
|
||||
'LowercaseRoman',
|
||||
'UppercaseRoman',
|
||||
'LowercaseLetters',
|
||||
'UppercaseLetters',
|
||||
'NoLabelPrefixOnly',
|
||||
] as const satisfies readonly PageLabelStyleName[];
|
||||
|
||||
export type { PageLabelStyleName } from '@/types';
|
||||
|
||||
type CpdfLabelStyleSource = {
|
||||
decimalArabic: number;
|
||||
lowercaseRoman: number;
|
||||
uppercaseRoman: number;
|
||||
lowercaseLetters: number;
|
||||
uppercaseLetters: number;
|
||||
noLabelPrefixOnly?: number;
|
||||
};
|
||||
|
||||
const NO_LABEL_PREFIX_ONLY_FALLBACK = 5 as CpdfLabelStyle;
|
||||
|
||||
export function resolvePageLabelStyle(
|
||||
cpdf: CpdfLabelStyleSource,
|
||||
style: PageLabelStyleName
|
||||
): CpdfLabelStyle {
|
||||
switch (style) {
|
||||
case 'DecimalArabic':
|
||||
return cpdf.decimalArabic as CpdfLabelStyle;
|
||||
case 'LowercaseRoman':
|
||||
return cpdf.lowercaseRoman as CpdfLabelStyle;
|
||||
case 'UppercaseRoman':
|
||||
return cpdf.uppercaseRoman as CpdfLabelStyle;
|
||||
case 'LowercaseLetters':
|
||||
return cpdf.lowercaseLetters as CpdfLabelStyle;
|
||||
case 'UppercaseLetters':
|
||||
return cpdf.uppercaseLetters as CpdfLabelStyle;
|
||||
case 'NoLabelPrefixOnly':
|
||||
return (
|
||||
(cpdf.noLabelPrefixOnly as CpdfLabelStyle | undefined) ??
|
||||
NO_LABEL_PREFIX_ONLY_FALLBACK
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export function normalizePageLabelStartValue(value: number): number {
|
||||
if (!Number.isFinite(value)) {
|
||||
return 1;
|
||||
}
|
||||
|
||||
return Math.max(0, Math.floor(value));
|
||||
}
|
||||
551
src/pages/add-page-labels.html
Normal file
551
src/pages/add-page-labels.html
Normal file
@@ -0,0 +1,551 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8" />
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
||||
|
||||
<title>Add Page Labels Online Free - PDF Page Labels Tool | BentoPDF</title>
|
||||
<meta
|
||||
name="title"
|
||||
content="Add Page Labels Online Free - PDF Page Labels Tool | BentoPDF"
|
||||
/>
|
||||
<meta
|
||||
name="description"
|
||||
content="Add PDF page labels such as Roman numerals, prefixes, and custom numbering ranges. Free, secure, and runs entirely in your browser with CoherentPDF."
|
||||
/>
|
||||
<meta
|
||||
name="keywords"
|
||||
content="add page labels, pdf page labels, roman numeral pages, coherentpdf"
|
||||
/>
|
||||
<meta name="author" content="BentoPDF" />
|
||||
<meta
|
||||
name="robots"
|
||||
content="index, follow, max-image-preview:large, max-snippet:-1, max-video-preview:-1"
|
||||
/>
|
||||
|
||||
<link
|
||||
rel="canonical"
|
||||
href="https://www.bentopdf.com/add-page-labels.html"
|
||||
/>
|
||||
|
||||
<meta property="og:type" content="website" />
|
||||
<meta
|
||||
property="og:url"
|
||||
content="https://www.bentopdf.com/add-page-labels"
|
||||
/>
|
||||
<meta
|
||||
property="og:title"
|
||||
content="Add Page Labels Online Free - PDF Page Labels Tool | BentoPDF"
|
||||
/>
|
||||
<meta
|
||||
property="og:description"
|
||||
content="Apply PDF page labels with Roman numerals, letters, prefixes, and custom start values."
|
||||
/>
|
||||
<meta property="og:site_name" content="BentoPDF" />
|
||||
|
||||
<meta name="twitter:card" content="summary_large_image" />
|
||||
<meta
|
||||
name="twitter:url"
|
||||
content="https://www.bentopdf.com/add-page-labels"
|
||||
/>
|
||||
<meta name="twitter:title" content="Add Page Labels Free" />
|
||||
<meta
|
||||
name="twitter:description"
|
||||
content="Add PDF page labels like i, ii, iii, A-1, and more directly in your browser."
|
||||
/>
|
||||
<meta name="twitter:site" content="@BentoPDF" />
|
||||
|
||||
<meta name="mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-capable" content="yes" />
|
||||
<meta name="apple-mobile-web-app-title" content="Add Page Labels" />
|
||||
|
||||
<link href="/src/css/styles.css" rel="stylesheet" />
|
||||
<link rel="manifest" href="/site.webmanifest" />
|
||||
<link rel="icon" type="image/svg+xml" href="/images/favicon.svg" />
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="192x192"
|
||||
href="/images/favicon-192x192.png"
|
||||
/>
|
||||
<link
|
||||
rel="icon"
|
||||
type="image/png"
|
||||
sizes="512x512"
|
||||
href="/images/favicon-512x512.png"
|
||||
/>
|
||||
<link
|
||||
rel="apple-touch-icon"
|
||||
sizes="180x180"
|
||||
href="/images/apple-touch-icon.png"
|
||||
/>
|
||||
<link rel="icon" href="/favicon.ico" sizes="32x32" />
|
||||
</head>
|
||||
|
||||
<body class="antialiased bg-gray-900">
|
||||
{{> navbar }}
|
||||
|
||||
<div
|
||||
id="uploader"
|
||||
class="min-h-screen flex flex-col items-center justify-start py-12 p-4 bg-gray-900"
|
||||
>
|
||||
<div
|
||||
id="tool-uploader"
|
||||
class="bg-gray-800 rounded-xl shadow-xl px-4 py-8 md:p-8 max-w-2xl w-full text-gray-200 border border-gray-700"
|
||||
>
|
||||
<button
|
||||
id="back-to-tools"
|
||||
class="flex items-center gap-2 text-indigo-400 hover:text-indigo-300 mb-6 font-semibold"
|
||||
>
|
||||
<i data-lucide="arrow-left" class="cursor-pointer"></i>
|
||||
<span class="cursor-pointer" data-i18n="tools.backToTools"
|
||||
>Back to Tools</span
|
||||
>
|
||||
</button>
|
||||
|
||||
<h1
|
||||
class="text-2xl font-bold text-white mb-2"
|
||||
data-i18n="tools:addPageLabels.name"
|
||||
>
|
||||
Add Page Labels
|
||||
</h1>
|
||||
<p class="text-gray-400 mb-6" data-i18n="tools:addPageLabels.subtitle">
|
||||
Add PDF page labels such as Roman numerals, prefixes, lettered
|
||||
sections, or custom starting values.
|
||||
</p>
|
||||
|
||||
<div
|
||||
id="drop-zone"
|
||||
class="relative flex flex-col items-center justify-center w-full h-48 md:h-64 border-2 border-dashed border-gray-600 rounded-xl cursor-pointer bg-gray-900 hover:bg-gray-700 transition-colors duration-300"
|
||||
>
|
||||
<div class="flex flex-col items-center justify-center pt-5 pb-6">
|
||||
<i
|
||||
data-lucide="upload-cloud"
|
||||
class="w-10 h-10 mb-3 text-gray-400"
|
||||
></i>
|
||||
<p class="mb-2 text-sm text-gray-400">
|
||||
<span class="font-semibold" data-i18n="upload.clickToSelect"
|
||||
>Click to select a file</span
|
||||
>
|
||||
<span data-i18n="upload.orDragAndDrop">or drag and drop</span>
|
||||
</p>
|
||||
<p
|
||||
class="text-xs text-gray-500"
|
||||
data-i18n="tools:addPageLabels.uploadHint"
|
||||
>
|
||||
PDF file
|
||||
</p>
|
||||
<p class="text-xs text-gray-500" data-i18n="upload.filesNeverLeave">
|
||||
Your files never leave your device.
|
||||
</p>
|
||||
</div>
|
||||
<input
|
||||
id="file-input"
|
||||
type="file"
|
||||
class="absolute top-0 left-0 w-full h-full opacity-0 cursor-pointer"
|
||||
accept="application/pdf"
|
||||
/>
|
||||
</div>
|
||||
|
||||
<div id="file-display-area" class="mt-4 space-y-2"></div>
|
||||
|
||||
<div id="options-panel" class="hidden mt-6 space-y-4">
|
||||
<div
|
||||
class="rounded-lg border border-indigo-700/40 bg-indigo-900/20 p-4"
|
||||
>
|
||||
<h2
|
||||
class="text-sm font-semibold text-white mb-2"
|
||||
data-i18n="tools:addPageLabels.howLabelsWorkTitle"
|
||||
>
|
||||
How labels work
|
||||
</h2>
|
||||
<ul class="text-sm text-gray-300 space-y-1 list-disc list-inside">
|
||||
<li data-i18n="tools:addPageLabels.howLabelsWorkStep1">
|
||||
Leave Page Range empty to label all pages.
|
||||
</li>
|
||||
<li data-i18n="tools:addPageLabels.howLabelsWorkStep2">
|
||||
Use styles like Roman numerals for front matter and decimal
|
||||
numbering for the main body.
|
||||
</li>
|
||||
<li data-i18n="tools:addPageLabels.howLabelsWorkStep3">
|
||||
Use Prefix with Start Value 0 to create labels such as A-0, A-1,
|
||||
A-2.
|
||||
</li>
|
||||
<li data-i18n="tools:addPageLabels.howLabelsWorkStep4">
|
||||
Enable progress when one rule uses a disjoint range such as
|
||||
1-9,30-40 or odd.
|
||||
</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
<div class="flex items-center justify-between gap-4">
|
||||
<h2
|
||||
class="text-lg font-semibold text-white"
|
||||
data-i18n="tools:addPageLabels.labelRulesTitle"
|
||||
>
|
||||
Label Rules
|
||||
</h2>
|
||||
<button
|
||||
id="add-rule-btn"
|
||||
type="button"
|
||||
class="inline-flex items-center gap-2 rounded-lg bg-indigo-600 px-4 py-2 text-sm font-semibold text-white hover:bg-indigo-500 transition-colors"
|
||||
>
|
||||
<i data-lucide="plus" class="w-4 h-4"></i>
|
||||
<span data-i18n="tools:addPageLabels.addRule">Add Rule</span>
|
||||
</button>
|
||||
</div>
|
||||
|
||||
<div id="label-rules" class="space-y-4"></div>
|
||||
|
||||
<label
|
||||
class="flex items-center gap-3 rounded-lg border border-gray-700 bg-gray-900 px-4 py-3 text-sm text-gray-300"
|
||||
>
|
||||
<input
|
||||
id="remove-existing-labels"
|
||||
type="checkbox"
|
||||
checked
|
||||
class="h-4 w-4 rounded border-gray-500 bg-gray-700 text-indigo-600 focus:ring-indigo-500"
|
||||
/>
|
||||
<span data-i18n="tools:addPageLabels.removeExistingLabels"
|
||||
>Remove existing page labels before applying these rules</span
|
||||
>
|
||||
</label>
|
||||
|
||||
<p
|
||||
class="text-xs text-gray-500"
|
||||
data-i18n="tools:addPageLabels.cpdfNote"
|
||||
>
|
||||
This tool uses CoherentPDF in your browser. If CoherentPDF is not
|
||||
configured, you will be prompted to set it up in WASM Settings.
|
||||
</p>
|
||||
|
||||
<button
|
||||
id="process-btn"
|
||||
class="btn-gradient w-full mt-4"
|
||||
data-i18n="tools:addPageLabels.processButton"
|
||||
>
|
||||
Add Page Labels
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
id="loader-modal"
|
||||
class="hidden fixed inset-0 bg-black bg-opacity-75 flex items-center justify-center z-50"
|
||||
>
|
||||
<div
|
||||
class="bg-gray-800 p-8 rounded-lg flex flex-col items-center gap-4 border border-gray-700 shadow-xl"
|
||||
>
|
||||
<div class="solid-spinner"></div>
|
||||
<p
|
||||
id="loader-text"
|
||||
class="text-white text-lg font-medium"
|
||||
data-i18n="loader.processing"
|
||||
>
|
||||
Processing...
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<div
|
||||
id="alert-modal"
|
||||
class="fixed inset-0 bg-gray-900 bg-opacity-90 flex items-center justify-center z-50 hidden"
|
||||
>
|
||||
<div
|
||||
class="bg-gray-800 rounded-lg shadow-xl p-6 max-w-sm w-full border border-gray-700"
|
||||
>
|
||||
<h3
|
||||
id="alert-title"
|
||||
class="text-xl font-bold text-white mb-2"
|
||||
data-i18n="alert.title"
|
||||
>
|
||||
Alert
|
||||
</h3>
|
||||
<p id="alert-message" class="text-gray-300 mb-6"></p>
|
||||
<button
|
||||
id="alert-ok"
|
||||
class="w-full bg-indigo-600 hover:bg-indigo-700 text-white font-semibold py-2 px-4 rounded-lg transition-colors duration-200"
|
||||
data-i18n="common.ok"
|
||||
>
|
||||
OK
|
||||
</button>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
<section class="max-w-4xl mx-auto px-4 py-12">
|
||||
<h2
|
||||
class="text-2xl md:text-3xl font-bold text-white mb-8 text-center"
|
||||
data-i18n="howItWorks.title"
|
||||
>
|
||||
How It Works
|
||||
</h2>
|
||||
<div class="space-y-6">
|
||||
<div class="flex items-start gap-4">
|
||||
<div
|
||||
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
|
||||
>
|
||||
1
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<h3
|
||||
class="text-lg font-semibold text-white mb-1"
|
||||
data-i18n="tools:addPageLabels.howItWorksUploadTitle"
|
||||
>
|
||||
Upload File
|
||||
</h3>
|
||||
<p
|
||||
class="text-gray-400"
|
||||
data-i18n="tools:addPageLabels.howItWorksUploadDescription"
|
||||
>
|
||||
Choose the PDF you want to relabel.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-start gap-4">
|
||||
<div
|
||||
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
|
||||
>
|
||||
2
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<h3
|
||||
class="text-lg font-semibold text-white mb-1"
|
||||
data-i18n="tools:addPageLabels.howItWorksDefineTitle"
|
||||
>
|
||||
Define Rules
|
||||
</h3>
|
||||
<p
|
||||
class="text-gray-400"
|
||||
data-i18n="tools:addPageLabels.howItWorksDefineDescription"
|
||||
>
|
||||
Set one or more page label rules with page ranges, styles,
|
||||
prefixes, and starting values.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
<div class="flex items-start gap-4">
|
||||
<div
|
||||
class="flex-shrink-0 w-10 h-10 bg-indigo-600 rounded-full flex items-center justify-center text-white font-bold"
|
||||
>
|
||||
3
|
||||
</div>
|
||||
<div class="flex-1">
|
||||
<h3
|
||||
class="text-lg font-semibold text-white mb-1"
|
||||
data-i18n="tools:addPageLabels.howItWorksDownloadTitle"
|
||||
>
|
||||
Download
|
||||
</h3>
|
||||
<p
|
||||
class="text-gray-400"
|
||||
data-i18n="tools:addPageLabels.howItWorksDownloadDescription"
|
||||
>
|
||||
Save the updated PDF with its new page labels.
|
||||
</p>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="max-w-6xl mx-auto px-4 py-12">
|
||||
<h2
|
||||
class="text-2xl md:text-3xl font-bold text-white mb-6 text-center"
|
||||
data-i18n="tools:addPageLabels.relatedToolsTitle"
|
||||
>
|
||||
Related PDF Tools
|
||||
</h2>
|
||||
<div class="grid grid-cols-2 md:grid-cols-3 lg:grid-cols-6 gap-4">
|
||||
<a
|
||||
href="page-numbers.html"
|
||||
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
|
||||
>
|
||||
<h3
|
||||
class="text-white font-semibold mb-1"
|
||||
data-i18n="tools:pageNumbers.name"
|
||||
>
|
||||
Page Numbers
|
||||
</h3>
|
||||
<p
|
||||
class="text-gray-400 text-sm"
|
||||
data-i18n="tools:pageNumbers.subtitle"
|
||||
>
|
||||
Print visible page numbers on each page.
|
||||
</p>
|
||||
</a>
|
||||
<a
|
||||
href="bates-numbering.html"
|
||||
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
|
||||
>
|
||||
<h3
|
||||
class="text-white font-semibold mb-1"
|
||||
data-i18n="tools:batesNumbering.name"
|
||||
>
|
||||
Bates Numbering
|
||||
</h3>
|
||||
<p
|
||||
class="text-gray-400 text-sm"
|
||||
data-i18n="tools:batesNumbering.subtitle"
|
||||
>
|
||||
Add sequential Bates stamps across files.
|
||||
</p>
|
||||
</a>
|
||||
<a
|
||||
href="bookmark.html"
|
||||
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
|
||||
>
|
||||
<h3
|
||||
class="text-white font-semibold mb-1"
|
||||
data-i18n="tools:editBookmarks.name"
|
||||
>
|
||||
Edit Bookmarks
|
||||
</h3>
|
||||
<p
|
||||
class="text-gray-400 text-sm"
|
||||
data-i18n="tools:editBookmarks.subtitle"
|
||||
>
|
||||
Organize bookmark structure inside your PDF.
|
||||
</p>
|
||||
</a>
|
||||
<a
|
||||
href="table-of-contents.html"
|
||||
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
|
||||
>
|
||||
<h3
|
||||
class="text-white font-semibold mb-1"
|
||||
data-i18n="tools:tableOfContents.name"
|
||||
>
|
||||
Table of Contents
|
||||
</h3>
|
||||
<p
|
||||
class="text-gray-400 text-sm"
|
||||
data-i18n="tools:tableOfContents.subtitle"
|
||||
>
|
||||
Generate a contents page from bookmarks.
|
||||
</p>
|
||||
</a>
|
||||
<a
|
||||
href="view-metadata.html"
|
||||
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
|
||||
>
|
||||
<h3
|
||||
class="text-white font-semibold mb-1"
|
||||
data-i18n="tools:viewMetadata.name"
|
||||
>
|
||||
View Metadata
|
||||
</h3>
|
||||
<p
|
||||
class="text-gray-400 text-sm"
|
||||
data-i18n="tools:viewMetadata.subtitle"
|
||||
>
|
||||
Inspect hidden document information.
|
||||
</p>
|
||||
</a>
|
||||
<a
|
||||
href="edit-metadata.html"
|
||||
class="block bg-gray-800 p-4 rounded-lg hover:bg-gray-700 transition-colors border border-gray-700"
|
||||
>
|
||||
<h3
|
||||
class="text-white font-semibold mb-1"
|
||||
data-i18n="tools:editMetadata.name"
|
||||
>
|
||||
Edit Metadata
|
||||
</h3>
|
||||
<p
|
||||
class="text-gray-400 text-sm"
|
||||
data-i18n="tools:editMetadata.subtitle"
|
||||
>
|
||||
Update title, author, and other document data.
|
||||
</p>
|
||||
</a>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
<section class="max-w-4xl mx-auto px-4 py-12">
|
||||
<h2
|
||||
class="text-2xl md:text-3xl font-bold text-white mb-6 text-center"
|
||||
data-i18n="faq.sectionTitle"
|
||||
>
|
||||
Frequently Asked Questions
|
||||
</h2>
|
||||
<div class="space-y-4">
|
||||
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
|
||||
<summary
|
||||
class="cursor-pointer font-semibold text-white flex items-center justify-between"
|
||||
>
|
||||
<span data-i18n="tools:addPageLabels.faqWhatIsQuestion"
|
||||
>What is a page label?</span
|
||||
>
|
||||
<i data-lucide="chevron-down" class="w-5 h-5"></i>
|
||||
</summary>
|
||||
<p
|
||||
class="mt-3 text-gray-400"
|
||||
data-i18n="tools:addPageLabels.faqWhatIsAnswer"
|
||||
>
|
||||
A page label is the numbering shown by PDF readers in thumbnails,
|
||||
page navigation, and print dialogs. It does not print new text onto
|
||||
the page itself.
|
||||
</p>
|
||||
</details>
|
||||
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
|
||||
<summary
|
||||
class="cursor-pointer font-semibold text-white flex items-center justify-between"
|
||||
>
|
||||
<span data-i18n="tools:addPageLabels.faqMixQuestion"
|
||||
>Can I mix Roman numerals and normal numbers?</span
|
||||
>
|
||||
<i data-lucide="chevron-down" class="w-5 h-5"></i>
|
||||
</summary>
|
||||
<p
|
||||
class="mt-3 text-gray-400"
|
||||
data-i18n="tools:addPageLabels.faqMixAnswer"
|
||||
>
|
||||
Yes. Add multiple rules, such as 1-4 with LowercaseRoman and 5-20
|
||||
with DecimalArabic.
|
||||
</p>
|
||||
</details>
|
||||
<details class="bg-gray-800 p-5 rounded-lg border border-gray-700">
|
||||
<summary
|
||||
class="cursor-pointer font-semibold text-white flex items-center justify-between"
|
||||
>
|
||||
<span data-i18n="tools:addPageLabels.faqPrivacyQuestion"
|
||||
>Do my files stay private?</span
|
||||
>
|
||||
<i data-lucide="chevron-down" class="w-5 h-5"></i>
|
||||
</summary>
|
||||
<p
|
||||
class="mt-3 text-gray-400"
|
||||
data-i18n="tools:addPageLabels.faqPrivacyAnswer"
|
||||
>
|
||||
Yes. The processing happens in your browser using CoherentPDF WASM.
|
||||
Your PDF does not leave your device.
|
||||
</p>
|
||||
</details>
|
||||
</div>
|
||||
</section>
|
||||
|
||||
{{> footer }}
|
||||
<script type="module" src="/src/js/utils/lucide-init.ts"></script>
|
||||
<script type="module" src="/src/js/utils/full-width.ts"></script>
|
||||
<script type="module" src="/src/js/utils/simple-mode-footer.ts"></script>
|
||||
<script type="module" src="/src/version.ts"></script>
|
||||
<script type="module" src="/src/js/logic/add-page-labels-page.ts"></script>
|
||||
<script type="module" src="/src/js/mobileMenu.ts"></script>
|
||||
<script type="module" src="/src/js/main.ts"></script>
|
||||
|
||||
<script type="application/ld+json">
|
||||
{
|
||||
"@context": "https://schema.org",
|
||||
"@type": "SoftwareApplication",
|
||||
"name": "Add Page Labels - BentoPDF",
|
||||
"applicationCategory": "PDF Tool",
|
||||
"operatingSystem": "Any - Web Browser",
|
||||
"offers": {
|
||||
"@type": "Offer",
|
||||
"price": "0",
|
||||
"priceCurrency": "USD"
|
||||
}
|
||||
}
|
||||
</script>
|
||||
</body>
|
||||
</html>
|
||||
51
src/tests/page-labels.test.ts
Normal file
51
src/tests/page-labels.test.ts
Normal file
@@ -0,0 +1,51 @@
|
||||
import { describe, expect, it } from 'vitest';
|
||||
import {
|
||||
normalizePageLabelStartValue,
|
||||
resolvePageLabelStyle,
|
||||
type PageLabelStyleName,
|
||||
} from '@/js/utils/page-labels';
|
||||
|
||||
const mockCpdf = {
|
||||
decimalArabic: 0,
|
||||
uppercaseRoman: 1,
|
||||
lowercaseRoman: 2,
|
||||
uppercaseLetters: 3,
|
||||
lowercaseLetters: 4,
|
||||
};
|
||||
|
||||
describe('page label helpers', () => {
|
||||
it.each([
|
||||
['DecimalArabic', 0],
|
||||
['LowercaseRoman', 2],
|
||||
['UppercaseRoman', 1],
|
||||
['LowercaseLetters', 4],
|
||||
['UppercaseLetters', 3],
|
||||
] satisfies Array<[PageLabelStyleName, number]>)(
|
||||
'maps %s to the expected CoherentPDF style value',
|
||||
(style, expected) => {
|
||||
expect(resolvePageLabelStyle(mockCpdf, style)).toBe(expected);
|
||||
}
|
||||
);
|
||||
|
||||
it('falls back to style value 5 for NoLabelPrefixOnly when the runtime constant is absent', () => {
|
||||
expect(resolvePageLabelStyle(mockCpdf, 'NoLabelPrefixOnly')).toBe(5);
|
||||
});
|
||||
|
||||
it('uses the runtime constant for NoLabelPrefixOnly when available', () => {
|
||||
expect(
|
||||
resolvePageLabelStyle(
|
||||
{
|
||||
...mockCpdf,
|
||||
noLabelPrefixOnly: 9,
|
||||
},
|
||||
'NoLabelPrefixOnly'
|
||||
)
|
||||
).toBe(9);
|
||||
});
|
||||
|
||||
it('normalizes invalid and decimal start values', () => {
|
||||
expect(normalizePageLabelStartValue(Number.NaN)).toBe(1);
|
||||
expect(normalizePageLabelStartValue(-4)).toBe(0);
|
||||
expect(normalizePageLabelStartValue(7.9)).toBe(7);
|
||||
});
|
||||
});
|
||||
@@ -410,6 +410,10 @@ export default defineConfig(() => {
|
||||
'delete-pages': resolve(__dirname, 'src/pages/delete-pages.html'),
|
||||
'organize-pdf': resolve(__dirname, 'src/pages/organize-pdf.html'),
|
||||
'page-numbers': resolve(__dirname, 'src/pages/page-numbers.html'),
|
||||
'add-page-labels': resolve(
|
||||
__dirname,
|
||||
'src/pages/add-page-labels.html'
|
||||
),
|
||||
'add-watermark': resolve(__dirname, 'src/pages/add-watermark.html'),
|
||||
'header-footer': resolve(__dirname, 'src/pages/header-footer.html'),
|
||||
'invert-colors': resolve(__dirname, 'src/pages/invert-colors.html'),
|
||||
|
||||
Reference in New Issue
Block a user