chrome.documentScan

ब्यौरा

अटैच किए गए दस्तावेज़ स्कैनर से इमेज ढूंढने और उन्हें वापस पाने के लिए, chrome.documentScan एपीआई का इस्तेमाल करें.

Document Scan API को इस तरह से डिज़ाइन किया गया है कि इससे ऐप्लिकेशन और एक्सटेंशन, अटैच किए गए दस्तावेज़ स्कैनर पर मौजूद पेपर दस्तावेज़ों का कॉन्टेंट देख सकें.

अनुमतियां

documentScan

उपलब्धता

Chrome 44 या इसके बाद का वर्शन सिर्फ़ ChromeOS पर
बाद में जोड़े गए एपीआई सदस्यों के लिए उपलब्धता, उन सदस्यों के साथ दिखाई जाती है.

कॉन्सेप्ट और इस्तेमाल

यह एपीआई, दस्तावेज़ों को स्कैन करने के दो तरीके इस्तेमाल करता है. अगर आपके इस्तेमाल के उदाहरण में किसी भी स्कैनर का इस्तेमाल किया जा सकता है और कॉन्फ़िगरेशन को कंट्रोल करने की ज़रूरत नहीं है, तो scan() तरीके का इस्तेमाल करें. ज़्यादा मुश्किल इस्तेमाल के उदाहरणों के लिए, तरीकों के कॉम्बिनेशन की ज़रूरत होती है. ये सिर्फ़ Chrome 124 और उसके बाद के वर्शन में काम करते हैं.

आसानी से स्कैन करना

सामान्य इस्तेमाल के मामलों के लिए, इसका मतलब है कि ऐसे मामले जिनमें किसी भी स्कैनर का इस्तेमाल किया जा सकता है और कॉन्फ़िगरेशन को कंट्रोल करने की ज़रूरत नहीं होती है, scan() को कॉल करें. यह तरीका, ScanOptions ऑब्जेक्ट लेता है और एक प्रॉमिस दिखाता है. यह प्रॉमिस, ScanResults ऑब्जेक्ट के साथ रिज़ॉल्व होता है. इस विकल्प की सुविधाएं, स्कैन की संख्या और कॉलर के स्वीकार किए जाने वाले MIME टाइप तक सीमित हैं. स्कैन किए गए डेटा को यूआरएल के तौर पर दिखाया जाता है, ताकि यूज़र इंटरफ़ेस के लिए <img> टैग में दिखाया जा सके.

मुश्किल स्कैनिंग

इस सेक्शन में बताए गए तरीके से, जटिल स्कैन तीन चरणों में पूरे किए जाते हैं. इस आउटलाइन में, हर तरीके के आर्ग्युमेंट या जवाब में दिखाई गई हर प्रॉपर्टी के बारे में नहीं बताया गया है. इसका मकसद सिर्फ़ आपको स्कैनर कोड लिखने के बारे में सामान्य जानकारी देना है.

डिस्कवरी

  1. getScannerList() पर कॉल करें. उपलब्ध स्कैनर की जानकारी, Promise में मिलती है. यह Promise, GetScannerListResponse के साथ रिज़ॉल्व होता है.

    • जवाब वाले ऑब्जेक्ट में, ScannerInfo ऑब्जेक्ट की एक शृंखला होती है.
    • अगर स्कैनर एक से ज़्यादा प्रोटोकॉल या कनेक्शन के तरीकों के साथ काम करता है, तो ऐरे में किसी एक स्कैनर के लिए कई एंट्री हो सकती हैं.
  2. जवाब के तौर पर मिले ऐरे से कोई स्कैनर चुनें और उसकी scannerId प्रॉपर्टी की वैल्यू सेव करें.

    एक ही स्कैनर के लिए, कई ऑब्जेक्ट के बीच अंतर करने के लिए, अलग-अलग ScannerInfo ऑब्जेक्ट की प्रॉपर्टी का इस्तेमाल करें. एक ही स्कैनर से स्कैन किए गए ऑब्जेक्ट के लिए, deviceUuid प्रॉपर्टी की वैल्यू एक जैसी होगी. ScannerInfo में एक imageFormats प्रॉपर्टी भी होती है. इसमें इस्तेमाल की जा सकने वाली इमेज टाइप का एक कलेक्शन होता है.

स्कैनर का कॉन्फ़िगरेशन

  1. सेव किए गए स्कैनर आईडी को पास करके, openScanner() को कॉल करें. यह एक प्रॉमिस दिखाता है, जो OpenScannerResponse के साथ रिज़ॉल्व होता है. जवाब वाले ऑब्जेक्ट में यह जानकारी शामिल होती है:

    • scannerHandle प्रॉपर्टी, जिसे आपको सेव करना होगा.

    • यह विकल्प प्रॉपर्टी है. इसमें स्कैनर के हिसाब से प्रॉपर्टी होती हैं. आपको इन्हें सेट करना होगा. ज़्यादा जानकारी के लिए, स्कैनर के विकल्प वापस पाना लेख पढ़ें.

  2. (वैकल्पिक) अगर आपको उपयोगकर्ता से स्कैनर के विकल्पों के लिए वैल्यू चाहिए, तो यूज़र इंटरफ़ेस बनाएं. आपको पिछले चरण में दिए गए स्कैनर के विकल्पों की ज़रूरत होगी. साथ ही, आपको स्कैनर से मिले विकल्प ग्रुप को वापस पाना होगा. ज़्यादा जानकारी के लिए, यूज़र इंटरफ़ेस बनाना लेख पढ़ें.

  3. प्रोग्राम के हिसाब से या उपयोगकर्ता की ओर से दी गई वैल्यू का इस्तेमाल करके, OptionSetting ऑब्जेक्ट की एक ऐरे बनाएं. ज़्यादा जानकारी के लिए, स्कैनर के विकल्प सेट करना लेख पढ़ें.

  4. स्कैनर के विकल्प सेट करने के लिए, OptionSetting ऑब्जेक्ट के ऐरे को setOptions() पर पास करें. यह एक प्रॉमिस दिखाता है, जो SetOptionsResponse के साथ रिज़ॉल्व होता है. इस ऑब्जेक्ट में, स्कैनर के विकल्पों का अपडेट किया गया वर्शन होता है. इसे स्कैनर कॉन्फ़िगरेशन के पहले चरण में वापस पाया जाता है.

    किसी एक विकल्प को बदलने से, दूसरे विकल्प पर पाबंदियां लग सकती हैं. इसलिए, आपको इन चरणों को कई बार दोहराना पड़ सकता है.

