Категория

Извлечение изображений из PDF в JavaScript (React)

2026-09-11 09:51:55 Allen Yang
AI Summarize:
ChatGPT
ChatGPT ✓
Claude ✓
Grok ✓
Perplexity ✓
Quick
Quick
Concise overview
Highlights
Key takeaways
Detailed
Structured explanation
Brief
One sentence summary
Summarize |

Изображения, извлечённые из PDF-документа с помощью Spire.PDF for JavaScript в приложении React

Вы получили отчёт на 40 страниц, и вам нужны восемь диаграмм из него для презентации, или вы хотите вытащить фотографии товаров из каталога поставщика. Загвоздка в том, что PDF хранит изображения во внутреннем потоковом формате, который встроенные API браузера прочитать не могут, поэтому пути «щёлкнуть правой кнопкой мыши и сохранить изображение» не существует.

Spire.PDF for JavaScript читает эти потоки за вас с помощью своего класса PdfImageHelper. GetImagesInfo извлекает каждый объект изображения на странице, а метод Image.Save каждого из них записывает его в отдельный файл. Всё выполняется в браузере через WebAssembly — PDF никогда не покидает устройство, и никакой сервер или внешний инструмент не задействуется.

В этой статье вы узнаете, как:

  • Извлекать объекты изображений со страницы PDF с помощью GetImagesInfo
  • Сохранять каждое из них в VFS и запускать скачивание
  • Пройти по каждой странице многостраничного документа
  • Применить единообразную схему именования к извлечённым файлам
  • Использовать извлечённые изображения напрямую в вашем интерфейсе React

Предварительные требования

Это руководство предполагает, что у вас есть проект React с установленным Spire.PDF for JavaScript и инициализированным модулем WASM. Инструкции по настройке см. в разделе Интеграция Spire.PDF for JavaScript в проект React.

Вам потребуется:

  • PDF-файл, содержащий изображения, загруженный в VFS
  • Модуль WASM, доступный через window.wasmModule.spirepdf

Извлечение изображений с одной страницы

Базовый процесс извлечения получает все изображения с одной страницы, сохраняет каждое в VFS и запускает скачивание:

  1. Загрузите PDF в VFS и откройте его с помощью PdfDocument
  2. Получите целевую страницу из документа
  3. Вызовите GetImagesInfo, чтобы получить массив объектов с информацией об изображениях
  4. Пройдите в цикле по массиву, вызывая images[i].Image.Save(), чтобы записать каждое изображение в VFS
  5. Прочитайте из VFS и запустите скачивание браузером для каждого извлечённого изображения
function App() {
  const extractImagesFromPdf = async () => {
    // Get the Spire.PDF WASM module
    const pdfModule = window.wasmModule?.spirepdf;

    // Check if the WASM module is ready
    if (!pdfModule) {
      alert('Spire.PDF is not ready yet');
      return;
    }

    // Load the PDF file into VFS
    const inputFileName = 'Business_Data_Overview.pdf';
    await window.spire.FetchFileToVFS(inputFileName, "", `${process.env.PUBLIC_URL}/data/`);

    // Create a PdfDocument object and load the PDF document
    let doc = new pdfModule.PdfDocument();
    doc.LoadFromFile(inputFileName);

    // Get the first page
    let page = doc.Pages.get_Item(0);

    // Create a PdfImageHelper object and get the image information on the first page
    let helper = new pdfModule.PdfImageHelper();
    let images = helper.GetImagesInfo(page);

    // Iterate through the images on the page, save each as a separate image file, and trigger download
    for (let i = 0; i < images.length; i++) {
      const outputFileName = `ExtractedImage_${i + 1}.png`;
      images[i].Image.Save({ fileName: outputFileName });

      // Read the extracted image file from VFS and trigger download
      const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
      const blob = new Blob([fileArray], { type: 'image/png' });
      const url = URL.createObjectURL(blob);
      const a = document.createElement('a');
      a.href = url;
      a.download = outputFileName;
      a.click();
      URL.revokeObjectURL(url);
    }

    doc.Close();
  };

  return (
    <div style={{ textAlign: 'center', height: '300px' }}>
      <h1>Extract Images From PDF</h1>
      <button onClick={extractImagesFromPdf}>
        Generate
      </button>
    </div>
  );
}

