Рубрики
Без рубрики

React PDF-генерация PDF-документов в React с использованием React-PDF

Итак, в учебном пособии я постараюсь кратко объяснить, как работает React-PDF, а также проведет вас, как генерировать PDF из массива объектов. Tagged with React, WebDev, Tuperial, JavaScript.

Этот пост был изначально опубликован на моем Блог , проверьте это для получения дополнительного содержания.

Вступление

Я недавно работал над проектом, и я получил уникальное (для меня) требование, которое нужно мне, чтобы я генерировал файл PDF из массива значений в браузере, обычно в моем небольшом опыте разработки программного обеспечения PDF -файлы генерируются в бэкэнд с использованием Кукольник для узла JS и FPDF для PHP E.T.C. Поэтому мне пришлось искать библиотеку React, которая могла бы работать для моего варианта использования, повезло для меня, я нашел React-pdf Отказ Я нашел другие библиотеки, такие как @progress/kendo-react-pdf Но я решил пойти с React-pdf Из-за его удобной документации. Библиотека была построена по Диего Мураччоль а также поддерживается им. Итак, в посте руководителя/в блоге я постараюсь кратко объяснить, как работает React-PDF, а также прогуляется, как создать PDF из массива объектов, исходящих из Moviedb API Отказ

Функции

Проходя документацию, когда я пытался выбрать подходящую библиотеку для моего использования, были некоторые особенности React-pdf Это убедило меня использовать его, я кратко расскажу о них:

Компоненты

React-PDF использует Реактивно примитивы Спецификация для создания пользовательских компонентов, которые вы можете использовать для создания и структуры ваших документов PDF. Эти компоненты включают в себя:

  • Документ
  • Страница
  • Вид
  • Изображение
  • Текст
  • Связь
  • Примечание
  • Холст
  • PDFViewer
  • Pdfdownloadlink
  • BlobProvider.

Вы можете проверить документы для получения более подробной информации о том, что делает каждый компонент выше, в основном компоненты о помощи вам создать PDF с помощью синтаксиса JSXESQUES.

Стиль

Теперь, когда у нас есть идея создания документа PDF, как мы его стиль? React-pdf Обеспечивает мощное стиль раствора с использованием API styleSheet, которая помогает вам стимулировать ваш документ, используя CSS, Media queries и Flexbox. Проверьте документы для свойств CSS, которые они поддерживают. Что если вы большой поклонник CSS-in-js? Ну, они также поддерживают весь Стильные компоненты API.

Шрифты

React-PDF имеет Шрифт API, который помогает вам загружать шрифты из разных источников и использовать в вашем документе PDF.

Это были некоторые из особенностей, которые заставили меня выбрать React-PDF. Также, когда я проверил Репозиторий GitHub сопровождающий Диего Мураччоль довольно активен и пытается ответить на большинство открытых вопросов.

Демо

Поэтому я кратко проведу вам простой пример генерации PDF из API MovieDB. Эта демонстрация продемонстрирует создание лучших фильмов года.

Структура папок

project
│   package.json
│
│
└───Public
│   │   150.png
│   │   index.html
│   │   star.png
│
│
│
└───src
    │   Movie.jsx
    │   MovieList.jsx
    |   constant.js
    |   index.js
    |   styles.css

index.js (запись)

import React from "react";
import ReactDOM from "react-dom";
import MovieList from "./MovieList";

import "./styles.css";

function App() {
    return (
        
); } const rootElement = document.getElementById("root"); ReactDOM.render(, rootElement);

Index.js является точкой входа приложения. Это рендесирует который является родительским компонентом нашего приложения.

Movielist.jsx

import React, { useState } from "react";
import Axios from "axios";
import { PDFDownloadLink } from "@react-pdf/renderer";
import { API_KEY } from "./constants";
import { PdfDocument } from "./Movie";

const years = [
  { value: "2010", text: "2010" },
  { value: "2011", text: "2011" },
  { value: "2012", text: "2012" },
  { value: "2013", text: "2013" },
  { value: "2014", text: "2014" },
  { value: "2015", text: "2015" },
  { value: "2016", text: "2016" },
  { value: "2017", text: "2017" },
  { value: "2018", text: "2018" },
  { value: "2019", text: "2019" }
];

export default function MovieList() {
  const [year, setYear] = useState("");
  const [movieDetails, setDetails] = useState([]);
  const [show, setHide] = useState(false)

  const fetchMovie = async e => {
    setYear(e.target.value);
    try {
      let res = await Axios(
        `https://api.themoviedb.org/3/discover/movie?api_key=${API_KEY}&primary_release_year=${year}&sort_by=vote_average.desc`
      );
      setDetails(res.data.results);
      setHide(true)
    } catch (error) {
      console.log(error);
    }
  };

  return (
    

Best movies of the year

{show &&} fileName="movielist.pdf" style={{ textDecoration: "none", padding: "10px", color: "#4a4a4a", backgroundColor: "#f2f2f2", border: "1px solid #4a4a4a" }} > {({ blob, url, loading, error }) => loading ? "Loading document..." : "Download Pdf" } }
); }

