fix(pdf): add an option to apply theme colors to PDF, closes #3778 (#3799)

This commit is contained in:
Huang Xin
2026-04-08 13:29:44 +08:00
committed by GitHub
parent 932c82aa49
commit 799db40763
35 changed files with 189 additions and 45 deletions
@@ -1235,5 +1235,9 @@
"Hardcover progress sync failed: {{error}}": "فشلت مزامنة تقدم Hardcover: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "الإبقاء على معرف المصدر الحالي",
"Toggle Toolbar": "تبديل شريط الأدوات"
"Toggle Toolbar": "تبديل شريط الأدوات",
"Split Hyphens": "تقسيم الواصلات",
"Apply Theme Colors to PDF": "تطبيق ألوان السمة على PDF",
"Name": "الاسم",
"Unavailable": "غير متاح"
}
@@ -1183,5 +1183,9 @@
"Hardcover progress sync failed: {{error}}": "Hardcover অগ্রগতি সিঙ্ক ব্যর্থ: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "বিদ্যমান উৎস শনাক্তকারী রাখুন",
"Toggle Toolbar": "টুলবার টগল করুন"
"Toggle Toolbar": "টুলবার টগল করুন",
"Split Hyphens": "হাইফেন বিভক্ত করুন",
"Apply Theme Colors to PDF": "PDF-এ থিম রং প্রয়োগ করুন",
"Name": "নাম",
"Unavailable": "অনুপলব্ধ"
}
@@ -1170,5 +1170,9 @@
"Hardcover progress sync failed: {{error}}": "Hardcover ཀློག་འགྲོས་ཟླ་སྒྲིག་མི་ཚོགས: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "ཡོད་བཞིན་པའི་འབྱུང་ཁུངས་ཐོབ་ཐང་གཞག",
"Toggle Toolbar": "ལག་ཆའི་ཚན་བར་བརྗེ་བ།"
"Toggle Toolbar": "ལག་ཆའི་ཚན་བར་བརྗེ་བ།",
"Split Hyphens": "སྦྲེལ་རྟགས་གཅད་པ",
"Apply Theme Colors to PDF": "PDF ལ་བརྗོད་དོན་ཚོས་གཞི་སྤྱོད་པ",
"Name": "མིང",
"Unavailable": "རག་མི་ཐུབ"
}
@@ -1183,5 +1183,9 @@
"Hardcover progress sync failed: {{error}}": "Hardcover-Fortschrittssynchronisierung fehlgeschlagen: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "Vorhandene Quellkennung beibehalten",
"Toggle Toolbar": "Symbolleiste umschalten"
"Toggle Toolbar": "Symbolleiste umschalten",
"Split Hyphens": "Bindestriche trennen",
"Apply Theme Colors to PDF": "Designfarben auf PDF anwenden",
"Name": "Name",
"Unavailable": "Nicht verfügbar"
}
@@ -1183,5 +1183,9 @@
"Hardcover progress sync failed: {{error}}": "Αποτυχία συγχρονισμού προόδου Hardcover: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "Διατήρηση υπάρχοντος αναγνωριστικού πηγής",
"Toggle Toolbar": "Εναλλαγή γραμμής εργαλείων"
"Toggle Toolbar": "Εναλλαγή γραμμής εργαλείων",
"Split Hyphens": "Διαχωρισμός παύλων",
"Apply Theme Colors to PDF": "Εφαρμογή χρωμάτων θέματος σε PDF",
"Name": "Όνομα",
"Unavailable": "Μη διαθέσιμο"
}
@@ -1196,5 +1196,9 @@
"Hardcover progress sync failed: {{error}}": "Error al sincronizar progreso de Hardcover: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "Mantener el identificador de origen existente",
"Toggle Toolbar": "Alternar barra de herramientas"
"Toggle Toolbar": "Alternar barra de herramientas",
"Split Hyphens": "Dividir guiones",
"Apply Theme Colors to PDF": "Aplicar colores del tema al PDF",
"Name": "Nombre",
"Unavailable": "No disponible"
}
@@ -1183,5 +1183,9 @@
"Hardcover progress sync failed: {{error}}": "همگام‌سازی پیشرفت Hardcover ناموفق: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "حفظ شناسه منبع موجود",
"Toggle Toolbar": "تغییر نوار ابزار"
"Toggle Toolbar": "تغییر نوار ابزار",
"Split Hyphens": "تقسیم خط‌تیره‌ها",
"Apply Theme Colors to PDF": "اعمال رنگ‌های پوسته روی PDF",
"Name": "نام",
"Unavailable": "ناموجود"
}
@@ -1196,5 +1196,9 @@
"Hardcover progress sync failed: {{error}}": "Échec de la synchronisation de la progression Hardcover : {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "Conserver l'identifiant source existant",
"Toggle Toolbar": "Basculer la barre d'outils"
"Toggle Toolbar": "Basculer la barre d'outils",
"Split Hyphens": "Séparer les traits d'union",
"Apply Theme Colors to PDF": "Appliquer les couleurs du thème au PDF",
"Name": "Nom",
"Unavailable": "Indisponible"
}
@@ -1196,5 +1196,9 @@
"Hardcover progress sync failed: {{error}}": "סנכרון התקדמות Hardcover נכשל: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "שמור על מזהה המקור הקיים",
"Toggle Toolbar": "הצג/הסתר סרגל כלים"
"Toggle Toolbar": "הצג/הסתר סרגל כלים",
"Split Hyphens": "פיצול מקפים",
"Apply Theme Colors to PDF": "החל צבעי ערכת נושא על PDF",
"Name": "שם",
"Unavailable": "לא זמין"
}
@@ -1183,5 +1183,9 @@
"Hardcover progress sync failed: {{error}}": "Hardcover प्रगति सिंक विफल: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "मौजूदा स्रोत पहचानकर्ता रखें",
"Toggle Toolbar": "टूलबार टॉगल करें"
"Toggle Toolbar": "टूलबार टॉगल करें",
"Split Hyphens": "हाइफ़न विभाजित करें",
"Apply Theme Colors to PDF": "PDF पर थीम रंग लागू करें",
"Name": "नाम",
"Unavailable": "अनुपलब्ध"
}
@@ -1183,5 +1183,9 @@
"Sunset": "Naplemente",
"Reveal in Finder": "Megjelenítés a Finderben",
"Reveal in File Explorer": "Megjelenítés a Fájlkezelőben",
"Reveal in Folder": "Megjelenítés a mappában"
"Reveal in Folder": "Megjelenítés a mappában",
"Split Hyphens": "Kötőjelek felosztása",
"Apply Theme Colors to PDF": "Téma színeinek alkalmazása PDF-re",
"Name": "Név",
"Unavailable": "Nem elérhető"
}
@@ -1170,5 +1170,9 @@
"Hardcover progress sync failed: {{error}}": "Sinkronisasi progres Hardcover gagal: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "Pertahankan pengidentifikasi sumber yang ada",
"Toggle Toolbar": "Alihkan Bilah Alat"
"Toggle Toolbar": "Alihkan Bilah Alat",
"Split Hyphens": "Pisahkan Tanda Hubung",
"Apply Theme Colors to PDF": "Terapkan Warna Tema ke PDF",
"Name": "Nama",
"Unavailable": "Tidak Tersedia"
}
@@ -1196,5 +1196,9 @@
"Hardcover progress sync failed: {{error}}": "Sincronizzazione progressi Hardcover non riuscita: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "Mantieni l'identificatore sorgente esistente",
"Toggle Toolbar": "Mostra/nascondi barra degli strumenti"
"Toggle Toolbar": "Mostra/nascondi barra degli strumenti",
"Split Hyphens": "Dividi trattini",
"Apply Theme Colors to PDF": "Applica colori tema al PDF",
"Name": "Nome",
"Unavailable": "Non disponibile"
}
@@ -1170,5 +1170,9 @@
"Hardcover progress sync failed: {{error}}": "Hardcover進捗の同期に失敗: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "既存のソース識別子を保持",
"Toggle Toolbar": "ツールバーの表示切替"
"Toggle Toolbar": "ツールバーの表示切替",
"Split Hyphens": "ハイフンで分割",
"Apply Theme Colors to PDF": "テーマカラーをPDFに適用",
"Name": "名前",
"Unavailable": "利用不可"
}
@@ -1170,5 +1170,9 @@
"Hardcover progress sync failed: {{error}}": "Hardcover 진행 상황 동기화 실패: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "기존 소스 식별자 유지",
"Toggle Toolbar": "도구 모음 전환"
"Toggle Toolbar": "도구 모음 전환",
"Split Hyphens": "하이픈 분리",
"Apply Theme Colors to PDF": "PDF에 테마 색상 적용",
"Name": "이름",
"Unavailable": "사용 불가"
}
@@ -1170,5 +1170,9 @@
"Hardcover progress sync failed: {{error}}": "Penyegerakan kemajuan Hardcover gagal: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "Kekalkan pengecam sumber sedia ada",
"Toggle Toolbar": "Togol Bar Alat"
"Toggle Toolbar": "Togol Bar Alat",
"Split Hyphens": "Pisahkan Sempang",
"Apply Theme Colors to PDF": "Gunakan Warna Tema pada PDF",
"Name": "Nama",
"Unavailable": "Tidak Tersedia"
}
@@ -1183,5 +1183,9 @@
"Hardcover progress sync failed: {{error}}": "Synchronisatie van Hardcover-voortgang mislukt: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "Bestaande bronidentificatie behouden",
"Toggle Toolbar": "Werkbalk in-/uitschakelen"
"Toggle Toolbar": "Werkbalk in-/uitschakelen",
"Split Hyphens": "Afbreekstreepjes splitsen",
"Apply Theme Colors to PDF": "Themakleuren toepassen op PDF",
"Name": "Naam",
"Unavailable": "Niet beschikbaar"
}
@@ -1209,5 +1209,9 @@
"Hardcover progress sync failed: {{error}}": "Synchronizacja postępu Hardcover nie powiodła się: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "Zachowaj istniejący identyfikator źródła",
"Toggle Toolbar": "Przełącz pasek narzędzi"
"Toggle Toolbar": "Przełącz pasek narzędzi",
"Split Hyphens": "Dziel łączniki",
"Apply Theme Colors to PDF": "Zastosuj kolory motywu do PDF",
"Name": "Nazwa",
"Unavailable": "Niedostępne"
}
@@ -1196,5 +1196,9 @@
"Hardcover progress sync failed: {{error}}": "Falha na sincronização de progresso do Hardcover: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "Manter o identificador de origem existente",
"Toggle Toolbar": "Alternar barra de ferramentas"
"Toggle Toolbar": "Alternar barra de ferramentas",
"Split Hyphens": "Dividir hífens",
"Apply Theme Colors to PDF": "Aplicar cores do tema ao PDF",
"Name": "Nome",
"Unavailable": "Indisponível"
}
@@ -1196,5 +1196,9 @@
"Hardcover progress sync failed: {{error}}": "Sincronizarea progresului Hardcover a eșuat: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "Păstrați identificatorul sursă existent",
"Toggle Toolbar": "Comutare bară de instrumente"
"Toggle Toolbar": "Comutare bară de instrumente",
"Split Hyphens": "Desparte cratimele",
"Apply Theme Colors to PDF": "Aplică culorile temei la PDF",
"Name": "Nume",
"Unavailable": "Indisponibil"
}
@@ -1209,5 +1209,9 @@
"Hardcover progress sync failed: {{error}}": "Ошибка синхронизации прогресса Hardcover: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "Сохранить существующий идентификатор источника",
"Toggle Toolbar": "Переключить панель инструментов"
"Toggle Toolbar": "Переключить панель инструментов",
"Split Hyphens": "Разделить дефисы",
"Apply Theme Colors to PDF": "Применить цвета темы к PDF",
"Name": "Имя",
"Unavailable": "Недоступно"
}
@@ -1183,5 +1183,9 @@
"Hardcover progress sync failed: {{error}}": "Hardcover ප්‍රගති සමමුහුර්තකරණය අසාර්ථකයි: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "පවතින මූලාශ්‍ර හඳුනාගැනීම තබාගන්න",
"Toggle Toolbar": "මෙවලම් තීරුව ටොගල් කරන්න"
"Toggle Toolbar": "මෙවලම් තීරුව ටොගල් කරන්න",
"Split Hyphens": "හයිෆන් බෙදන්න",
"Apply Theme Colors to PDF": "PDF වෙත තේමා වර්ණ යොදන්න",
"Name": "නම",
"Unavailable": "ලබාගත නොහැක"
}
@@ -1209,5 +1209,9 @@
"Hardcover progress sync failed: {{error}}": "Sinhronizacija napredka Hardcover ni uspela: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "Ohrani obstoječi identifikator vira",
"Toggle Toolbar": "Preklopi orodno vrstico"
"Toggle Toolbar": "Preklopi orodno vrstico",
"Split Hyphens": "Razdeli vezaje",
"Apply Theme Colors to PDF": "Uporabi barve teme za PDF",
"Name": "Ime",
"Unavailable": "Nedosegljivo"
}
@@ -1183,5 +1183,9 @@
"Hardcover progress sync failed: {{error}}": "Synkronisering av Hardcover-framsteg misslyckades: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "Behåll befintlig källidentifierare",
"Toggle Toolbar": "Visa/dölj verktygsfältet"
"Toggle Toolbar": "Visa/dölj verktygsfältet",
"Split Hyphens": "Dela bindestreck",
"Apply Theme Colors to PDF": "Tillämpa temafärger på PDF",
"Name": "Namn",
"Unavailable": "Inte tillgängligt"
}
@@ -1183,5 +1183,9 @@
"Hardcover progress sync failed: {{error}}": "Hardcover முன்னேற்ற ஒத்திசைவு தோல்வி: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "ஏற்கனவே உள்ள மூல அடையாளங்காட்டியை வைத்திருக்கவும்",
"Toggle Toolbar": "கருவிப்பட்டியை நிலைமாற்று"
"Toggle Toolbar": "கருவிப்பட்டியை நிலைமாற்று",
"Split Hyphens": "ஹைபன்களைப் பிரி",
"Apply Theme Colors to PDF": "PDF-க்கு தீம் நிறங்களைப் பயன்படுத்து",
"Name": "பெயர்",
"Unavailable": "கிடைக்கவில்லை"
}
@@ -1170,5 +1170,9 @@
"Hardcover progress sync failed: {{error}}": "การซิงค์ความคืบหน้า Hardcover ล้มเหลว: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "เก็บตัวระบุแหล่งที่มาที่มีอยู่",
"Toggle Toolbar": "สลับแถบเครื่องมือ"
"Toggle Toolbar": "สลับแถบเครื่องมือ",
"Split Hyphens": "แยกยัติภังค์",
"Apply Theme Colors to PDF": "ใช้สีธีมกับ PDF",
"Name": "ชื่อ",
"Unavailable": "ไม่พร้อมใช้งาน"
}
@@ -1183,5 +1183,9 @@
"Hardcover progress sync failed: {{error}}": "Hardcover ilerleme senkronizasyonu başarısız: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "Mevcut kaynak tanımlayıcısını koru",
"Toggle Toolbar": "Araç Çubuğunu Aç/Kapat"
"Toggle Toolbar": "Araç Çubuğunu Aç/Kapat",
"Split Hyphens": "Tireleri Böl",
"Apply Theme Colors to PDF": "Tema Renklerini PDF'ye Uygula",
"Name": "Ad",
"Unavailable": "Kullanılamaz"
}
@@ -1209,5 +1209,9 @@
"Hardcover progress sync failed: {{error}}": "Помилка синхронізації прогресу Hardcover: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "Зберегти наявний ідентифікатор джерела",
"Toggle Toolbar": "Перемкнути панель інструментів"
"Toggle Toolbar": "Перемкнути панель інструментів",
"Split Hyphens": "Розділити дефіси",
"Apply Theme Colors to PDF": "Застосувати кольори теми до PDF",
"Name": "Ім'я",
"Unavailable": "Недоступно"
}
@@ -1170,5 +1170,9 @@
"Hardcover progress sync failed: {{error}}": "Đồng bộ tiến trình Hardcover thất bại: {{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "Giữ mã định danh nguồn hiện tại",
"Toggle Toolbar": "Bật/tắt thanh công cụ"
"Toggle Toolbar": "Bật/tắt thanh công cụ",
"Split Hyphens": "Tách gạch nối",
"Apply Theme Colors to PDF": "Áp dụng màu chủ đề cho PDF",
"Name": "Tên",
"Unavailable": "Không khả dụng"
}
@@ -1170,5 +1170,9 @@
"Hardcover progress sync failed: {{error}}": "Hardcover 进度同步失败:{{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "保留现有来源标识符",
"Toggle Toolbar": "切换工具栏"
"Toggle Toolbar": "切换工具栏",
"Split Hyphens": "拆分连字符",
"Apply Theme Colors to PDF": "将主题颜色应用于 PDF",
"Name": "名称",
"Unavailable": "不可用"
}
@@ -1170,5 +1170,9 @@
"Hardcover progress sync failed: {{error}}": "Hardcover 進度同步失敗:{{error}}",
"ISBN": "ISBN",
"Keep existing source identifier": "保留現有來源識別碼",
"Toggle Toolbar": "切換工具列"
"Toggle Toolbar": "切換工具列",
"Split Hyphens": "拆分連字號",
"Apply Theme Colors to PDF": "將主題顏色套用至 PDF",
"Name": "名稱",
"Unavailable": "無法使用"
}
@@ -233,11 +233,13 @@ const FoliateViewer: React.FC<{
if (bookDoc.rendition?.layout === 'pre-paginated') {
applyFixedlayoutStyles(detail.doc, viewSettings);
const themeCode = getThemeCode();
if (themeCode && renderer) {
renderer.pageColors = {
background: themeCode.bg,
foreground: themeCode.fg,
};
if (bookData.book?.format === 'PDF' && themeCode && renderer) {
renderer.pageColors = viewSettings.applyThemeToPDF
? {
background: themeCode.bg,
foreground: themeCode.fg,
}
: undefined;
}
}
@@ -619,6 +621,7 @@ const FoliateViewer: React.FC<{
useEffect(() => {
if (viewRef.current && viewRef.current.renderer) {
const renderer = viewRef.current.renderer;
const viewSettings = getViewSettings(bookKey)!;
viewRef.current.renderer.setStyles?.(getStyles(viewSettings));
const docs = viewRef.current.renderer.getContents();
@@ -631,13 +634,13 @@ const FoliateViewer: React.FC<{
applyScrollbarStyle(document, viewSettings.hideScrollbar || false);
});
if (bookDoc.rendition?.layout === 'pre-paginated') {
if (themeCode && viewRef.current?.renderer) {
viewRef.current.renderer.pageColors = {
background: themeCode.bg,
foreground: themeCode.fg,
};
}
if (bookData?.book?.format === 'PDF' && themeCode && renderer) {
renderer.pageColors = viewSettings.applyThemeToPDF
? {
background: themeCode.bg,
foreground: themeCode.fg,
}
: undefined;
}
}
// eslint-disable-next-line react-hooks/exhaustive-deps
@@ -647,6 +650,7 @@ const FoliateViewer: React.FC<{
viewSettings?.scrolled,
viewSettings?.overrideColor,
viewSettings?.invertImgColorInDark,
viewSettings?.applyThemeToPDF,
viewSettings?.hideScrollbar,
]);
@@ -58,6 +58,7 @@ const ViewMenu: React.FC<ViewMenuProps> = ({ bookKey, setIsDropdownOpen }) => {
const [invertImgColorInDark, setInvertImgColorInDark] = useState(
viewSettings!.invertImgColorInDark,
);
const [applyThemeToPDF, setApplyThemeToPDF] = useState(viewSettings!.applyThemeToPDF!);
const zoomIn = () => setZoomLevel((prev) => Math.min(prev + ZOOM_STEP, MAX_ZOOM_LEVEL));
const zoomOut = () => setZoomLevel((prev) => Math.max(prev - ZOOM_STEP, MIN_ZOOM_LEVEL));
@@ -127,6 +128,12 @@ const ViewMenu: React.FC<ViewMenuProps> = ({ bookKey, setIsDropdownOpen }) => {
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [invertImgColorInDark]);
useEffect(() => {
if (applyThemeToPDF === viewSettings.applyThemeToPDF) return;
saveViewSettings(envConfig, bookKey, 'applyThemeToPDF', applyThemeToPDF, true, true);
// eslint-disable-next-line react-hooks/exhaustive-deps
}, [applyThemeToPDF]);
useEffect(() => {
if (zoomMode === viewSettings.zoomMode) return;
viewSettings.zoomMode = zoomMode;
@@ -328,6 +335,13 @@ const ViewMenu: React.FC<ViewMenuProps> = ({ bookKey, setIsDropdownOpen }) => {
Icon={themeMode === 'dark' ? BiMoon : themeMode === 'light' ? BiSun : TbSunMoon}
onClick={cycleThemeMode}
/>
{bookData.book?.format === 'PDF' && (
<MenuItem
label={_('Apply Theme Colors to PDF')}
Icon={applyThemeToPDF ? MdCheck : undefined}
onClick={() => setApplyThemeToPDF(!applyThemeToPDF)}
/>
)}
<MenuItem
label={_('Invert Image In Dark Mode')}
disabled={!isDarkMode}
+2 -1
View File
@@ -219,7 +219,6 @@ export const DEFAULT_BOOK_STYLE: BookStyle = {
textIndent: 0,
fullJustification: true,
hyphenation: true,
invertImgColorInDark: false,
theme: 'light',
overrideFont: false,
overrideLayout: false,
@@ -236,6 +235,8 @@ export const DEFAULT_BOOK_STYLE: BookStyle = {
zoomMode: 'fit-page',
spreadMode: 'auto',
keepCoverSpread: true,
invertImgColorInDark: false,
applyThemeToPDF: false,
};
export const DEFAULT_MOBILE_VIEW_SETTINGS: Partial<ViewSettings> = {
+2 -1
View File
@@ -154,7 +154,6 @@ export interface BookStyle {
textIndent: number;
fullJustification: boolean;
hyphenation: boolean;
invertImgColorInDark: boolean;
theme: string;
overrideFont: boolean;
overrideLayout: boolean;
@@ -172,6 +171,8 @@ export interface BookStyle {
zoomMode: 'fit-page' | 'fit-width' | 'original-size' | 'custom';
spreadMode: 'auto' | 'none';
keepCoverSpread: boolean;
invertImgColorInDark: boolean;
applyThemeToPDF: boolean;
}
export interface BookFont {