स्कैन किया जा रहा है

  1. StartScanOptions ऑब्जेक्ट बनाएं और इसे startScan() को पास करें. यह एक प्रॉमिस दिखाता है, जो StartScanResponse के साथ रिज़ॉल्व होता है. इसकी job प्रॉपर्टी एक हैंडल है. इसका इस्तेमाल स्कैन किए गए डेटा को पढ़ने या स्कैन को रद्द करने के लिए किया जाता है.

  2. जॉब हैंडल को readScanData() पर पास करें. यह एक प्रॉमिस दिखाता है, जो ReadScanDataResponse ऑब्जेक्ट के साथ रिज़ॉल्व होता है. अगर डेटा को सही तरीके से पढ़ा गया है, तो उसकी result प्रॉपर्टी SUCCESS के बराबर होती है. साथ ही, उसकी data प्रॉपर्टी में स्कैन के हिस्से के साथ ArrayBuffer शामिल होता है. ध्यान दें कि estimatedCompletion में, अब तक डिलीवर किए गए कुल डेटा का अनुमानित प्रतिशत शामिल होता है.

  3. पिछले चरण को तब तक दोहराएं, जब तक result प्रॉपर्टी की वैल्यू EOF के बराबर न हो जाए या कोई गड़बड़ी न हो जाए.

स्कैनिंग खत्म होने पर, चरण 3 में सेव किए गए स्कैनर हैंडल के साथ कॉल closeScanner() करें. यह एक प्रॉमिस दिखाता है, जो CloseScannerResponse के साथ रिज़ॉल्व होता है. जॉब बनाने के बाद किसी भी समय कॉल करने पर, स्कैनिंग बंद हो जाएगी cancelScan().

जवाब के ऑब्जेक्ट

सभी तरीके, एक प्रॉमिस दिखाते हैं. यह प्रॉमिस, किसी तरह के रिस्पॉन्स ऑब्जेक्ट के साथ रिज़ॉल्व होता है. इनमें से ज़्यादातर में result प्रॉपर्टी होती है. इसकी वैल्यू, OperationResult का सदस्य होती है. जब तक result की वैल्यू कोई खास वैल्यू नहीं होती, तब तक जवाब ऑब्जेक्ट की कुछ प्रॉपर्टी में वैल्यू नहीं होंगी. इन संबंधों के बारे में, हर रिस्पॉन्स ऑब्जेक्ट के रेफ़रंस में बताया गया है.

उदाहरण के लिए, OpenScannerResponse.scannerHandle की वैल्यू सिर्फ़ तब होगी, जब OpenScannerResponse.result की वैल्यू SUCCESS होगी.

स्कैनर के विकल्प

स्कैनर के विकल्प, डिवाइस के हिसाब से अलग-अलग होते हैं. इसलिए, दस्तावेज़ स्कैन करने वाले एपीआई में सीधे तौर पर स्कैनर के विकल्पों को नहीं दिखाया जा सकता. इस समस्या को हल करने के लिए, OpenScannerResponse (openScanner() का इस्तेमाल करके वापस पाया गया) और SetOptionsResponse (setOptions() के लिए रिस्पॉन्स ऑब्जेक्ट) में एक options प्रॉपर्टी होती है. यह एक ऑब्जेक्ट है, जिसमें स्कैनर के हिसाब से विकल्प होते हैं. हर विकल्प, की-वैल्यू मैपिंग है. इसमें कुंजी, डिवाइस के हिसाब से तय किया गया विकल्प होता है और वैल्यू, ScannerOption का इंस्टेंस होता है.

आम तौर पर, स्ट्रक्चर ऐसा दिखता है:

{
  "key1": { scannerOptionInstance }
  "key2": { scannerOptionInstance }
}

उदाहरण के लिए, मान लें कि कोई स्कैनर "source" और "resolution" नाम के विकल्प दिखाता है. जवाब में मिले options ऑब्जेक्ट का स्ट्रक्चर, यहां दिए गए उदाहरण की तरह दिखेगा. आसान बनाने के लिए, सिर्फ़ कुछ ScannerOption जवाब दिखाए गए हैं.

{
  "source": {
    "name": "source",
    "type": OptionType.STRING,
...
},
  "resolution": {
    "name": "resolution",
    "type": OptionType.INT,
...
  },
...
}

यूज़र इंटरफ़ेस बनाना

इस एपीआई का इस्तेमाल करने के लिए, इस पैरामीटर को सेट करना ज़रूरी नहीं है. हालांकि, ऐसा हो सकता है कि आपको किसी विकल्प के लिए उपयोगकर्ता से वैल्यू चुनने के लिए कहना हो. इसके लिए, उपयोगकर्ता इंटरफ़ेस की ज़रूरत होती है. अटैच किए गए स्कैनर के विकल्प वापस पाने के लिए, OpenScannerResponse (openScanner() से खोला गया) का इस्तेमाल करें. इसके बारे में पिछले सेक्शन में बताया गया है.

कुछ स्कैनर, डिवाइस के हिसाब से विकल्पों को ग्रुप करते हैं. इनसे विकल्प के व्यवहार पर कोई असर नहीं पड़ता. हालांकि, स्कैनर के प्रॉडक्ट के दस्तावेज़ में इन ग्रुप का ज़िक्र किया जा सकता है. इसलिए, ऐसे ग्रुप को उपयोगकर्ता को दिखाया जाना चाहिए. इन ग्रुप को वापस पाने के लिए, getOptionGroups() पर कॉल करें. इससे एक प्रॉमिस मिलता है, जो GetOptionGroupsResponse ऑब्जेक्ट के साथ रिज़ॉल्व होता है. इसकी groups प्रॉपर्टी में, स्कैनर के हिसाब से ग्रुप का ऐरे होता है. इन ग्रुप में मौजूद जानकारी का इस्तेमाल करके, OpenScannerResponse में मौजूद विकल्पों को व्यवस्थित करें, ताकि उन्हें दिखाया जा सके.

{
  scannerHandle: "123456",
  result: SUCCESS,
  groups: [
    {
      title: "Standard",
      members: [ "resolution", "mode", "source" ]
    }
  ]
}

