|
|
@@ -1,4 +1,4 @@
|
|
|
-import { DataSource } from 'typeorm';
|
|
|
+// import { DataSource } from 'typeorm';
|
|
|
import { PDFDocument } from 'pdf-lib';
|
|
|
import * as PDFMerger from 'pdf-merger-js';
|
|
|
import * as mammoth from 'mammoth';
|
|
|
@@ -73,17 +73,28 @@ export class DocumentService {
|
|
|
|
|
|
// 使用html-pdf-node将HTML转换为PDF
|
|
|
try {
|
|
|
- const { HtmlToPdf } = await import('html-pdf-node');
|
|
|
+ const { generatePdf } = await import('html-pdf-node');
|
|
|
const options = {
|
|
|
format: 'A4',
|
|
|
margin: { top: '20mm', right: '20mm', bottom: '20mm', left: '20mm' }
|
|
|
};
|
|
|
const file = { content: html };
|
|
|
- const pdfBuffer = await HtmlToPdf.generatePdf(file, options);
|
|
|
- return Buffer.from(pdfBuffer);
|
|
|
+
|
|
|
+ // 使用Promise方式调用generatePdf
|
|
|
+ const pdfBuffer = await new Promise<Buffer>((resolve, reject) => {
|
|
|
+ generatePdf(file, options, (err: Error | null, buffer: Buffer) => {
|
|
|
+ if (err) {
|
|
|
+ reject(err);
|
|
|
+ } else {
|
|
|
+ resolve(buffer);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ return pdfBuffer;
|
|
|
} catch (error) {
|
|
|
console.warn('html-pdf-node转换失败,使用备用方案:', error);
|
|
|
-
|
|
|
+
|
|
|
// 备用方案:使用pdf-lib创建简单PDF
|
|
|
const pdfDoc = await PDFDocument.create();
|
|
|
const page = pdfDoc.addPage([595, 842]); // A4尺寸
|
|
|
@@ -97,7 +108,7 @@ export class DocumentService {
|
|
|
y: 650,
|
|
|
size: 10,
|
|
|
});
|
|
|
-
|
|
|
+
|
|
|
const pdfBytes = await pdfDoc.save();
|
|
|
return Buffer.from(pdfBytes);
|
|
|
}
|
|
|
@@ -371,22 +382,46 @@ export class DocumentService {
|
|
|
try {
|
|
|
// 使用mammoth将DOCX转HTML,然后HTML转PDF
|
|
|
const result = await mammoth.convertToHtml({ buffer: docxBuffer });
|
|
|
- // const html = result.value;
|
|
|
-
|
|
|
- // 使用pdf-lib创建PDF
|
|
|
- const pdfDoc = await PDFDocument.create();
|
|
|
- const page = pdfDoc.addPage([595, 842]); // A4尺寸
|
|
|
-
|
|
|
- // 简单文本渲染(实际项目中可能需要更复杂的HTML到PDF转换)
|
|
|
- // 这里应该使用html内容,但简化实现
|
|
|
- page.drawText('合并后的文档内容', {
|
|
|
- x: 50,
|
|
|
- y: 700,
|
|
|
- size: 12,
|
|
|
- });
|
|
|
-
|
|
|
- const pdfBytes = await pdfDoc.save();
|
|
|
- return Buffer.from(pdfBytes);
|
|
|
+ const html = result.value;
|
|
|
+
|
|
|
+ // 使用html-pdf-node将HTML转换为PDF
|
|
|
+ try {
|
|
|
+ const { generatePdf } = await import('html-pdf-node');
|
|
|
+ const options = {
|
|
|
+ format: 'A4',
|
|
|
+ margin: { top: '20mm', right: '20mm', bottom: '20mm', left: '20mm' }
|
|
|
+ };
|
|
|
+ const file = { content: html };
|
|
|
+
|
|
|
+ // 使用Promise方式调用generatePdf
|
|
|
+ const pdfBuffer = await new Promise<Buffer>((resolve, reject) => {
|
|
|
+ generatePdf(file, options, (err: Error | null, buffer: Buffer) => {
|
|
|
+ if (err) {
|
|
|
+ reject(err);
|
|
|
+ } else {
|
|
|
+ resolve(buffer);
|
|
|
+ }
|
|
|
+ });
|
|
|
+ });
|
|
|
+
|
|
|
+ return pdfBuffer;
|
|
|
+ } catch (error) {
|
|
|
+ console.warn('html-pdf-node转换失败,使用备用方案:', error);
|
|
|
+
|
|
|
+ // 备用方案:使用pdf-lib创建简单PDF
|
|
|
+ const pdfDoc = await PDFDocument.create();
|
|
|
+ const page = pdfDoc.addPage([595, 842]); // A4尺寸
|
|
|
+
|
|
|
+ // 使用实际文档内容
|
|
|
+ page.drawText('合并后的文档内容', {
|
|
|
+ x: 50,
|
|
|
+ y: 700,
|
|
|
+ size: 12,
|
|
|
+ });
|
|
|
+
|
|
|
+ const pdfBytes = await pdfDoc.save();
|
|
|
+ return Buffer.from(pdfBytes);
|
|
|
+ }
|
|
|
} catch (error) {
|
|
|
console.error('DOCX转PDF失败:', error);
|
|
|
throw new Error(`DOCX转PDF失败: ${error instanceof Error ? error.message : '未知错误'}`);
|