ขุดข้อมูลด้วย Adobe PDF Extract API

มีข้อมูลทางวิทยาศาสตร์มากมายนับไม่ถ้วนในรายงานและการศึกษาทางวิทยาศาสตร์หลายล้านฉบับในช่วงสองสามศตวรรษที่ผ่านมา แม้ว่าข้อมูลส่วนใหญ่จะถูกแปลงเป็นไฟล์ PDF ในรูปแบบที่ใช้งานง่าย แต่ข้อมูลภายในอาจยังคงถูกล็อกในลักษณะที่ไม่ง่ายอย่างที่ควรจะเป็นในการทำงานโดยรวม PDF Extract API ที่เพิ่งเปิดตัวของเราเป็นวิธีที่มีประสิทธิภาพในการรับข้อความดิบของเอกสารและทำความเข้าใจเนื้อหาภายในอย่างชาญฉลาด ในบทความนี้ ผมจะสาธิตวิธีที่เราสามารถใช้ API นี้เพื่อรวบรวมและรวมชุดข้อมูลขนาดใหญ่ให้เป็นหนึ่งเดียว

ข้อมูลของเรา

สำหรับตัวอย่างสมมุตินี้ ฉันกำลังจินตนาการถึงองค์กรดาราศาสตร์ (เรียกว่า Department of Star Light) ที่ตรวจสอบความส่องสว่างของดวงดาว ก่อนที่ฉันจะพูดอะไรมากกว่านี้ โปรดทราบว่าฉันไม่ใช่นักดาราศาสตร์หรือนักวิทยาศาสตร์ โปรดจำไว้ว่าทั้งหมดนี้เป็นเพียงตัวอย่างสมมติ อย่างไรก็ตาม DSL (เป็นหน่วยงานของรัฐ แน่นอนว่าต้องใช้ตัวย่อ) ศึกษาความสว่างของชุดดาว ทุกๆ ปี จะมีการสร้างรายงานหลายหน้าเกี่ยวกับดาวเหล่านี้ รายงานประกอบด้วยใบปะหน้าและตารางสิบสองหน้าที่เป็นตัวแทนของแต่ละเดือนของปี

DSL ดำเนินการมายี่สิบปี โดยศึกษาและรายงานเกี่ยวกับดาวดวงเดียวกัน นี่เป็นข้อมูลมากมายและในขณะที่อ่านและจัดเก็บได้ง่ายในรูปแบบ PDF คุณจะรวบรวมข้อมูลและทำการวิเคราะห์ตลอดระยะเวลาได้อย่างไร นั่นคือ 20 ไฟล์ แต่ละตาราง 12 หน้า รวมทั้งหมด 240 ตาราง มีการวิเคราะห์ดาว 20 ดวง นั่นคือ 4,800 สถิติส่วนบุคคล

อย่างที่ฉันบอกไป ข้อมูลทั้งหมดนี้เป็นรูปแบบอิเล็กทรอนิกส์ ดังนั้นในทางทฤษฎีแล้ว คุณสามารถคัดลอกและวางข้อมูลได้ แต่มีแนวโน้มว่าจะเกิดข้อผิดพลาดและไม่สามารถปรับขนาดได้ (ลองนึกดูว่าข้อมูลขยายไปถึงห้าสิบปี รายงานรายสัปดาห์ และดาวหนึ่งร้อยดวงหรือไม่) ที่นี่เป็นที่ที่ PDF Extract สามารถบันทึกวันได้ โปรดทราบว่าฉันกำลังใช้Node SDK สำหรับการสาธิตของฉัน แต่คุณยังสามารถใช้JavaหรือPython SDK ของเราได้อีกด้วย หากคุณกำลังใช้อย่างอื่น เรามีREST API ที่คุณสามารถใช้ได้ด้วย

PDF Extract รองรับการส่งคืนหลายสิ่งจาก PDF:

  • ข้อความ (รวมถึงแบบอักษร ตำแหน่ง ข้อมูลองค์กร และอื่นๆ อีกมากมาย เป็นอะไรที่มากกว่าแค่ตัวข้อความเอง)
  • รูปภาพ
  • โต๊ะ

เอกสารของเราครอบคลุมตัวอย่างการดึงข้อมูลแบบตารางจาก PDF หลายตัวอย่าง ส่วนที่เกี่ยวข้องของรหัสมาถึงบล็อกนี้:

const options = new PDFServicesSdk.ExtractPDF.options.ExtractPdfOptions.Builder()  .addElementsToExtract(PDFServicesSdk.ExtractPDF.options.ExtractElementType.TABLES) .addTableStructureFormat(PDFServicesSdk.ExtractPDF.options.TableStructureType.CSV)
    .build();

โซลูชันของฉันเดือดลงไปที่ขั้นตอนต่อไปนี้

1) สแกนโฟลเดอร์เอกสารของเราสำหรับ PDF ของเรา ทำได้โดยใช้รูปแบบ glob บนโฟลเดอร์ ฉันใช้แพ็คเกจglobby NPM ที่ยอดเยี่ยมสำหรับสิ่งนี้

