You can use as @David-Kucsai told in comment @david.kucsai/react-pdf-table

or without using

Example

Data

const data = {
  id: "5df3180a09ea16dc4b95f910",
  items: [
    {
      sr: 1,
      desc: "desc1",
      xyz: 5,
    },
    {
      sr: 2,
      desc: "desc2",
      xyz: 6,
    },
  ],
};

app.js

import React, { Component, Fragment } from "react";
import { PDFViewer } from "@react-pdf/renderer";
import Table from "./components/reports/Table";
import data from "./data";

class App extends Component {
  render() {
    return (
      <Fragment>
        <PDFViewer width="1000" height="600">
          <Table data={data} />
        </PDFViewer>
      </Fragment>
    );
  }
}

export default App;

Table.js

import React from "react";
import { Page, Document, StyleSheet } from "@react-pdf/renderer";
import ItemsTable from "./ItemsTable";

const styles = StyleSheet.create({
  page: {
    fontSize: 11,
    flexDirection: "column",
  },
});

const Table = ({ data }) => (
  <Document>
    <Page size="A4" style={styles.page}>
      // ...
      <ItemsTable data={data} />
      // ...
    </Page>
  </Document>
);

export default Table;

ItemsTable.js

import React from "react";
import { View, StyleSheet } from "@react-pdf/renderer";
import TableRow from "./TableRow";

const styles = StyleSheet.create({
  tableContainer: {
    flexDirection: "row",
    flexWrap: "wrap",
  },
});

const ItemsTable = ({ data }) => (
  <View style={styles.tableContainer}>
    {/*<TableHeader />*/}
    <TableRow items={data.items} />
    {/*<TableFooter items={data.items} />*/}
  </View>
);

export default ItemsTable;

TableRow.js

import React, { Fragment } from "react";
import { Text, View, StyleSheet } from "@react-pdf/renderer";

const styles = StyleSheet.create({
  row: {
    flexDirection: "row",
    alignItems: "center",
  },
  description: {
    width: "60%",
  },
  xyz: {
    width: "40%",
  },
});

const TableRow = ({ items }) => {
  const rows = items.map((item) => (
    <View style={styles.row} key={item.sr.toString()}>
      <Text style={styles.description}>{item.desc}</Text>
      <Text style={styles.xyz}>{item.xyz}</Text>
    </View>
  ));
  return <Fragment>{rows}</Fragment>;
};

export default TableRow;

For more information check Generate Dynamic PDF Invoices Using React and React-PDF

Answer from Yash on Stack Overflow
Top answer
1 of 4
19

You can use as @David-Kucsai told in comment @david.kucsai/react-pdf-table

or without using

Example

Data

const data = {
  id: "5df3180a09ea16dc4b95f910",
  items: [
    {
      sr: 1,
      desc: "desc1",
      xyz: 5,
    },
    {
      sr: 2,
      desc: "desc2",
      xyz: 6,
    },
  ],
};

app.js

import React, { Component, Fragment } from "react";
import { PDFViewer } from "@react-pdf/renderer";
import Table from "./components/reports/Table";
import data from "./data";

class App extends Component {
  render() {
    return (
      <Fragment>
        <PDFViewer width="1000" height="600">
          <Table data={data} />
        </PDFViewer>
      </Fragment>
    );
  }
}

export default App;

Table.js

import React from "react";
import { Page, Document, StyleSheet } from "@react-pdf/renderer";
import ItemsTable from "./ItemsTable";

const styles = StyleSheet.create({
  page: {
    fontSize: 11,
    flexDirection: "column",
  },
});

const Table = ({ data }) => (
  <Document>
    <Page size="A4" style={styles.page}>
      // ...
      <ItemsTable data={data} />
      // ...
    </Page>
  </Document>
);

export default Table;

ItemsTable.js

import React from "react";
import { View, StyleSheet } from "@react-pdf/renderer";
import TableRow from "./TableRow";

const styles = StyleSheet.create({
  tableContainer: {
    flexDirection: "row",
    flexWrap: "wrap",
  },
});

const ItemsTable = ({ data }) => (
  <View style={styles.tableContainer}>
    {/*<TableHeader />*/}
    <TableRow items={data.items} />
    {/*<TableFooter items={data.items} />*/}
  </View>
);

export default ItemsTable;

TableRow.js

import React, { Fragment } from "react";
import { Text, View, StyleSheet } from "@react-pdf/renderer";

const styles = StyleSheet.create({
  row: {
    flexDirection: "row",
    alignItems: "center",
  },
  description: {
    width: "60%",
  },
  xyz: {
    width: "40%",
  },
});