export default App;

Файлы изображений, извлечённые из PDF

Файлы изображений, извлечённые из PDF

Что делает код:

  • helper.GetImagesInfo(page) возвращает массив объектов с информацией об изображениях для указанной страницы. Каждый объект имеет свойство Image, предоставляющее доступ к данным изображения.
  • images[i].Image.Save({ fileName: outputFileName }) записывает изображение в VFS как PNG-файл.
  • Шаблон «чтение из VFS + Blob + скачивание» тот же, что используется для вывода PDF, но с type: 'image/png' вместо type: 'application/pdf'.
  • Извлечение — это операция только для чтения: исходный PDF-документ не изменяется. Если вы хотите изменить или удалить изображение на месте, а не просто прочитать его, см. Замена и удаление изображений из PDF на JavaScript (React).

Извлечение изображений со всех страниц

Приведённый выше пример извлекает изображения только с первой страницы. Для многостраничного документа, такого как каталог товаров или годовой отчёт, обычно нужны все изображения с каждой страницы. Просто добавьте внешний цикл по страницам документа:

const extractAllImages = async () => {
  const pdfModule = window.wasmModule?.spirepdf;
  if (!pdfModule) return;

  await window.spire.FetchFileToVFS('Business_Data_Overview.pdf', "", `${process.env.PUBLIC_URL}/data/`);

  let doc = new pdfModule.PdfDocument();
  doc.LoadFromFile('Business_Data_Overview.pdf');

  let helper = new pdfModule.PdfImageHelper();
  let imageCount = 0;

  // Loop through all pages in the document
  for (let pageIndex = 0; pageIndex < doc.Pages.Count; pageIndex++) {
    let page = doc.Pages.get_Item(pageIndex);
    let images = helper.GetImagesInfo(page);

    // Extract each image on this page
    for (let i = 0; i < images.length; i++) {
      imageCount++;
      const outputFileName = `Page${pageIndex + 1}_Image${i + 1}.png`;
      images[i].Image.Save({ fileName: outputFileName });

      const fileArray = window.dotnetRuntime.Module.FS.readFile(outputFileName);
      const blob = new Blob([fileArray], { type: 'image/png' });
      const url = URL.createObjectURL(blob);
      const a = document.createElement('a');
      a.href = url;
      a.download = outputFileName;
      a.click();
      URL.revokeObjectURL(url);
    }
  }

  console.log(`Total images extracted: ${imageCount}`);
  doc.Close();
};

Ключевое отличие от примера с одной страницей: внешний цикл for перебирает doc.Pages.Count, а имя файла включает как номер страницы, так и индекс изображения (Page1_Image1.png, Page1_Image2.png, Page2_Image1.png и т. д.), чтобы извлечённые файлы оставались упорядоченными.


Именование извлечённых файлов

Единообразная стратегия именования помогает отслеживать, какое изображение с какой страницы и позиции было получено. Вот распространённые шаблоны:

Последовательная нумерация — самый простой вариант, подходит для извлечения с одной страницы:

const outputFileName = `ExtractedImage_${i + 1}.png`;
// ExtractedImage_1.png, ExtractedImage_2.png, ...

Страница и индекс — лучше всего подходит для многостраничного извлечения, сохраняет исходное расположение:

const outputFileName = `Page${pageIndex + 1}_Image${i + 1}.png`;
// Page1_Image1.png, Page1_Image2.png, Page2_Image1.png, ...

С отметкой времени — полезно при извлечении из нескольких документов в рамках одной сессии:

const timestamp = Date.now();
const outputFileName = `Extracted_${timestamp}_Page${pageIndex + 1}_${i + 1}.png`;

На основе имени исходного документа — помогает отследить происхождение:

