我正在嘗試使用javascript決議包含表格形式資料的pdf。我的 pdf 檔案是一個網格形式的大學時間表,每個網格中都有資料。我正在使用 pdfreader npm 包(我對 javascript 很陌生,所以我不確定用例是否存在更好的包)
我的計劃是首先決議 pdf,并借助我知道時間表中存在的幾個詞(例如日期名稱),并獲取 pdf 中網格的近似 x 和 y 坐標。其次,再次決議 pdf,現在從文本中,借助我在第一遍中獲取的坐標,我可以填充一些 2d 陣列。
在 pdf 決議器的示例中,有一個函式 parseFileItems 對從 pdf 檔案決議的每個專案呼叫 itemHandler(error, item)。因此,對于第一遍,我將函式稱為
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
}
});
現在我需要做的是再次決議pdf并使用我在第一遍中獲取的“cordinatesofGrid”變數。所以我再次打算第二次呼叫 parseFileItems。但這應該只在第一次通過并且它的回呼代碼執行完畢后才會發生。
我嘗試使用 await 呼叫第一個 parseFileItems,然后第二次呼叫 parse 函式,但這沒有按預期作業。(我認為這是因為等待不適用于回呼)
await new PdfReader().parseFileItems("./timetable.pdf", (err, item) => {
//first call
});
new PdfReader().parseFileItems("./timetable.pdf", (err, item) => {
//second call
});
任何人都可以建議如何確保一個函式呼叫的回呼,僅在第二個函式呼叫的回呼之后執行
uj5u.com熱心網友回復:
您可以圍繞新的 PdfReader() 創建一個 Promise 包裝器
快速僅供參考,我不知道 pdf 庫是否基于承諾!這是根據您提供的資訊!
//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
}
uj5u.com熱心網友回復:
您可以嘗試使用.then()函式進行承諾處理。
這是一些關于它如何作業/如何使用它的檔案的鏈接。我相信這只有在你的函式使用 Promise 時才有效(我假設因為你嘗試等待)。
uj5u.com熱心網友回復:
您可以將第二個放在第一個回呼中并使用await
await new PdfReader().parseFileItems("./timetable.pdf", async(err, item) => {
await new PdfReader().parseFileItems("./timetable.pdf", (err, item) => {
//second call
});
//first call
});
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/462045.html
標籤:javascript 节点.js 表示 pdf