स्कैनर कॉन्फ़िगरेशन में बताया गया है कि किसी एक विकल्प को बदलने से, दूसरे विकल्प पर पाबंदियां लग सकती हैं. इसलिए, setOptionsResponse (setOptions() के लिए रिस्पॉन्स ऑब्जेक्ट) में एक और options प्रॉपर्टी शामिल है. यूज़र इंटरफ़ेस को अपडेट करने के लिए, इसका इस्तेमाल करें. इसके बाद, ज़रूरत के हिसाब से इसे तब तक दोहराएं, जब तक सभी विकल्प सेट न हो जाएं.

स्कैनर के विकल्प सेट करना

setOptions() को OptionSetting ऑब्जेक्ट का कलेक्शन पास करके, स्कैनर के विकल्प सेट करें. उदाहरण के लिए, एक लेटर साइज़ पेज स्कैन करना सेक्शन देखें.

उदाहरण

किसी पेज को blob के तौर पर वापस पाना

इस उदाहरण में, स्कैनर से किसी पेज को blob के तौर पर वापस पाने का एक तरीका दिखाया गया है. साथ ही, OperationResult की वैल्यू का इस्तेमाल करके startScan() और readScanData() का इस्तेमाल करने का तरीका दिखाया गया है.

async function pageAsBlob(handle) {
  let response = await chrome.documentScan.startScan(
      handle, {format: "image/jpeg"});
  if (response.result != chrome.documentScan.OperationResult.SUCCESS) {
    return null;
  }
  const job = response.job;

  let imgParts = [];
  response = await chrome.documentScan.readScanData(job);
  while (response.result == chrome.documentScan.OperationResult.SUCCESS) {
    if (response.data && response.data.byteLength > 0) {
        imgParts.push(response.data);
    } else {
      // Delay so hardware can make progress.
      await new Promise(r => setTimeout(r, 100));
    }
    response = await chrome.documentScan.readScanData(job);
  }
  if (response.result != chrome.documentScan.OperationResult.EOF) {
    return null;
  }
  if (response.data && response.data.byteLength > 0) {
    imgParts.push(response.data);
  }
  return new Blob(imgParts, { type: "image/jpeg" });
}

लेटर साइज़ का एक पेज स्कैन करना

इस उदाहरण में, स्कैनर चुनने, उसके विकल्प सेट करने, और उसे खोलने का तरीका बताया गया है. इसके बाद, यह किसी एक पेज का कॉन्टेंट वापस लाता है और स्कैनर को बंद कर देता है. इस प्रोसेस में, getScannerList(), openScanner(), setOptions(), और closeScanner() का इस्तेमाल करने का तरीका बताया गया है. ध्यान दें कि पेज का कॉन्टेंट, पिछले उदाहरण में दिए गए pageAsBlob() फ़ंक्शन को कॉल करके वापस पाया जाता है.

async function scan() {
    let response = await chrome.documentScan.getScannerList({ secure: true });
    let scanner = await chrome.documentScan.openScanner(
        response.scanners[0].scannerId);
    const handle = scanner.scannerHandle;

    let options = [];
    for (source of scanner.options["source"].constraint.list) {
        if (source.includes("ADF")) {
            options.push({
                name: "source",
                type: chrome.documentScan.OptionType.STRING,
                value: { value: source }
            });
            break;
        }
    }
    options.push({
        name: "tl-x",
        type: chrome.documentScan.OptionType.FIXED,
        value: 0.0
    });
    options.push({
        name: "br-x",
        type: chrome.documentScan.OptionType.FIXED,
        value: 215.9  // 8.5" in mm
    });
    options.push({
        name: "tl-y",
        type: chrome.documentScan.OptionType.FIXED,
        value: 0.0
    });
    options.push({
        name: "br-y",
        type: chrome.documentScan.OptionType.FIXED,
        value: 279.4  // 11" in mm
    });
    response = await chrome.documentScan.setOptions(handle, options);

    let imgBlob = await pageAsBlob(handle);
    if (imgBlob != null) {
        // Insert imgBlob into DOM, save to disk, etc
    }
    await chrome.documentScan.closeScanner(handle);
}

कॉन्फ़िगरेशन दिखाएं

जैसा कि यहां बताया गया है, किसी उपयोगकर्ता को स्कैनर के कॉन्फ़िगरेशन के विकल्प दिखाने के लिए, getOptionGroups() को कॉल करने के साथ-साथ, getOptionGroups() को कॉल करने पर मिले स्कैनर के विकल्पों को भी कॉल करना ज़रूरी है.openScanner() ऐसा इसलिए किया जाता है, ताकि उपयोगकर्ताओं को मैन्युफ़ैक्चरर के तय किए गए ग्रुप में विकल्प दिखाए जा सकें. इस उदाहरण में, ऐसा करने का तरीका बताया गया है.

async function showConfig() {
  let response = await chrome.documentScan.getScannerList({ secure: true });
  let scanner = await chrome.documentScan.openScanner(
      response.scanners[0].scannerId);
  let groups = await chrome.documentScan.getOptionGroups(scanner.scannerHandle);

  for (const group of groups.groups) {
    console.log("=== " + group.title + " ===");
    for (const member of group.members) {
      const option = scanner.options[member];
      if (option.isActive) {
        console.log("  " + option.name + " = " + option.value);
      } else {
        console.log("  " + option.name + " is inactive");
      }
    }
  }
}

टाइप

CancelScanResponse

Chrome 125 या इसके बाद के वर्शन

प्रॉपर्टी

  • नौकरी

    स्ट्रिंग

    यह वही जॉब हैंडल देता है जो cancelScan() को पास किया गया था.

  • नतीजा

    बैकएंड से स्कैन करने की प्रोसेस रद्द करने का नतीजा. अगर नतीजा OperationResult.SUCCESS या OperationResult.CANCELLED है, तो स्कैन करने की प्रोसेस रद्द कर दी गई है. साथ ही, स्कैनर नया स्कैन शुरू करने के लिए तैयार है. अगर नतीजे में OperationResult.DEVICE_BUSY दिखता है, तो इसका मतलब है कि स्कैनर, रद्द करने के अनुरोध को अब भी प्रोसेस कर रहा है. कॉल करने वाले व्यक्ति को कुछ समय इंतज़ार करना चाहिए और फिर से अनुरोध करना चाहिए. नतीजे की अन्य वैल्यू से पता चलता है कि कोई ऐसी गड़बड़ी हुई है जिसे ठीक नहीं किया जा सकता. इसलिए, इसे फिर से ठीक करने की कोशिश नहीं करनी चाहिए.

