#reactjs #pdf #react-pdf
#reactjs #PDF #react-pdf
Вопрос:
Вот react-pdf
пример и https://storage.googleapis.com/cbb_logos/conf_logos/conf-1-logo.png
ссылка на изображение, которое публично размещено на GCS. Согласно GCS, «Любой, у кого есть эта ссылка, может получить доступ к объекту в общедоступном Интернете»
Однако, если я скопирую ссылку в строку 11 в react-pdf
примере, изображение не отобразится. В документах для их компонента изображения четко указано: Компонент React для отображения сетевых или локальных (только для узла) изображений в формате JPG или PNG, а также строк изображений в кодировке base64.
Проще говоря, мне не повезло в этом, или есть другой способ получить размещенные изображения в react-pdf? Возможно, для этого лучше подойдет другая библиотека JS? Я не думаю, что это хорошая идея сохранять это изображение локально в моем приложении, так как у меня есть еще 1000 логотипов, и это значительно увеличило бы размер моих приложений.
Правка 1: я быстро попробовал использовать jsPDF, используя этот stackblitz (не мой)https://stackblitz.com/edit/react-w5qb9a?file=src/App.js
Я удалил этот div
<div style={{ maxWidth: '40px' }}>
<img
style={{width: '100%' }}
src='https://storage.googleapis.com/cbb_logos/conf_logos/conf-1-logo.png'
/>
</div>
…под p-тегом затем загрузил PDF, и изображение также не появилось. Итак, я все еще ищу решение.
Ответ №1:
Я подтвердил, что это работает в проекте, как указано в документах, но по какой-то причине это не работает на их собственном примерном сайте, как вы отметили.
Чтобы протестировать, я создал новый проект react, используя create-react-app
:
yarn create react-app react-pdf-image
Установить react-pdf
:
cd react-pdf-image
yarn add @react-pdf/renderer
Примечание: Только что была выпущена новая версия create-react-app
(5.0.0), которая использует webpack v5, и на данный момент некоторые пакеты, такие как react-pdf
, больше не работают из коробки. Мне пришлось добавить дополнительную конфигурацию в webpack через craco
пакет.
Установите дополнительные пакеты:
yarn add process browserify-zlib stream-browserify util buffer assert @craco/craco
Измените scripts
раздел в package.json
, как показано ниже:
"scripts": {
"start": "craco start",
"build": "craco build",
"test": "craco test",
"eject": "react-scripts eject"
},
Затем создайте новый файл в корне проекта craco.config.js
с этим содержимым:
const webpack = require("webpack");
module.exports = {
webpack: {
configure: {
resolve: {
fallback: {
process: require.resolve("process/browser"),
zlib: require.resolve("browserify-zlib"),
stream: require.resolve("stream-browserify"),
util: require.resolve("util"),
buffer: require.resolve("buffer"),
asset: require.resolve("assert"),
},
},
plugins: [
new webpack.ProvidePlugin({
Buffer: ["buffer", "Buffer"],
process: "process/browser",
}),
],
},
},
};
Надеюсь, эта проблема будет решена, и если это так, я удалю эти дополнительные шаги.
Наконец, замените содержимое src/App.js
файла этим кодом:
import { Document, Image, Page, PDFViewer, Text } from "@react-pdf/renderer";
const MyDocument = () => {
return (
<Document>
<Page>
<Text>Image test</Text>
<Image src="https://storage.googleapis.com/cbb_logos/conf_logos/conf-1-logo.png" />
</Page>
</Document>
);
};
const App = () => (
<div>
<PDFViewer>
<MyDocument />
</PDFViewer>
</div>
);
export default App;
Вернитесь в корневой каталог проекта, запустите yarn start
, и вы должны увидеть отрисованный PDF-файл с текстом и изображением.
Ответ №2:
20.0622 Для тех, кто пытается это решить, в дополнение к комментарию liquidki, что я должен был сделать:
1. Следуйте каждому шагу комментария liquidki.
2. Добавьте следующие библиотеки:
yarn add browserify-fs node-polyfill-webpack-plugin process
3: В вашем craco.config.js , добавить:
const webpack = require("webpack");
const NodePolyfillPlugin = require("node-polyfill-webpack-plugin")
module.exports = {
webpack: {
configure: {
resolve: {
fallback: {
process: require.resolve("process/browser"),
zlib: require.resolve("browserify-zlib"),
stream: require.resolve("stream-browserify"),
util: require.resolve("util"),
buffer: require.resolve("buffer"),
asset: require.resolve("assert"),
fs: require.resolve('browserify-fs'),
},
},
plugins: [
new webpack.ProvidePlugin({
Buffer: ["buffer", "Buffer"],
process: "process/browser.js",
}),
new NodePolyfillPlugin(),
],
},
},
};
Теперь перезапустите ваше приложение, и оно должно начать работать.
Ответ №3:
function returnSrc() {
const path = "https://lh3.googleusercontent.com/a-/AOh14GhNkZlYA7Qu9ZHeXoxsJczf3OPuyyNzLi_hFbgEKnU=s96-c";
console.log("LOG", path);
let selectedMethod = "GET";
return { uri: path, method: selectedMethod, body: "", headers: "" };
}
<Image style={styles.profile} src={returnSrc()} />
Комментарии:
1. Хотя это действительно отображает изображение на примере сайта, когда я заменил
path
приведенный выше файл png в вопросе, он отображает только пробел.