const pdfs = await globby('./gen/*.pdf');

// pdf is the filename we are checking
// datafile would translate foo.pdf to foo.json
let datafile = pdf.replace('.pdf', '.json');
if(!fs.existsSync(datafile)) {
    console.log(`Need to fetch the data for ${pdf}`);
    data = await getData(pdf);
    fs.writeFileSync(datafile, JSON.stringify(data), 'utf8');

const credentials = PDFServicesSdk.Credentials
    .serviceAccountCredentialsBuilder()
    .fromFile('pdftools-api-credentials.json')
    .build();
const executionContext = PDFServicesSdk.ExecutionContext.create(credentials);
const options = new PDFServicesSdk.ExtractPDF.options.ExtractPdfOptions.Builder()
    .addElementsToExtract(PDFServicesSdk.ExtractPDF.options.ExtractElementType.TABLES)
    .addTableStructureFormat(PDFServicesSdk.ExtractPDF.options.TableStructureType.CSV)
    .build();
const extractPDFOperation = PDFServicesSdk.ExtractPDF.Operation.createNew();
const input = PDFServicesSdk.FileRef.createFromLocalFile(pdf,PDFServicesSdk.ExtractPDF.SupportedSourceFormat.pdf);
extractPDFOperation.setInput(input);
extractPDFOperation.setOptions(options);
let output = './' + nanoid() + '.zip';
try {
    let result = await extractPDFOperation.execute(executionContext);
    await result.saveAsFile(output);
} catch(e) {
    console.log('Exception encountered while executing operation', err);
    reject(err)
}

// ok, now we need to get tables/*.csv from the zip
const zip = new StreamZip.async({ file: output });
const entries = await zip.entries();
let csvs = [];
for (const entry of Object.values(entries)) {
    if(entry.name.endsWith('.csv')) csvs.push(entry.name);
}

let result = [];
for(let i=0; i<csvs.length;i++) {
    const data = await zip.entryData(csvs[i]);
    let csvContent = data.toString();
    let csvData = await csv().fromString(csvContent);
    result.push(csvData);
}

[
    {
        "NAME": "Albadore",
        "LUMINOSITY": "44.377727966701904"
    },
    {
        "NAME": "Barnie",
        "LUMINOSITY": "22.82641486947966"
    },
    {
        "NAME": "Camden",
        "LUMINOSITY": "30.147538516875166"
    },
    {
        "NAME": "Delphinus",
        "LUMINOSITY": "24.18838138551451"
    },
    {
        "NAME": "Ernie",
        "LUMINOSITY": "39.326469491032285"
    },
    {
        "NAME": "Foofihagen",
        "LUMINOSITY": "34.09839876252938"
    },
    {
        "NAME": "Glados",
        "LUMINOSITY": "45.42275137909815"
    },
    {
        "NAME": "Helix",
        "LUMINOSITY": "28.434317384475182"
    },
    {
        "NAME": "Icarus",
        "LUMINOSITY": "45.26036772094769"
    },
    {
        "NAME": "Juniper",
        "LUMINOSITY": "37.61983037130726"
    },
    {
        "NAME": "Kelix",
        "LUMINOSITY": "34.33577955268733"
    },
    {
        "NAME": "Lindy",
        "LUMINOSITY": "44.132514920041444"
    },
    {
        "NAME": "Madzuga",
        "LUMINOSITY": "23.429262283398895"
    },
    {
        "NAME": "Nicronat",
        "LUMINOSITY": "32.57940088137253"
    },
    {
        "NAME": "Olicity",
        "LUMINOSITY": "41.76234700460494"
    },
    {
        "NAME": "Patronus",
        "LUMINOSITY": "38.57095289213085"
    },
    {
        "NAME": "Queen",
        "LUMINOSITY": "20.83277986794452"
    },
    {
        "NAME": "Romana",
        "LUMINOSITY": "39.28237819440117"
    },
    {
        "NAME": "Silver",
        "LUMINOSITY": "39.03680756359309"
    },
    {
        "NAME": "Tritonus",
        "LUMINOSITY": "36.96249959958089"
    }
],

4) ตกลง ณ จุดนี้ เราได้สร้างหรืออ่านข้อมูลดาราเป็นเวลาหลายปี dataข้อมูลนี้เป็นข้อมูลในตัวแปรที่เรียกว่า ฉันมีตัวแปรชื่อresultที่จะเก็บทุกอย่าง:

let year = pdf.split('/').pop().split('.').shift();
result.push({
    year, 
    data
});

5) และสุดท้าย ผลลัพธ์จะถูกเขียนไปยังระบบไฟล์:

fs.writeFileSync(outputFile, JSON.stringify(result), 'utf8');