const TableRow = ({ items }) => {
  const rows = items.map((item) => (
    <View style={styles.row} key={item.sr.toString()}>
      <Text style={styles.description}>{item.desc}</Text>
      <Text style={styles.xyz}>{item.xyz}</Text>
    </View>
  ));
  return <Fragment>{rows}</Fragment>;
};

export default TableRow;

For more information check Generate Dynamic PDF Invoices Using React and React-PDF

2 of 4
9

Thanks goes to Yash for the detailed answer given. This is what I ended up creating after seeing your example.

The main trick to create a "table" is to use fixed width columns on each row.

Note: Make the parent container width: '100%' (table in this case) if you want to have your rows add up beyond 100% without overflowing/growing the parent. I would still recommend you try to have your total width add to 100% though, but the example below shows otherwise.

import { StyleSheet, Text, View } from '@react-pdf/renderer'
import PropTypes from 'prop-types'

const styles = StyleSheet.create({
  table: {
    width: '100%',
  },
  row: {
    display: 'flex',
    flexDirection: 'row',
    borderTop: '1px solid #EEE',
    paddingTop: 8,
    paddingBottom: 8,
  },
  header: {
    borderTop: 'none',
  },
  bold: {
    fontWeight: 'bold',
  },
  // So Declarative and unDRY 
  col1: {
    width: '27%',
  },
  col2: {
    width: '15%',
  },
  col3: {
    width: '15%',
  },
  col4: {
    width: '20%',
  },
  col5: {
    width: '27%',
  },
})

const ReportTable = ({ data, maximumDays }) => {
  return (
    <View style={styles.table}>
      <View style={[styles.row, styles.bold, styles.header]}>
        <Text style={styles.col1}>Name</Text>
        <Text style={styles.col2}>Start Date</Text>
        <Text style={styles.col3}>End Date</Text>
        <Text style={styles.col4}>Days</Text>
        <Text style={styles.col5}>Info</Text>
      </View>
      {data.map((row, i) => (
        <View key={i} style={styles.row} wrap={false}>
          <Text style={styles.col1}>
            <Text style={styles.bold}>{row.lastName}</Text>, {row.firstName}
          </Text>
          <Text style={styles.col2}>{row.startDate}</Text>
          <Text style={styles.col3}>{row.endDate}</Text>
          <Text style={styles.col4}>
            <Text style={styles.bold}>{row.days}</Text> of{' '}
            {maximumDays}
          </Text>
          <Text style={styles.col5}>{row.info}</Text>
        </View>
      ))}
    </View>
  )
}

ReportTable.propTypes = {
  data: PropTypes.array.isRequired,
  maximumDays: PropTypes.number.isRequired,
}

export default ReportTable

🌐
npm
npmjs.com › package › @react-pdf › renderer
@react-pdf/renderer - npm
3 days ago - import React from 'react'; import { Document, Page, Text, View, StyleSheet } from '@react-pdf/renderer'; // Create styles const styles = StyleSheet.create({ page: { flexDirection: 'row', backgroundColor: '#E4E4E4', }, section: { margin: 10, ...
      » npm install @react-pdf/renderer
    
