Closed Angeliz closed 2 months ago
Facing the same issue as well. Here is my App.js (which is copied over from the demo project mostly)
import React from 'react';
import logo from './logo.svg';
import './App.css';
import {
PdfLoader,
PdfHighlighter,
Tip,
Highlight,
Popup,
AreaHighlight
} from "react-pdf-highlighter";
const resetHash = () => {
document.location.hash = "";
};
type State = {
highlights: Array<T_ManuscriptHighlight>
};
const HighlightPopup = ({ comment }) =>
comment.text ? (
<div className="Highlight__popup">
{comment.emoji} {comment.text}
</div>
) : null;
function App() {
return (
<div className="App">
<header className="App-header">
<img src={logo} className="App-logo" alt="logo" />
<p>
Edit <code>src/App.js</code> and save to reload.
</p>
<a
className="App-link"
href="https://reactjs.org"
target="_blank"
rel="noopener noreferrer"
>
Learn React
</a>
<PdfLoader url={"https://arxiv.org/pdf/1708.08021.pdf"}>
{pdfDocument => (
<PdfHighlighter
pdfDocument={pdfDocument}
enableAreaSelection={event => event.altKey}
onScrollChange={resetHash}
scrollRef={scrollTo => {
this.scrollViewerTo = scrollTo;
this.scrollToHighlightFromHash();
}}
onSelectionFinished={(
position,
content,
hideTipAndSelection,
transformSelection
) => (
<Tip
onOpen={transformSelection}
onConfirm={comment => {
this.addHighlight({ content, position, comment });
hideTipAndSelection();
}}
/>
)}
highlightTransform={(
highlight,
index,
setTip,
hideTip,
viewportToScaled,
screenshot,
isScrolledTo
) => {
const isTextHighlight = !Boolean(
highlight.content && highlight.content.image
);
const component = isTextHighlight ? (
<Highlight
isScrolledTo={isScrolledTo}
position={highlight.position}
comment={highlight.comment}
/>
) : (
<AreaHighlight
highlight={highlight}
onChange={boundingRect => {
this.updateHighlight(
highlight.id,
{ boundingRect: viewportToScaled(boundingRect) },
{ image: screenshot(boundingRect) }
);
}}
/>
);
return (
<Popup
popupContent={<HighlightPopup {...highlight} />}
onMouseOut={hideTip}
key={index}
children={component}
/>
);
}}
/>
)}
</PdfLoader>
</header>
</div>
);
}
export default App;``
I also had the same issue. I realized later on that the reason I was having the issue was because I didn't have react-pdf-highlighter inside my node modules folder 😦 . If you haven't already done so, be sure to run npm i react-pdf-highlighter
. The other issue I believe had to do with my worker PDFWorker line. In order to have import PDFWorker from "worker-loader!pdfjs-dist/lib/pdf.worker";
run, you need to explicitly indicate to eslint to alllow for no-weback-loader syntax to be rendered. That is, place /* eslint import/no-webpack-loader-syntax: 0 */
at the top of the component file. Hope this helps!
I am having the same issue and I have copied the exact demo into a create-react-app. I am only the sidebar renders, but the pdf does not render at all.
/* eslint import/no-webpack-loader-syntax: 0 */
import React, { Component } from "react";
import PDFWorker from "worker-loader!pdfjs-dist/lib/pdf.worker";
import {
PdfLoader,
PdfHighlighter,
Tip,
Highlight,
Popup,
AreaHighlight,
setPdfWorker
} from "react-pdf-highlighter";
import testHighlights from "./test-highlights";
import Spinner from "./Spinner";
import Sidebar from "./Sidebar";
import "./App.css";
setPdfWorker(PDFWorker);
const getNextId = () => String(Math.random()).slice(2);
const parseIdFromHash = () =>
document.location.hash.slice("#highlight-".length);
const resetHash = () => {
document.location.hash = "";
};
const HighlightPopup = ({ comment }) =>
comment.text ? (
<div className="Highlight__popup">
{comment.emoji} {comment.text}
</div>
) : null;
const PRIMARY_PDF_URL = "https://arxiv.org/pdf/1708.08021.pdf";
const SECONDARY_PDF_URL = "https://arxiv.org/pdf/1604.02480.pdf";
const searchParams = new URLSearchParams(document.location.search);
const initialUrl = searchParams.get("url") || PRIMARY_PDF_URL;
class App extends Component {
state = {
url: initialUrl,
highlights: testHighlights[initialUrl]
? [...testHighlights[initialUrl]]
: []
};
resetHighlights = () => {
this.setState({
highlights: []
});
};
toggleDocument = () => {
const newUrl =
this.state.url === PRIMARY_PDF_URL ? SECONDARY_PDF_URL : PRIMARY_PDF_URL;
this.setState({
url: newUrl,
highlights: testHighlights[newUrl] ? [...testHighlights[newUrl]] : []
});
};
scrollViewerTo = (highlight) => {};
scrollToHighlightFromHash = () => {
const highlight = this.getHighlightById(parseIdFromHash());
if (highlight) {
this.scrollViewerTo(highlight);
}
};
componentDidMount() {
window.addEventListener(
"hashchange",
this.scrollToHighlightFromHash,
false
);
}
getHighlightById(id) {
const { highlights } = this.state;
return highlights.find(highlight => highlight.id === id);
}
addHighlight(highlight) {
const { highlights } = this.state;
console.log("Saving highlight", highlight);
this.setState({
highlights: [{ ...highlight, id: getNextId() }, ...highlights]
});
}
updateHighlight(highlightId, position, content) {
console.log("Updating highlight", highlightId, position, content);
this.setState({
highlights: this.state.highlights.map(h => {
const {
id,
position: originalPosition,
content: originalContent,
...rest
} = h;
return id === highlightId
? {
id,
position: { ...originalPosition, ...position },
content: { ...originalContent, ...content },
...rest
}
: h;
})
});
}
render() {
const { url, highlights } = this.state;
return (
<div className="App" style={{ display: "flex", height: "100vh" }}>
<Sidebar
highlights={highlights}
resetHighlights={this.resetHighlights}
toggleDocument={this.toggleDocument}
/>
<div
style={{
height: "100vh",
width: "75vw",
position: "relative"
}}
>
<PdfLoader url={url} beforeLoad={<Spinner />}>
{pdfDocument => (
<PdfHighlighter
pdfDocument={pdfDocument}
enableAreaSelection={event => event.altKey}
onScrollChange={resetHash}
// pdfScaleValue="page-width"
scrollRef={scrollTo => {
this.scrollViewerTo = scrollTo;
this.scrollToHighlightFromHash();
}}
onSelectionFinished={(
position,
content,
hideTipAndSelection,
transformSelection
) => (
<Tip
onOpen={transformSelection}
onConfirm={comment => {
this.addHighlight({ content, position, comment });
hideTipAndSelection();
}}
/>
)}
highlightTransform={(
highlight,
index,
setTip,
hideTip,
viewportToScaled,
screenshot,
isScrolledTo
) => {
const isTextHighlight = !Boolean(
highlight.content && highlight.content.image
);
const component = isTextHighlight ? (
<Highlight
isScrolledTo={isScrolledTo}
position={highlight.position}
comment={highlight.comment}
/>
) : (
<AreaHighlight
highlight={highlight}
onChange={boundingRect => {
this.updateHighlight(
highlight.id,
{ boundingRect: viewportToScaled(boundingRect) },
{ image: screenshot(boundingRect) }
);
}}
/>
);
return (
<Popup
popupContent={<HighlightPopup {...highlight} />}
onMouseOver={popupContent =>
setTip(highlight, highlight => popupContent)
}
onMouseOut={hideTip}
key={index}
children={component}
/>
);
}}
highlights={highlights}
/>
)}
</PdfLoader>
</div>
</div>
);
}
}
export default App;```
I am having the same issue and I have copied the exact demo into a create-react-app. I am only the sidebar renders, but the pdf does not render at all.
/* eslint import/no-webpack-loader-syntax: 0 */ import React, { Component } from "react"; import PDFWorker from "worker-loader!pdfjs-dist/lib/pdf.worker"; import { PdfLoader, PdfHighlighter, Tip, Highlight, Popup, AreaHighlight, setPdfWorker } from "react-pdf-highlighter"; import testHighlights from "./test-highlights"; import Spinner from "./Spinner"; import Sidebar from "./Sidebar"; import "./App.css"; setPdfWorker(PDFWorker); const getNextId = () => String(Math.random()).slice(2); const parseIdFromHash = () => document.location.hash.slice("#highlight-".length); const resetHash = () => { document.location.hash = ""; }; const HighlightPopup = ({ comment }) => comment.text ? ( <div className="Highlight__popup"> {comment.emoji} {comment.text} </div> ) : null; const PRIMARY_PDF_URL = "https://arxiv.org/pdf/1708.08021.pdf"; const SECONDARY_PDF_URL = "https://arxiv.org/pdf/1604.02480.pdf"; const searchParams = new URLSearchParams(document.location.search); const initialUrl = searchParams.get("url") || PRIMARY_PDF_URL; class App extends Component { state = { url: initialUrl, highlights: testHighlights[initialUrl] ? [...testHighlights[initialUrl]] : [] }; resetHighlights = () => { this.setState({ highlights: [] }); }; toggleDocument = () => { const newUrl = this.state.url === PRIMARY_PDF_URL ? SECONDARY_PDF_URL : PRIMARY_PDF_URL; this.setState({ url: newUrl, highlights: testHighlights[newUrl] ? [...testHighlights[newUrl]] : [] }); }; scrollViewerTo = (highlight) => {}; scrollToHighlightFromHash = () => { const highlight = this.getHighlightById(parseIdFromHash()); if (highlight) { this.scrollViewerTo(highlight); } }; componentDidMount() { window.addEventListener( "hashchange", this.scrollToHighlightFromHash, false ); } getHighlightById(id) { const { highlights } = this.state; return highlights.find(highlight => highlight.id === id); } addHighlight(highlight) { const { highlights } = this.state; console.log("Saving highlight", highlight); this.setState({ highlights: [{ ...highlight, id: getNextId() }, ...highlights] }); } updateHighlight(highlightId, position, content) { console.log("Updating highlight", highlightId, position, content); this.setState({ highlights: this.state.highlights.map(h => { const { id, position: originalPosition, content: originalContent, ...rest } = h; return id === highlightId ? { id, position: { ...originalPosition, ...position }, content: { ...originalContent, ...content }, ...rest } : h; }) }); } render() { const { url, highlights } = this.state; return ( <div className="App" style={{ display: "flex", height: "100vh" }}> <Sidebar highlights={highlights} resetHighlights={this.resetHighlights} toggleDocument={this.toggleDocument} /> <div style={{ height: "100vh", width: "75vw", position: "relative" }} > <PdfLoader url={url} beforeLoad={<Spinner />}> {pdfDocument => ( <PdfHighlighter pdfDocument={pdfDocument} enableAreaSelection={event => event.altKey} onScrollChange={resetHash} // pdfScaleValue="page-width" scrollRef={scrollTo => { this.scrollViewerTo = scrollTo; this.scrollToHighlightFromHash(); }} onSelectionFinished={( position, content, hideTipAndSelection, transformSelection ) => ( <Tip onOpen={transformSelection} onConfirm={comment => { this.addHighlight({ content, position, comment }); hideTipAndSelection(); }} /> )} highlightTransform={( highlight, index, setTip, hideTip, viewportToScaled, screenshot, isScrolledTo ) => { const isTextHighlight = !Boolean( highlight.content && highlight.content.image ); const component = isTextHighlight ? ( <Highlight isScrolledTo={isScrolledTo} position={highlight.position} comment={highlight.comment} /> ) : ( <AreaHighlight highlight={highlight} onChange={boundingRect => { this.updateHighlight( highlight.id, { boundingRect: viewportToScaled(boundingRect) }, { image: screenshot(boundingRect) } ); }} /> ); return ( <Popup popupContent={<HighlightPopup {...highlight} />} onMouseOver={popupContent => setTip(highlight, highlight => popupContent) } onMouseOut={hideTip} key={index} children={component} /> ); }} highlights={highlights} /> )} </PdfLoader> </div> </div> ); } } export default App;```
Did you find a workaround through it?
I am having the same issue and I have copied the exact demo into a create-react-app. I am only the sidebar renders, but the pdf does not render at all.
/* eslint import/no-webpack-loader-syntax: 0 */ import React, { Component } from "react"; import PDFWorker from "worker-loader!pdfjs-dist/lib/pdf.worker"; import { PdfLoader, PdfHighlighter, Tip, Highlight, Popup, AreaHighlight, setPdfWorker } from "react-pdf-highlighter"; import testHighlights from "./test-highlights"; import Spinner from "./Spinner"; import Sidebar from "./Sidebar"; import "./App.css"; setPdfWorker(PDFWorker); const getNextId = () => String(Math.random()).slice(2); const parseIdFromHash = () => document.location.hash.slice("#highlight-".length); const resetHash = () => { document.location.hash = ""; }; const HighlightPopup = ({ comment }) => comment.text ? ( <div className="Highlight__popup"> {comment.emoji} {comment.text} </div> ) : null; const PRIMARY_PDF_URL = "https://arxiv.org/pdf/1708.08021.pdf"; const SECONDARY_PDF_URL = "https://arxiv.org/pdf/1604.02480.pdf"; const searchParams = new URLSearchParams(document.location.search); const initialUrl = searchParams.get("url") || PRIMARY_PDF_URL; class App extends Component { state = { url: initialUrl, highlights: testHighlights[initialUrl] ? [...testHighlights[initialUrl]] : [] }; resetHighlights = () => { this.setState({ highlights: [] }); }; toggleDocument = () => { const newUrl = this.state.url === PRIMARY_PDF_URL ? SECONDARY_PDF_URL : PRIMARY_PDF_URL; this.setState({ url: newUrl, highlights: testHighlights[newUrl] ? [...testHighlights[newUrl]] : [] }); }; scrollViewerTo = (highlight) => {}; scrollToHighlightFromHash = () => { const highlight = this.getHighlightById(parseIdFromHash()); if (highlight) { this.scrollViewerTo(highlight); } }; componentDidMount() { window.addEventListener( "hashchange", this.scrollToHighlightFromHash, false ); } getHighlightById(id) { const { highlights } = this.state; return highlights.find(highlight => highlight.id === id); } addHighlight(highlight) { const { highlights } = this.state; console.log("Saving highlight", highlight); this.setState({ highlights: [{ ...highlight, id: getNextId() }, ...highlights] }); } updateHighlight(highlightId, position, content) { console.log("Updating highlight", highlightId, position, content); this.setState({ highlights: this.state.highlights.map(h => { const { id, position: originalPosition, content: originalContent, ...rest } = h; return id === highlightId ? { id, position: { ...originalPosition, ...position }, content: { ...originalContent, ...content }, ...rest } : h; }) }); } render() { const { url, highlights } = this.state; return ( <div className="App" style={{ display: "flex", height: "100vh" }}> <Sidebar highlights={highlights} resetHighlights={this.resetHighlights} toggleDocument={this.toggleDocument} /> <div style={{ height: "100vh", width: "75vw", position: "relative" }} > <PdfLoader url={url} beforeLoad={<Spinner />}> {pdfDocument => ( <PdfHighlighter pdfDocument={pdfDocument} enableAreaSelection={event => event.altKey} onScrollChange={resetHash} // pdfScaleValue="page-width" scrollRef={scrollTo => { this.scrollViewerTo = scrollTo; this.scrollToHighlightFromHash(); }} onSelectionFinished={( position, content, hideTipAndSelection, transformSelection ) => ( <Tip onOpen={transformSelection} onConfirm={comment => { this.addHighlight({ content, position, comment }); hideTipAndSelection(); }} /> )} highlightTransform={( highlight, index, setTip, hideTip, viewportToScaled, screenshot, isScrolledTo ) => { const isTextHighlight = !Boolean( highlight.content && highlight.content.image ); const component = isTextHighlight ? ( <Highlight isScrolledTo={isScrolledTo} position={highlight.position} comment={highlight.comment} /> ) : ( <AreaHighlight highlight={highlight} onChange={boundingRect => { this.updateHighlight( highlight.id, { boundingRect: viewportToScaled(boundingRect) }, { image: screenshot(boundingRect) } ); }} /> ); return ( <Popup popupContent={<HighlightPopup {...highlight} />} onMouseOver={popupContent => setTip(highlight, highlight => popupContent) } onMouseOut={hideTip} key={index} children={component} /> ); }} highlights={highlights} /> )} </PdfLoader> </div> </div> ); } } export default App;```
Did you find a workaround through it?
It finally worked for me when I updated my pdfjs-dist package!
I have written a simple code to display a pdf but the pdf does not render. I am not getting any error.
<>
<div
style={{
height: "100vh",
width: "75vw",
position: "relative",
backgroundColor:"blue"
}}
>
<PdfLoader url={"https://arxiv.org/pdf/1708.08021.pdf"}></PdfLoader>
</div>
</>
hi, I used
react-pdf-highlighter
as a npm package in my project, and I importPdfLoader
in atsx
file, but I got some mistakes.there is my code
there is the mistake