นี่เป็นงานเล็กน้อยเช่นกัน นั่นคือในการแปลงข้อมูลของฉันเป็นรูปแบบ Chart.js แต่สิ่งสำคัญที่ต้องจำไว้คือตอนนี้ข้อมูลพร้อมสำหรับการใช้งานหลายอย่าง ต้องการที่จะเห็นมันด้วยตัวคุณเอง?

  • ไฟล์ PDF ที่ผมใช้สำหรับการป้อนข้อมูลแหล่งที่มาที่ถูกสร้างขึ้นผ่าน Adobe สร้างเอกสาร ฉันสร้างสคริปต์ที่สร้างไฟล์ PDF จำนวน 20 ไฟล์ และใช้ตรรกะเล็กน้อยเพื่อทำให้ดาวบางดวงมีแนวโน้มขึ้นหรือลง คุณสามารถค้นหาสคริปต์และไฟล์ PDF ต้นฉบับได้ที่นี่:https://github.com/cfjedimaster/document-services-demos/tree/main/article_support/extract-science/gen
  • สคริปต์ที่ทำการยกของหนัก (แยกและจัดเก็บ) สามารถพบได้ที่นี่: https://github.com/cfjedimaster/document-services-demos/blob/main/article_support/extract-science/getdata.js
  • สามารถดูการสาธิตฝั่งไคลเอ็นต์ที่สร้างแผนภูมิได้ที่นี่: https://github.com/cfjedimaster/document-services-demos/tree/main/article_support/extract-science/visualizer

Suggested posts

ศึกษาผลกระทบของธรรมชาติบนกระดาน บทสัมภาษณ์ของศาสตราจารย์ Danielle Celermajer

ศึกษาผลกระทบของธรรมชาติบนกระดาน บทสัมภาษณ์ของศาสตราจารย์ Danielle Celermajer

นอกเหนือจาก “แล้วกำไรล่ะ?” คำถามอื่นๆ ที่ฉันมักถูกถามเกี่ยวกับ Nature on the Board ก็คือ “แล้วอะไรล่ะที่เปลี่ยนไปจริงๆ” และขึ้นอยู่กับว่าคุณต้องการกำหนดการเปลี่ยนแปลงอย่างไร เรื่องราวมีอยู่ว่าในปี 1934 Lettie Pate Whitehead กลายเป็นผู้หญิงคนแรกที่ทำหน้าที่ในคณะกรรมการของบริษัทยักษ์ใหญ่ (Coca Cola)

ซื้อตอนนี้หรือซื้อทีหลัง? สมองของคุณกำลังหลอกหลอนคุณ และนี่คือวิธี

ซื้อตอนนี้หรือซื้อทีหลัง? สมองของคุณกำลังหลอกหลอนคุณ และนี่คือวิธี

ลองนึกภาพดู เจมส์เป็นหัวหน้าโครงการสำหรับแพลตฟอร์มออนไลน์ที่ให้บริการที่ง่ายและต้นทุนต่ำในการตั้งค่าอีคอมเมิร์ซสำหรับธุรกิจขนาดเล็ก หนึ่งในบริการของพวกเขาคือการให้ข้อมูลเชิงลึกเกี่ยวกับพฤติกรรมการซื้อของลูกค้า

Related posts

สองปีในการออกแบบ - ดี ไม่ดี และน่าเกลียด...

สองปีในการออกแบบ - ดี ไม่ดี และน่าเกลียด...

“หวัดดี Siri เล่น Me Dive โดย Olivia Dean” ในเดือนพฤษภาคม 2021 ฉันเริ่มฝึกงานที่ Future Academy Africa ในเมือง Akure ประเทศไนจีเรีย

การค้นหาข้อมูลเกี่ยวกับชื่อโดเมน

ตัดตอนมาจาก Small, Sharp Software Tools โดย Brian P. Hogan

การค้นหาข้อมูลเกี่ยวกับชื่อโดเมน

เมื่อคุณส่งคำขอไปที่ facebook.com คอมพิวเตอร์ของคุณจะค้นหาชื่อโดเมนเพื่อแปลชื่อโดเมนนั้นเป็นที่อยู่ IP เพื่อให้คอมพิวเตอร์ของคุณสามารถเชื่อมต่อได้

การรวบรวม OSINT เพื่อการล่าภัยคุกคาม

การรวบรวม OSINT เพื่อการล่าภัยคุกคาม

สวัสดีชาวไซเบอร์! ยินดีต้อนรับกลับสู่ OSINT สำหรับซีรี่ส์การล่าภัยคุกคาม ในบทความแรก ฉันได้ให้ภาพรวมของ OSINT และความสำคัญในการตามล่าภัยคุกคาม

เครือข่ายทีวีทวิตเตอร์

เครือข่ายทีวีทวิตเตอร์

ของเก่ากลายเป็นของใหม่อีกครั้ง และของที่เคยเป็นประกายระยิบระยับกลับดูจืดชืด ฉันไม่ได้กำลังพูดถึงกางเกงยีนส์ JNCO ที่กลับมาเป็นที่นิยมในหมู่เด็กเท่ๆ ในตัวเมืองพร้อมกับแฟชั่นอื่นๆ ในช่วงปลายทศวรรษ 1990