Published   Apr 04, 2026
Version   4.3.3
Author   Diego Muracciole
🌐
CodeSandbox
codesandbox.io › examples › package › @react-pdf › renderer
@react-pdf/renderer examples - CodeSandbox
reactReact example starter project · Chat Massenger App · react-pdf/renderer test · RandomHouse · react-pdf-tables · shopiumx · @devias-io/material-kit-pro-react · react-google-maps-api-editing-a-polygon · portfolio · invoice-generatordynamic invoice generator ·
🌐
GitHub
github.com › dmk99 › react-pdf-table
GitHub - dmk99/react-pdf-table: Storybook Available
<PDFViewer> <Document> <Page> <Table data={[ {firstName: "John", lastName: "Smith", dob: new Date(2000, 1, 1), country: "Australia", phoneNumber: "xxx-0000-0000"} ]} > <TableHeader> <TableCell> First Name </TableCell> <TableCell> Last Name </TableCell> <TableCell> DOB </TableCell> <TableCell> Country </TableCell> <TableCell> Phone Number </TableCell> </TableHeader> <TableBody> <DataTableCell getContent={(r) => r.firstName}/> <DataTableCell getContent={(r) => r.lastName}/> <DataTableCell getContent={(r) => r.dob.toLocaleString()}/> <DataTableCell getContent={(r) => r.country}/> <DataTableCell getContent={(r) => r.phoneNumber}/> </TableBody> </Table> </Page> </Document> </PDFViewer> This example will render a header and one row using the default styling.
Starred by 159 users
Forked by 64 users
Languages   TypeScript 91.3% | JavaScript 8.7% | TypeScript 91.3% | JavaScript 8.7%
🌐
React-pdf
react-pdf.org › advanced
React-pdf
With react-pdf, now it is possible to render dynamic text based on the context in which a certain element is being rendered. All you have to do is to pass a function to the render prop of the <Text /> or <View /> component.
🌐
GitHub
github.com › enescang › react-pdf-table
GitHub - enescang/react-pdf-table: Simple table generator for @react-pdf/renderer
<ReactPdfTable.TableRow> <ReactPdfTable.TableRow width={70} disableMargin={true}> <ReactPdfTable.TableCell text="1" align="center" width={57} /> <ReactPdfTable.TableCell text="2" align="center" /> <ReactPdfTable.TableCell text="3" align="right" /> </ReactPdfTable.TableRow> <ReactPdfTable.TableCell text="Name1" align="center" /> <ReactPdfTable.TableCell text="Name2" align="right" /> <ReactPdfTable.TableCell text="Name3" align="right" /> </ReactPdfTable.TableRow>
Starred by 13 users
Forked by 3 users
Languages   JavaScript 100.0% | JavaScript 100.0%
🌐
npm
npmjs.com › package › @david.kucsai › react-pdf-table
@david.kucsai/react-pdf-table - npm
<PDFViewer> <Document> <Page> <Table data={[ {firstName: "John", lastName: "Smith", dob: new Date(2000, 1, 1), country: "Australia", phoneNumber: "xxx-0000-0000"} ]} > <TableHeader> <TableCell> First Name </TableCell> <TableCell> Last Name </TableCell> <TableCell> DOB </TableCell> <TableCell> Country </TableCell> <TableCell> Phone Number </TableCell> </TableHeader> <TableBody> <DataTableCell getContent={(r) => r.firstName}/> <DataTableCell getContent={(r) => r.lastName}/> <DataTableCell getContent={(r) => r.dob.toLocaleString()}/> <DataTableCell getContent={(r) => r.country}/> <DataTableCell getContent={(r) => r.phoneNumber}/> </TableBody> </Table> </Page> </Document> </PDFViewer> This example will render a header and one row using the default styling.
      » npm install @david.kucsai/react-pdf-table
    
