Sostituire e rimuovere immagini dai PDF in JavaScript (React)

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

Un documento PDF con un'immagine sostituita e un'altra eliminata utilizzando Spire.PDF per JavaScript

Un PDF che hai prodotto lo scorso trimestre circola ancora internamente, ma il suo logo è stato aggiornato il mese scorso e un grafico mostra numeri che non sono più veritieri. Non vuoi ricostruire il documento da zero — ti serve soltanto sostituire l'immagine obsoleta con quella nuova, oppure rimuovere completamente un timbro o una filigrana ormai superati.

Spire.PDF per JavaScript gestisce entrambe le operazioni nel browser tramite la sua classe PdfImageHelper. L'idea di fondo è la stessa per entrambe le operazioni: prima individuare l'immagine sulla pagina, poi agire su di essa. GetImagesInfo legge i metadati dell'immagine, ReplaceImage inserisce il nuovo contenuto preservando la posizione originale, mentre DeleteImage rimuove l'oggetto e lascia lo spazio vuoto. Nessun server, nessun caricamento, nessun Adobe Acrobat.

In questo articolo imparerai come:

  • Individuare ogni immagine su una pagina con GetImagesInfo
  • Sostituire un'immagine mantenendone la posizione e le dimensioni originali
  • Eliminare un'immagine e lasciare uno spazio vuoto pulito
  • Scegliere l'immagine giusta in base alla sua posizione quando non ne conosci l'indice
  • Pulire le immagini su tutte le pagine di un documento

Prerequisiti

Questo tutorial presuppone che tu abbia un progetto React con Spire.PDF per JavaScript installato e il modulo WASM inizializzato. Se non hai ancora configurato tutto ciò, segui Integrare Spire.PDF per JavaScript in un progetto React.

Ti serviranno:

  • Un PDF che contenga già almeno un'immagine, caricato nel VFS
  • (Per la sostituzione) un nuovo file immagine da inserire
  • Il modulo WASM raggiungibile tramite window.wasmModule.spirepdf

Come Spire.PDF individua le immagini

Sia la sostituzione che l'eliminazione partono dallo stesso passaggio: capire quali immagini sono presenti sulla pagina e dove si trovano. Il metodo PdfImageHelper.GetImagesInfo(page) restituisce un array di oggetti di informazioni sull'immagine. Ogni oggetto espone:

  • Image — i dati dell'immagine stessa (usati durante la sostituzione, o durante l'estrazione delle immagini dal PDF)
  • Bounds — un RectangleF che descrive la posizione e le dimensioni dell'immagine sulla pagina
// Create a PdfImageHelper and inspect the first page
let helper = new pdfModule.PdfImageHelper();
let images = helper.GetImagesInfo(page);

console.log(`Found ${images.length} image(s) on this page`);
for (let i = 0; i < images.length; i++) {
  console.log(`Image ${i}: position=(${images[i].Bounds.X}, ${images[i].Bounds.Y}), size=${images[i].Bounds.Width}x${images[i].Bounds.Height}`);
}

L'indice dell'array segue l'ordine in cui le immagini compaiono sulla pagina, quindi images[0] è la prima, images[1] la seconda, e così via. Una volta ottenuto questo array, sostituire o eliminare è una singola chiamata a un metodo — trattata nelle due sezioni seguenti.


Sostituire un'immagine

La sostituzione mantiene intatto il layout del documento: la nuova immagine eredita la posizione e le dimensioni del segnaposto originale, quindi nulla intorno ad essa si sposta. I passaggi sono: caricare il PDF e l'immagine di sostituzione nel VFS, aprire il PDF, chiamare GetImagesInfo, quindi chiamare ReplaceImage con l'oggetto di informazioni di destinazione e la nuova immagine.

