React-PDF与Azure Cosmos DB集成:从Cosmos DB生成PDF

React-PDF与Azure Cosmos DB集成:从Cosmos DB生成PDF

【免费下载链接】react-pdf 📄 Create PDF files using React 【免费下载链接】react-pdf 项目地址: https://gitcode.com/gh_mirrors/re/react-pdf

你是否在寻找一种高效方式将Azure Cosmos DB中的数据转换为专业PDF文档?无论是客户报告、订单确认还是数据分析报表,将NoSQL数据库中的JSON数据与React-PDF结合,能快速实现动态PDF生成。本文将通过3个核心步骤,带你构建从Cosmos DB到PDF的完整解决方案,无需复杂后端开发经验。

集成架构概览

React-PDF与Azure Cosmos DB的集成主要包含数据查询、文档渲染和文件输出三个环节。以下是系统工作流程图:

mermaid

技术栈说明:

准备工作清单

准备项具体内容参考资源
Azure账号创建Cosmos DB账户并获取连接字符串Azure官方文档
React-PDF安装npm install @react-pdf/renderer项目README
示例项目克隆仓库git clone https://gitcode.com/gh_mirrors/re/react-pdf
环境变量配置COSMOS_DB_CONNECTION_STRINGVite环境配置

实现步骤详解

1. 配置Cosmos DB连接

首先在项目根目录创建.env文件,添加Cosmos DB连接信息:

COSMOS_DB_CONNECTION_STRING=AccountEndpoint=https://<your-account>.documents.azure.cn:443/;AccountKey=<your-key>;
COSMOS_DB_DATABASE=SalesDB
COSMOS_DB_CONTAINER=Invoices

2. 创建数据模型与PDF模板

数据模型(src/models/invoiceModel.js):

export const InvoiceModel = {
  id: String,
  customerName: String,
  orderDate: Date,
  totalAmount: Number,
  items: [{ product: String, quantity: Number, price: Number }]
};

PDF模板(src/components/InvoiceDocument.js):

import { Document, Page, Text, View, StyleSheet } from '@react-pdf/renderer';

const styles = StyleSheet.create({
  page: { padding: 30 },
  header: { fontSize: 20, marginBottom: 20, textAlign: 'center' },
  section: { marginBottom: 15 },
  tableRow: { flexDirection: 'row', marginBottom: 5 },
  tableCell: { width: '33%' }
});

export const InvoiceDocument = ({ invoice }) => (
  <Document>
    <Page size="A4" style={styles.page}>
      <Text style={styles.header}>销售单据 #{invoice.id}</Text>
      
      <View style={styles.section}>
        <Text>客户名称: {invoice.customerName}</Text>
        <Text>订单日期: {new Date(invoice.orderDate).toLocaleDateString()}</Text>
      </View>
      
      <View style={styles.tableRow}>
        <Text style={styles.tableCell}>产品</Text>
        <Text style={styles.tableCell}>数量</Text>
        <Text style={styles.tableCell}>价格</Text>
      </View>
      
      {invoice.items.map((item, index) => (
        <View key={index} style={styles.tableRow}>
          <Text style={styles.tableCell}>{item.product}</Text>
          <Text style={styles.tableCell}>{item.quantity}</Text>
          <Text style={styles.tableCell}>¥{item.price.toFixed(2)}</Text>
        </View>
      ))}
      
      <View style={styles.section}>
        <Text>总计: ¥{invoice.totalAmount.toFixed(2)}</Text>
      </View>
    </Page>
  </Document>
);

3. 实现数据查询与PDF生成

创建API处理函数(src/api/generateInvoicePDF.js):

import { CosmosClient } from '@azure/cosmos';
import { renderToFile } from '@react-pdf/renderer';
import { InvoiceDocument } from '../components/InvoiceDocument';

// 初始化Cosmos客户端
const client = new CosmosClient(process.env.COSMOS_DB_CONNECTION_STRING);
const database = client.database(process.env.COSMOS_DB_DATABASE);
const container = database.container(process.env.COSMOS_DB_CONTAINER);

export async function generateInvoicePDF(invoiceId) {
  try {
    // 1. 从Cosmos DB查询数据
    const { resource: invoice } = await container.item(invoiceId).read();
    
    if (!invoice) {
      throw new Error(`Invoice with ID ${invoiceId} not found`);
    }
    
    // 2. 使用React-PDF生成PDF
    const outputPath = `./generated-invoices/invoice-${invoiceId}.pdf`;
    await renderToFile(<InvoiceDocument invoice={invoice} />, outputPath);
    
    return { 
      success: true, 
      filePath: outputPath,
      invoiceId: invoice.id
    };
  } catch (error) {
    console.error('Error generating PDF:', error);
    return { 
      success: false, 
      error: error.message 
    };
  }
}

性能优化与最佳实践

数据查询优化

// 分页查询示例
const { resources: invoices } = await container.items
  .query({
    query: "SELECT * FROM c WHERE c.orderDate > @startDate",
    parameters: [{ name: "@startDate", value: "2023-01-01" }]
  })
  .fetchNext();

PDF渲染优化

  • 利用React-PDF的缓存机制(packages/image/src/cache.ts)
  • 避免在PDF模板中使用复杂CSS动画和未优化图片
  • 对包含大量数据的PDF采用流式渲染:
// 流式渲染示例
import { renderToStream } from '@react-pdf/renderer';

const stream = await renderToStream(<InvoiceDocument invoice={invoice} />);
stream.pipe(fs.createWriteStream(outputPath));

错误处理策略

  1. 数据库连接错误:实现指数退避重试机制
  2. PDF渲染失败:捕获渲染异常并返回友好错误信息
  3. 数据格式问题:使用JSON Schema验证Cosmos DB返回的数据结构

部署选项与场景适配

部署方式实现方式适用场景
Azure Functions将生成逻辑封装为HTTP触发函数按需生成单份PDF
定时任务使用Azure Logic Apps定时批量生成周期性报表生成
前端直接生成通过Cosmos DB REST API + React-PDF客户端渲染客户端离线生成

常见问题解决

  1. 中文显示乱码:配置中文字体(packages/font/src/standard-font.ts)
import { Font } from '@react-pdf/renderer';

Font.register({
  family: 'SimSun',
  src: '/fonts/simsun.ttf'
});
  1. PDF生成超时
  • 增加Azure Functions执行超时时间
  • 将大型PDF生成任务拆分为多个小任务
  1. Cosmos DB连接限制
  • 实现连接池管理
  • 使用Azure Functions专用计划提高资源配额

通过本文介绍的方案,你可以快速构建从Azure Cosmos DB到PDF文档的生成 pipeline。该方案已在React-PDF官方示例项目(packages/examples/)中验证,兼容最新版React 18和Azure Cosmos DB JavaScript SDK v4。如需查看完整示例代码,可克隆项目仓库进行本地调试。

提示:项目中包含多个框架示例,可根据实际需求选择Next.js或Vite作为基础框架进行集成开发。

【免费下载链接】react-pdf 📄 Create PDF files using React 【免费下载链接】react-pdf 项目地址: https://gitcode.com/gh_mirrors/re/react-pdf

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值