Published   Feb 12, 2022
Version   0.4.1
Author   David Kucsai
Find elsewhere
🌐
Snyk
snyk.io › advisor › @react-pdf/renderer › @react-pdf/renderer code examples
Top 5 @react-pdf/renderer Code Examples | Snyk
import React from 'react' import { View, StyleSheet, Text } from '@react-pdf/renderer' import { config } from './config' const styles = StyleSheet.create({ table: { width: '100%' }, header: { display: 'flex', flexDirection: 'row', justifyContent: 'space-between', alignItems: 'center', backgroundColor: config.primaryColor, color: '#fff', padding: 3 }, headerCell: { fontWeight: 'heavy', white: '#fff', width: '11.11%', n6g7 / httpdf / example / documents / Side.js View on Github ·
🌐
npm
npmjs.com › package › @ag-media › react-pdf-table
@ag-media/react-pdf-table - npm
... import {Table, TR, TH, TD} from '@ag-media/react-pdf-table'; const Component = () => ( <Table> <TH> <TD>Header 1</TD> <TD>Header 2</TD> </TH> <TR> <TD>Data 1</TD> <TD>Data 2</TD> </TR> </Table> ); Hint: you can use the short (<TH />, <TR ...
      » npm install @ag-media/react-pdf-table
    
Published   May 15, 2025
Version   2.0.3
Author   AG Media
🌐
GitHub
github.com › diegomura › react-pdf › issues › 487
Table examples for newbies · Issue #487 · diegomura/react-pdf
February 12, 2019 - Most of the Automated PDFs that i have come across contain lot of Tables. I know i can't use HTML Tables in this. Given the power of flex boxes this should be very much achievable. It would be ...
Author   kishaningithub
🌐
npm
npmjs.com › package › @airthium › react-pdf-table
@airthium/react-pdf-table - npm
const data = { title: 'Table title', headers: ['head 1', 'head 2', 'head 3'], rows: [ ['in head 1 - 1', 'in head 2 - 1', 'in head 3 - 1'], ['in head 1 - 2', 'in head 2 - 2', 'in head 3 - 2'], ['in head 1 - 3', 'in head 2 - 3', 'in head 3 - 3'] ], footer: 'footer' } ...
      » npm install @airthium/react-pdf-table
    
Published   Jul 17, 2023
Version   0.9.36
Author   Airthium
🌐
CodeSandbox
codesandbox.io › s › react-pdf-tables-o1wp2
react-pdf-tables - CodeSandbox
April 22, 2020 - react-pdf-tables using @react-pdf/renderer, @testing-library/jest-dom, @testing-library/react, @testing-library/user-event, react, react-dom, react-scripts
Published   Apr 22, 2020
🌐
npm
npmjs.com › package › @alex9923 › react-pdf-table
@alex9923/react-pdf-table - npm
<PDFViewer> <Document> <Page> <Table data={[ {firstName: "John", lastName: "Smith", dob: new Date(2000, 1, 1), country: "Australia", phoneNumber: "xxx-0000-0000"} ]} > <TableHeader> <TableCell> First Name </TableCell> <TableCell> Last Name </TableCell> <TableCell> DOB </TableCell> <TableCell> Country </TableCell> <TableCell> Phone Number </TableCell> </TableHeader> <TableBody> <DataTableCell getContent={(r) => r.firstName}/> <DataTableCell getContent={(r) => r.lastName}/> <DataTableCell getContent={(r) => r.dob.toLocaleString()}/> <DataTableCell getContent={(r) => r.country}/> <DataTableCell getContent={(r) => r.phoneNumber}/> </TableBody> </Table> </Page> </Document> </PDFViewer> This example will render a header and one row using the default styling.
      » npm install @alex9923/react-pdf-table
    
Published   Dec 24, 2024
Version   0.4.7-beta
Author   David Kucsai
🌐
JavaScript in Plain English
javascript.plainenglish.io › implementing-a-table-with-react-pdf-a-comprehensive-guide-95dc988faf31
Implementing a Table with React-PDF: A Comprehensive Guide | by Mojca Rojko | JavaScript in Plain English
January 27, 2025 - import { StyleSheet, Text, View } from "@react-pdf/renderer"; import { compact, isNaN } from "lodash"; const styles = StyleSheet.create({ tableColStyle: { borderStyle: "solid", borderColor: "#3f3f3f", borderWidth: 1, borderLeftWidth: 0, borderTopWidth: 0, paddingVertical: 4, paddingHorizontal: 3, }, tableRowStyle: { flexDirection: "row", }, tableStyle: { width: "auto", }, firstTableColHeaderStyle: { borderStyle: "solid", borderColor: "#3f3f3f", borderWidth: 1, borderLeftWidth: 1, backgroundColor: "#bdbdbd", }, firstTableColStyle: { borderStyle: "solid", borderColor: "#3f3f3f"…
🌐
npm
npmjs.com › package › react-pdf-table
react-pdf-table - npm
October 19, 2022 - react-pdf-table is super simple table generator for @react-pdf/renderer · npm install react-pdf-table --save · This package has only 2 main component for creating table. These are TableRow and TableCell. import ReactPdfTable from ...
      » npm install react-pdf-table
    
Published   Oct 19, 2022
Version   1.0.0-alfa.3
🌐
Telerik
telerik.com › components › pdf processing › repeated table headers
React PDF Processing Repeated Table Headers - KendoReact
Render recurrent table headers when you export content by using the KendoReact PDF Processing in React projects.
🌐
Medium
kartikbudhraja.medium.com › generating-dynamic-pdfs-with-react-a-step-by-step-guide-ab755995c3cd
Generating Dynamic PDFs with React. A Step-by-Step Guide.
September 14, 2023 - Generating Dynamic PDFs with React. A Step-by-Step Guide. Overview - In this article, we will explore the dynamic world of PDF generation with react-pdf in React. From the basics of the library to …
🌐
GitHub
github.com › ag-media › react-pdf-table
GitHub - ag-media/react-pdf-table: declarative table generator for @react-pdf/renderer
... import {Table, TR, TH, TD} from '@ag-media/react-pdf-table'; const Component = () => ( <Table> <TH> <TD>Header 1</TD> <TD>Header 2</TD> </TH> <TR> <TD>Data 1</TD> <TD>Data 2</TD> </TR> </Table> ); Hint: you can use the short (<TH />, <TR ...
Starred by 28 users
Forked by 5 users
Languages   TypeScript 88.9% | JavaScript 6.3% | MDX 4.5% | HTML 0.3% | TypeScript 88.9% | JavaScript 6.3% | MDX 4.5% | HTML 0.3%