Movielist.jsx Компонент содержит большую часть логики в этом приложении. Мы импортируем Pdfdownloadlink от @React-pdf/рендерин , это в основном является якорный тег, который позволяет нам генерировать и загружать документы PDF. Pdfdownloadlink принимает Документ Реквизиты, которые являются шаблоном PDF, который мы будем создавать в ближайшее время, используя некоторые из реализации, перечисленных в начале этого поста. Это также принимает Имя файла опоры, который можно использовать для определения имени файла документа PDF, A Стиль Опора, чтобы добавить встроенный стиль к тегу ссылки, A ClassName опоры, если вы предпочитаете использовать классы в стиле и дети опора, которая является якорным тегом содержимого.

Movie.jsx

import React from "react";
import {
    Page,
    Text,
    View,
    Document,
    StyleSheet,
    Image
} from "@react-pdf/renderer";
import moment from "moment";

const POSTER_PATH = "https://image.tmdb.org/t/p/w154";

const styles = StyleSheet.create({
    page: {
        backgroundColor: "#ffffff"
    },
    section: {
        margin: 10,
        padding: 10,
        flexGrow: 1
    },
    movieContainer: {
        backgroundColor: "#f6f6f5",
        display: "flex",
        flexDirection: "row",
        padding: 5
    },
    movieDetails: {
        display: "flex",
        marginLeft: 5
    },
    movieTitle: {
        fontSize: 15,
        marginBottom: 10
    },
    movieOverview: {
        fontSize: 10
    },

    image: {
        height: 200,
        width: 150
    },
    subtitle: {
        display: "flex",
        justifyContent: "space-between",
        flexDirection: "row",
        width: 150,
        alignItems: "center",
        marginBottom: 12
    },
    vote: {
        display: "flex",
        flexDirection: "row"
    },
    rating: {
        height: 10,
        width: 10
    },
    vote_text: {
        fontSize: 10
    },
    vote_pop: {
        fontSize: 10,
        padding: 2,
        backgroundColor: "#61C74F",
        color: "#fff"
    },
    vote_pop_text: {
        fontSize: 10,
        marginLeft: 4
    },
    overviewContainer: {
        minHeight: 110
    },
    detailsFooter: {
        display: "flex",
        flexDirection: "row"
    },
    lang: {
        fontSize: 8,
        fontWeight: 700
    },
    vote_average: {
        fontSize: 8,
        marginLeft: 4,
        fontWeight: "bold"
    }
});

export function PdfDocument(props) {
    console.log("pdf props", props.data);
    return (
        
            
                {props.data
                    ? props.data.map((a, index) => {
                            return (
                                
                                    
                                    
                                        {a.title}
                                        
                                            
                                                
                                                {a.vote_count}
                                            
                                            
                                                {a.popularity}
                                                Popularity
                                            
                                        
                                        
                                            {a.overview}
                                        
                                        
                                            
                                                Language: {a.original_language.toUpperCase()}
                                            
                                            
                                                Average Votes: {a.vote_average}
                                            
                                            
                                                Release Date:{" "}
                                                {moment(a.release_date, "YYYY-MM-DD").format(
                                                    " MMMM D Y"
                                                )}
                                            
                                        
                    
                    
                );
                })
            : ""}
            
        
    );
}

Это Movie.jsx Компонент-это шаблон PDF, который мы генерируем, здесь мы определяем, как структура PDF с использованием реагирования (просмотр, документ), а также стиль. Так что я кратко рассказал о некоторых API React-PDF, которые я использовал здесь.

  • Stylesheet.create () : Это поможет вам определить стили, которые вы хотите использовать в документе, он принимает объект, содержащий все CSS, которые вы хотите использовать в документе, и он возвращает объект, который вы можете применить к любому из элементов PDF через стиль проп.

  • Документ : Pdfdownloadlink Документ Пропад принимает только компонент типа Документ Таким образом, это должно быть корнем ваших компонентов при создании шаблона PDF и принимает только ребенка типа Страница , Документ это просто обертка вокруг вашего шаблона PDF, и он принимает некоторые дополнительные реквизит

  • Страница : Это указывает на страницу в документе, и вы можете иметь несколько Страницы в документе. Это принимает некоторые реквизиты для определения Размер страницы, ориентация или если вы хотите упаковывать страницу сворачивать . реквизит

  • Просмотр : Я хотел бы сравнить этот компонент с HTML Div , это помогает вам раздел или разделить документ. реквизит

  • Текст : Этот компонент используется для отображения текста в документе и применения стилей к нему. реквизит

  • Изображение : Этот компонент используется для отображения изображений (сети или локальных) на документе, эти изображения могут быть PNG, JPG или BASE64.

Демо -применение

Вывод

До того, как я использовал эту библиотеку, я никогда не думал, что можно сгенерировать PDF на стороне клиента, React-PDF не только позволяет вам сделать это, но и использовать синтаксис JSXESQU для структуры и разработки документа PDF. Я знаю, что демонстрация довольно тривиальна Но я думаю, что эта библиотека может быть полезна в некоторых случаях.

Оригинал: “https://dev.to/finallynero/generating-pdf-documents-in-react-using-react-pdf-4ka7”