اذهب إلى المحتوى
  • 0

كيف أطبع الصفحة بدون فتحها في electron?

Mohamed Lamin Mahmoudi

السؤال

 عندي وصفة أريد أن أطبعها  بدون أن أفتح صفحة html الخاصة بها 

main.js

ipcMain.on('open-recip',function(e,data){
  var opti = {
    silent: false,
    printBackground: true,
    color: false,
    margin: {
      marginType: 'printableArea'
    },
    landscape: false,
    pagesPerSheet: 1,
    collate: false,
    copies: 1,
    header: 'Header of the Page',
    footer: 'Footer of the Page'
  }
  
  let win = new BrowserWindow({
		show: false,
		webPreferences: {
			nodeIntegration: true
		}
	});
	win.loadFile('recipe.html');
  
	win.webContents.on('did-finish-load', () => {
 
    win.webContents.send('dataRecipe',data);
		win.webContents.print(opti, (success, failureReason) => {
      
     
			if (!success) console.log(failureReason);
			console.log('Print Initiated');
      
		});
	});
 
 
 

index.js

const {ipcRenderer} =require('electron');
ipcRenderer.on('dataRecipe',function(){
  let Name=document.getElementById('name');
  let  Age =document.getElementById('age');
  
  let textname=document.createTextNode(window.localStorage.getItem('name'));
  let textage=document.createTextNode(window.localStorage.getItem('Age'));
  console.log(textage);
  console.log(textname);
  Name.appendChild(textname);
  Age.appendChild(textage);
  
  let DrugsLoc=window.localStorage.getItem('Drugs');
  console.log(DrugsLoc.split(',').slice(1));
  let  Drugs=DrugsLoc.split(',').slice(1);
  let i=0;
  let nameD;
  let nameS;
  let form;
  let des;
  while(i<Drugs.length){
      console.log(Drugs[i]);
        nameD= Drugs[i++];
        nameS=Drugs[i++];
        form=Drugs[i++];
        des=Drugs[i++];
        let ul = document.querySelector("ul");
  let li = document.createElement("li");
  li.innerHTML =
   nameD+
    "(" +
    nameS+
    ")" +
    form +
    "<div>" +
    des;
    "</div>"; 
  ul.append(li);
  }
})

المشكل هو أن الوصفة تطبع فارغة ولا تظهر عليها البيانات المدخلة فيها من الذاكرة المحلية ! سابقا كنت أفتح الوصفة لأتاكد من ظهور البيانات فيها وكانت تظهر أما الان أريد ان اطبع الوصفة بدون فتح الصفحة كيف افعل ذلك ؟

رابط هذا التعليق
شارك على الشبكات الإجتماعية

Recommended Posts

  • 0

لطباعة الصفحة بصورة تلقائية دون فتح واجهة المستخدم يمكنك إستعمال المفتاح silent:true في دالة print بعد وضعها داخل event listener وكما يلي

	 
	ipcMain.on("PRINT", function (e, params) {
	 
	  mainWindow.webContents.print({silent:true}, function (success, failureReason){
	 
	    if(failureReason) {
	 
	        console.log('###printing failure reason###', failureReason)
	 
	    }
	 
	  })
	 
	}
	 
	

 

نرسل ال event "PRINT" بعد تعريفه  من مكان إرساله.يمكنك تعيينه من مكان الضغط على زر الطباعة بإستخدام ipcRenderer

	 
	...
	 
	<script>
	 
	var directPrint= function(){
	 
	ipcRenderer.send("PRINT")
	 
	}
	 
	</script>
	 
	...
	 
	<button onclick="directPrint"> Print</button>
	 
	


عند الضغط على زر print المعرف أعلاه سيتم إرسال event إسمه "PRINT"  يتم إستقباله من قبل ipcMain

ثم تنفيذ الطباعة بنجاح في حال لم تكن هناك مشكلة  success أو إخراج خطأ فشل الطباعة من خلال , failureReason

الأمثلة أعلاه هي افتراضية كون أنك لم تدرج كامل الكود المطلوب. لكن الغرض منها توضيح سبب المشكلة. ربما يتعين عليك إعادة كتابة ملف main.js  بشكل أفضل ليعمل معك الحل الذي طرحته. أذا واجهت صعوبة في تطبيقه يرجى أدراج ملف المشروع بدون node_modules 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 9 ساعات قال علي محسن:

......

لطباعة الصفحة بصورة تلقائية دون فتح واجهة المستخدم يمكنك إستعمال المفتاح silent:true في دالة print بعد وضعها داخل event listener وكما يلي

 

 


	 
	ipcMain.on("PRINT", function (e, params) {
	 
	  mainWindow.webContents.print({silent:true}, function (success, failureReason){
	 
	    if(failureReason) {
	 
	        console.log('###printing failure reason###', failureReason)
	 
	    }
	 
	  })
	 
	}
	 
	

 


 

نرسل ال event "PRINT" بعد تعريفه  من مكان إرساله.يمكنك تعيينه من مكان الضغط على زر الطباعة بإستخدام ipcRenderer

 

 


	 
	...
	 
	<script>
	 
	var directPrint= function(){
	 
	ipcRenderer.send("PRINT")
	 
	}
	 
	</script>
	 
	...
	 
	<button onclick="directPrint"> Print</button>
	 
	

 


عند الضغط على زر print المعرف أعلاه سيتم إرسال event إسمه "PRINT"  يتم إستقباله من قبل ipcMain

ثم تنفيذ الطباعة بنجاح في حال لم تكن هناك مشكلة  success أو إخراج خطأ فشل الطباعة من خلال , failureReason

الأمثلة أعلاه هي افتراضية كون أنك لم تدرج كامل الكود المطلوب. لكن الغرض منها توضيح سبب المشكلة. ربما يتعين عليك إعادة كتابة ملف main.js  بشكل أفضل ليعمل معك الحل الذي طرحته. أذا واجهت صعوبة في تطبيقه يرجى أدراج ملف المشروع بدون node_modules 

نفس الشئ مزال يطبع الصفحة فارغة وانا أريده أن يطبعها مملوءة بالبيانات المحقونة فيها من ملف js

win.webContents.on('did-finish-load', () => {
 
    win.webContents.send('dataRecipe',data);
		win.webContents.print({silent:true},function (success, failureReason)  {
			if (!success) console.log(failureReason);
			console.log('Print Initiated');
      
		});
	});
 

حدث الضغط على الزر مكتوب في الملف drug.js صفحة html الخاصة به هي drug.html 

ملف الوصفة هو recipe.html 

ges.rar

تم التعديل في بواسطة Mohamed Lamin Mahmoudi
تعديل النص
رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0

عدل هذا الجزء من الكود في ملف main.js لديك وسيعمل معك

 
	ipcMain.on('open-recip',function(e,data){
	  var opti = {
	    silent: false,
	    printBackground: true,
	    color: false,
	    margin: {
	      marginType: 'printableArea'
	    },
	    landscape: false,
	    pagesPerSheet: 1,
	    collate: false,
	    copies: 1,
	    header: 'Header of the Page',
	    footer: 'Footer of the Page'
	  }
	  console.log
	  let win = new BrowserWindow({
	    show: false,
	    webPreferences: {
	      nodeIntegration: true,
	      contextIsolation: false  // هنا تكمن المشكلة تابع الشرح ادناه
	    }
	  });
	  win.loadFile('recipe.html');
	 
	  win.webContents.on('did-finish-load', () => {
	   
	    win.webContents.send('dataRecipe',data);
	    win.webContents.print({silent:true},function (success, failureReason)  {
	     
	     
	      if (!success) console.log(failureReason);
	      console.log('Print Initiated');
	     
	    });
	  });
	 
	 
	 
	 
	 
	  /* win.loadFile('recipe.html');
	  win.webContents.on('did-finish-load', ()=>{
	   
	    console.log(data);
	  });*/
	 
	}
	);
	

المشكلة أنك لم تفعل الوصول إلى دوال electron داخل ملف recipe.html المتربط به ملف recipe.js الذي يحتوي بدوره في أول سطر منه على إستيراد  ipcRenderer ,  كل هذا يتم بتفعيلك لهذا الخيار contextIsolation: false في قطعة الكود أعلاه.

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 21 ساعات قال علي محسن:

عدل هذا الجزء من الكود في ملف main.js لديك وسيعمل معك

 


 
	ipcMain.on('open-recip',function(e,data){
	  var opti = {
	    silent: false,
	    printBackground: true,
	    color: false,
	    margin: {
	      marginType: 'printableArea'
	    },
	    landscape: false,
	    pagesPerSheet: 1,
	    collate: false,
	    copies: 1,
	    header: 'Header of the Page',
	    footer: 'Footer of the Page'
	  }
	  console.log
	  let win = new BrowserWindow({
	    show: false,
	    webPreferences: {
	      nodeIntegration: true,
	      contextIsolation: false  // هنا تكمن المشكلة تابع الشرح ادناه
	    }
	  });
	  win.loadFile('recipe.html');
	 
	  win.webContents.on('did-finish-load', () => {
	   
	    win.webContents.send('dataRecipe',data);
	    win.webContents.print({silent:true},function (success, failureReason)  {
	     
	     
	      if (!success) console.log(failureReason);
	      console.log('Print Initiated');
	     
	    });
	  });
	 
	 
	 
	 
	 
	  /* win.loadFile('recipe.html');
	  win.webContents.on('did-finish-load', ()=>{
	   
	    console.log(data);
	  });*/
	 
	}
	);
	

 

المشكلة أنك لم تفعل الوصول إلى دوال electron داخل ملف recipe.html المتربط به ملف recipe.js الذي يحتوي بدوره في أول سطر منه على إستيراد  ipcRenderer ,  كل هذا يتم بتفعيلك لهذا الخيار contextIsolation: false في قطعة الكود أعلاه.

هل هناك طريقة أحدد بها حجم الورقة المراد طباعتها لأنه مباشرة يبدأ بطباعة الوصفة بحجم A4 وأنا أريد أن احدد حجمها ب A5???

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 4 دقائق مضت قال Mohamed Lamin Mahmoudi:

هل هناك طريقة أحدد بها حجم الورقة المراد طباعتها لأنه مباشرة يبدأ بطباعة الوصفة بحجم A4 وأنا أريد أن احدد حجمها ب A5???

إن كنت تستعمل أحد تابعي الطباعة 

contents.printToPDF(options)

أو

contents.print([options], [callback])

فيمكنك تحديد حجم الصفحة، من خلال تمرير الخاصية pageSize ضمن الكائن options

{
  marginsType: 0,
  printBackground: false,
  printSelectionOnly: false,
  landscape: false,
  pageSize: 'A4',
  scaleFactor: 100
}

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 44 دقائق مضت قال Wael Aljamal:

إن كنت تستعمل أحد تابعي الطباعة 


contents.printToPDF(options)

أو


contents.print([options], [callback])

فيمكنك تحديد حجم الصفحة، من خلال تمرير الخاصية pageSize ضمن الكائن options


{
  marginsType: 0,
  printBackground: false,
  printSelectionOnly: false,
  landscape: false,
  pageSize: 'A4',
  scaleFactor: 100
}

 

مازالت تطبع الصفحة بحجم كبير كيف أخرج نافذة التحديد لكي أحدد من خلالها الحجم ؟

var opti = {
    silent: false,
    printBackground: false,
    color: false,
    margin: {
      marginType: 'printableArea'
    },
    landscape: false,
    pagesPerSheet: 1,
    collate: false,
    copies: 1,
   // header: 'Header of the Page',
   // footer: 'Footer of the Page',
    pageSize:'A5',
    scaleFactor:100
  }
  
  let win = new BrowserWindow({
		show: false,
		webPreferences: {
			nodeIntegration: true,
      contextIsolation: false
		}
	});
	win.loadFile('recipe.html');
  
	win.webContents.on('did-finish-load', () => {
 
    win.webContents.send('dataRecipe');
		win.webContents.print(opti,function (success, failureReason)  {
			if (!success) console.log(failureReason);
			console.log('Print Initiated');
      
		});
	});
 

 

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 34 دقائق مضت قال Mohamed Lamin Mahmoudi:

مازالت تطبع الصفحة بحجم كبير كيف أخرج نافذة التحديد لكي أحدد من خلالها الحجم ؟



 

طالما أن الإعدادات لديك ثابتة، ما سبب عدم طباعة الصفحة بالحجم المطلوب؟ أنت تحدد الكائن opti مع خصائص ثابتة، ربما المشكلة شيء مختلف

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 8 دقائق مضت قال Wael Aljamal:

طالما أن الإعدادات لديك ثابتة، ما سبب عدم طباعة الصفحة بالحجم المطلوب؟ أنت تحدد الكائن opti مع خصائص ثابتة، ربما المشكلة شيء مختلف

هكذا تظهر بالحجم المطلوب لكن المحتوى لايظهر كاملا 

received_1042377739799838.jpeg

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ 38 دقائق مضت قال Mohamed Lamin Mahmoudi:

هكذا تظهر بالحجم المطلوب لكن المحتوى لايظهر كاملا 

إذا مشكلة تنسيق ومحاذاة.

حاول عرض الصفحة HTML وتأكد من أمها تظهر بالشكل المطلوب

ثم تابع العمل على الطباعة

رابط هذا التعليق
شارك على الشبكات الإجتماعية

  • 0
بتاريخ On 8/31/2022 at 19:45 قال Mohamed Lamin Mahmoudi:

هل هناك طريقة أحدد بها حجم الورقة المراد طباعتها لأنه مباشرة يبدأ بطباعة الوصفة بحجم A4 وأنا أريد أن احدد حجمها ب A5???

حاول تعديل إعدادات الطابعة الإفتراضية لديك default printer

رابط هذا التعليق
شارك على الشبكات الإجتماعية

انضم إلى النقاش

يمكنك أن تنشر الآن وتسجل لاحقًا. إذا كان لديك حساب، فسجل الدخول الآن لتنشر باسم حسابك.

زائر
أجب على هذا السؤال...

×   لقد أضفت محتوى بخط أو تنسيق مختلف.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   جرى استعادة المحتوى السابق..   امسح المحرر

×   You cannot paste images directly. Upload or insert images from URL.

  • إعلانات

  • تابعنا على



×
×
  • أضف...