Pdf.js: ์›น ์ž‘์—…์ž์—์„œ PDF.js ์บ”๋ฒ„์Šค ๋ Œ๋”๋ง ์‹คํ–‰

์— ๋งŒ๋“  2018๋…„ 11์›” 29์ผ  ยท  4์ฝ”๋ฉ˜ํŠธ  ยท  ์ถœ์ฒ˜: mozilla/pdf.js

๊ตฌ์„ฑ:

  • ํฌ๋กฌ 71
  • ์šด์˜ ์ฒด์ œ ๋ฐ ํ•ด๋‹น ๋ฒ„์ „: ๋ชจ๋“ 
  • PDF.js ๋ฒ„์ „: 2.0.943
  • ๋ธŒ๋ผ์šฐ์ € ํ™•์žฅ์ž: ์•„๋‹ˆ์š”

๋ฌธ์ œ๋ฅผ ์žฌํ˜„ํ•˜๋Š” ๋‹จ๊ณ„:

  1. ๋‹ค์Œ๊ณผ ๊ฐ™์ด ์›น ์ž‘์—…์ž๋ฅผ ์ž‘์„ฑํ•˜์‹ญ์‹œ์˜ค.
function onmessage () {
  const pdfDocument = await pdfjs.getDocument('/some-hard-coded.pdf')
  const page = await pdfDocument.getPage(1)
  const viewport = pdfPage.getViewport(1)
  const width = 250
  const height = viewport.height * (width / viewport.width)
  const canvas = new OffscreenCanvas(width, height)
  const canvasContext = canvas.getContext('2d', { alpha: false })
  return page.render({ canvasContext, viewport })
})
  1. w = new Worker('sample-pdf.js'); ์™€ ๊ฐ™์ด ํ˜ธ์ถœํ•˜์„ธ์š”.

์˜ˆ์ƒ๋˜๋Š” ๋™์ž‘์€ ๋ฌด์—‡์ž…๋‹ˆ๊นŒ? (์Šคํฌ๋ฆฐ์ƒท ์ถ”๊ฐ€)

PDF๋Š” OffscreenCanvas ๋ Œ๋”๋ง๋ฉ๋‹ˆ๋‹ค.

๋ฌด์—‡์ด ์ž˜๋ชป๋˜์—ˆ๋‚˜์š”? (์Šคํฌ๋ฆฐ์ƒท ์ถ”๊ฐ€)

ReferenceError: ๋ฌธ์„œ๊ฐ€ ์ •์˜๋˜์ง€ ์•Š์•˜์Šต๋‹ˆ๋‹ค.
GenericFontLoader.insertRule(pdf.js:10154)
GenericFontLoader.bind์—์„œ (pdf.js:10205)
WorkerTransport์—์„œ(pdf.js:9177)
LoopbackPort.MessageHandler._onComObjOnMessage์—์„œ (pdf.js:12833)
๋ฃจํ”„๋ฐฑํฌํŠธ์—์„œ.(pdf.js:8681)
Array.forEach์—์„œ ()

์ฆ‰ ์ด๊ฒƒ์€ ์‹คํŒจํ•˜๊ณ  ์žˆ์Šต๋‹ˆ๋‹ค.

styleElement = this.styleElement = document.createElement('์Šคํƒ€์ผ');

๋ฌธ์ œ๋Š” DOM์ด ์—†๋‹ค๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. PDF.js์— Node ์˜ˆ์ œ๊ฐ€ ์žˆ๋Š” ๊ฒƒ์ฒ˜๋Ÿผ ๋ฌธ์ œ๋Š” ๋ฌธ์„œ ์ค‘ ํ•˜๋‚˜์ผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ๊นŠ์€ ๊ณณ์— ์ˆจ์–ด ์žˆ๋Š” ๋ฌธ์ œ๊ฐ€ ์žˆ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์–ด์จŒ๋“  ์—ฌ๊ธฐ์— ๋ช‡ ๊ฐ€์ง€ ๋ถ„๋ช…ํ•œ ์ง€์นจ์ด ์žˆ๋Š” ๊ฒฝ์šฐ๋ฅผ ๋Œ€๋น„ํ•˜์—ฌ ๋ณด๊ณ ํ•˜๊ณ  ์‹ถ์—ˆ์Šต๋‹ˆ๋‹ค.

๊ฐ€์žฅ ์œ ์šฉํ•œ ๋Œ“๊ธ€

์›น ์ž‘์—…์ž ๋‚ด์—์„œ pdf.js๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?

์ด๊ฑธ๋กœ ์ˆ˜์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

