Этот пост был изначально опубликован на моем Блог , проверьте это для получения дополнительного содержания.
Вступление
Я недавно работал над проектом, и я получил уникальное (для меня) требование, которое нужно мне, чтобы я генерировал файл 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, и он принимает некоторые дополнительные реквизитСтраница: Это указывает на страницу в документе, и вы можете иметь несколькоСтраницыв документе. Это принимает некоторые реквизиты для определенияРазмерстраницы,ориентацияили если вы хотите упаковывать страницусворачивать. реквизитПросмотр: Я хотел бы сравнить этот компонент с HTMLDiv, это помогает вам раздел или разделить документ. реквизитТекст: Этот компонент используется для отображения текста в документе и применения стилей к нему. реквизитИзображение: Этот компонент используется для отображения изображений (сети или локальных) на документе, эти изображения могут быть PNG, JPG или BASE64.
Демо -применение
Вывод
До того, как я использовал эту библиотеку, я никогда не думал, что можно сгенерировать PDF на стороне клиента, React-PDF не только позволяет вам сделать это, но и использовать синтаксис JSXESQU для структуры и разработки документа PDF. Я знаю, что демонстрация довольно тривиальна Но я думаю, что эта библиотека может быть полезна в некоторых случаях.
Оригинал: “https://dev.to/finallynero/generating-pdf-documents-in-react-using-react-pdf-4ka7”