2023-11-17 15:52:44 +03:00
import jsQR from "jsqr" ;
2024-01-04 20:17:54 -05:00
import { PdfFile } from "../../wrappers/PdfFile.js" ;
2023-11-17 15:52:44 +03:00
import { getImagesOnPage , PDFJSImage } from "./getImagesOnPage.js" ;
export async function detectQRCodePages ( file : PdfFile ) {
console . log ( "FileInQRPrev: " , file ) ;
const pdfDoc = await file . pdfJsDocument ;
console . log ( "FileInQRAfter: " , file ) ;
const pagesWithQR : number [ ] = [ ] ;
for ( let i = 0 ; i < pdfDoc . numPages ; i ++ ) {
console . log ( "Page:" , i , "/" , pdfDoc . numPages ) ;
const page = await pdfDoc . getPage ( i + 1 ) ;
const images = await getImagesOnPage ( page ) ;
// console.log("images:", images);
for ( const image of images ) {
const data = await checkForQROnImage ( image ) ;
if ( data == "https://github.com/Frooodle/Stirling-PDF" ) {
pagesWithQR . push ( i ) ;
}
}
}
if ( pagesWithQR . length == 0 ) {
2024-01-04 20:17:54 -05:00
console . warn ( "Could not find any QR Codes in the provided PDF." ) ;
2023-11-17 15:52:44 +03:00
}
return pagesWithQR ;
}
async function checkForQROnImage ( image : any ) {
// TODO: There is an issue with the jsQR package (The package expects rgba but sometimes we have rgb), and the package seems to be stale, we could create a fork and fix the issue. In the meanwhile we just force rgba:
// Check for rgb and convert to rgba
if ( image . data . length == image . width * image . height * 3 ) {
const tmpArray = new Uint8ClampedArray ( image . width * image . height * 4 ) ;
// Iterate through the original array and add an alpha channel
for ( let i = 0 , j = 0 ; i < image . data . length ; i += 3 , j += 4 ) {
tmpArray [ j ] = image . data [ i ] ; // Red channel
tmpArray [ j + 1 ] = image . data [ i + 1 ] ; // Green channel
tmpArray [ j + 2 ] = image . data [ i + 2 ] ; // Blue channel
tmpArray [ j + 3 ] = 255 ; // Alpha channel (fully opaque)
}
image . data = tmpArray ;
}
const code = jsQR ( image . data , image . width , image . height ) ;
if ( code )
return code . data ;
else
return null ;
}