[data-vh-workflow]{font:16px/1.65 system-ui,sans-serif;max-width:960px;margin:24px auto;padding:24px;background:#111a22;color:#edf5fa;border:1px solid #3b4a56;border-radius:20px}[data-vh-workflow] *{box-sizing:border-box}[data-vh-workflow] label{display:block;margin:12px 0}[data-vh-workflow] input:not([type=checkbox]),[data-vh-workflow] textarea,[data-vh-workflow] select{display:block;width:100%;padding:12px;background:#1e2a35;color:#fff;border:1px solid #647987;border-radius:8px}[data-vh-workflow] input[type=checkbox]{width:20px;height:20px;vertical-align:middle}[data-vh-workflow] fieldset{border:1px solid #647987;margin:18px 0;padding:16px}[data-vh-workflow] button,.vh-w-download{display:inline-block;background:#5ce0c2;color:#06251f;padding:12px 18px;border:0;border-radius:8px;font:inherit;margin:10px 8px 10px 0;cursor:pointer;text-decoration:none}[data-vh-workflow] button:disabled{opacity:.45;cursor:default}[data-vh-workflow] #results>div{padding:12px 0;border-bottom:1px solid #3b4a56}[data-vh-workflow] #status{white-space:pre-wrap;overflow-wrap:anywhere}[data-vh-workflow] h2{color:#fff}[data-vh-workflow] video{max-width:100%}.vh-w-copy{max-width:960px;margin:auto}.vh-w-copy p{line-height:1.8}.vh-w-cover{width:min(100%,520px);height:auto;border-radius:16px;display:block;margin:20px auto}@media(min-width:720px){[data-vh-workflow] #fields{display:grid;grid-template-columns:1fr 1fr;gap:0 24px}[data-vh-workflow] #fields>p,[data-vh-workflow] #fields>button{grid-column:1/-1}}@media(max-width:500px){[data-vh-workflow]{padding:16px}}
अपने वास्तविक काम की CSV और प्लान की credit दर से खर्च निकालें। Retry प्रतिशत जोड़ें, शामिल credits घटाएँ और shortfall के लिए पूरे extra packs का हिसाब देखें। CSV और JSON report डाउनलोड करें।
काम और credits का हिसाब
Enable JavaScript to use this tool.
(function(){
‘use strict’;
const root=document.querySelector(‘[data-vh-workflow]’);if(!root)return;
const mode=root.dataset.vhWorkflow,hi=root.dataset.lang===’hi’;
const $=s=>root.querySelector(s),t=(en,h)=>hi?h:en;
const enc=new TextEncoder();
const esc=s=>String(s).replace(/[&”‘]/g,c=>({‘&’:’&’,”:’>’,'”‘:’"’,”‘”:’'’}[c]));
const cleanName=s=>String(s).normalize(‘NFKC’).replace(/[^p{L}p{N}_-]+/gu,’-‘).replace(/^-+|-+$/g,”).slice(0,70)||’file’;
const crcTable=Array.from({length:256},(_,n)=>{for(let j=0;j>>1):n>>>1;return n>>>0});
function crc(a){let c=0xffffffff;for(const b of a)c=crcTable[(c^b)&255]^(c>>>8);return(c^0xffffffff)>>>0;}
async function zip(files){let chunks=[],central=[],offset=0;for(const f of files){const name=enc.encode(f.name),data=new Uint8Array(await f.blob.arrayBuffer()),sum=crc(data);let h=new Uint8Array(30+name.length),v=new DataView(h.buffer);v.setUint32(0,0x04034b50,true);v.setUint16(4,20,true);v.setUint16(6,0×800,true);v.setUint16(12,33,true);v.setUint32(14,sum,true);v.setUint32(18,data.length,true);v.setUint32(22,data.length,true);v.setUint16(26,name.length,true);h.set(name,30);chunks.push(h,data);let c=new Uint8Array(46+name.length),w=new DataView(c.buffer);w.setUint32(0,0x02014b50,true);w.setUint16(4,20,true);w.setUint16(6,20,true);w.setUint16(8,0×800,true);w.setUint16(14,33,true);w.setUint32(16,sum,true);w.setUint32(20,data.length,true);w.setUint32(24,data.length,true);w.setUint16(28,name.length,true);w.setUint32(42,offset,true);c.set(name,46);central.push(c);offset+=h.length+data.length;}let size=central.reduce((a,b)=>a+b.length,0),end=new Uint8Array(22),v=new DataView(end.buffer);v.setUint32(0,0x06054b50,true);v.setUint16(8,files.length,true);v.setUint16(10,files.length,true);v.setUint32(12,size,true);v.setUint32(16,offset,true);return new Blob([…chunks,…central,end],{type:’application/zip’});}
const jsonBlob=o=>new Blob([JSON.stringify(o,null,2)],{type:’application/json’});
const csvCell=x=>'”‘+String(x??”).replace(/”/g,'””‘)+'”‘;
const csvBlob=rows=>new Blob([‘ufeff’+rows.map(r=>r.map(csvCell).join(‘,’)).join(‘rn’)],{type:’text/csv;charset=utf-8′});
const report=rows=>({name:’report.csv’,blob:csvBlob(rows)});
let outputs=[],urls=[];
function reset(){urls.forEach(URL.revokeObjectURL);urls=[];outputs=[];$(‘#results’).replaceChildren();$(‘#zip’).disabled=true;}
function link(f){const a=document.createElement(‘a’),u=URL.createObjectURL(f.blob);urls.push(u);a.href=u;a.download=f.name;a.textContent=t(‘Download ‘,’डाउनलोड ‘)+f.name;a.className=’vh-w-download’;return a;}
function add(f,note){outputs.push(f);const div=document.createElement(‘div’),a=link(f);div.append(a);if(f.blob.type.startsWith(‘image/’)){const im=document.createElement(‘img’);im.src=a.href;im.alt=f.name;im.style.cssText=’display:block;max-width:240px;max-height:240px;object-fit:contain;background:white’;div.append(im);}if(note){const p=document.createElement(‘p’);p.textContent=note;div.append(p);}$(‘#results’).append(div);$(‘#zip’).disabled=false;}
const status=s=>{$(‘#status’).textContent=s;};
async function loadImage(file){if(file.size>30*1024*1024)throw Error(t(‘Image exceeds 30 MB.’,’फोटो 30 MB से बड़ी है।’));let u=URL.createObjectURL(file);try{let im=new Image();im.src=u;await im.decode();if(im.naturalWidth*im.naturalHeight>40000000)throw Error(t(‘Image exceeds 40 megapixels.’,’फोटो 40 megapixels से बड़ी है।’));return im;}finally{URL.revokeObjectURL(u);}}
function number(value,min,max,label){if(String(value).trim()===”)throw Error(label+’ is required’);let n=Number(value);if(/width|height|long side/i.test(label)&&!Number.isInteger(n))throw Error(label+’ must be an integer’);if(!Number.isFinite(n)||nmax)throw Error(label+’ ‘+min+’–’+max);return n;}
function draw(im,width,height,fit,box){let c=document.createElement(‘canvas’);c.width=width;c.height=height;let ctx=c.getContext(‘2d’);ctx.fillStyle=’#fff’;ctx.fillRect(0,0,width,height);let sx=box?.x||0,sy=box?.y||0,sw=box?.w||im.naturalWidth,sh=box?.h||im.naturalHeight;let scale=fit===’crop’?Math.max(width/sw,height/sh):Math.min(width/sw,height/sh);ctx.drawImage(im,sx,sy,sw,sh,(width-sw*scale)/2,(height-sh*scale)/2,sw*scale,sh*scale);return c;}
async function encode(c,type,q){let b=await new Promise(r=>c.toBlob(r,type,q));if(!b||b.type!==type)throw Error(t(‘Output format is unsupported in this browser.’,’यह output format इस browser में समर्थित नहीं है।’));return b;}
async function compress(c,type,maxKB){let max=Math.floor(maxKB*1024);let best=null,lo=.02,hiQ=.98;let low=await encode(c,type,lo);if(low.size>max)throw Error(t(‘Cannot meet the KB limit at these dimensions. Increase KB or reduce dimensions.’,’इन dimensions पर KB सीमा पूरी नहीं हो रही। KB बढ़ाएँ या dimensions घटाएँ।’));best=low;for(let j=0;j<10;j++){let q=(lo+hiQ)/2,b=await encode(c,type,q);if(b.size<=max){best=b;lo=q;}else hiQ=q;}return best;}
function inkBox(im){let c=draw(im,Math.min(im.naturalWidth,1200),Math.max(1,Math.round(im.naturalHeight*Math.min(im.naturalWidth,1200)/im.naturalWidth)),'fit'),ctx=c.getContext('2d'),d=ctx.getImageData(0,0,c.width,c.height).data;let left=c.width,top=c.height,right=-1,bottom=-1;for(let y=0;y<c.height;y++)for(let x=0;x<c.width;x++){let i=(y*c.width+x)*4;if(d[i]+d[i+1]+d[i+2]<540){left=Math.min(left,x);right=Math.max(right,x);top=Math.min(top,y);bottom=Math.max(bottom,y);}}if(right<left)throw Error(t('No dark handwriting detected. Disable margin trimming or upload a clearer scan.','गहरी लिखावट नहीं मिली। Margin trim बंद करें या साफ scan डालें।'));let pad=Math.max(6,Math.round(c.width*.02)),s=im.naturalWidth/c.width;left=Math.max(0,left-pad);top=Math.max(0,top-pad);right=Math.min(c.width-1,right+pad);bottom=Math.min(c.height-1,bottom+pad);return{x:left*s,y:top*s,w:(right-left+1)*s,h:(bottom-top+1)*s};}
function input(label,id,value,type='number'){return '‘;}
const fileField=(label,id,multiple=false,accept=’image/*’)=>’‘;
function mount(ui){$(‘#fields’).innerHTML=ui;}
const dims=input(t(‘Width px’,’चौड़ाई px’),’width’,800)+input(t(‘Height px’,’ऊँचाई px’),’height’,400)+input(t(‘Maximum KB’,’अधिकतम KB’),’max’,100);
const batchSettings=input(t(‘Maximum width px’,’अधिकतम चौड़ाई px’),’width’,1200)+input(t(‘Maximum height px’,’अधिकतम ऊँचाई px’),’height’,1200)+input(t(‘Maximum KB per image’,’हर फोटो का अधिकतम KB’),’max’,100)+input(t(‘Filename prefix’,’फाइल नाम prefix’),’prefix’,’image’,’text’);
if(mode===’form-pack’){
mount([‘photo’,’signature’,’thumb’,’declaration’].map((k,i)=>’
‘).join(”)+’
‘+esc(t(‘Example dimensions only. Enter the specifications in your current notification. Blank slots are skipped; no admission or portal acceptance guarantee.’,’Dimensions केवल उदाहरण हैं। अपने वर्तमान notification की शर्तें भरें। खाली स्लॉट छोड़ दिए जाएँगे; फॉर्म स्वीकार होने की गारंटी नहीं।’))+’
‘);
}else if(mode===’declaration-pack’||mode===’thumb-pack’){
mount(fileField(t(‘Upload your own scan’,’अपना scan डालें’),’files’,true)+dims+input(t(‘Minimum KB (0 = no minimum)’,’न्यूनतम KB (0 = कोई minimum नहीं)’),’min’,0)+’‘);
if(mode===’thumb-pack’){$(‘#width’).value=240;$(‘#height’).value=240;$(‘#max’).value=50;}
}else if(mode===’batch-kb’||mode===’website-pack’){
mount(fileField(t(‘Up to 40 images; maximum total 120 MB’,’40 फोटो तक; कुल अधिकतम 120 MB’),’files’,true)+batchSettings+’‘);
if(mode===’website-pack’)$(‘#format’).value=’image/webp’;
}else if(mode===’hindi-pdf’){
mount(fileField(t(‘PDF with selectable text (maximum 20 MB)’,’Selectable text वाला PDF (अधिकतम 20 MB)’),’files’,false,’.pdf,application/pdf’)+’‘+’
‘+esc(t(‘Scanned PDFs need OCR. Select Kruti Dev only for PDFs entirely encoded in Kruti Dev 010; mixed English or Unicode text can be damaged. Review the output.’,’Scanned PDF के लिए OCR चाहिए। Kruti Dev केवल पूरी तरह Kruti Dev 010 में encoded PDF के लिए चुनें; mixed English या Unicode text बिगड़ सकता है। Output जाँचें।’))+’
‘);
$(‘#reexport’).onclick=()=>{reset();add({name:’reviewed-hindi.txt’,blob:new Blob([$(‘#text’).value],{type:’text/plain;charset=utf-8′})});};
}else if(mode===’social-video’){
mount(fileField(t(‘Video (up to 100 MB / 60 seconds)’,’वीडियो (100 MB / 60 सेकंड तक)’),’files’,false,’video/*’)+input(t(‘Output long side px (240–720)’,’Output long side px (240–720)’),’width’,720)+’
‘+esc(t(‘Creates 9:16, 1:1 and 16:9 WebM exports with white padding. Keeps full frame; audio requires browser captureStream support. Exports run in real time. No subtitle or MP4 conversion is included.’,’9:16, 1:1 और 16:9 WebM में सफेद padding के साथ export होगा। पूरा frame रहेगा; audio के लिए browser में captureStream समर्थन चाहिए। Export वास्तविक समय लेता है। Subtitle या MP4 conversion शामिल नहीं है।’))+’
‘);
}else if(mode===’ai-audit’){
mount(fileField(t(‘Usage CSV: task,quantity,credits_per_unit,retries_percent’,’Usage CSV: task,quantity,credits_per_unit,retries_percent’),’files’,false,’.csv,text/csv’)+’‘+input(t(‘Monthly subscription cost (your currency)’,’मासिक subscription खर्च (आपकी currency)’),’price’,0)+input(t(‘Included monthly credits’,’हर महीने शामिल credits’),’included’,0)+input(t(‘Extra credit pack size’,’Extra credit pack का आकार’),’pack’,1000)+input(t(‘Extra credit pack price’,’Extra credit pack की कीमत’),’packprice’,0)+input(t(‘Currency label’,’Currency label’),’currency’,’INR’,’text’)+’
‘+esc(t(‘Enter prices and credit rates from your plan. Credits differ by provider; tokens, images and video seconds must be converted to the provider’s credits first. No live price feed or model recommendation.’,’अपने प्लान की कीमत और credit दर भरें। हर provider के credits अलग हैं; tokens, images और video seconds को पहले उसी provider के credits में बदलें। Live prices या model recommendation नहीं।’))+’
‘);
$(‘#sample’).onclick=()=>{let f={name:’ai-usage-template.csv’,blob:csvBlob([[‘task’,’quantity’,’credits_per_unit’,’retries_percent’],[‘images’,30,10,20],[‘video_seconds’,60,5,10]])};$(‘#results’).append(link(f));};
}
let cancelled=false; if($(‘#cancel’))$(‘#cancel’).onclick=()=>{cancelled=true;status(t(‘Stopping current export…’,’वर्तमान export रोका जा रहा है…’));};
function parseCSV(s){s=s.replace(/^ufeff/,”);let rows=[],row=[],val=”,quoted=false;for(let i=0;ix.trim()))rows.push(row);row=[];val=”;}else val+=c;}if(quoted)throw Error(‘Unclosed CSV quote’);row.push(val);if(row.some(x=>x.trim()))rows.push(row);return rows;}
function audit(rows,price,included,pack,packprice){if(rows[0]?.join(‘,’)!==’task,quantity,credits_per_unit,retries_percent’)throw Error(‘Use CSV template headers exactly’);let total=0,items=rows.slice(1).map((r,i)=>{if(r.length!==4)throw Error(‘CSV row ‘+(i+2)+’: expected 4 columns’);let q=number(r[1],0,1e9,’quantity’),rate=number(r[2],0,1e9,’credits_per_unit’),retry=number(r[3],0,1000,’retries_percent’);let credits=q*rate*(1+retry/100);total+=credits;return{task:r[0],quantity:q,credits_per_unit:rate,retries_percent:retry,credits};});let short=Math.max(0,total-included),packs=Math.ceil(short/pack);return{items,total_credits:total,included_credits:included,shortfall_credits:short,extra_packs:packs,estimated_cost:price+packs*packprice,subscription_cost:price,extra_cost:packs*packprice};}
async function videoExport(file){if(!window.MediaRecorder)throw Error(‘MediaRecorder unsupported’);if(file.size>100*1024*1024)throw Error(‘Maximum 100 MB’);const url=URL.createObjectURL(file),v=document.createElement(‘video’);v.src=url;v.preload=’auto’;v.playsInline=true;v.controls=true;root.append(v);await new Promise((res,rej)=>{v.onloadedmetadata=res;v.onerror=()=>rej(Error(‘Video cannot be decoded’));});let src=null;try{if(!Number.isFinite(v.duration)||v.duration>60)throw Error(‘Maximum duration: 60 seconds’);if(!v.captureStream)throw Error(‘Audio-preserving captureStream unsupported; use desktop Chrome’);let side=number($(‘#width’).value,240,720,’long side’);let mime=[‘video/webm;codecs=vp9,opus’,’video/webm;codecs=vp8,opus’,’video/webm’].find(x=>MediaRecorder.isTypeSupported(x));if(!mime)throw Error(‘WebM recording unsupported’);for(const [label,ratio] of [[‘portrait’,9/16],[‘square’,1],[‘landscape’,16/9]]){if(cancelled)break;status(t(‘Exporting ‘,’Export हो रहा है: ‘)+label);v.currentTime=0;src=v.captureStream();let c=document.createElement(‘canvas’);c.width=Math.round(ratio<1?side*ratio:side);c.height=Math.round(ratiostream.addTrack(a));let rec=new MediaRecorder(stream,{mimeType:mime,videoBitsPerSecond:1500000}),chunks=[],raf;let painting=true;function paint(){if(!painting)return;ctx.fillStyle=’#fff’;ctx.fillRect(0,0,c.width,c.height);let s=Math.min(c.width/v.videoWidth,c.height/v.videoHeight);ctx.drawImage(v,(c.width-v.videoWidth*s)/2,(c.height-v.videoHeight*s)/2,v.videoWidth*s,v.videoHeight*s);raf=requestAnimationFrame(paint);}paint();let done=new Promise((res,rej)=>{rec.ondataavailable=e=>{if(e.data.size)chunks.push(e.data);};rec.onerror=()=>rej(Error(‘Recording failed’));rec.onstop=res;});rec.start(500);await v.play();await new Promise(res=>{v.onended=res;const timer=setInterval(()=>{if(cancelled||v.ended){clearInterval(timer);res();}},100);v.onended=()=>{clearInterval(timer);res();};});v.pause();rec.stop();await done;painting=false;cancelAnimationFrame(raf);stream.getTracks().forEach(x=>x.stop());src.getTracks().forEach(x=>x.stop());if(cancelled)break;let blob=new Blob(chunks,{type:’video/webm’});if(!blob.size)throw Error(‘Empty video export’);add({name:cleanName(file.name.replace(/.[^.]+$/,”))+’-‘+label+’.webm’,blob},c.width+’×’+c.height+’ · ‘+t(‘Check audio and frames before posting.’,’पोस्ट करने से पहले audio और frames जाँचें।’));}}finally{v.pause();src?.getTracks().forEach(x=>x.stop());v.remove();URL.revokeObjectURL(url);}}
$(‘#run’).onclick=async()=>{reset();cancelled=false;$(‘#run’).disabled=true;status(t(‘Processing…’,’प्रोसेस हो रहा है…’));try{
if(mode===’form-pack’){
let rows=[[‘slot’,’filename’,’width’,’height’,’bytes’,’max_kb’,’status’]];for(const k of [‘photo’,’signature’,’thumb’,’declaration’]){let f=$(‘#’+k).files[0];if(!f)continue;let w=number($(‘#’+k+’-w’).value,1,4000,’width’),h=number($(‘#’+k+’-h’).value,1,4000,’height’),kb=number($(‘#’+k+’-max’).value,1,5000,’KB’);let im=await loadImage(f),c=draw(im,w,h,’fit’),b=await compress(c,’image/jpeg’,kb);let n=k+’.jpg’;add({name:n,blob:b},w+’×’+h+’ · ‘+(b.size/1024).toFixed(1)+’ KB’);rows.push([k,n,w,h,b.size,kb,’size and dimensions checked’]);}if(!outputs.length)throw Error(t(‘Choose at least one image.’,’कम से कम एक फोटो चुनें।’));add(report(rows));
}else if([‘declaration-pack’,’thumb-pack’,’batch-kb’,’website-pack’].includes(mode)){
let files=Array.from($(‘#files’).files);if(!files.length)throw Error(t(‘Choose images first.’,’पहले फोटो चुनें।’));if(files.length>40||files.reduce((n,f)=>n+f.size,0)>120*1024*1024)throw Error(‘Maximum 40 images / 120 MB total’);let w=number($(‘#width’).value,1,4000,’width’),h=number($(‘#height’).value,1,4000,’height’),kb=number($(‘#max’).value,1,5000,’KB’),type=$(‘#format’)?.value||’image/jpeg’;let rows=[[‘input’,’output’,’width’,’height’,’bytes’,’status’]],manifest=[];for(let i=0;i<files.length;i++){let f=files[i];status((i+1)+' / '+files.length);try{let im=await loadImage(f),ww=w,hh=h,box=null;let batch=['batch-kb','website-pack'].includes(mode);if(batch){let scale=Math.min(1,w/im.naturalWidth,h/im.naturalHeight);ww=Math.max(1,Math.round(im.naturalWidth*scale));hh=Math.max(1,Math.round(im.naturalHeight*scale));}else if($('#trim').checked)box=inkBox(im);let c=draw(im,ww,hh,'fit',box),b=await compress(c,type,kb),min=$('#min')?number($('#min').value,0,kb,'min KB'):0;let note=b.size20*1024*1024)throw Error(‘Choose a PDF up to 20 MB’);if(!window.pdfjsLib)throw Error(‘PDF library did not load’);let pdf=await pdfjsLib.getDocument({data:new Uint8Array(await f.arrayBuffer())}).promise;try{if(pdf.numPages>100)throw Error(‘Maximum 100 pages’);let pages=[];for(let i=1;i3)lines+=’n’;lines+=item.str+(item.hasEOL?’n’:’ ‘);lastY=y;}if($(‘#encoding’).value===’kruti’){if(/[u0900-u097f]/.test(lines))throw Error(‘Already-Unicode text detected. Select Unicode instead.’);lines=vhKrutiToUnicode(lines);}let s=lines.normalize(‘NFC’).replace(/[u200BuFEFF]/g,”).replace(/[ t]+/g,’ ‘).trim();if($(‘#join’).checked)s=s.replace(/n+/g,’ ‘);pages.push({page:i,text:s});status(i+’ / ‘+pdf.numPages);}if(!pages.some(p=>p.text))throw Error(‘No selectable text found. This PDF needs OCR.’);$(‘#text’).value=pages.map(p=>’— ‘+p.page+’ —n’+p.text).join(‘nn’);add({name:’extracted-hindi.txt’,blob:new Blob([$(‘#text’).value],{type:’text/plain;charset=utf-8′})});add({name:’pages.json’,blob:jsonBlob(pages)});}finally{await pdf.destroy();}
}else if(mode===’social-video’){let f=$(‘#files’).files[0];if(!f)throw Error(‘Choose a video’);await videoExport(f);
}else if(mode===’ai-audit’){
let f=$(‘#files’).files[0];if(!f||f.size>1024*1024)throw Error(‘Choose CSV up to 1 MB’);let rows=parseCSV(await f.text());if(rows.length>1001)throw Error(‘Maximum 1000 tasks’);let a=audit(rows,number($(‘#price’).value,0,1e9,’price’),number($(‘#included’).value,0,1e12,’included’),number($(‘#pack’).value,1,1e12,’pack’),number($(‘#packprice’).value,0,1e9,’packprice’));a.currency=$(‘#currency’).value;add({name:’ai-credit-audit.json’,blob:jsonBlob(a)},t(‘Estimated monthly cost: ‘,’अनुमानित मासिक खर्च: ‘)+a.estimated_cost.toFixed(2)+’ ‘+a.currency+’ · ‘+a.total_credits.toFixed(2)+’ credits’);add(report([[‘task’,’quantity’,’credits_per_unit’,’retries_percent’,’estimated_credits’],…a.items.map(i=>[i.task,i.quantity,i.credits_per_unit,i.retries_percent,i.credits])]));
}
status(cancelled?t(‘Cancelled. Completed exports remain available.’,’रोक दिया। पूरे हुए exports डाउनलोड कर सकते हैं।’):t(‘Finished. Review outputs and report before use.’,’पूरा हुआ। उपयोग से पहले output और report जाँचें।’));
}catch(e){status(e.message);}finally{$(‘#run’).disabled=false;}};
$(‘#zip’).onclick=async()=>{let b=$(‘#zip’);b.disabled=true;try{let z=await zip(outputs);let f={name:mode+’-pack.zip’,blob:z};$(‘#results’).append(link(f));}catch(e){status(e.message);}finally{b.disabled=false;}};
window.VHWorkflowTest={parseCSV,audit,crc,zip,cleanName};
})();
कैसे उपयोग करें
- ऊपर बताई गई input file चुनें। पहले छोटे sample से शुरुआत करें।
- अपने काम की वास्तविक settings भरें। फॉर्म के लिए उसी भर्ती या आवेदन का वर्तमान notification देखें।
- पैक बनाएँ दबाएँ। नीचे status और अलग-अलग output देखें।
- हर output खोलकर जाँचें। Report सहित ZIP डाउनलोड करें।
Report को कैसे पढ़ें
Image report में source नाम, output नाम, चौड़ाई, ऊँचाई और bytes आते हैं। PASS केवल दी गई आकार सीमा का परिणाम है। BELOW_MINIMUM_REVIEW का अर्थ है कि output आपके minimum से छोटा है। ऐसे output को सही बताए बिना review के लिए रखा जाता है। असफल files की वजह report में मिलेगी; बाकी files का output फिर भी डाउनलोड कर सकते हैं।
जानकारी और सीमाएँ
अपने वास्तविक काम की CSV और प्लान की credit दर से खर्च निकालें। Retry प्रतिशत जोड़ें, शामिल credits घटाएँ और shortfall के लिए पूरे extra packs का हिसाब देखें। CSV और JSON report डाउनलोड करें।
File size और दृश्य गुणवत्ता अलग बातें हैं। Handwriting, छाप, बारीक अक्षर या वीडियो की आवाज केवल bytes की जाँच से सत्यापित नहीं होते। मूल file को संभालकर रखें और output को इस्तेमाल से पहले देखें। किसी tool की size report को आवेदन स्वीकार होने या डेटा पूरी तरह सही होने की गारंटी न मानें।
Privacy
Input files browser में process होती हैं; यह workflow processing के लिए उन्हें server पर नहीं भेजता। PDF reader की library download के लिए network चाहिए। कम RAM वाले फोन पर कम और छोटी files उपयोग करें। पेज बंद करने से अस्थायी results चले जाएँगे, इसलिए पहले डाउनलोड करें।
FAQ
क्या यह API वाला AI tool है?
नहीं। Processing और calculations आपके browser में होते हैं। AI credits report में आप अपने प्लान की दरें भरते हैं।
क्या settings पहले से official हैं?
नहीं। दिखाई गई dimensions उदाहरण हैं। अपने वर्तमान form की requirements स्वयं भरें।
क्या ZIP के अलावा अलग file मिलती है?
हाँ। हर output का अलग download link भी है। ZIP बनाना वैकल्पिक है।
क्या सभी mobile browsers पर चलेगा?
Image और text workflows modern browsers के लिए हैं। Video export को MediaRecorder और audio captureStream चाहिए; समर्थित desktop Chrome पर पहले जाँचें।
Output गलत या अधूरा लगे तो?
मूल file से तुलना करें, settings बदलें और फिर चलाएँ। PDF में केवल image हो तो OCR चाहिए; font encoding खराब हो तो अलग font converter चाहिए।
संबंधित टूल
n