// Worker.ts
import { pdfjs } from "react-pdf";
pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`;

pdfjs.getDocument(...) => errors

๊ทธ๋Ÿฌ๋‚˜ getDocument . ๊ทธ๊ฒƒ์€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜

์žกํžˆ์ง€ ์•Š์€(์•ฝ์† ์ค‘) ์˜ค๋ฅ˜: ๊ฐ€์งœ ์ž‘์—…์ž ์„ค์ • ์‹คํŒจ: "__webpack_require__(...).ensure๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค"

๋ชจ๋“  4 ๋Œ“๊ธ€

(๋ณธ์งˆ์ ์œผ๋กœ) ๋ฌธ์ œ #10039์˜ ๋ณต์ œ๋ณธ์ฒ˜๋Ÿผ ๋ณด์ž…๋‹ˆ๋‹ค. OffscreenCanvas ๋ฅผ ์ฆ‰์‹œ ์ง€์›ํ•˜๋ ค๋ฉด ์ƒ๋‹นํ•œ ์–‘์˜ ๋ฆฌํŒฉํ† ๋ง์ด ํ•„์š”ํ•  ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ฐ์‚ฌ ํ•ด์š”. @Snuffleupagus ๋‚˜๋Š” ๊ทธ ๋ฌธ์ œ๋ฅผ ๋ณด์•˜๊ณ  ๊ทธ๊ฒƒ์„ ์—ฐ๊ฒฐํ•ด์•ผํ–ˆ์Šต๋‹ˆ๋‹ค. ๋ฌธ์ œ๋Š” ๋‹ค์Œ๊ณผ ๊ฐ™์€ ์˜๋ฏธ์—์„œ ๋™์ผํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  1. OffscreenCanvas ๋Š” ๋ฉ”์ธ ์Šค๋ ˆ๋“œ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค(์ฆ‰, ์›น ์ž‘์—…์ž์—๋งŒ ๊ตญํ•œ๋˜์ง€ ์•Š์Œ).
  2. ์›น ์ž‘์—…์ž๋Š” OffscreenCanvas๋ฅผ ์‚ฌ์šฉํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค(์ฆ‰, OffscreenCanvas ์ด์™ธ์˜ Canvas ํด๋ฆฌํ•„์ด ์ž‘๋™ํ•  ์ˆ˜ ์žˆ์Œ).
  3. ์ž‘๋™ํ•˜๋Š” OffscreenCanvas๊ฐ€ PDF.js๊ฐ€ ์›น ์ž‘์—…์ž์—๊ฒŒ ๊ฒช๋Š” ์œ ์ผํ•œ ๋ฌธ์ œ๋Š” ์•„๋‹ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ฆ‰, OffscreenCanvas ์ง€์›์€ CanvasElement ๋Œ€ํ•œ ๋Œ€์•ˆ์ด ๋  ์ˆ˜ ์žˆ๋Š” ๋˜ ๋‹ค๋ฅธ ๋ฌธ์ œ์ด์ง€๋งŒ ๊ทธ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ์ด ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ์— ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

https://github.com/mozilla/pdf.js/blob/master/examples/node/pdf2png/pdf2png.js (๋…ธ๋“œ ์˜ˆ)๋ฅผ ๋ณด๋ฉด canvasFactory , ๋„. ๊ทธ๋ ‡๊ฒŒ ํ•˜๋ฉด ์–ด๋–ป๊ฒŒ ๋˜๋‚˜์š”?

์›น ์ž‘์—…์ž ๋‚ด์—์„œ pdf.js๋ฅผ ์–ด๋–ป๊ฒŒ ์‚ฌ์šฉํ•ฉ๋‹ˆ๊นŒ?

์ด๊ฑธ๋กœ ์ˆ˜์ž…ํ–ˆ์Šต๋‹ˆ๋‹ค.

// Worker.ts
import { pdfjs } from "react-pdf";
pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`;

pdfjs.getDocument(...) => errors

๊ทธ๋Ÿฌ๋‚˜ getDocument . ๊ทธ๊ฒƒ์€ ์˜ค๋ฅ˜๋ฅผ ๋ฐ˜ํ™˜

์žกํžˆ์ง€ ์•Š์€(์•ฝ์† ์ค‘) ์˜ค๋ฅ˜: ๊ฐ€์งœ ์ž‘์—…์ž ์„ค์ • ์‹คํŒจ: "__webpack_require__(...).ensure๋Š” ํ•จ์ˆ˜๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค"

์ด ํŽ˜์ด์ง€๊ฐ€ ๋„์›€์ด ๋˜์—ˆ๋‚˜์š”?
0 / 5 - 0 ๋“ฑ๊ธ‰