Estoy tratando de analizar un pdf que contiene datos en forma de tabla usando javascript. Mi archivo pdf es un horario universitario en forma de cuadrícula que tiene datos en cada cuadrícula. Estoy haciendo uso del paquete pdfreader npm (soy bastante nuevo en javascript, así que no estoy seguro de si existe un paquete mejor para el caso de uso)
Mi plan es primero analizar a través del pdf y con la ayuda de algunas palabras que sé que están presentes en la tabla de tiempo (por ejemplo, el nombre de los días) y obtener las coordenadas x e y aproximadas de la cuadrícula en el pdf. En segundo lugar, analice el pdf una vez más y ahora, a partir del texto, obtengo una matriz 2d con la ayuda de las coordenadas que obtuve en el primer paso.
En el ejemplo del analizador de pdf hay una función, parseFileItems, que llama a itemHandler(error, item) en cada elemento analizado del archivo pdf. Entonces, para el primer paso, llamo a la función como
new PdfReader().parseFileItems("./timetable.pdf", (err, item) => { if (err) console.error("error:", err); else if (!item) console.warn("end of file"); else if (item.text) { cordinatesofGrid=//my logic to fetch the cordinates of the grid } });Ahora lo que tengo que hacer es analizar el pdf una vez más y hacer uso de la variable "cordinatesofGrid" que obtuve en la primera pasada. así que nuevamente tengo la intención de llamar a parseFileItems por segunda vez. Pero esto debería suceder solo una vez que el primer paso y su código de devolución de llamada hayan terminado de ejecutarse.
Intenté llamar a los primeros parseFileItems con await y luego llamar a la función de análisis por segunda vez, pero esto no funciona como se esperaba. (Supongo que esto se debe a que la espera no se aplica a la devolución de llamada)
await new PdfReader().parseFileItems("./timetable.pdf", (err, item) => { //first call }); new PdfReader().parseFileItems("./timetable.pdf", (err, item) => { //second call });¿Alguien podría sugerir cómo asegurarse de que la devolución de llamada de una llamada de función se ejecute solo después de la devolución de llamada de la segunda llamada de función?
Podría crear un contenedor Promise alrededor del nuevo PdfReader()
Para tu información, ¡no sé si la biblioteca de pdf está basada en promesas! esto es de la información que proporcionó!
//This code will always resolve and never throw a reject const PdfReaderAsync = () => { return new Promise((res, rej) => { new PdfReader().parseFileItems("./timetable.pdf", (err, item) => { if (err || !item) rej(err) res(item) }) }) } //Make the function you are calling this code async //So you can use it like this try { let item = await PdfReaderAsync() // Run through your code } catch (err) { //handleError } // Code 2 try { let item = await PdfReaderAsync() // Run through your code } catch (err) { //handleError }Puede poner el segundo en la primera devolución de llamada y usar await
await new PdfReader().parseFileItems("./timetable.pdf", async(err, item) => { await new PdfReader().parseFileItems("./timetable.pdf", (err, item) => { //second call }); //first call });