mirror of
https://github.com/InvoiceShelf/InvoiceShelf.git
synced 2026-04-20 19:54:08 +00:00
Bundle Noto Sans (Regular/Bold/Italic/BoldItalic) under resources/static/fonts/ as the default PDF face — it covers Latin, Cyrillic, Greek, Arabic, Thai and Hindi out of the box, replacing the limited DejaVu Sans fallback. Move all @font-face declarations into app.pdf.partials.fonts and include it from every invoice/estimate/payment/report template, dropping per-template font-family hardcodes and the conditional Thai locale include.
Introduce FontService + FontController to download static Noto Sans CJK packages (zh, zh_CN, ja, ko) from life888888/cjk-fonts-ttf on demand. GeneratesPdfTrait::ensureFontsForLocale primes the family before rendering and the partial emits @font-face rules for installed packages so dompdf resolves them through standard CSS — no separate registerFont() instance required. Static TTFs are mandatory because dompdf's PHP-Font-Lib does not parse variable fonts (fvar/gvar tables), which is why Google Fonts' NotoSansTC[wght].ttf rendered empty boxes.
Expose status/install via /api/v1/fonts/status and /api/v1/fonts/{package}/install with matching FONTS_STATUS / FONTS_INSTALL constants in scripts-v2/api/endpoints.ts. Flip DOMPDF_ENABLE_REMOTE default to true for remote asset loading.
208 lines
4.9 KiB
PHP
208 lines
4.9 KiB
PHP
<!DOCTYPE html>
|
|
<html lang="en">
|
|
|
|
<head>
|
|
<title>@lang('pdf_tax_summery_label')</title>
|
|
@include("app.pdf.partials.fonts")
|
|
|
|
<style type="text/css">
|
|
body {
|
|
}
|
|
|
|
table {
|
|
border-collapse: collapse;
|
|
}
|
|
|
|
.sub-container {
|
|
padding: 0px 20px;
|
|
}
|
|
|
|
.report-header {
|
|
width: 100%;
|
|
margin-bottom: 60px
|
|
}
|
|
|
|
.heading-text {
|
|
font-weight: bold;
|
|
font-size: 24px;
|
|
color: #5851D8;
|
|
width: 100%;
|
|
text-align: left;
|
|
padding: 0px;
|
|
margin: 0px;
|
|
}
|
|
|
|
.heading-date-range {
|
|
font-weight: normal;
|
|
font-size: 15px;
|
|
color: #A5ACC1;
|
|
width: 100%;
|
|
text-align: right;
|
|
padding: 0px;
|
|
margin: 0px;
|
|
}
|
|
|
|
.sub-heading-text {
|
|
font-weight: bold;
|
|
font-size: 16px;
|
|
color: #595959;
|
|
padding: 0px;
|
|
margin: 0px;
|
|
margin-top: 6px;
|
|
}
|
|
|
|
.tax-types-title {
|
|
margin-top: 20px;
|
|
padding-left: 3px;
|
|
font-size: 16px;
|
|
line-height: 21px;
|
|
color: #040405;
|
|
}
|
|
|
|
.tax-table-container {
|
|
padding-left: 10px;
|
|
}
|
|
|
|
.tax-table {
|
|
width: 100%;
|
|
padding-bottom: 10px;
|
|
}
|
|
|
|
.tax-title {
|
|
padding: 0px;
|
|
margin: 0px;
|
|
font-size: 14px;
|
|
line-height: 21px;
|
|
color: #595959;
|
|
}
|
|
|
|
.tax-amount {
|
|
padding: 0px;
|
|
margin: 0px;
|
|
font-size: 14px;
|
|
line-height: 21px;
|
|
text-align: right;
|
|
color: #595959;
|
|
}
|
|
|
|
.tax-total-table {
|
|
border-top: 1px solid #EAF1FB;
|
|
width: 100%;
|
|
}
|
|
|
|
.tax-total-cell {
|
|
padding-right: 20px;
|
|
padding-top: 10px;
|
|
}
|
|
|
|
.tax-total {
|
|
padding-top: 10px;
|
|
padding-right: 30px;
|
|
padding: 0px;
|
|
margin: 0px;
|
|
text-align: right;
|
|
font-weight: bold;
|
|
font-size: 16px;
|
|
line-height: 21px;
|
|
text-align: right;
|
|
color: #040405;
|
|
}
|
|
|
|
.report-footer {
|
|
width: 100%;
|
|
margin-top: 40px;
|
|
padding: 15px 20px;
|
|
background: #F9FBFF;
|
|
box-sizing: border-box;
|
|
}
|
|
|
|
.report-footer-label {
|
|
padding: 0px;
|
|
margin: 0px;
|
|
text-align: left;
|
|
font-weight: bold;
|
|
font-size: 16px;
|
|
line-height: 21px;
|
|
color: #595959;
|
|
}
|
|
|
|
.report-footer-value {
|
|
padding: 0px;
|
|
margin: 0px;
|
|
text-align: right;
|
|
font-weight: bold;
|
|
font-size: 20px;
|
|
line-height: 21px;
|
|
color: #5851D8;
|
|
}
|
|
</style>
|
|
|
|
</head>
|
|
|
|
<body>
|
|
<div class="sub-container">
|
|
<table class="report-header">
|
|
<tr>
|
|
<td>
|
|
<p class="heading-text">
|
|
{{ $company->name }}
|
|
</p>
|
|
</td>
|
|
<td>
|
|
<p class="heading-date-range">
|
|
{{ $from_date }} - {{ $to_date }}
|
|
</p>
|
|
</td>
|
|
</tr>
|
|
<tr>
|
|
<td colspan="2">
|
|
<p class="sub-heading-text">@lang('pdf_tax_report_label')</p>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<p class="tax-types-title">@lang('pdf_tax_types_label')</p>
|
|
<div class="tax-table-container">
|
|
<table class="tax-table">
|
|
@foreach ($taxTypes as $tax)
|
|
<tr>
|
|
<td>
|
|
<p class="tax-title">
|
|
{{ $tax->taxType->name }}
|
|
</p>
|
|
</td>
|
|
<td>
|
|
<p class="tax-amount">
|
|
{!! format_money_pdf($tax->total_tax_amount, $currency) !!}
|
|
</p>
|
|
</td>
|
|
</tr>
|
|
@endforeach
|
|
|
|
</table>
|
|
</div>
|
|
</div>
|
|
|
|
<table class="tax-total-table">
|
|
<tr>
|
|
<td class="tax-total-cell">
|
|
<p class="tax-total">
|
|
{!! format_money_pdf($totalTaxAmount, $currency) !!}
|
|
</p>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
<table class="report-footer">
|
|
<tr>
|
|
<td>
|
|
<p class="report-footer-label">@lang('pdf_total_tax_label')</p>
|
|
</td>
|
|
<td>
|
|
<p class="report-footer-value">
|
|
{!! format_money_pdf($totalTaxAmount, $currency) !!}
|
|
</p>
|
|
</td>
|
|
</tr>
|
|
</table>
|
|
</body>
|
|
|
|
</html> |