CloseScannerResponse

Chrome 125 या इसके बाद के वर्शन

प्रॉपर्टी

  • नतीजा

    स्कैनर बंद करने का नतीजा. अगर यह वैल्यू SUCCESS नहीं है, तब भी हैंडल अमान्य होगा. इसका इस्तेमाल किसी भी अन्य कार्रवाई के लिए नहीं किया जाना चाहिए.

  • scannerHandle

    स्ट्रिंग

    वही स्कैनर हैंडल जो closeScanner को पास किया गया था.

Configurability

Chrome 125 या इसके बाद के वर्शन

किसी विकल्प को कैसे बदला जा सकता है.

Enum

"NOT_CONFIGURABLE"
यह विकल्प सिर्फ़ पढ़ने के लिए है.

"SOFTWARE_CONFIGURABLE"
इस विकल्प को सॉफ़्टवेयर में सेट किया जा सकता है.

"HARDWARE_CONFIGURABLE"
इस विकल्प को उपयोगकर्ता, स्कैनर पर मौजूद बटन को टॉगल करके या दबाकर सेट कर सकता है.

ConnectionType

Chrome 125 या इसके बाद के वर्शन

इससे पता चलता है कि स्कैनर, कंप्यूटर से कैसे कनेक्ट किया गया है.

Enum

"UNSPECIFIED"

"USB"

"NETWORK"

ConstraintType

Chrome 125 या इसके बाद के वर्शन

OptionConstraint से दिखाए गए कॉन्स्ट्रेंट का डेटा टाइप.

Enum

"INT_RANGE"
OptionType.INT वैल्यू की रेंज पर पाबंदी. OptionConstraint की min, max, और quant प्रॉपर्टी long होंगी. साथ ही, इसकी list प्रॉपर्टी को अनसेट कर दिया जाएगा.

"FIXED_RANGE"
OptionType.FIXED वैल्यू की रेंज पर पाबंदी. OptionConstraint की min, max, और quant प्रॉपर्टी double हो जाएंगी. साथ ही, इसकी list प्रॉपर्टी को अनसेट कर दिया जाएगा.

"INT_LIST"
OptionType.INT वैल्यू की किसी सूची पर लागू होने वाली पाबंदी. OptionConstraint.list प्रॉपर्टी में long वैल्यू शामिल होंगी और अन्य प्रॉपर्टी सेट नहीं होंगी.

"FIXED_LIST"
OptionType.FIXED वैल्यू की किसी सूची पर लागू होने वाली पाबंदी. OptionConstraint.list प्रॉपर्टी में double वैल्यू शामिल होंगी और अन्य प्रॉपर्टी सेट नहीं होंगी.

"STRING_LIST"
OptionType.STRING वैल्यू की किसी सूची पर लागू होने वाली पाबंदी. OptionConstraint.list प्रॉपर्टी में DOMString वैल्यू शामिल होंगी और अन्य प्रॉपर्टी सेट नहीं होंगी.

DeviceFilter

Chrome 125 या इसके बाद के वर्शन

प्रॉपर्टी

  • लोकल

    बूलियन ज़रूरी नहीं है

    सिर्फ़ उन स्कैनर को वापस लाएं जो सीधे तौर पर कंप्यूटर से जुड़े हैं.

  • सुरक्षित

    बूलियन ज़रूरी नहीं है

    सिर्फ़ उन स्कैनर को वापस भेजें जो यूएसबी या टीएलएस जैसे सुरक्षित ट्रांसपोर्ट का इस्तेमाल करते हैं.

GetOptionGroupsResponse

Chrome 125 या इसके बाद के वर्शन

प्रॉपर्टी

  • समूह

    OptionGroup[] optional

    अगर result SUCCESS है, तो स्कैनर ड्राइवर की ओर से दिए गए क्रम में विकल्प ग्रुप की सूची दिखाता है.

  • नतीजा

    विकल्प ग्रुप पाने का नतीजा. अगर इसकी वैल्यू SUCCESS है, तो groups प्रॉपर्टी की वैल्यू अपने-आप भर जाएगी.

  • scannerHandle

    स्ट्रिंग

    वही स्कैनर हैंडल जो getOptionGroups को पास किया गया था.

GetScannerListResponse

Chrome 125 या इसके बाद के वर्शन

प्रॉपर्टी

  • नतीजा

    गिनती का नतीजा. ध्यान दें कि गड़बड़ी का मैसेज दिखने पर भी, कुछ नतीजे दिख सकते हैं.

  • स्कैनर

    यह स्कैनर की ऐसी सूची होती है जिसमें दिए गए DeviceFilter से मेल खाने वाले स्कैनर शामिल होते हैं. हालांकि, ऐसा हो सकता है कि यह सूची खाली हो.

OpenScannerResponse

Chrome 125 या इसके बाद के वर्शन

प्रॉपर्टी

  • विकल्प

    object ज़रूरी नहीं है

    अगर result SUCCESS है, तो यह की-वैल्यू मैपिंग उपलब्ध कराता है. इसमें कुंजी, डिवाइस के हिसाब से तय किया गया विकल्प होती है और वैल्यू, ScannerOption का इंस्टेंस होती है.

  • नतीजा

    स्कैनर खोलने का नतीजा. अगर इसकी वैल्यू SUCCESS है, तो scannerHandle और options प्रॉपर्टी की वैल्यू अपने-आप भर जाएगी.

  • scannerHandle

    string ज़रूरी नहीं है

    अगर result, SUCCESS है, तो स्कैनर का एक हैंडल, जिसका इस्तेमाल आगे की कार्रवाइयों के लिए किया जा सकता है.

  • scannerId

    स्ट्रिंग

    स्कैनर आईडी को openScanner() पर पास किया गया.

OperationResult

Chrome 125 या इसके बाद के वर्शन

एक इनम, जो हर कार्रवाई के नतीजे के बारे में बताता है.

Enum

"UNKNOWN"
कोई ऐसी गड़बड़ी हुई जिसकी जानकारी नहीं है या कोई सामान्य गड़बड़ी हुई.

"SUCCESS"
कार्रवाई पूरी हो गई.

"UNSUPPORTED"
यह कार्रवाई नहीं की जा सकती.

"CANCELLED"
कार्रवाई रद्द कर दी गई थी.

"DEVICE_BUSY"
डिवाइस व्यस्त है.

