fix: lỗi font Bold của xuất pdf

This commit is contained in:
3dtours committed 2026-06-24 18:17:42 +07:00
1 parent 4b551ccc31
commit 957ba6c72c
7 files changed
+91 -466

No files matched your search

+88 -30
View File
@@ -2,7 +2,7 @@ import React, { useState, useEffect, useMemo, useRef } from 'react';
import { io } from 'socket.io-client';
import { jsPDF } from 'jspdf';
import autoTable from 'jspdf-autotable';
import { robotoBase64 } from '../utils/pdfFont';
import { robotoBase64, robotoBoldBase64 } from '../utils/pdfFont';
import { ItineraryTimeline } from '../components/ItineraryTimeline';
import { ExpenseManager } from '../components/ExpenseManager';
import { useTourStore } from '@/store/useTourStore';
@@ -486,12 +486,12 @@ export const TourDetailPage = ({
const handleExportPDF = async () => {
const doc = new jsPDF({ orientation: 'landscape', unit: 'mm', format: 'a4' });
// 1. Thêm font vào Virtual File System của jsPDF để hỗ trợ tiếng Việt
doc.addFileToVFS("Roboto-Regular.ttf", robotoBase64);
doc.addFont("Roboto-Regular.ttf", "Roboto", "normal");
doc.addFileToVFS("Roboto-Bold.ttf", robotoBoldBase64);
doc.addFont("Roboto-Bold.ttf", "Roboto", "bold");
doc.setFont("Roboto");
// 2. Vẽ Tiêu đề & Thông tin Tour ở đầu trang
const titleText = `LỊCH TRÌNH TOUR: ${currentTour?.title?.toUpperCase() || 'HÀNH TRÌNH TOUR'}`;
doc.setFontSize(16);
doc.text(titleText, 148.5, 15, { align: 'center' });
@@ -508,9 +508,9 @@ export const TourDetailPage = ({
doc.text(dateRangeStr, 148.5, startY, { align: 'center' });
startY += 8;
// 3. Chuẩn bị dữ liệu bảng
const tableColumn = ["STT", "Ngày giờ", "Chặng", "Địa điểm", "Ghi chú"];
const tableRows: any[] = [];
const legRowRanges: Record<string, { start: number; count: number }> = {};
const formatDateTime = (dateStr: string) => {
if (!dateStr) return '';
@@ -525,30 +525,43 @@ export const TourDetailPage = ({
};
let stt = 1;
let globalRowIndex = 0;
if (currentTour?.legs && currentTour.legs.length > 0) {
currentTour.legs.forEach((leg: any, legIdx: number) => {
const legName = leg.note || `Chặng ${legIdx + 1}`;
if (leg.locations && leg.locations.length > 0) {
leg.locations.forEach((loc: any) => {
const currentStt = stt++;
const arrivalStr = loc.arrivalTime ? `Đến: ${formatDateTime(loc.arrivalTime)}` : '';
const departureStr = loc.departureTime ? `Đi: ${formatDateTime(loc.departureTime)}` : '';
const timeText = [arrivalStr, departureStr].filter(Boolean).join('\n');
const locName = loc.name;
const addressStr = loc.address ? `\n📍 Địa chỉ: ${loc.address}` : '';
const locationText = `${locName}${addressStr}`;
const noteText = loc.notes || '';
const legLocations = (leg.locations || []).filter((loc: any) =>
loc && (loc.plannedStart || loc.plannedEnd || loc.name)
);
if (legLocations.length > 0) {
const startRow = globalRowIndex;
legRowRanges[leg.id] = { start: startRow, count: legLocations.length };
legLocations.forEach((loc: any) => {
const timeStr = loc.plannedStart
? formatDateTime(loc.plannedStart)
: loc.plannedEnd
? formatDateTime(loc.plannedEnd)
: '';
const locName = loc.name || '';
const addressStr = loc.address || '';
const coordStr = loc.latitude && loc.longitude
? `\n${loc.latitude}, ${loc.longitude}`
: '';
const locationText = [locName, addressStr, coordStr].filter(Boolean).join('\n');
const noteText = loc.note || '';
tableRows.push([
currentStt,
timeText,
stt++,
timeStr,
legName,
locationText,
noteText
]);
globalRowIndex++;
});
}
});
@@ -558,22 +571,67 @@ export const TourDetailPage = ({
tableRows.push(["-", "-", "-", "Chưa có chặng hoặc địa điểm nào trong hành trình.", "-"]);
}
// 4. Vẽ bảng dùng autoTable
autoTable(doc, {
head: [tableColumn],
headStyles: {
fillColor: [37, 99, 235],
textColor: [255, 255, 255],
fontStyle: 'bold',
halign: 'center',
valign: 'middle'
},
body: tableRows,
startY: startY,
theme: 'grid',
headStyles: { fillColor: [37, 99, 235], textColor: [255, 255, 255], fontStyle: 'normal' },
styles: { font: "Roboto", fontSize: 9, cellPadding: 3, overflow: 'linebreak' },
columnStyles: {
0: { cellWidth: 12, halign: 'center' }, // STT
1: { cellWidth: 50 }, // Ngày giờ
2: { cellWidth: 45 }, // Chặng
3: { cellWidth: 90 }, // Địa điểm
4: { cellWidth: 70 } // Ghi chú
styles: {
font: "Roboto",
fontSize: 9,
cellPadding: 3,
overflow: 'linebreak',
valign: 'top'
},
margin: { left: 15, right: 15 }
columnStyles: {
0: { cellWidth: 12, halign: 'center', valign: 'middle' },
1: { cellWidth: 50, halign: 'center', valign: 'middle' },
2: { cellWidth: 45, halign: 'center', valign: 'middle' },
3: { cellWidth: 90, valign: 'top' },
4: { cellWidth: 70, valign: 'top' }
},
margin: { left: 15, right: 15 },
didParseCell: (cell: any) => {
if (cell.section === 'body') {
if (cell.column.index === 2) {
let assigned = false;
for (const leg of currentTour?.legs || []) {
const range = legRowRanges[leg.id];
if (range && cell.row.index >= range.start && cell.row.index < range.start + range.count) {
if (cell.row.index === range.start) {
cell.rowSpan = range.count;
} else {
cell.rowSpan = 0;
}
assigned = true;
break;
}
}
if (!assigned) {
cell.rowSpan = 1;
}
}
if (cell.column.index === 3) {
const rowData = tableRows[cell.row.index];
if (rowData && rowData[3]) {
const coordMatch = rowData[3].match(/([\d.]+),\s*([\d.]+)/);
if (coordMatch) {
const lat = coordMatch[1];
const lng = coordMatch[2];
cell.cell.link = `https://www.openstreetmap.org/?mlat=${lat}&mlon=${lng}`;
}
}
}
}
}
});
try {
+2
View File
@@ -1 +1,3 @@
export const robotoBase64 = "AAEAAAAOAIAAAwBgR0RFRgslCyYAAU70AAAAQEdQT1OW7t6tAAFPNAAAUZJHU1VCLJENOgABoMgAAAQsT1MvMrivKbYAAAFoAAAAYFZETVhu6nZPAAASiAAABeBjbWFwe1eWmQAAGGgAAAh+Z2x5ZnKsuk0AAClMAAD8BGhlYWT3/7sxAAAA7AAAADZoaGVhCywJXgAAASQAAAAkaG10eMBzVnEAAAHIAAAQwGxvY2Hm+KbaAAAg6AAACGJtYXhwBE8BKgAAAUgAAAAgbmFtZfDWLcMAASVQAAAEo3Bvc3RDYN+ZAAEp9AAAJP0AAQAAAAEAAOqeVyxfDzz1AAsIAAAAAADE8BEuAAAAANAzXr36jf3VCTAIcwAAAAkAAgAAAAAAAAABAAAHbP4MAAAJSfqN/dgJMAABAAAAAAAAAAAAAAAAAAAEMAABAAAEMACwABYAeAAFAAEAAAAAAAAAAAAAAAAAAwABAAMEigGQAAUAAAWaBTMAAAEfBZoFMwAAA9EAZgIAAAAAAAAAAAAAAAAA4AAC/1AAIFsAAAAgAAAAAHB5cnMAQAAA//0GAP4AAGYHmgIAIAABn08BAAAEOgWwAAAAIAACAfsAAAAAAAAB+wAAAfsAAAKPAIgE+wBGBH4AbgXcAGkE+QBlAWUAZwK8AIUCyAAmA3IAHASJAE4BkgAdAjUAJQIbAJADTAASBH4AcwR+AKoEfgBdBH4AXgR+ADUEfgCaBH0AgwR+AE0EfgBwBH4AZAHwAIYBsQApBBEASARkAJgELgCGA8cASwcvAGoFOAAcBPsAqQU1AHcFPwCpBIwAqQRsAKkFcwB6BbQAqQItALcEagA1BQQAqQROAKkG/ACpBbQAqQWAAHYFDACpBYAAbQTtAKgEvwBQBMYAMQUwAIwFFwAcBxkAPQUEADkEzgAPBMoAVgIfAJIDSAAoAh8ACQNYAEADnAAEAnkAOQRaAG0EfQCMBDAAXASDAF8EPQBdAscAPAR9AGAEaACMAfEAjQHp/78EDgCNAfEAnAcDAIsEagCMBJAAWwR9AIwEjABfArUAjAQgAF8CnQAJBGkAiAPgACEGAwArA/cAKQPJABYD9wBYArUAQAHzAK8CtQATBXEAgwHzAIsEYQBpBKYAWwW0AGkE2AAfAesAkwToAFoDWABmBkkAWwOTAJMDwQBmBG4AfwZKAFoDqgB4Av0AggRHAGEC7wBCAu8APgKCAHsEiACaA+kAQwIWAJMB+wB0ArkAegOjAHoDwABmBdwAVQY1AFAGOQBvA8kARAd6//IERABZBYEAdgS6AKYEwgCLBsEATgSwAH4EkQBHBIkAWwScAJUFmwAeAfoAmwRzAJoETwAjAioAIwWLAKIEiACRB6EAaQdEAGEB/ACgArn/5AV/AGUEkwBbBZAAjATzAIgCA/+0BDcAYgPEAKkDjQCMA2oAgQHxAI0CrQB5AioAMgPGAHsC/ABeAloAfgAA/TYAAP2GAAD8iwAA/V4AAPwnAe/9OAINALcECwBxAhcAkwRzALEFpAAfBXIAZwU+ADIEkQB4BbUAsgSRAEUFuwBNBYkAWgVSAHEEhQBkBL0AoAQCAC4EiABgBFAAYwQlAG0EiACRBI4AegKXAMMEbgAlA+wAZQTFACkEiACRBE0AZQSIAGAELABRBF0AjwWjAFcFmgBfBpcAegShAHkEQv/aBkgASgX/ACoFZAB7CJkAMQikALEGggA+BbQAsAULAKIGBAAyB0MAGwS/AFAFtACxBakALwUHAE0GLQBTBdkArwV6AJYHhwCwB8AAsAYSABEG6wCyBQUAowVkAJMHJwC3BRgAWQRsAGEEkgCdA1sAmgTUAC4GIAAVBBAAWASeAJwEUgCcBKAAKAXvAJ0EnQCcBJ4AnAPYACgFzQBkBL0AnARZAGcGeACcBp8AkQT3AB4GNgCdBFgAnQRNAGQGiACdBGQALwRo/+cETgBnBskAJwbkAJwEif/9BJ4AnAcIAJwGKwCBBFb/3AcsALgF+QCZBNIAKARGAA8HDADKBgwAvAbRAJMF4QCWCQUAtwfRAJsEJABQA9sATAVyAGcEjABbBQoAFgQDAC4FcgBnBIkAWwcBAJwGJAB+BwkAnAYsAIEFMgB1BEcAZAT9AHQAAPxnAAD8cQAA/WYAAP2kAAD6jQAA+qQEVv/cBRsAqASKAIwEZACiA5AAkQTbALEEBgCRBQkAowR+AJoGjABFBYQAPgfPAKgFtACRCDEAsAb0AJEF7gBxBNMAbQctADQFXAAfBXAAlgRrAIMFcACKBi8APwS+/90FCQCjBFoAmgWyALEEiACRBYcAXQSoAGgEqABpBLcAOgNJADsE9gBXBpQAWQbkAGQGVgA2BSsAMQRKAFMECAB5B8EARAZ1AD8H+wCpBqEAkAT2AHYEHQBlBa0AIwUgAEYFZACWBBQAAAgpAAAEFAAACCkAAAK5AAACCgAAAVwAAAR/AAACMAAAAaIAAADRAAAAAAAABUAAogY/AJADpgANAZkAYAGZADABlwAkAZoAUALUAGgC2wA8AsEAJARpAEYEjwBXArIAigPEAJQFWgCUB6oARAJmAGwCZgBZA6MAOwLvADYDYAB6BKYAWwaRAKcEfgBfBegAewPOAGgIOgCiBQEAZwUXAJgGJgBUBtcAZAbPAGMGagBZBI8AagWOAKkErwBFBJIAqATFAD8IOgBiAgz/sASCAGUEZACYBBEAPgQvAIUECAArAkwAtQKPAG4CAwBcBG4AHwAAAAAIMwBbCDUAXALvAFADC/+iA/P/XgPvAG4DpABbAf0AnwSFABMEUACKBHwAYASAAIoD5gCKA8sAigSsAGME4wCKAegAlwPPACsEVACKA7QAigYCAIoE4wCKBLsAYARcAIoEuwBZBEoAigQgAEMEJgAoBHwAdARnABQGFQAxBFQAJgQrAA0EIwBHBA8AYwQPAJgEDwBOBA8ATgQPADAEDwCABA4AcgQPAEIEDwBgBA8AVQOkAIMC7wB6Au8AQgLvAD4C7wA2Au8AWwLvAFYC7wA6Au8ATwLvAEkDlgCPArUAngNHAIEBkQBnAiUAGwH8/7YEDgBpBDoAHgN5AFcD9ABpBG8AWgTDAGQEiABgBUwAsQUkALIEEwCSBT0AsgQPAJIDnwCBA54AgQR+AE0FfgCDBYEAfgWuAH4FkwCyBeAAfgXjAH4D1QCgBIIAgwRYAA8EzwA+BGsAZQQuAEoEuQCCBQAAeAQgADsEfQCMBDIAXASTAFsEjABbBJ4AWgSNAIwEnABbBDAAXAQ9AF0EfQBgBH4AhQR+AFoFPwCpBYAAdwRaAG0DagCBAfsAAAI1ACUFXQAlBV0AJQSGAAAExgAxAp3/9AU4ABwFOAAcBTgAHAU4ABwFOAAcBTgAHAU4ABwFNQB3BIwAqQSMAKkEjACpBIwAqQIt/+ACLQCwAi3/6QIt/9YFtACpBYAAdgWAAHYFgAB2BYAAdgWAAHYFMACMBTAAjAUwAIwFMACMBM4ADwRaAG0EWgBtBFoAbQRaAG0EWgBtBFoAbQRaAG0EMABcBD0AXQQ9AF0EPQBdBD0AXQH6/8YB+gCWAfr/zwH6/7wEagCMBJAAWwSQAFsEkABbBJAAWwSQAFsEaQCIBGkAiARpAIgEaQCIA8kAFgPJABYFOAAcBFoAbQU4ABwEWgBtBTgAHARaAG0FNQB3BDAAXAU1AHcEMABcBTUAdwQwAFwFNQB3BDAAXAU/AKkFGQBfBIwAqQQ9AF0EjACpBD0AXQSMAKkEPQBdBIwAqQQ9AF0EjACpBD0AXQVzAHoEfQBgBXMAegR9AGAFcwB6BH0AYAVzAHoEfQBgBbQAqQRoAIwCLf+3Afr/nQIt/7YB+v+cAi3/7AH6/9ICLQAJAfH/+gItAKoGlwC3A9oAjQRqADUCA/+0BQQAqQQOAI0ETgChAfEAkwROAKkB8QBXBE4AqQKHAJwETgCpAs0AnAW0AKkEagCMBbQAqQRqAIwFtACpBGoAjARq/84FgAB2BJAAWwWAAHYEkABbBYAAdgSQAFsE7QCoArUAjATtAKgCtQBTBO0AqAK1AGMEvwBQBCAAXwS/AFAEIABfBL8AUAQgAF8EvwBQBCAAXwS/AFAEIABfBMYAMQKdAAkExgAxAp0ACQTGADECxQAJBTAAjARpAIgFMACMBGkAiAUwAIwEaQCIBTAAjARpAIgFMACMBGkAiAUwAIwEaQCIBxkAPQYDACsEzgAPA8kAFgTOAA8EygBWA/cAWATKAFYD9wBYBMoAVgP3AFgHev/yBsEATgWBAHYEiQBbBID/wQSA/8EEJgAoBIUAEwSFABMEhQATBIUAEwSFABMEhQATBIUAEwR8AGAD5gCKA+YAigPmAIoD5gCKAej/vgHoAI4B6P/HAej/tATjAIoEuwBgBLsAYAS7AGAEuwBgBLsAYAR8AHQEfAB0BHwAdAR8AHQEKwANBIUAEwSFABMEhQATBHwAYAR8AGAEfABgBHwAYASAAIoD5gCKA+YAigPmAIoD5gCKA+YAigSsAGMErABjBKwAYwSsAGME4wCKAej/lQHo/5QB6P/KAej/4wHoAIkDzwArBFQAigO0AIIDtACKA7QAigO0AIoE4wCKBOMAigTjAIoEuwBgBLsAYAS7AGAESgCKBEoAigRKAIoEIABDBCAAQwQgAEMEIABDBCYAKAQmACgEfAB0BHwAdAR8AHQEfAB0BHwAdAR8AHQGFQAxBCsADQQrAA0EIwBHBCMARwQjAEcIQABDBTgAHATw//AGGP/+ApEABAWUAD0FMv94BWYAMwKX/5sFOAAcBPsAqQSMAKkEygBWBbQAqQItALcFBACpBvwAqQW0AKkFgAB2BQwAqQTGADEEzgAPBQQAOQIt/9YEzgAPBIUAZARQAGMEiACRApcAwwRdAI8EcwCaBJAAWwSIAJoD4AAhA/cAKQKX/+YEXQCPBJAAWwRdAI Line truncated
export const robotoBoldBase64 = "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AvoARQL6AEYC+gAzAvoARwL6AEMD0gCNAqoAkAPbAGMEO//7BK0ASQU5AIQFKwCEBEcAcQUwAIQEQABxBHUAYwSDAEAEbQBjBKz//wIBAIUDnQBqAAD8mgQHAIMEB/9FBAcAhAQHAIQDxQBjA50AagOdAGoC+wBHAvsANQL7AEUC+wBGAvsAMwL7AEcC+wBDBWoAWAWSAFgFcgCEBdYAWAXXAFgEaACPBIIAWARXAA8ErAAsBGsAaAQuADwDnQBqAdkAWgaOAEAEpwBgAhv/nwSXADcElwBhBJcANASXAFQElwBOBJcAMwSXAF8ElwBWBJcAXwSXANkCQf+tAkH/rQIxAIYCMf/8AjEAhgRtAGME0gBMBD4AOASRAG8ERgBEBJgARASWAEQEnAA8BJUAbwSaAEQEUwBIBJEAQgPUAGYFNQBWA9AABwZQ/9cEFABjBMAAQAUwADYE1gBjAf4AAAMaAG4FUf/sBVH/7ASY/8sE8wAoArT/4gViAAcFYgAHBWIABwViAAcFYgAHBWIABwViAAcFPABWBIAAggSAAIIEgACCBIAAggJV/7oCVQCVAlX/rwJV/60FpgCCBYYAVgWGAFYFhgBWBYYAVgWGAFYFRAB0BUQAdAVEAHQFRAB0BPIAAgRKAEQESgBEBEoARARKAEQESgBEBEoARARKAEQELABCBFMASARTAEgEUwBIBFMASAIx/6gCMQCGAjH/nQIx/5sEewBpBIYAQgSGAEIEhgBCBIYAQgSGAEIEegBoBHoAaAR6AGgEegBoBAQAAwQEAAMFYgAHBEoARAViAAcESgBEBWIABwRKAEQFPABWBCwAQgU8AFYELABCBTwAVgQsAEIFPABWBCwAQgUzAIIFGABCBIAAggRTAEgEgACCBFMASASAAIIEUwBIBIAAggRTAEgEgACCBFMASAVzAF4EkQBFBXMAXgSRAEUFcwBeBJEARQVzAF4EkQBFBacAggR6AGgCVf+yAjH/oAJV/9QCMf/CAlX/0gIx/8ACVQAXAh8AAwJVAJUGzQCVBDMAbQR4ACgCQf+XBRQAggRGAG8EVQCCAh8AfgRVAIICHwBbBFUAggK1AH4EVQCCAvsAfgWmAIIEewBpBaYAggR7AGkFpgCCBHsAaQR7/5IFhgBWBIYAQgWGAFYEhgBCBYYAVgSGAEIFGwCCAusAbwUbAIIC6wBQBRsAggLrABEE6wBFBB0AOATrAEUEHQA4BOsARQQdADgE6wBFBB0AOATrAEUEHQA4BPMAKAK0AAoE8wAoArQACgTzACgC3AAKBUQAdAR6AGgFRAB0BHoAaAVEAHQEegBoBUQAdAR6AGgFRAB0BHoAaAVEAHQEegBoBv8AIw Line truncated