function App() {
  const replaceImageInPdf = 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/`);

    // Load the new image used for replacement into VFS
    const newImageName = 'ChartImage.png';
    await window.spire.FetchFileToVFS(newImageName, "", `${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 page
    let helper = new pdfModule.PdfImageHelper();
    let images = helper.GetImagesInfo(page);

    // Load the new image and replace the first image on the page
    let newImage = pdfModule.PdfImage.FromFile(newImageName);
    helper.ReplaceImage(images[0], newImage);

    // Define the output file name in PDF format
    const outputFileName = 'ReplaceImage.pdf';

    // Save as PDF format
    doc.SaveToFile({ fileName: outputFileName });
    doc.Close();

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

  return (
    <div style={{ textAlign: 'center', height: '300px' }}>
      <h1>Replace Image In PDF</h1>
      <button onClick={replaceImageInPdf}>
        Generate
      </button>
    </div>
  );
}

export default App;

Documento PDF generato dopo la sostituzione di un'immagine

Documento PDF generato dopo la sostituzione di un'immagine

helper.ReplaceImage(images[0], newImage) sostituisce il contenuto dell'immagine all'indice 0 con newImage. La sostituzione avviene nella stessa posizione e con le stesse dimensioni dell'originale. Se l'immagine sostitutiva ha un rapporto d'aspetto diverso, viene allungata per adattarsi al segnaposto originale.


Eliminare un'immagine

L'eliminazione condivide esattamente la stessa configurazione della sostituzione — caricare il PDF, ottenere la pagina, chiamare GetImagesInfo. L'unica differenza è la chiamata finale: invece di ReplaceImage, chiami DeleteImage con l'oggetto di informazioni di destinazione, e l'immagine viene rimossa completamente, lasciando il suo spazio vuoto.

// Everything above is identical to the replace example:
// load the PDF, get page 0, create the helper, call GetImagesInfo(page)

// Delete the first image on the page
helper.DeleteImage({ imageInfo: images[0] });

Documento PDF generato dopo l'eliminazione di un'immagine

Documento PDF generato dopo l'eliminazione di un'immagine

helper.DeleteImage({ imageInfo: images[0] }) rimuove l'immagine all'indice 0. Il testo, la grafica e il layout circostanti rimangono intatti — lo spazio che occupava viene semplicemente lasciato vuoto, senza alcun riflusso.


Individuare le immagini per posizione

Quando una pagina contiene diverse immagini, potresti non sapere quale indice dell'array corrisponda a quella che desideri. La proprietà Bounds ti indica dove si trova ciascuna immagine, e IntersectsWith ti permette di agire sulle immagini all'interno di una regione specifica — utile per rimuovere un timbro nell'intestazione o sostituire un grafico che si trova sempre nello stesso punto.

// Get the image information on the page
let helper = new pdfModule.PdfImageHelper();
let images = helper.GetImagesInfo(page);

// Define the target region (e.g., a stamp area in the bottom-right)
let targetRect = new pdfModule.RectangleF({ x: 400, y: 700, width: 100, height: 80 });

// Iterate through the images and delete those within the target region
for (let i = 0; i < images.length; i++) {
  if (images[i].Bounds.IntersectsWith({ rect: targetRect })) {
    helper.DeleteImage({ imageInfo: images[i] });
    console.log(`Deleted image at position (${images[i].Bounds.X}, ${images[i].Bounds.Y})`);
  }
}

Bounds è un RectangleF con X, Y, Width e Height, tutti espressi in punti (1 punto = 1/72 di pollice). L'origine (0, 0) è l'angolo in alto a sinistra della pagina.


Elaborazione in batch su tutte le pagine

Per agire sulle immagini in un documento composto da più pagine, esegui un ciclo sulla collezione Pages e applica la stessa logica a ogni pagina. L'esempio seguente elimina ogni immagine; sostituisci DeleteImage con ReplaceImage per effettuare invece una sostituzione in batch (carica la nuova immagine una volta sola prima del ciclo).

const batchDeleteAllImages = 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();

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

    // Delete all images on this page
    for (let i = 0; i < images.length; i++) {
      helper.DeleteImage({ imageInfo: images[i] });
    }
    console.log(`Page ${pageIndex + 1}: deleted ${images.length} image(s)`);
  }

  const outputFileName = 'AllImagesDeleted.pdf';
  doc.SaveToFile({ fileName: outputFileName });
  doc.Close();

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

Domande frequenti

Come faccio a trovare l'immagine specifica che voglio modificare?

GetImagesInfo restituisce le immagini nell'ordine della pagina, quindi images[0], images[1], … ti danno la prima, la seconda e così via. Quando l'ordine non è evidente, leggi la proprietà Bounds di ogni oggetto per vedere dove si trova, e usa Bounds.IntersectsWith per individuare le immagini all'interno di una regione nota. Vedi Individuare le immagini per posizione sopra.

La sostituzione o l'eliminazione disturbano il resto della pagina?

No. Entrambe le operazioni agiscono solo sull'oggetto immagine stesso. Una sostituzione mantiene la posizione e le dimensioni del segnaposto originale; un'eliminazione lascia uno spazio vuoto. Testo, grafica e layout non sono interessati, e il documento non viene mai riformattato.

Posso sostituire un'immagine con una che ha un rapporto d'aspetto diverso?

Sì — ReplaceImage allunga la nuova immagine per riempire il segnaposto originale. Se hai bisogno di preservare le proporzioni della nuova immagine, elimina quella vecchia e aggiungi la sostitutiva con DrawImage alle dimensioni esatte che desideri. Vedi Come aggiungere immagini a un PDF in JavaScript (React).

Come faccio a rimuovere ogni immagine da un documento?

Esegui un ciclo su doc.Pages.Count, chiama GetImagesInfo per ogni pagina e DeleteImage su ogni voce — l'esempio Elaborazione in batch su tutte le pagine mostra il codice completo.


Vedi anche