Вы можете использовать превосходную библиотеку React-pdf . Он имеет хорошую производительность и имеет дополнительное преимущество, заключающееся в том, что если вы печатаете текст, он будет доступен для поиска.
Если вам необходимо отобразить страницу как в DOM, так и в PDF, я рекомендую создать примитивы и использовать их вместо тегов dom (div, p и т. Д.). Используя эти примитивы, вы сможете рендерить те же компоненты как в dom, так и в pdf.
Вот пример примитива View:
import React from 'react';
import { View as ViewPDF } from '@react-pdf/renderer';
import { RENDERING_CONTEXT, withRenderingContext } from '../RenderingContext';
class View extends React.Component {
render() {
const { renderingContext, children, className, style } = this.props;
const isPdf = renderingContext === RENDERING_CONTEXT.PDF;
return isPdf
? <ViewPDF className={className} style={style}>
{children}
</ViewPDF>
: <div className={className} style {style}>
{children}
</div>;
}
}
export default withRenderingContext(View);
RenderingContext - это контекст , в котором вы можете сохранить текущий контекст рендеринга. Затем вам нужно только обернуть свою страницу PDF с поставщиком, который устанавливает правильный контекст. Правильный компонент (из response-pdf или dom) будет использоваться на основе контекста рендеринга.
В вашем примере вы можете просто заменить элемент dom в Invoice на эти примитивы. Затем вы сможете отобразить компонент Invoice в pdf-файле или в dom.