"INVALID"
डेटा या तरीके को पास किया गया कोई आर्ग्युमेंट मान्य नहीं है.

"WRONG_TYPE"
दी गई वैल्यू, विकल्प के लिए गलत डेटा टाइप है.

"EOF"
अब कोई डेटा उपलब्ध नहीं है.

"ADF_JAMMED"
डॉक्यूमेंट फ़ीडर जाम हो गया है.

"ADF_EMPTY"
डॉक्यूमेंट फ़ीडर खाली है.

"COVER_OPEN"
फ़्लैटबेड का कवर खुला है.

"IO_ERROR"
डिवाइस से कम्यूनिकेट करते समय कोई गड़बड़ी हुई.

"ACCESS_DENIED"
डिवाइस की पुष्टि करना ज़रूरी है.

"NO_MEMORY"
Chromebook पर कार्रवाई पूरी करने के लिए, ज़रूरत के मुताबिक मेमोरी उपलब्ध नहीं है.

"UNREACHABLE"
डिवाइस से कनेक्ट नहीं किया जा सका.

"MISSING"
डिवाइस डिसकनेक्ट हो गया है.

"INTERNAL_ERROR"
यह गड़बड़ी, कॉल करने वाले ऐप्लिकेशन के अलावा किसी और जगह पर हुई है.

OptionConstraint

Chrome 125 या इसके बाद के वर्शन

प्रॉपर्टी

  • सूची

    string[] | number[] ज़रूरी नहीं

  • अधिकतम

    number ज़रूरी नहीं

  • कम से कम

    number ज़रूरी नहीं

  • क्वांट

    number ज़रूरी नहीं

  • टाइप

OptionGroup

Chrome 125 या इसके बाद के वर्शन

प्रॉपर्टी

  • सदस्य

    string[]

    ड्राइवर के दिए गए क्रम में विकल्पों के नामों की सूची.

  • title

    स्ट्रिंग

    इससे प्रिंट किया जा सकने वाला टाइटल मिलता है. उदाहरण के लिए, "ज्यामिति के विकल्प".

OptionSetting

Chrome 125 या इसके बाद के वर्शन

प्रॉपर्टी

  • नाम

    स्ट्रिंग

    इससे सेट किए जाने वाले विकल्प का नाम पता चलता है.

  • टाइप

    इससे विकल्प के डेटा टाइप के बारे में पता चलता है. मांगा गया डेटा टाइप, विकल्प के असल डेटा टाइप से मेल खाना चाहिए.

  • मान

    string | number | boolean | number[] optional

    इससे सेट की जाने वाली वैल्यू का पता चलता है. autoSettable चालू किए गए विकल्पों के लिए, अपने-आप सेटिंग का अनुरोध करने के लिए, इसे सेट न करें. value के लिए दिया गया डेटा टाइप, type से मेल खाना चाहिए.

OptionType

Chrome 125 या इसके बाद के वर्शन

किसी विकल्प का डेटा टाइप.

Enum

"UNKNOWN"
विकल्प के डेटा टाइप की जानकारी नहीं है. value प्रॉपर्टी को अनसेट कर दिया जाएगा.

"BOOL"
value प्रॉपर्टी की वैल्यू truefalse होगी.

"INT"
यह एक साइंड 32-बिट इंटिजर होता है. value प्रॉपर्टी, long या long[] होगी. यह इस बात पर निर्भर करता है कि विकल्प में एक से ज़्यादा वैल्यू हैं या नहीं.

"FIXED"
यह -32768 से 32767.9999 की रेंज में मौजूद एक डबल है. इसका रिज़ॉल्यूशन 1/65535 है. value प्रॉपर्टी, double या double[] होगी. यह इस बात पर निर्भर करता है कि विकल्प में एक से ज़्यादा वैल्यू हैं या नहीं. ऐसी डबल वैल्यू जिन्हें सटीक तौर पर नहीं दिखाया जा सकता उन्हें उपलब्ध रेंज और सटीक वैल्यू के हिसाब से राउंड किया जाएगा.

"STRING"
NUL ('\0') को छोड़कर, किसी भी बाइट का क्रम. value प्रॉपर्टी एक DOMString होगी.

"BUTTON"
इस तरह के विकल्प की कोई वैल्यू नहीं होती. इसके बजाय, इस तरह का विकल्प सेट करने से स्कैनर ड्राइवर में विकल्प के हिसाब से साइड इफ़ेक्ट होता है. उदाहरण के लिए, स्कैनर ड्राइवर, बटन टाइप वाले विकल्प का इस्तेमाल करके डिफ़ॉल्ट वैल्यू चुनने का तरीका उपलब्ध करा सकता है. इसके अलावा, वह ऑटोमैटिक दस्तावेज़ फ़ीडर को अगले कागज़ पर जाने के लिए कह सकता है.

"GROUP"
ग्रुप बनाने का विकल्प. कोई वैल्यू नहीं है. इसे इसलिए शामिल किया गया है, ताकि यह काम कर सके. हालांकि, आम तौर पर इसे ScannerOption वैल्यू में नहीं दिखाया जाता. सदस्यों के विकल्पों के साथ ग्रुप की सूची पाने के लिए, getOptionGroups() का इस्तेमाल करें.

OptionUnit

Chrome 125 या इसके बाद के वर्शन

यह ScannerOption.unit के लिए डेटा टाइप दिखाता है.

Enum

"UNITLESS"
वैल्यू, बिना यूनिट वाली संख्या है. उदाहरण के लिए, यह थ्रेशोल्ड हो सकता है.

"PIXEL"
वैल्यू पिक्सल की संख्या होती है. उदाहरण के लिए, स्कैन डाइमेंशन.

"BIT"
वैल्यू, बिट की संख्या होती है. उदाहरण के लिए, कलर डेप्थ.

"मिमी"
वैल्यू को मिलीमीटर में मेज़र किया जाता है. उदाहरण के लिए, स्कैन डाइमेंशन.

"DPI"
इसकी वैल्यू को डॉट्स पर इंच में मापा जाता है. उदाहरण के लिए, रिज़ॉल्यूशन.

"PERCENT"
वैल्यू प्रतिशत में है. उदाहरण के लिए, चमक.

"MICROSECOND"
वैल्यू को माइक्रोसेकंड में मापा जाता है. उदाहरण के लिए, एक्सपोज़र का समय.

ReadScanDataResponse

