การพิมพ์เอกสารโดยทางโปรแกรมหรือใช้กล่องโต้ตอบ
บทความนี้จะอธิบายวิธีการพิมพ์เอกสารประมวลผลคำจากแอปพลิเคชันบริการ ASP.NET หรือ Windows โดยใช้ Aspose.Words และ XpsPrint
API นอกจากนี้ยังสาธิตวิธีการพิมพ์เอกสารด้วยกล่องโต้ตอบการตั้งค่า การแสดงตัวอย่างก่อนพิมพ์ และความคืบหน้าการพิมพ์ และอธิบายวิธีลดเวลาในการโทรครั้งแรกเพื่อพิมพ์เอกสาร
การพิมพ์เอกสารบน Server ผ่าน XpsPrint
API
ส่วนนี้มีไว้สำหรับผู้ใช้ที่ต้องการส่งเอกสาร XPS ไปยัง XpsPrint API ที่ไม่มีการจัดการจากแอปพลิเคชัน .NET โดยใช้ Aspose.Words
ข้อจำกัดในการพิมพ์เอกสารในแอปพลิเคชันบริการ ASP.NET หรือ Windows
เมื่อพัฒนาแอปพลิเคชัน .NET ที่สร้างเอาต์พุตที่พิมพ์ออกมา โดยทั่วไปคุณสามารถใช้คลาสที่ให้ไว้ในเนมสเปซ System.Drawing.Printing หรือคลาส Windows Presentation Foundation (WPF) ได้ อย่างไรก็ตาม หากแอปพลิเคชันเป็นแอปพลิเคชันบริการ ASP.NET หรือ Windows ตัวเลือกสำหรับการพิมพ์จะถูกจำกัด เนื่องจาก Microsoft ไม่สนับสนุนให้ใช้แนวทางนี้ แอปพลิเคชันบริการไม่รองรับคลาสการพิมพ์ .NET Framework ซึ่งรวมถึงเพจ ASP ซึ่งโดยทั่วไปจะทำงานในบริบทของบริการเซิร์ฟเวอร์
คลาสภายในเนมสเปซ System.Drawing.Printing ไม่ได้รับการสนับสนุนสำหรับการใช้งานภายในบริการ Windows หรือแอปพลิเคชันหรือบริการ ASP.NET และการพยายามใช้งานอาจทำให้ประสิทธิภาพของบริการลดลง ข้อยกเว้นรันไทม์ และปัญหาอื่นๆ ไม่รองรับการใช้ WPF เพื่อสร้างบริการ Windows เช่นกัน เนื่องจาก WPF เป็นเทคโนโลยีการนำเสนอ บริการ Windows จึงต้องการสิทธิ์ที่เหมาะสมในการดำเนินการด้านภาพที่เกี่ยวข้องกับการโต้ตอบของผู้ใช้ หากบริการ Windows ไม่มีสิทธิ์ดังกล่าว อาจมีผลลัพธ์ที่ไม่คาดคิด
ออบเจ็กต์ Aspose.Words Document จัดเตรียมกลุ่มวิธี Print เพื่อพิมพ์เอกสาร วิธีการเหล่านี้ใช้คลาสการพิมพ์ .NET ที่กำหนดไว้ในเนมสเปซ System.Drawing.Printing มีลูกค้า Aspose.Words จำนวนมากที่สามารถนำไปใช้ในการพิมพ์ในแอปพลิเคชันฝั่งเซิร์ฟเวอร์ได้สำเร็จ อย่างไรก็ตาม บทความนี้จะสาธิตวิธีการอื่นในการพิมพ์ที่สอดคล้องกับคำแนะนำของ Microsoft
วิธีการพิมพ์เอกสารบน Server
วิธีที่เหมาะสมในการพิมพ์เอกสารตาม Microsoft คือการใช้ XpsPrint API ที่ไม่มีการจัดการ API นี้พร้อมใช้งานบน Windows 7, Windows Server 2008 R2 และบน Windows Vista หากติดตั้งการอัปเดตแพลตฟอร์มสำหรับ Windows Vista
เนื่องจาก Aspose.Words สามารถแปลงเอกสารใดๆ เป็น XPS ได้อย่างง่ายดาย คุณเพียงแค่เขียนโค้ดที่ส่งเอกสาร XPS ไปยัง XpsPrint
API เท่านั้น ปัญหาเดียวคือ XpsPrint
API ไม่มีการจัดการและต้องการความรู้บางอย่างเกี่ยวกับเทคโนโลยี Platform Invoid
หากต้องการพิมพ์เอกสาร Aspose.Words ให้คลาส XpsPrintHelper มีวิธีการพิมพ์แบบง่าย โดยที่คุณเพียงแค่ต้องระบุพารามิเตอร์ต่อไปนี้ (ดูรายละเอียดเพิ่มเติมในบทความ พิมพ์เอกสารผ่าน XPS API):
- เอกสารที่คุณต้องการพิมพ์
- ชื่อเครื่องพิมพ์
- ชื่องาน (ไม่บังคับ)
- ค่าบูลีน ระบุว่าโปรแกรมควรรอจนกว่างานพิมพ์จะเสร็จสิ้นหรือไม่ ดังนั้นระบบจะตรวจสอบว่าพิมพ์เอกสารสำเร็จหรือส่งคืนทันทีหลังจากส่งงานพิมพ์ ในกรณีสุดท้าย ไม่สามารถระบุได้ว่างานพิมพ์สำเร็จหรือไม่
เมื่อพบปัญหาในการส่งหรือพิมพ์เอกสาร วิธีการนี้จะทำให้เกิดข้อยกเว้น
ตัวอย่างโค้ดด้านล่างแสดงวิธีการพิมพ์เอกสารโดยใช้คลาส XpsPrintHelper:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
// The path to the documents directory. | |
string dataDir = RunExamples.GetDataDir_RenderingAndPrinting(); | |
// Open a sample document in Aspose.Words. | |
Document document = new Document(dataDir + "TestFile.doc"); | |
// Specify the name of the printer you want to print to. | |
const string printerName = @"\\COMPANY\Brother MFC-885CW Printer"; | |
// Print the document. | |
XpsPrintHelper.Print(document, printerName, "My Test Job", true); |
เมื่อคุณรันโปรเจ็กต์ จะพิมพ์เอกสารตัวอย่างบนเครื่องพิมพ์ที่ระบุ และเปิดหน้าต่างคอนโซลเพื่อแสดงผลการพิมพ์ เมื่องานพิมพ์เสร็จสมบูรณ์หรือเกิดข้อผิดพลาด ระบบจะแสดงข้อความแสดงความสำเร็จหรือข้อความแสดงข้อยกเว้นที่ถูกส่งออกมา
คุณยังสามารถตั้งค่าการพิมพ์บางอย่างโดยใช้คลาส PageSetup ได้ ตัวอย่างเช่น ใน Microsoft Word ถาดเครื่องพิมพ์ถูกกำหนดไว้สำหรับแต่ละส่วนและเป็นเครื่องพิมพ์เฉพาะ ดังนั้น คุณจึงเปลี่ยนค่าเหล่านี้สำหรับแต่ละส่วนโดยทางโปรแกรมผ่านคุณสมบัติ FirstPageTray และ OtherPagesTray ได้
Print
ได้
เมธอด XpsPrintHelper.Print มีโอเวอร์โหลดสองครั้ง การโอเวอร์โหลดครั้งแรกจะใช้ออบเจ็กต์ Document และบันทึกลงใน MemoryStream
ในรูปแบบ XPS โอเวอร์โหลดครั้งที่สองยอมรับวัตถุ Stream
สตรีมต้องมีเอกสารในรูปแบบ XPS
คุณสามารถดาวน์โหลดตัวอย่างวิธีการโอเวอร์โหลดได้จาก Aspose.Words GitHub
คุณสามารถดาวน์โหลดไฟล์ตัวอย่างของตัวอย่างนี้ได้จาก Aspose.Words GitHub
การพิมพ์เอกสารด้วยการตั้งค่าและกล่องโต้ตอบแสดงตัวอย่างก่อนพิมพ์
เมื่อทำงานกับเอกสาร มักจำเป็นต้องพิมพ์ไปยังเครื่องพิมพ์ที่เลือก การใช้กล่องโต้ตอบแสดงตัวอย่างก่อนพิมพ์เพื่อตรวจสอบลักษณะที่เอกสารที่พิมพ์ออกมาด้วยสายตาจะเป็นประโยชน์ และเลือกตัวเลือกการพิมพ์ที่เกี่ยวข้อง
Aspose.Words ไม่มีกล่องโต้ตอบหรือแบบฟอร์มในตัว แต่ใช้คลาส AsposeWordsPrintDocument โดยอิงตามคลาส .NET PrintDocument อินสแตนซ์ของคลาสนี้สามารถส่งผ่านไปยังแบบฟอร์ม PrintPreviewDialog เพื่อดูตัวอย่างและพิมพ์เอกสารได้ นอกจากนี้คลาส พิมพ์กล่องโต้ตอบตัวอย่าง ยังกำหนดเอาต์พุตที่จะส่งไปยังเครื่องพิมพ์
ตัวอย่างต่อไปนี้แสดงวิธีใช้คลาสเหล่านี้เพื่อพิมพ์เอกสารจาก Aspose.Words ผ่านกล่องโต้ตอบแสดงตัวอย่างก่อนพิมพ์และการตั้งค่า:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
// The path to the documents directory. | |
string dataDir = RunExamples.GetDataDir_RenderingAndPrinting(); | |
Document doc = new Document(dataDir + "TestFile.doc"); | |
PrintDialog printDlg = new PrintDialog(); | |
// Initialize the print dialog with the number of pages in the document. | |
printDlg.AllowSomePages = true; | |
printDlg.PrinterSettings.MinimumPage = 1; | |
printDlg.PrinterSettings.MaximumPage = doc.PageCount; | |
printDlg.PrinterSettings.FromPage = 1; | |
printDlg.PrinterSettings.ToPage = doc.PageCount; | |
// Сheck if the user accepted the print settings and whether to proceed to document preview. | |
if (printDlg.ShowDialog() != DialogResult.OK) | |
return; | |
// Create a special Aspose.Words implementation of the .NET PrintDocument class. | |
// Pass the printer settings from the print dialog to the print document. | |
AsposeWordsPrintDocument awPrintDoc = new AsposeWordsPrintDocument(doc); | |
awPrintDoc.PrinterSettings = printDlg.PrinterSettings; | |
// Initialize the print preview dialog. | |
PrintPreviewDialog previewDlg = new PrintPreviewDialog(); | |
// Pass the Aspose.Words print document to the print preview dialog. | |
previewDlg.Document = awPrintDoc; | |
// Specify additional parameters of the print preview dialog. | |
previewDlg.ShowInTaskbar = true; | |
previewDlg.MinimizeBox = true; | |
previewDlg.PrintPreviewControl.Zoom = 1; | |
previewDlg.Document.DocumentName = doc.OriginalFileName; | |
previewDlg.WindowState = FormWindowState.Maximized; | |
// Occur whenever the print preview dialog is first displayed. | |
previewDlg.Shown += PreviewDlg_Shown; | |
// Show the appropriately configured print preview dialog. | |
previewDlg.ShowDialog(); |
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
private static void PreviewDlg_Shown(object sender, EventArgs e) | |
{ | |
// Bring the print preview dialog on top when it is initially displayed. | |
((PrintPreviewDialog)sender).Activate(); | |
} |
หากต้องการปรับลักษณะที่ปรากฏของการตั้งค่ากล่องโต้ตอบแสดงตัวอย่างก่อนพิมพ์ให้เหมาะสม ให้ระบุคุณสมบัติของคลาส PrintPreviewDialog
การพิมพ์หลายหน้าในแผ่นเดียว
การมีความยืดหยุ่นมากขึ้นในการพิมพ์เอกสารจะเป็นประโยชน์เสมอ การใช้ .NET และ Aspose.Words คุณสามารถปรับแต่งการดำเนินการพิมพ์อย่างละเอียดได้อย่างง่ายดายเพื่อใช้ตรรกะที่คุณกำหนดเอง โดยกำหนดวิธีที่เอกสารจะปรากฏบนหน้าที่พิมพ์
เช่นเดียวกับในส่วนก่อนหน้า Aspose.Words ใช้คลาส MultipagePrintDocument ซึ่งอิงตามคลาส .NET PrintDocument ซึ่งหมายความว่าโครงสร้างพื้นฐานการพิมพ์ .NET ที่มีอยู่สามารถนำมาใช้ในลักษณะที่กล่องโต้ตอบตัวอย่างการพิมพ์และการพิมพ์จะช่วยให้การแสดงภาพเอกสารก่อนการพิมพ์ คลาส MultipagePrintDocument ให้ความสามารถในการพิมพ์หลายหน้าบนกระดาษแผ่นเดียว
ผลลัพธ์ของตัวอย่างโค้ดนี้แสดงอยู่ด้านล่าง:
การซ่อนกล่องโต้ตอบความคืบหน้าการพิมพ์เมื่อพิมพ์เอกสาร
กล่องโต้ตอบความคืบหน้าการพิมพ์ไม่ปรากฏขึ้นเมื่อพิมพ์เอกสารด้วยวิธี Print อย่างไรก็ตาม กล่องโต้ตอบนี้จะปรากฏขึ้นระหว่างการพิมพ์ด้วยวิธี Print อื่น ในกรณีนี้ เพื่อป้องกันไม่ให้กล่องโต้ตอบการพิมพ์ปรากฏขึ้น คุณควรระบุการตั้งค่าเครื่องพิมพ์ที่ถูกต้องและตัวควบคุมการพิมพ์มาตรฐานในวิธีนี้ ดังที่แสดงในตัวอย่างด้านล่าง:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
// The path to the documents directory. | |
string dataDir = RunExamples.GetDataDir_RenderingAndPrinting(); | |
// Load the documents which store the shapes we want to render. | |
Document doc = new Document(dataDir + "TestFile RenderShape.doc"); | |
// Obtain the settings of the default printer | |
System.Drawing.Printing.PrinterSettings settings = new System.Drawing.Printing.PrinterSettings(); | |
// The standard print controller comes with no UI | |
System.Drawing.Printing.PrintController standardPrintController = new System.Drawing.Printing.StandardPrintController(); | |
// Print the document using the custom print controller | |
AsposeWordsPrintDocument prntDoc = new AsposeWordsPrintDocument(doc); | |
prntDoc.PrinterSettings = settings; | |
prntDoc.PrintController = standardPrintController; | |
prntDoc.Print(); |
คุณสามารถดาวน์โหลดไฟล์ตัวอย่างของตัวอย่างนี้ได้จาก Aspose.Words GitHub
วิธีลดเวลาในการโทรครั้งแรกเพื่อพิมพ์เอกสาร
Aspose.Words อ่านและแคชบางช่องของ PrinterSettings เพื่อลดเวลาในการพิมพ์ คุณสามารถบรรลุสิ่งนี้ได้โดยการเรียกวิธี CachePrinterSettings วิธีการนี้จะถูกเรียกก่อนที่การพิมพ์จะเริ่มขึ้น หากไม่ได้ดำเนินการก่อนหน้านี้ โปรดทราบว่าเวลารวมในการพิมพ์ทั้งที่มีและไม่มีการเรียกใช้วิธีนี้เกือบจะเท่ากัน วัตถุประสงค์ของการใช้วิธีการนี้คือเพื่อลดเวลาของการเรียกวิธี Print ครั้งแรก ตัวอย่างโค้ดต่อไปนี้แสดงวิธีการใช้วิธีนี้:
// For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-.NET | |
//Load the Word document | |
Document doc = new Document(dataDir + "TestFile.doc"); | |
// Build layout. | |
doc.UpdatePageLayout(); | |
// Create settings, setup printing. | |
PrinterSettings settings = new PrinterSettings(); | |
settings.PrinterName = "Microsoft XPS Document Writer"; | |
// Create AsposeWordsPrintDocument and cache settings. | |
AsposeWordsPrintDocument printDocument = new AsposeWordsPrintDocument(doc); | |
printDocument.PrinterSettings = settings; | |
printDocument.CachePrinterSettings(); | |
printDocument.Print(); | |