|
|
@@ -4578,7 +4578,7 @@ class ExamPdfExportService
|
|
|
* @param array $student 学生信息 ['name' => '', 'grade' => '']
|
|
|
* @param array $teacher 教师信息 ['name' => '']
|
|
|
* @param bool $includeGrading 是否包含判卷版本
|
|
|
- * @return array 返回 ['pdf_url' => '...'] 或 ['pdf_url' => '...', 'grading_pdf_url' => '...'](includeGrading 时返回完整 PDF,pdf_url 与 grading_pdf_url 为同一份)
|
|
|
+ * @return array 返回 ['pdf_url' => '...', 'grading_pdf_url' => '...']
|
|
|
*/
|
|
|
public function generateByQuestions(
|
|
|
object $paper,
|
|
|
@@ -4600,31 +4600,14 @@ class ExamPdfExportService
|
|
|
try {
|
|
|
$result = [];
|
|
|
|
|
|
+ // 1. 生成试卷PDF(不含答案)
|
|
|
$examHtml = $this->renderCustomExamHtml($paper, $groupedQuestions, $student, $teacher, false);
|
|
|
- if (! $examHtml) {
|
|
|
- return $result;
|
|
|
- }
|
|
|
- if ($this->katexRenderer) {
|
|
|
- $examHtml = $this->katexRenderer->renderHtml($examHtml);
|
|
|
- }
|
|
|
-
|
|
|
- if ($includeGrading) {
|
|
|
- // 生成完整一份 PDF:试卷 + 判卷(分页合并)
|
|
|
- $gradingHtml = $this->renderCustomExamHtml($paper, $groupedQuestions, $student, $teacher, true);
|
|
|
- if ($gradingHtml && $this->katexRenderer) {
|
|
|
- $gradingHtml = $this->katexRenderer->renderHtml($gradingHtml);
|
|
|
- }
|
|
|
- $unifiedHtml = $gradingHtml ? $this->mergeHtmlWithPageBreak($examHtml, $gradingHtml, null) : $examHtml;
|
|
|
- $pdfBinary = $this->buildPdf($unifiedHtml ?? $examHtml, true);
|
|
|
- if ($pdfBinary) {
|
|
|
- $path = "custom_exams/{$paper->paper_id}.pdf";
|
|
|
- $url = $this->pdfStorageService->put($path, $pdfBinary);
|
|
|
- $result['pdf_url'] = $url;
|
|
|
- $result['grading_pdf_url'] = $url; // 兼容:完整 PDF 含试卷+判卷,与 pdf_url 同一份
|
|
|
- Log::info('generateByQuestions: 完整 PDF(试卷+判卷)生成成功', ['url' => $url]);
|
|
|
+ if ($examHtml) {
|
|
|
+ // 【修复】使用服务端 KaTeX 预渲染 LaTeX 公式
|
|
|
+ if ($this->katexRenderer) {
|
|
|
+ $examHtml = $this->katexRenderer->renderHtml($examHtml);
|
|
|
}
|
|
|
- } else {
|
|
|
- // 仅试卷
|
|
|
+ // 与学生卷 PDF 一致:扁长图走自适应宽度(与 renderAndStoreExamPdf 第二参语义对齐)
|
|
|
$examPdf = $this->buildPdf($examHtml, true);
|
|
|
if ($examPdf) {
|
|
|
$examPath = "custom_exams/{$paper->paper_id}_exam.pdf";
|
|
|
@@ -4634,6 +4617,24 @@ class ExamPdfExportService
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+ // 2. 如果需要,生成判卷PDF(含答案)
|
|
|
+ if ($includeGrading) {
|
|
|
+ $gradingHtml = $this->renderCustomExamHtml($paper, $groupedQuestions, $student, $teacher, true);
|
|
|
+ if ($gradingHtml) {
|
|
|
+ // 【修复】使用服务端 KaTeX 预渲染 LaTeX 公式
|
|
|
+ if ($this->katexRenderer) {
|
|
|
+ $gradingHtml = $this->katexRenderer->renderHtml($gradingHtml);
|
|
|
+ }
|
|
|
+ $gradingPdf = $this->buildPdf($gradingHtml, true);
|
|
|
+ if ($gradingPdf) {
|
|
|
+ $gradingPath = "custom_exams/{$paper->paper_id}_grading.pdf";
|
|
|
+ $gradingUrl = $this->pdfStorageService->put($gradingPath, $gradingPdf);
|
|
|
+ $result['grading_pdf_url'] = $gradingUrl;
|
|
|
+ Log::info('判卷PDF生成成功', ['url' => $gradingUrl]);
|
|
|
+ }
|
|
|
+ }
|
|
|
+ }
|
|
|
+
|
|
|
return $result;
|
|
|
|
|
|
} catch (\Throwable $e) {
|
|
|
@@ -4775,15 +4776,6 @@ class ExamPdfExportService
|
|
|
): ?string {
|
|
|
try {
|
|
|
$viewName = $this->resolveExamViewName($grading);
|
|
|
- $examCode = $paper->paper_id ?? 'unknown';
|
|
|
- $studentName = $student['name'] ?? '________';
|
|
|
- $pdfMeta = [
|
|
|
- 'student_name' => $studentName,
|
|
|
- 'exam_code' => $examCode,
|
|
|
- 'header_title' => $studentName . '|' . $examCode . '|质检',
|
|
|
- 'exam_pdf_title' => '试卷_' . $examCode,
|
|
|
- 'grading_pdf_title' => '判卷_' . $examCode,
|
|
|
- ];
|
|
|
|
|
|
$html = view($viewName, [
|
|
|
'paper' => $paper,
|
|
|
@@ -4792,7 +4784,6 @@ class ExamPdfExportService
|
|
|
'teacher' => $teacher,
|
|
|
'grading' => $grading,
|
|
|
'includeAnswer' => false, // exam-paper 视图需要这个变量
|
|
|
- 'pdfMeta' => $pdfMeta,
|
|
|
])->render();
|
|
|
|
|
|
if (empty(trim($html))) {
|