inspect-front/public/templates/report-template.html

1015 lines
34 KiB
HTML
Raw Normal View History

2025-03-17 10:18:30 +08:00
<!DOCTYPE html>
<html lang="zh">
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>体检检查报告</title>
<!-- 添加PDF.js库 -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.4.120/pdf.min.js"></script>
<style>
2025-03-17 16:43:28 +08:00
.report-container {
2025-03-17 10:18:30 +08:00
max-width: 1200px;
margin: 0 auto;
padding: 20px;
}
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
.report-item {
margin-bottom: 40px;
border: 1px solid #e0e0e0;
border-radius: 8px;
overflow: hidden;
2025-03-17 16:43:28 +08:00
box-shadow: 0 2px 4px rgba(0, 0, 0, 0.1);
2025-03-17 16:08:40 +08:00
width: 800px;
height: 1123px;
margin: 0 auto 40px;
position: relative;
2025-03-17 10:18:30 +08:00
}
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
.report-title {
background-color: #4a90e2;
color: white;
padding: 15px;
font-size: 18px;
font-weight: bold;
border-bottom: 1px solid #e0e0e0;
}
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
.report-content {
padding: 20px;
text-align: center;
background-color: white;
}
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
.report-content img {
max-width: 100%;
height: auto;
}
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
.report-content iframe {
width: 100%;
height: 800px;
border: none;
}
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
.report-summary {
padding: 15px;
background-color: #f9f9f9;
border-top: 1px solid #e0e0e0;
}
/* 新增表格样式 */
.exam-table {
width: 100%;
border-collapse: collapse;
margin: 20px 0;
}
2025-03-17 16:43:28 +08:00
.exam-table th,
.exam-table td {
2025-03-17 10:18:30 +08:00
border: 1px solid #ddd;
padding: 12px;
text-align: left;
}
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
.exam-table th {
background-color: #f5f5f5;
font-weight: bold;
}
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
.exam-table tr:nth-child(even) {
background-color: #fafafa;
}
h1 {
text-align: center;
color: #333;
margin-bottom: 30px;
}
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
/* 默认隐藏打印占位符和打印专用内容 */
.print-placeholder {
display: none;
}
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
.print-only {
display: none;
}
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
.pdf-loading {
text-align: center;
padding: 20px;
font-style: italic;
color: #666;
}
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
.pdf-error {
color: red;
text-align: center;
padding: 20px;
border: 1px solid #ffcccc;
background-color: #fff8f8;
}
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
.pdf-page-info {
text-align: center;
font-size: 12px;
color: #666;
margin-top: 10px;
}
/* 加载动画 */
.loading-spinner {
width: 30px;
height: 30px;
border: 3px solid #f3f3f3;
border-top: 3px solid #3498db;
border-radius: 50%;
margin: 0 auto 10px;
animation: spin 1s linear infinite;
}
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
@keyframes spin {
2025-03-17 16:43:28 +08:00
0% {
transform: rotate(0deg);
}
100% {
transform: rotate(360deg);
}
2025-03-17 10:18:30 +08:00
}
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
.pdf-image-container img {
max-width: 100%;
height: auto;
border: 1px solid #ddd;
margin: 10px 0;
}
2025-03-17 16:43:28 +08:00
/* 打印专用样式 - 完全重写 */
@media print {
body {
margin: 0;
padding: 0;
}
.report-container {
padding: 0;
max-width: none;
}
/* 一般检查特殊处理 */
.general-exam {
page-break-inside: avoid !important;
break-inside: avoid !important;
page-break-after: always !important;
break-after: page !important;
2025-03-17 17:16:02 +08:00
height: 1123px !important; /* 设置固定高度,与其他报告一致 */
width: 800px !important;
margin: 0 auto !important;
2025-03-17 16:43:28 +08:00
padding: 0 !important;
border: none !important;
border-radius: 0 !important;
box-shadow: none !important;
display: block !important;
overflow: visible !important;
2025-03-17 17:16:02 +08:00
position: relative !important; /* 确保可以放置绝对定位的页脚 */
}
/* 确保一般检查的页脚正确显示 */
.general-exam .report-footer {
position: absolute !important;
bottom: 30px !important;
left: 10px !important;
right: 10px !important;
border-top: 1px solid #000 !important;
padding-top: 5px !important;
display: block !important;
}
.general-exam .report-footer-text {
font-size: 10px !important;
margin: 0 !important;
font-style: italic !important;
text-align: right !important;
}
/* 确保一般检查的页码正确显示 */
.general-exam .page-number {
position: absolute !important;
bottom: 10px !important;
left: 0 !important;
right: 0 !important;
text-align: center !important;
font-size: 10px !important;
display: block !important;
2025-03-17 16:43:28 +08:00
}
/* 一般检查的内容区域 */
.general-exam .report-content {
padding: 5px !important;
margin: 0 !important;
display: block !important;
overflow: visible !important;
height: auto !important;
}
/* 一般检查的表格 */
.general-exam .exam-table {
margin: 5px 0 !important;
font-size: 9px !important;
}
.general-exam .exam-table th,
.general-exam .exam-table td {
padding: 2px !important;
font-size: 9px !important;
}
/* 一般检查的小结 */
.general-exam .report-summary {
padding: 5px !important;
2025-03-17 17:16:02 +08:00
margin-bottom: 80px !important;
2025-03-17 16:43:28 +08:00
font-size: 9px !important;
}
.general-exam .report-summary h4 {
margin: 2px 0 !important;
font-size: 9px !important;
}
.general-exam .report-summary p {
margin: 2px 0 !important;
font-size: 9px !important;
}
/* 其他报告项目的样式 */
.report-item:not(.general-exam) {
page-break-after: always;
break-after: page;
margin: 0;
padding: 0;
border: none;
border-radius: 0;
box-shadow: none;
height: 100vh;
display: flex;
flex-direction: column;
overflow: hidden;
}
/* 最后一个报告不需要分页 */
.report-item:last-child {
page-break-after: auto;
break-after: auto;
}
/* 标题样式 */
h1 {
font-size: 18px;
margin: 10px 0;
}
.report-title {
padding: 8px 10px;
font-size: 16px;
background-color: #4a90e2 !important;
color: white !important;
}
/* 内容区域 */
.report-item:not(.general-exam) .report-content {
padding: 10px;
flex: 1;
overflow: hidden;
display: flex;
flex-direction: column;
align-items: center;
}
/* 表格样式 */
.report-item:not(.general-exam) .exam-table {
margin: 10px 0;
}
.report-item:not(.general-exam) .exam-table th,
.report-item:not(.general-exam) .exam-table td {
padding: 5px;
font-size: 11px;
}
/* 小结部分 */
.report-item:not(.general-exam) .report-summary {
padding: 8px;
2025-03-17 17:16:02 +08:00
margin-bottom: 80px !important;
2025-03-17 16:43:28 +08:00
font-size: 11px;
background-color: #f9f9f9 !important;
}
.report-item:not(.general-exam) .report-summary h4 {
margin: 3px 0;
}
.report-item:not(.general-exam) .report-summary p {
margin: 3px 0;
}
/* PDF图片容器 */
.pdf-image-container {
max-height: 500px;
overflow: hidden;
width: 100%;
text-align: center;
}
.pdf-image-container img {
max-width: 100%;
max-height: 480px;
object-fit: contain;
margin: 0 auto;
border: none;
}
.pdf-page-info {
font-size: 9px;
margin-top: 3px;
}
/* 隐藏屏幕元素 */
.screen-only {
display: none !important;
}
/* 显示打印元素 */
.print-only {
display: block !important;
}
/* 确保背景色和边框在打印时可见 */
.report-title,
.exam-table th,
.exam-table td,
.report-summary {
-webkit-print-color-adjust: exact !important;
color-adjust: exact !important;
print-color-adjust: exact !important;
}
/* 页面设置 */
@page {
margin: 0.5cm;
size: A4 portrait;
}
/* 超声检查报告的特殊样式 */
.ultrasound-exam .pdf-image-container {
max-height: 800px !important;
/* 增加高度 */
}
.ultrasound-exam .pdf-image-container img {
max-width: 100% !important;
max-height: 880px !important;
/* 增加高度 */
object-fit: contain !important;
}
/* 调整超声检查报告的内容区域 */
.ultrasound-exam .report-content {
padding: 5px !important;
}
/* 调整超声检查报告的小结部分 */
.ultrasound-exam .report-summary {
padding: 5px !important;
2025-03-17 17:16:02 +08:00
margin-bottom: 80px !important;
2025-03-17 16:43:28 +08:00
font-size: 10px !important;
}
.ultrasound-exam .report-summary p {
margin: 3px 0 !important;
font-size: 10px !important;
}
/* 所有报告项目的打印样式 */
.report-item {
page-break-after: always;
break-after: page;
margin: 0 auto;
padding: 0;
border: none;
border-radius: 0;
box-shadow: none;
width: 800px;
height: 1123px;
position: relative;
display: flex;
flex-direction: column;
overflow: hidden;
}
}
/* 添加首页样式 */
.repott_concent {
width: 561px;
height: 397px;
margin: auto;
position: absolute;
top: 0;
left: 0;
right: 0;
bottom: 0;
}
.repott_concent_area {
display: flex;
justify-content: center;
}
.repott_concent_title {
font-size: 40pt;
letter-spacing: 30px;
}
.repott_concent_english {
display: flex;
justify-content: center;
margin-top: 17px;
}
.repott_concent_english_health {
font-size: 15pt;
width: 174px;
text-align: center;
}
.repott_concent_Examination {
font-size: 15pt;
width: 152px;
text-align: center;
}
.repott_concent_Report {
font-size: 15pt;
width: 204px;
text-align: center;
}
.person_detail {
display: flex;
justify-content: center;
margin-bottom: 14px;
}
.person_title {
font-size: 15pt;
letter-spacing: 30px;
}
.person_content {
font-size: 15pt;
width: 235px;
text-align: center;
border-bottom: 1px solid;
}
.preface-content .footer {
margin-top: 40px;
width: 100%;
text-align: right; /* 整个footer右对齐 */
}
.preface-content .hospital-name {
margin-bottom: 20px;
font-weight: normal;
}
.preface-content .slogan {
font-style: normal;
}
.underline {
display: inline-block;
min-width: 100px;
border-bottom: 1px solid #000;
text-align: center;
margin: 0 5px; /* 增加左右间距 */
}
2025-03-17 17:16:02 +08:00
/* 添加页码样式 */
.page-number {
position: absolute;
bottom: 20px;
left: 0;
right: 0;
text-align: center;
font-size: 12px;
}
/* 打印时的页码样式 */
@media print {
.page-number {
bottom: 10px;
font-size: 10px;
}
}
/* 调整页脚样式,避免与页码重叠 */
.report-footer {
position: absolute;
bottom: 40px;
left: 20px;
right: 20px;
border-top: 1px solid #000;
padding-top: 10px;
text-align: right;
}
.report-footer-text {
margin: 0;
font-size: 12px;
font-style: italic;
}
/* 打印时的页码样式 */
@media print {
.report-footer {
position: absolute;
bottom: 30px;
left: 10px;
right: 10px;
border-top: 1px solid #000;
padding-top: 5px;
}
.report-footer-text {
font-size: 10px;
}
}
2025-03-17 10:18:30 +08:00
</style>
</head>
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
<body>
<div class="report-container">
2025-03-17 16:08:40 +08:00
<!-- 添加首页 -->
<div class="report-item" style="width: 800px;height: 1123px;margin:0 auto;position: relative;">
<div class="report-title">体检编号:--</div>
<div class="repott_concent">
<div class="repott_concent_area">
<div class="repott_concent_title">健康</div>
<div class="repott_concent_title">体检</div>
<div class="repott_concent_title">报告</div>
</div>
<div class="repott_concent_english">
<div class="repott_concent_english_health">Health</div>
<div class="repott_concent_Examination">Examination</div>
<div class="repott_concent_Report">Report</div>
</div>
<div style="margin-top: 100px;">
<div class="person_detail">
<span class="person_title">姓名</span><span class="person_content">--</span>
</div>
<div class="person_detail">
<span class="person_title">性别</span><span class="person_content">--</span>
</div>
<div class="person_detail">
<span class="person_title">年龄</span><span class="person_content">--</span>
</div>
<div class="person_detail">
<span class="person_title">单位</span><span class="person_content">--</span>
</div>
<div class="person_detail">
2025-03-17 16:43:28 +08:00
<span class="person_title" style="letter-spacing: 4px;">联系电话</span><span
class="person_content">--</span>
2025-03-17 16:08:40 +08:00
</div>
<div class="person_detail">
2025-03-17 16:43:28 +08:00
<span class="person_title" style="letter-spacing: 4px;">体检日期</span><span
class="person_content">--</span>
2025-03-17 16:08:40 +08:00
</div>
</div>
</div>
2025-03-17 17:16:02 +08:00
</div>
<!-- 添加页码 -->
<div class="page-number" >第1页</div>
</div>
2025-03-17 16:08:40 +08:00
</div>
2025-03-17 16:43:28 +08:00
<p> </p>
<!-- 前言 -->
<div class="report-item" style="width: 800px;height: 1123px;margin:0 auto;position: relative;">
2025-03-17 16:43:40 +08:00
<div class="report-title">前言</div>
2025-03-17 16:43:28 +08:00
<div class="repott_concent">
<div class="content">
<p class="greeting">尊敬的<span class="underline">________</span>先生/女士:</p>
<div class="paragraph-group">
<p>您好欢迎参加2024年度国家基本公共卫生服务老年人健康体检项目。</p>
<p>健康体检是在自我感觉健康的情况下,通过医学手段对身体各脏器的状态进行的检测。定期的健康体检可以帮助您及早发现健康状态下的危机,为您的健康保驾护航。</p>
<p>希望您仔细阅读并妥善保管这份体检报告,给予充分的重视。如有疑问请及时与我院进行联系。</p>
<p>我们希望能够与您建立长期的联系,并为您建立健康档案,以便对您的健康状态进行长期的追踪,为您的健康提供长期的帮助和服务。</p>
<p>由于体检项目和检测手段所限,一次体检不能全部检出身体中的潜在隐患,一旦发现身体出现不适,请及时到医院进行就诊。</p>
</div>
<div class="footer">
<p class="hospital-name" style="text-align: right;">乌兰察布第四医院</p>
<p class="slogan" style="text-align: right;">定期体检,尊享健康!</p>
</div>
</div>
</div>
2025-03-17 17:16:02 +08:00
<div class="report-footer">
<p class="report-footer-text">体检是健康的定投。</p>
</div>
<!-- 添加页码 -->
<div class="page-number">第2页</div>
2025-03-17 14:54:53 +08:00
</div>
2025-03-17 16:43:28 +08:00
<p> </p>
<!-- 一般检查部分 -->
<div class="report-item general-exam">
<div class="report-title">一般检查</div>
<div class="report-content">
<table class="exam-table">
<thead>
<tr>
<th>检查项目</th>
<th>检查结果</th>
</tr>
</thead>
<tbody>
<tr>
<td>体温</td>
<td>--</td>
</tr>
<tr>
<td>脉率</td>
<td>--</td>
</tr>
<tr>
<td>呼吸频率</td>
<td>--</td>
</tr>
<tr>
<td>血压</td>
<td>--</td>
</tr>
<tr>
<td>腰围</td>
<td>--</td>
</tr>
<tr>
<td>身高</td>
<td>--</td>
</tr>
<tr>
<td>体重</td>
<td>--</td>
</tr>
<tr>
<td>体质指数(BMI)</td>
<td>--</td>
</tr>
</tbody>
</table>
</div>
<div class="report-summary">
<h4>体检科小结:</h4>
<p>--</p>
</div>
2025-03-17 17:16:02 +08:00
<div class="report-footer">
<p class="report-footer-text">体检是健康的定投。</p>
</div>
<!-- 添加页码 -->
<div class="page-number">第3页</div>
2025-03-17 16:43:28 +08:00
</div>
<!-- 超声检查报告 -->
<div class="report-item ultrasound-exam">
<div class="report-title">超声检查报告</div>
<div class="report-content">
<!-- 屏幕查看时显示PDF -->
<div class="screen-only">
<iframe src=""></iframe>
</div>
<!-- 打印时显示渲染的PDF -->
<div class="print-only pdf-container" data-pdf-url="">
<div class="pdf-loading">正在准备PDF预览...</div>
<!-- 添加图片容器,用于存放渲染后的图片 -->
<div class="pdf-image-container" style="display:none;"></div>
</div>
</div>
<div class="report-summary">
<p>
<strong>【所见】</strong>
<br>--
</p>
<p>
<strong>【所得】</strong>
<br>--
</p>
</div>
2025-03-17 17:16:02 +08:00
<div class="report-footer">
<p class="report-footer-text">体检是健康的定投。</p>
</div>
<!-- 添加页码 -->
<div class="page-number">第4页</div>
2025-03-17 10:18:30 +08:00
</div>
<!-- 尿常规检查报告 -->
<div class="report-item">
<div class="report-title">尿常规检查报告</div>
<div class="report-content">
<!-- 屏幕查看时显示PDF -->
<div class="screen-only">
2025-03-17 14:54:53 +08:00
<iframe src=""></iframe>
2025-03-17 10:18:30 +08:00
</div>
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
<!-- 打印时显示渲染的PDF -->
2025-03-17 14:54:53 +08:00
<div class="print-only pdf-container" data-pdf-url="">
2025-03-17 10:18:30 +08:00
<div class="pdf-loading">正在准备PDF预览...</div>
2025-03-17 16:43:28 +08:00
<!-- 添加图片容器 -->
<div class="pdf-image-container" style="display:none;"></div>
2025-03-17 10:18:30 +08:00
</div>
</div>
<div class="report-summary">
<h4>检验科小结:</h4>
2025-03-17 14:54:53 +08:00
<p>--</p>
2025-03-17 10:18:30 +08:00
</div>
2025-03-17 17:16:02 +08:00
<div class="report-footer">
<p class="report-footer-text">定期体检,尊享健康!</p>
</div>
<!-- 添加页码 -->
<div class="page-number">第5页</div>
2025-03-17 10:18:30 +08:00
</div>
<!-- 生化检查报告 -->
<div class="report-item">
<div class="report-title">生化检查报告</div>
<div class="report-content">
<!-- 屏幕查看时显示PDF -->
<div class="screen-only">
2025-03-17 16:43:28 +08:00
<iframe src="" +#toolbar=0&navpanes=0&view=Fit></iframe>
2025-03-17 10:18:30 +08:00
</div>
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
<!-- 打印时显示渲染的PDF -->
2025-03-17 14:54:53 +08:00
<div class="print-only pdf-container" data-pdf-url="">
2025-03-17 10:18:30 +08:00
<div class="pdf-loading">正在准备PDF预览...</div>
2025-03-17 16:43:28 +08:00
<!-- 添加图片容器 -->
<div class="pdf-image-container" style="display:none;"></div>
2025-03-17 10:18:30 +08:00
</div>
</div>
<div class="report-summary">
<h4>检验科小结:</h4>
2025-03-17 14:54:53 +08:00
<p>--</p>
2025-03-17 10:18:30 +08:00
</div>
2025-03-17 17:16:02 +08:00
<div class="report-footer">
<p class="report-footer-text">定期体检,尊享健康!</p>
</div>
<!-- 添加页码 -->
<div class="page-number">第6页</div>
2025-03-17 10:18:30 +08:00
</div>
<!-- 血常规检查报告 -->
<div class="report-item">
<div class="report-title">血常规检查报告</div>
<div class="report-content">
<!-- 屏幕查看时显示PDF -->
<div class="screen-only">
2025-03-17 14:54:53 +08:00
<iframe src=""></iframe>
2025-03-17 10:18:30 +08:00
</div>
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
<!-- 打印时显示渲染的PDF -->
2025-03-17 14:54:53 +08:00
<div class="print-only pdf-container" data-pdf-url="">
2025-03-17 10:18:30 +08:00
<div class="pdf-loading">正在准备PDF预览...</div>
2025-03-17 16:43:28 +08:00
<!-- 添加图片容器 -->
<div class="pdf-image-container" style="display:none;"></div>
2025-03-17 10:18:30 +08:00
</div>
</div>
<div class="report-summary">
<h4>检验科小结:</h4>
2025-03-17 14:54:53 +08:00
<p>--</p>
2025-03-17 10:18:30 +08:00
</div>
2025-03-17 17:16:02 +08:00
<div class="report-footer">
<p class="report-footer-text">定期体检,尊享健康!</p>
</div>
<!-- 添加页码 -->
<div class="page-number">第7页</div>
2025-03-17 10:18:30 +08:00
</div>
<!-- 心电图检查报告 -->
<div class="report-item">
<div class="report-title">心电图检查报告</div>
<div class="report-content">
2025-03-17 16:43:28 +08:00
<img src="" alt="心电图检查">
2025-03-17 10:18:30 +08:00
</div>
<div class="report-summary">
<p><strong>【所见】</strong>
2025-03-17 16:43:28 +08:00
<br>--
2025-03-17 10:18:30 +08:00
</p>
<p><strong>【所得】</strong>
2025-03-17 16:43:28 +08:00
<br>--
</p>
2025-03-17 10:18:30 +08:00
</div>
2025-03-17 17:16:02 +08:00
<div class="report-footer">
<p class="report-footer-text">定期体检,尊享健康!</p>
</div>
<!-- 添加页码 -->
<div class="page-number">第8页</div>
2025-03-17 10:18:30 +08:00
</div>
</div>
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
<!-- 添加PDF渲染脚本 -->
<script>
2025-03-17 16:43:28 +08:00
// 设置PDF.js worker
pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.4.120/pdf.worker.min.js';
// 页面加载完成后立即开始预渲染所有PDF为图片
document.addEventListener('DOMContentLoaded', () => {
console.log('页面加载完成开始预渲染PDF为图片');
setTimeout(() => {
preRenderAllPDFs();
}, 1000);
});
// 预渲染所有PDF为图片
async function preRenderAllPDFs() {
const containers = document.querySelectorAll('.pdf-container');
for (const container of containers) {
const pdfUrl = container.getAttribute('data-pdf-url');
if (pdfUrl) {
try {
await renderPDFAsImage(pdfUrl, container);
} catch (error) {
console.error('预渲染PDF失败:', error);
showPDFError(container, pdfUrl);
}
2025-03-17 10:18:30 +08:00
}
}
2025-03-17 16:43:28 +08:00
console.log('所有PDF预渲染完成');
2025-03-17 10:18:30 +08:00
}
2025-03-17 16:43:28 +08:00
// 将PDF渲染为图片 - 完全重写
async function renderPDFAsImage(url, container) {
try {
console.log('开始渲染PDF为图片:', url);
const loadingElem = container.querySelector('.pdf-loading');
const imageContainer = container.querySelector('.pdf-image-container');
// 加载PDF
const loadingTask = pdfjsLib.getDocument({
url: url,
withCredentials: false,
cMapUrl: 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/3.4.120/cmaps/',
cMapPacked: true
});
const pdf = await loadingTask.promise;
console.log('PDF加载成功, 页数:', pdf.numPages);
// 只渲染第一页
const page = await pdf.getPage(1);
// 检查是否为超声检查报告
let scale = 1.5;
// 查找最近的report-item父元素检查是否有ultrasound-exam类
const reportItem = container.closest('.report-item');
if (reportItem && reportItem.classList.contains('ultrasound-exam')) {
// 超声检查报告使用更大的缩放比例
scale = 3.0;
console.log('检测到超声检查报告,使用更大缩放比例:', scale);
}
const viewport = page.getViewport({ scale: scale });
// 创建canvas
const canvas = document.createElement('canvas');
const context = canvas.getContext('2d');
canvas.height = viewport.height;
canvas.width = viewport.width;
// 渲染PDF页面到canvas
const renderContext = {
canvasContext: context,
viewport: viewport
};
await page.render(renderContext).promise;
// 裁剪canvas - 移除底部多余空白
// 这里我们尝试自动检测内容区域,避免显示多余的空白
const imageData = context.getImageData(0, 0, canvas.width, canvas.height);
const data = imageData.data;
// 从底部向上扫描,找到最后一行非空白像素
let bottomContentLine = canvas.height - 1;
let foundContent = false;
// 向上扫描最多200像素寻找内容
for (let y = canvas.height - 1; y > canvas.height - 200 && !foundContent; y--) {
for (let x = 0; x < canvas.width; x++) {
const idx = (y * canvas.width + x) * 4;
// 检查像素是否不是白色(简单判断)
if (data[idx] < 240 || data[idx + 1] < 240 || data[idx + 2] < 240) {
bottomContentLine = y + 20; // 添加一些边距
foundContent = true;
break;
}
2025-03-17 10:18:30 +08:00
}
}
2025-03-17 16:43:28 +08:00
// 创建新的canvas只包含内容部分
const newCanvas = document.createElement('canvas');
newCanvas.width = canvas.width;
newCanvas.height = Math.min(bottomContentLine + 1, canvas.height);
const newContext = newCanvas.getContext('2d');
// 将原canvas的内容复制到新canvas
newContext.drawImage(
canvas,
0, 0, canvas.width, newCanvas.height,
0, 0, newCanvas.width, newCanvas.height
);
// 将新canvas转换为图片
const imgData = newCanvas.toDataURL('image/png');
const img = document.createElement('img');
img.src = imgData;
img.alt = 'PDF预览';
// 添加页码信息
const pageInfo = document.createElement('p');
// pageInfo.textContent = `第1页共${pdf.numPages}页`;
// pageInfo.className = 'pdf-page-info';
// 清空并添加图片
imageContainer.innerHTML = '';
imageContainer.appendChild(img);
imageContainer.appendChild(pageInfo);
// 隐藏加载提示,显示图片
if (loadingElem) loadingElem.style.display = 'none';
imageContainer.style.display = 'block';
console.log('PDF渲染为图片完成');
return true;
} catch (error) {
console.error('渲染PDF为图片失败:', error);
throw error;
2025-03-17 10:18:30 +08:00
}
2025-03-17 16:43:28 +08:00
}
// 显示PDF错误信息
function showPDFError(container, url) {
const loadingElem = container.querySelector('.pdf-loading');
2025-03-17 10:18:30 +08:00
if (loadingElem) loadingElem.style.display = 'none';
2025-03-17 16:43:28 +08:00
const imageContainer = container.querySelector('.pdf-image-container');
imageContainer.innerHTML = `
2025-03-17 10:18:30 +08:00
<div class="pdf-error">
<p>无法加载PDF预览</p>
<p>请访问以下链接查看完整报告:</p>
<p>${url}</p>
</div>
`;
2025-03-17 16:43:28 +08:00
imageContainer.style.display = 'block';
}
// 打印前事件处理
window.addEventListener('beforeprint', () => {
console.log('打印前事件触发');
// 显示所有打印容器
document.querySelectorAll('.print-only').forEach(el => {
el.style.display = 'block';
});
// 检查是否所有PDF都已渲染为图片
const containers = document.querySelectorAll('.pdf-container');
let allRendered = true;
containers.forEach(container => {
const imageContainer = container.querySelector('.pdf-image-container');
if (imageContainer.style.display !== 'block') {
allRendered = false;
}
});
if (!allRendered) {
console.log('有PDF尚未渲染完成尝试再次渲染');
// 如果有未渲染完成的,尝试再次渲染
preRenderAllPDFs().catch(error => {
console.error('打印前渲染失败:', error);
});
} else {
console.log('所有PDF已渲染为图片可以直接打印');
2025-03-17 10:18:30 +08:00
}
});
</script>
</body>
2025-03-17 16:43:28 +08:00
2025-03-17 10:18:30 +08:00
</html>