I’m integrating pdfjs-dist’s PDFViewer in a React project using the pdfjs-dist/web/pdf_viewer module. Everything works fine initially — the PDF loads, the pages render, and I’m able to interact with them.
However, at some point later in the flow, I’m noticing that viewer._pages (which initially holds all page references) becomes unexpectedly empty ([]). This is causing issues with a custom updateVisiblePages function I wrote to hide/show certain pages based on user interaction.
const updateVisiblePages = useCallback(
(viewer: any) => {
console.log(viewer, 'viewer updateVisiblePages before return')
if (!viewer || !viewer._pages.length) return
console.log(viewer, 'after return')
const allPages = viewer._pages
let updated = false
allPages.length !== 0 &&
allPages.forEach((page: any, index: number) => {
const pageNum = index + 1
if (!isSearchActive) {
if (
pageNum < (Number(selectedContent.startPage) ?? 1) ||
pageNum > (Number(selectedContent.endPage) ?? allPages.length)
) {
if (!page.div.classList.contains('hidden-page')) {
page.div.classList.add('hidden-page') // Add class to hide
updated = true
}
} else {
if (page.div.classList.contains('hidden-page')) {
page.div.classList.remove('hidden-page') // Remove class to show
updated = true
}
}
} else {
if (page.div.classList.contains('hidden-page')) {
console.log(
'[DEBUG] Pages updated, removing hidden-page class when searching',
)
page.div.classList.remove('hidden-page') // Remove class to show
updated = true
}
}
})
if (updated) {
viewer.update() // Ensure the viewer updates its rendering
setVisiblePagesUpdated((prev) => !prev) // Trigger re-render
updateHeight()
window.addEventListener('resize', updateHeight)
return () => window.removeEventListener('resize', updateHeight)
}
},
[selectedContent, isSearchActive],
)
And I’m setting up the viewer like this inside a useEffect:
const viewer = new PDFViewer({
container: container,
eventBus: eventBusInstance,
enableWebGL: true,
renderInteractiveForms: true,
textLayerMode: 2,
enhanceTextSelection: true,
});
viewer.setDocument(pdfDoc);
My questions:
What can cause viewer._pages to become empty after the PDF is loaded?
Is there a lifecycle method or event I should hook into to prevent accessing _pages at the wrong time?
Is there a better/official API for tracking rendered pages instead of relying on _pages (which I realize is a private field)?
Any help in understanding when or why _pages gets reset/cleared would be greatly appreciated!