Chrome 125 या इसके बाद के वर्शन

प्रॉपर्टी

  • डेटा

    ArrayBuffer ज़रूरी नहीं है

    अगर result SUCCESS है, तो इसमें स्कैन की गई इमेज के डेटा का अगला हिस्सा शामिल होता है. अगर result EOF है, तो इसमें स्कैन की गई इमेज के डेटा का आखिरी हिस्सा होता है.

  • estimatedCompletion

    number ज़रूरी नहीं

    अगर result SUCCESS है, तो यह अनुमान लगाया जाता है कि अब तक स्कैन किए गए कुल डेटा का कितना हिस्सा डिलीवर किया गया है. इसकी वैल्यू 0 से 100 के बीच होती है.

  • नौकरी

    स्ट्रिंग

    यह readScanData() को पास किया गया जॉब हैंडल उपलब्ध कराता है.

  • नतीजा

    डेटा पढ़ने का नतीजा. अगर इसकी वैल्यू SUCCESS है, तो data में इमेज डेटा का अगला (शायद शून्य लंबाई वाला) हिस्सा होता है, जिसे पढ़ा जा सकता है. अगर इसकी वैल्यू EOF है, तो data में इमेज डेटा का आखिरी हिस्सा होता है.

ScannerInfo

Chrome 125 या इसके बाद के वर्शन

प्रॉपर्टी

  • connectionType

    इससे पता चलता है कि स्कैनर, कंप्यूटर से कैसे कनेक्ट किया गया है.

  • deviceUuid

    स्ट्रिंग

    इसका इस्तेमाल, एक ही फ़िज़िकल डिवाइस की ओर इशारा करने वाली अन्य ScannerInfo एंट्री से मिलान करने के लिए किया जाता है.

  • imageFormats

    string[]

    यह MIME टाइप का एक ऐसा कलेक्शन होता है जिसके लिए, स्कैन किए गए दस्तावेज़ों को वापस पाने का अनुरोध किया जा सकता है.

  • निर्माता

    स्ट्रिंग

    स्कैनर बनाने वाली कंपनी.

  • मॉडल

    स्ट्रिंग

    अगर स्कैनर मॉडल उपलब्ध है, तो उसकी जानकारी या सामान्य जानकारी.

  • नाम

    स्ट्रिंग

    स्कैनर का ऐसा नाम जिसे आसानी से पढ़ा जा सकता है. यह नाम, यूज़र इंटरफ़ेस (यूआई) में दिखता है.

  • protocolType

    स्ट्रिंग

    स्कैनर को ऐक्सेस करने के लिए इस्तेमाल किए गए प्रोटोकॉल या ड्राइवर के बारे में ऐसी जानकारी जिसे कोई भी व्यक्ति आसानी से पढ़ सकता है. जैसे, Mopria, WSD या epsonds. यह सुविधा मुख्य रूप से तब काम आती है, जब कोई डिवाइस एक से ज़्यादा प्रोटोकॉल के साथ काम करता है. इससे उपयोगकर्ता को प्रोटोकॉल चुनने की अनुमति दी जा सकती है.

  • scannerId

    स्ट्रिंग

    किसी स्कैनर का आईडी.

  • सुरक्षित

    बूलियन

    अगर यह वैल्यू सही है, तो स्कैनर कनेक्शन के ट्रांसपोर्ट को पैसिव लिसनर इंटरसेप्ट नहीं कर सकता. जैसे, टीएलएस या यूएसबी.

ScannerOption

Chrome 125 या इसके बाद के वर्शन

प्रॉपर्टी

  • कॉन्फ़िगर करने की सुविधा

    इससे पता चलता है कि विकल्प को बदला जा सकता है या नहीं. साथ ही, यह भी पता चलता है कि विकल्प को कैसे बदला जा सकता है.

  • सीमा

    इस कुकी का इस्तेमाल, मौजूदा स्कैनर विकल्प पर OptionConstraint को तय करने के लिए किया जाता है.

  • ब्यौरा

    स्ट्रिंग

    विकल्प के बारे में ज़्यादा जानकारी.

  • isActive

    बूलियन

    इससे पता चलता है कि विकल्प चालू है और इसे सेट या वापस पाया जा सकता है. अगर इस नीति को 'गलत है' पर सेट किया जाता है, तो value प्रॉपर्टी सेट नहीं होगी.

  • isAdvanced

    बूलियन

    इससे पता चलता है कि यूज़र इंटरफ़ेस (यूआई) को डिफ़ॉल्ट रूप से यह विकल्प नहीं दिखाना चाहिए.

  • isAutoSettable

    बूलियन

    इसे स्कैनर ड्राइवर अपने-आप सेट कर सकता है.

  • isDetectable

    बूलियन

    इससे पता चलता है कि इस विकल्प का पता सॉफ़्टवेयर से लगाया जा सकता है.

  • isEmulated

    बूलियन

    अगर यह वैल्यू सही है, तो स्कैनर ड्राइवर इसे सिम्युलेट करता है.

  • नाम

    स्ट्रिंग

    यह विकल्प का नाम है. इसमें अंग्रेज़ी के छोटे अक्षरों, संख्याओं, और डैश का इस्तेमाल किया जाता है. डाइक्रिटिक का इस्तेमाल नहीं किया जा सकता.

  • title

    स्ट्रिंग

    एक लाइन में प्रिंट किया जा सकने वाला टाइटल.

  • टाइप

    value प्रॉपर्टी में मौजूद डेटा टाइप, जो इस विकल्प को सेट करने के लिए ज़रूरी है.

  • यूनिट

    इस विकल्प के लिए मेज़रमेंट की इकाई.

  • मान

    string | number | boolean | number[] optional

    अगर ज़रूरी हो, तो विकल्प की मौजूदा वैल्यू. ध्यान दें कि इस प्रॉपर्टी का डेटा टाइप, type में बताए गए डेटा टाइप से मेल खाना चाहिए.

ScanOptions

प्रॉपर्टी

  • maxImages

    number ज़रूरी नहीं

    स्कैन की गई इमेज की अनुमति वाली संख्या. डिफ़ॉल्ट वैल्यू 1 होती है.

  • mimeTypes

    string[] ज़रूरी नहीं है

    ये MIME टाइप, कॉल करने वाले व्यक्ति के डिवाइस पर काम करते हैं.

ScanResults