const sourceName = 'Business_Data_Overview';
const outputFileName = `${sourceName}_p${pageIndex + 1}_img${i + 1}.png`;
// Business_Data_Overview_p1_img1.png, ...

Работа с извлечёнными изображениями

Вместо запуска скачиваний (или в дополнение к ним) вы можете использовать извлечённые данные изображений напрямую в вашем приложении React. Например, отобразить извлечённые изображения в галерее:

const extractAndDisplay = async () => {
  const pdfModule = window.wasmModule?.spirepdf;
  if (!pdfModule) return;

  await window.spire.FetchFileToVFS('Business_Data_Overview.pdf', "", `${process.env.PUBLIC_URL}/data/`);

  let doc = new pdfModule.PdfDocument();
  doc.LoadFromFile('Business_Data_Overview.pdf');

  let helper = new pdfModule.PdfImageHelper();
  let extractedImageUrls = [];

  for (let pageIndex = 0; pageIndex < doc.Pages.Count; pageIndex++) {
    let page = doc.Pages.get_Item(pageIndex);
    let images = helper.GetImagesInfo(page);

    for (let i = 0; i < images.length; i++) {
      const tempName = `temp_p${pageIndex + 1}_${i + 1}.png`;
      images[i].Image.Save({ fileName: tempName });

      const fileArray = window.dotnetRuntime.Module.FS.readFile(tempName);
      const blob = new Blob([fileArray], { type: 'image/png' });
      const url = URL.createObjectURL(blob);
      extractedImageUrls.push(url);
    }
  }

  doc.Close();

  // Now you have an array of object URLs you can use in <img> tags
  // setExtractedImages(extractedImageUrls); // if using state
  console.log(`Extracted ${extractedImageUrls.length} images ready for display`);
};

Этот подход даёт вам объектные URL-адреса, которые можно использовать напрямую в элементах <img src={url} />, что упрощает создание галереи предпросмотра, позволяет пользователям выбирать конкретные изображения или передавать изображения в другие части вашего приложения. Получив данные изображений, логику отрисовки для их добавления в PDF можно считать естественным следующим шагом.

Примечание. Не забудьте вызвать URL.revokeObjectURL(url) для каждого объектного URL-адреса, когда он вам больше не нужен, чтобы освободить память. Если вы отображаете изображения в галерее, отзывайте URL-адреса при размонтировании компонента галереи.


Часто задаваемые вопросы (FAQ)

Изменяет ли извлечение изображений исходный PDF?

Нет. Извлечение изображений — операция только для чтения. GetImagesInfo читает данные изображения из PDF, не изменяя документ, а Image.Save записывает копию в VFS. Исходный PDF остаётся неизменным.

В каком формате сохраняются извлечённые изображения?

Примеры в этой статье сохраняют извлечённые изображения как PNG-файлы (.png). Формат выходного файла определяется расширением, которое вы передаёте в Image.Save, поэтому при необходимости вы можете выбрать другой.

Как извлечь изображения из определённого диапазона страниц?

Вместо перебора всех страниц с помощью doc.Pages.Count перебирайте нужный вам диапазон. Например, чтобы извлечь изображения со страниц с 3 по 5 (с нумерацией от 0: с 2 по 4):

for (let pageIndex = 2; pageIndex <= 4 && pageIndex < doc.Pages.Count; pageIndex++) {
  let page = doc.Pages.get_Item(pageIndex);
  let images = helper.GetImagesInfo(page);
  // ... save and download each image
}

Могу ли я извлечь изображения и отобразить их в приложении React без скачивания?

Да. Вместо создания ссылки для скачивания создайте объектный URL с помощью URL.createObjectURL(blob) и используйте его как src элемента <img>. Пример кода см. в разделе Работа с извлечёнными изображениями выше.

Что делать, если на странице нет изображений?

GetImagesInfo возвращает пустой массив для страниц без изображений. Цикл for просто не выполняется, поэтому файлы не создаются и ошибки не возникают. Это безопасно выполнять на любой странице.


См. также