MCPcopy Create free account
hub / github.com/LibPDF-js/core / copyStream

Method copyStream

src/document/object-copier.ts:365–424  ·  view source on GitHub ↗

* Copy a stream, handling encryption state. * * If source wasn't encrypted, copies raw encoded bytes (fastest). * If source was encrypted, decodes and re-encodes with same filters.

(stream: PdfStream)

Source from the content-addressed store, hash-verified

363 * If source was encrypted, decodes and re-encodes with same filters.
364 */
365 private copyStream(stream: PdfStream): PdfStream {
366 const sourceWasEncrypted = this.source.isEncrypted;
367
368 // Clone the stream's dictionary
369 const clonedDict = stream.clone();
370
371 // Copy dict values (remapping refs, but not stream data yet)
372 this.copyDictValues(clonedDict);
373
374 if (!sourceWasEncrypted) {
375 // Source wasn't encrypted - copy raw encoded bytes directly
376 // This preserves exact encoding and is fastest
377 return new PdfStream(clonedDict, stream.data);
378 }
379
380 // Source was encrypted - we have decrypted data in memory
381 // Must decode and re-encode. Wrap in try/catch for robustness.
382 try {
383 const decodedData = stream.getDecodedData();
384 const filterEntry = stream.get("Filter");
385
386 if (filterEntry) {
387 // Re-encode with same filters
388 try {
389 const filterSpecs = this.buildFilterSpecs(stream);
390 const encodedData = FilterPipeline.encode(decodedData, filterSpecs);
391
392 // Update length
393 clonedDict.set("Length", PdfNumber.of(encodedData.length));
394
395 return new PdfStream(clonedDict, encodedData);
396 } catch (error) {
397 console.warn(`Could not re-encode stream, will use uncompressed data`);
398 console.warn(error);
399
400 // If re-encoding fails, store uncompressed
401 clonedDict.delete("Filter");
402 clonedDict.delete("DecodeParms");
403 clonedDict.set("Length", PdfNumber.of(decodedData.length));
404
405 return new PdfStream(clonedDict, decodedData);
406 }
407 }
408
409 // No filters - store uncompressed
410 clonedDict.set("Length", PdfNumber.of(decodedData.length));
411
412 return new PdfStream(clonedDict, decodedData);
413 } catch (error) {
414 console.warn(`Could not decode stream, will use raw data`);
415 console.warn(error);
416
417 // If decoding fails entirely, copy raw bytes as fallback
418 clonedDict.delete("Filter");
419 clonedDict.delete("DecodeParms");
420 clonedDict.set("Length", PdfNumber.of(stream.data.length));
421
422 return new PdfStream(clonedDict, stream.data);

Callers 1

copyObjectMethod · 0.95

Calls 10

copyDictValuesMethod · 0.95
buildFilterSpecsMethod · 0.95
getDecodedDataMethod · 0.80
deleteMethod · 0.80
encodeMethod · 0.65
cloneMethod · 0.45
getMethod · 0.45
setMethod · 0.45
ofMethod · 0.45
warnMethod · 0.45

Tested by

no test coverage detected