प्रॉपर्टी

  • dataUrls

    string[]

    डेटा इमेज के यूआरएल की एक ऐसी कैटगरी जिसे इमेज टैग में "src" वैल्यू के तौर पर पास किया जा सकता है.

  • mimeType

    स्ट्रिंग

    dataUrls का MIME टाइप.

SetOptionResult

Chrome 125 या इसके बाद के वर्शन

प्रॉपर्टी

  • नाम

    स्ट्रिंग

    इससे सेट किए गए विकल्प का नाम पता चलता है.

  • नतीजा

    इससे विकल्प सेट करने के नतीजे के बारे में पता चलता है.

SetOptionsResponse

Chrome 125 या इसके बाद के वर्शन

प्रॉपर्टी

  • विकल्प

    object ज़रूरी नहीं है

    विकल्प के नामों से ScannerOption वैल्यू तक अपडेट की गई कुंजी-वैल्यू मैपिंग. इसमें दिए गए सभी विकल्पों को सेट करने के बाद, नया कॉन्फ़िगरेशन शामिल होता है. इसका स्ट्रक्चर, OpenScannerResponse में मौजूद options प्रॉपर्टी के जैसा ही होता है.

    अगर कुछ विकल्प सेट नहीं किए जा सके, तब भी यह प्रॉपर्टी सेट हो जाएगी. हालांकि, अगर अपडेट किया गया कॉन्फ़िगरेशन वापस नहीं पाया जा सका, तो यह प्रॉपर्टी अनसेट हो जाएगी. उदाहरण के लिए, अगर स्कैनिंग के बीच में स्कैनर डिसकनेक्ट हो जाता है.

  • नतीजे

    नतीजों का एक कलेक्शन. इसमें हर एक OptionSetting के लिए एक नतीजा होता है.

  • scannerHandle

    स्ट्रिंग

    यह setOptions() को पास किए गए स्कैनर हैंडल को उपलब्ध कराता है.

StartScanOptions

Chrome 125 या इसके बाद के वर्शन

प्रॉपर्टी

  • फ़ॉर्मैट

    स्ट्रिंग

    यह विकल्प, स्कैन किए गए डेटा को किस MIME टाइप में दिखाना है, यह तय करता है.

  • maxReadSize

    number ज़रूरी नहीं

    अगर शून्य से अलग कोई वैल्यू तय की जाती है, तो readScanData के एक जवाब में स्कैन किए गए ज़्यादा से ज़्यादा बाइट की संख्या को उस वैल्यू तक सीमित कर दिया जाता है. कम से कम 32768 (32 केबी) वैल्यू इस्तेमाल की जा सकती है. अगर इस प्रॉपर्टी की वैल्यू नहीं दी जाती है, तो स्कैन की गई पूरी इमेज को एक ही बार में वापस भेजा जा सकता है.

StartScanResponse

Chrome 125 या इसके बाद के वर्शन

प्रॉपर्टी

  • नौकरी

    string ज़रूरी नहीं है

    अगर result SUCCESS है, तो एक हैंडल उपलब्ध कराता है. इसका इस्तेमाल स्कैन किए गए डेटा को पढ़ने या नौकरी रद्द करने के लिए किया जा सकता है.

  • नतीजा

    स्कैन शुरू करने का नतीजा. अगर इसकी वैल्यू SUCCESS है, तो job प्रॉपर्टी की वैल्यू अपने-आप भर जाएगी.

  • scannerHandle

    स्ट्रिंग

    यह उसी स्कैनर हैंडल को दिखाता है जिसे startScan() को पास किया गया था.

तरीके

cancelScan()

Chrome 125 या इसके बाद के वर्शन
chrome.documentScan.cancelScan(
  job: string,
)
: Promise<CancelScanResponse>

यह फ़ंक्शन, शुरू किए गए स्कैन को रद्द करता है. साथ ही, एक ऐसा प्रॉमिस दिखाता है जो CancelScanResponse ऑब्जेक्ट के साथ रिज़ॉल्व होता है. अगर किसी कॉलबैक का इस्तेमाल किया जाता है, तो ऑब्जेक्ट को इसके बजाय पास किया जाता है.

पैरामीटर

  • नौकरी

    स्ट्रिंग

    यह एक चालू स्कैन जॉब का हैंडल है. इसे पहले startScan को कॉल करके वापस लाया गया था.

रिटर्न

closeScanner()

Chrome 125 या इसके बाद के वर्शन
chrome.documentScan.closeScanner(
  scannerHandle: string,
)
: Promise<CloseScannerResponse>

यह फ़ंक्शन, पास किए गए हैंडल की मदद से स्कैनर को बंद करता है. साथ ही, यह एक ऐसा प्रॉमिस दिखाता है जो CloseScannerResponse ऑब्जेक्ट के साथ रिज़ॉल्व होता है. अगर किसी कॉलबैक का इस्तेमाल किया जाता है, तो ऑब्जेक्ट को इसके बजाय पास किया जाता है. अगर रिस्पॉन्स सफल नहीं होता है, तो भी दिया गया हैंडल अमान्य हो जाता है. इसलिए, इसका इस्तेमाल आगे की कार्रवाइयों के लिए नहीं किया जाना चाहिए.

पैरामीटर

  • scannerHandle

    स्ट्रिंग

    यह खुले हुए स्कैनर का हैंडल तय करता है. इसे पहले openScanner को कॉल करके वापस लाया गया था.

रिटर्न

getOptionGroups()

Chrome 125 या इसके बाद के वर्शन
chrome.documentScan.getOptionGroups(
  scannerHandle: string,
)
: Promise<GetOptionGroupsResponse>

यह फ़ंक्शन, ग्रुप के नाम और सदस्य के विकल्प, उस स्कैनर से लेता है जिसे openScanner ने पहले खोला था. यह तरीका, एक प्रॉमिस दिखाता है. यह प्रॉमिस, GetOptionGroupsResponse ऑब्जेक्ट के साथ रिज़ॉल्व होता है. अगर इस फ़ंक्शन को कोई कॉलबैक पास किया जाता है, तो लौटाया गया डेटा उसे पास कर दिया जाता है.

पैरामीटर

  • scannerHandle

    स्ट्रिंग

    यह एक खुले हुए स्कैनर का हैंडल है. इसे openScanner को कॉल करने पर वापस भेजा जाता है.

रिटर्न

getScannerList()

Chrome 125 या इसके बाद के वर्शन
chrome.documentScan.getScannerList(
  filter: DeviceFilter,
)
: Promise<GetScannerListResponse>

यह उपलब्ध स्कैनर की सूची दिखाता है और एक प्रॉमिस दिखाता है, जो GetScannerListResponse ऑब्जेक्ट के साथ रिज़ॉल्व होता है. अगर इस फ़ंक्शन को कोई कॉलबैक पास किया जाता है, तो लौटाया गया डेटा उसे पास कर दिया जाता है.

पैरामीटर

  • फ़िल्टर करें

    DeviceFilter से पता चलता है कि किस तरह के स्कैनर को वापस भेजना चाहिए.

रिटर्न

openScanner()

Chrome 125 या इसके बाद के वर्शन
chrome.documentScan.openScanner(
  scannerId: string,
)
: Promise<OpenScannerResponse>

यह फ़ंक्शन, खास ऐक्सेस के लिए स्कैनर खोलता है. साथ ही, एक ऐसा Promise दिखाता है जो OpenScannerResponse ऑब्जेक्ट के साथ रिज़ॉल्व होता है. अगर इस फ़ंक्शन को कोई कॉलबैक पास किया जाता है, तो लौटाया गया डेटा उसे पास कर दिया जाता है.

पैरामीटर

  • scannerId

    स्ट्रिंग

    उस स्कैनर का आईडी जिसे खोलना है. यह वैल्यू, getScannerList को किए गए पिछले कॉल से मिली है.

रिटर्न

readScanData()

Chrome 125 या इसके बाद के वर्शन
chrome.documentScan.readScanData(
  job: string,
)
: Promise<ReadScanDataResponse>

यह फ़ंक्शन, चालू जॉब हैंडल से उपलब्ध इमेज डेटा का अगला हिस्सा पढ़ता है. साथ ही, एक प्रॉमिस दिखाता है, जो ReadScanDataResponse ऑब्जेक्ट के साथ रिज़ॉल्व होता है. अगर किसी कॉलबैक का इस्तेमाल किया जाता है, तो ऑब्जेक्ट को इसके बजाय पास किया जाता है.

**ध्यान दें:**जवाब के तौर पर मिले नतीजे में, शून्य लंबाई वाला data सदस्य SUCCESS हो सकता है. इसका मतलब है कि स्कैनर अब भी काम कर रहा है, लेकिन उसके पास अब तक कोई अतिरिक्त डेटा उपलब्ध नहीं है. कॉल करने वाले व्यक्ति को कुछ देर इंतज़ार करना चाहिए और फिर से कोशिश करनी चाहिए.

स्कैन करने की प्रोसेस पूरी होने के बाद, जवाब में EOF के तौर पर नतीजे की वैल्यू दिखेगी. इस रिस्पॉन्स में, फ़ाइनल नॉन-ज़ीरो data सदस्य शामिल हो सकता है.

पैरामीटर

  • नौकरी

    स्ट्रिंग

    यह एक ऐसा जॉब हैंडल है जिसे पहले startScan से वापस लाया गया था.

रिटर्न

scan()

chrome.documentScan.scan(
  options: ScanOptions,
)
: Promise<ScanResults>

यह फ़ंक्शन, दस्तावेज़ को स्कैन करता है और एक प्रॉमिस दिखाता है. यह प्रॉमिस, ScanResults ऑब्जेक्ट के साथ रिज़ॉल्व होता है. अगर इस फ़ंक्शन को कोई कॉलबैक पास किया जाता है, तो लौटाया गया डेटा उसे पास कर दिया जाता है.

पैरामीटर

  • विकल्प

    यह एक ऑब्जेक्ट है, जिसमें स्कैन पैरामीटर होते हैं.

रिटर्न

  • Promise<ScanResults>

    Chrome 96 और इसके बाद के वर्शन

setOptions()

Chrome 125 या इसके बाद के वर्शन
chrome.documentScan.setOptions(
  scannerHandle: string,
  options: OptionSetting[],
)
: Promise<SetOptionsResponse>

यह फ़ंक्शन, तय किए गए स्कैनर पर विकल्प सेट करता है. साथ ही, एक प्रॉमिस दिखाता है. यह प्रॉमिस, SetOptionsResponse ऑब्जेक्ट के साथ रिज़ॉल्व होता है. इस ऑब्जेक्ट में, पास किए गए OptionSetting ऑब्जेक्ट के क्रम में हर वैल्यू को सेट करने की कोशिश का नतीजा होता है. अगर किसी कॉलबैक का इस्तेमाल किया जाता है, तो ऑब्जेक्ट को इसके बजाय पास किया जाता है.

पैरामीटर

  • scannerHandle

    स्ट्रिंग

    स्कैनर का हैंडल, जिस पर विकल्प सेट किए जाते हैं. यह ऐसी वैल्यू होनी चाहिए जो पहले openScanner को कॉल करने पर मिली हो.

  • विकल्प

    स्कैनर पर लागू किए जाने वाले OptionSetting ऑब्जेक्ट की सूची.

रिटर्न

startScan()

Chrome 125 या इसके बाद के वर्शन
chrome.documentScan.startScan(
  scannerHandle: string,
  options: StartScanOptions,
)
: Promise<StartScanResponse>

यह फ़ंक्शन, तय किए गए स्कैनर पर स्कैन शुरू करता है. साथ ही, एक प्रॉमिस दिखाता है, जो StartScanResponse के साथ रिज़ॉल्व होता है. अगर किसी कॉलबैक का इस्तेमाल किया जाता है, तो ऑब्जेक्ट को इसके बजाय पास किया जाता है. अगर कॉल पूरा हो जाता है, तो जवाब में एक जॉब हैंडल शामिल होता है. इसका इस्तेमाल बाद के कॉल में स्कैन डेटा को पढ़ने या स्कैन को रद्द करने के लिए किया जा सकता है.

पैरामीटर

  • scannerHandle

    स्ट्रिंग

    खुले हुए स्कैनर का हैंडल. यह ऐसी वैल्यू होनी चाहिए जो पहले openScanner को कॉल करने पर मिली हो.

  • विकल्प

    StartScanOptions ऑब्जेक्ट, स्कैन के लिए इस्तेमाल किए जाने वाले विकल्पों के बारे में बताता है. StartScanOptions.format प्रॉपर्टी, स्कैनर के ScannerInfo में दिखाई गई किसी एक एंट्री से मेल खानी चाहिए.

रिटर्न