การแสดงรูปร่างแยกจากเอกสาร

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

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

ประเภทรูปร่างใน Aspose.Words

เนื้อหาทั้งหมดในเลเยอร์การวาดเอกสารแสดงโดยโหนด Shape หรือ GroupShape ใน Aspose.Words Document Object Module (DOM) เนื้อหาดังกล่าวอาจเป็นกล่องข้อความ รูปภาพ รูปร่างอัตโนมัติ วัตถุ OLE ฯลฯ นอกจากนี้ บางฟิลด์ยังนำเข้าเป็นรูปร่างอีกด้วย เช่น ฟิลด์ INCLUDEPICTURE

รูปภาพธรรมดาแสดงโดยโหนด Shape ของ ShapeType.Image โหนดรูปร่างนี้ไม่มีโหนดย่อย แต่ข้อมูลรูปภาพที่อยู่ภายในโหนดรูปร่างนี้สามารถเข้าถึงได้โดยคุณสมบัติ Shape.ImageData ในทางกลับกัน รูปร่างสามารถประกอบด้วยโหนดย่อยจำนวนมากได้ ตัวอย่างเช่น รูปร่างกล่องข้อความซึ่งแสดงโดยคุณสมบัติ ShapeType.TextBox สามารถประกอบด้วยโหนดจำนวนมาก เช่น Paragraph และ Table รูปร่างส่วนใหญ่สามารถมีโหนดระดับบล็อก Paragraph และ Table ได้ เหล่านี้เป็นโหนดเดียวกันกับที่ปรากฏในเนื้อหาหลัก รูปร่างจะเป็นส่วนหนึ่งของบางย่อหน้าเสมอ ไม่ว่าจะรวมแบบอินไลน์โดยตรงหรือยึดกับ ย่อหน้า แต่ “ลอย” ที่ใดก็ได้ในหน้าเอกสาร

rendering-shapes-separately-from-a-document_1

เอกสารยังสามารถมีรูปร่างที่จัดกลุ่มไว้ด้วยกันได้ คุณสามารถเปิดใช้งาน Grouping ใน Microsoft Word ได้โดยเลือกหลายวัตถุแล้วคลิก “Group” ในเมนูคลิกขวา

rendering-shapes-separately-from-a-document_2

ใน Aspose.Words กลุ่มรูปร่างเหล่านี้จะแสดงโดยโหนด GroupShape สิ่งเหล่านี้สามารถเรียกใช้ในลักษณะเดียวกันเพื่อแสดงทั้งกลุ่มเป็นรูปภาพ

rendering-shapes-separately-from-a-document_3

รูปแบบ DOCX สามารถมีรูปภาพประเภทพิเศษ เช่น ไดอะแกรมหรือแผนภูมิ รูปร่างเหล่านี้ยังแสดงผ่านโหนด Shape ใน Aspose.Words ซึ่งมีวิธีการที่คล้ายกันในการแสดงเป็นรูปภาพ ตามการออกแบบ รูปร่างไม่สามารถมีรูปร่างอื่นเหมือนเด็กได้ เว้นแต่รูปร่างนั้นจะเป็นรูปภาพ (ShapeType.Image) ตัวอย่างเช่น Microsoft Word ไม่อนุญาตให้คุณแทรกกล่องข้อความลงในกล่องข้อความอื่น

ประเภทรูปร่างที่อธิบายไว้ข้างต้นมีวิธีพิเศษในการแสดงรูปร่างผ่านคลาส ShapeRenderer อินสแตนซ์ของคลาส ShapeRenderer ถูกดึงข้อมูลสำหรับ Shape หรือ GroupShape ผ่านวิธี GetShapeRenderer หรือโดยการส่ง Shape ไปยังตัวสร้างของคลาส ShapeRenderer คลาสนี้ให้การเข้าถึงสมาชิก ซึ่งอนุญาตให้แสดงรูปร่างดังต่อไปนี้:

  • ไฟล์บนดิสก์โดยใช้วิธี Save โอเวอร์โหลด
  • สตรีมโดยใช้วิธี Save โอเวอร์โหลด
  • วัตถุกราฟิก .NET โดยใช้วิธี RenderToSize และ RenderToScale

แสดงผลเป็นไฟล์หรือสตรีม

วิธีการ Save ให้การโอเวอร์โหลดที่แสดงรูปร่างโดยตรงไปยังไฟล์หรือสตรีม การโอเวอร์โหลดทั้งสองยอมรับอินสแตนซ์ของคลาส ImageSaveOptions ซึ่งอนุญาตให้กำหนดตัวเลือกสำหรับการแสดงผลรูปร่าง ซึ่งทำงานในลักษณะเดียวกับวิธี Document.Save แม้ว่าจำเป็นต้องใช้พารามิเตอร์นี้ คุณสามารถส่งค่า Null โดยระบุว่าไม่มีตัวเลือกที่กำหนดเองได้

รูปร่างสามารถส่งออกในรูปแบบภาพใดก็ได้ที่ระบุในการแจงนับ SaveFormat ตัวอย่างเช่น รูปภาพสามารถแสดงผลเป็นรูปภาพแรสเตอร์ เช่น JPEG โดยการระบุการแจงนับ SaveFormat.Jpeg หรือเป็นรูปภาพเวกเตอร์ เช่น EMF โดยการระบุ SaveFormat.Emf

ตัวอย่างโค้ดด้านล่างแสดงการแสดงรูปร่างให้กับอิมเมจ EMF แยกจากเอกสาร และบันทึกลงดิสก์:

ตัวอย่างโค้ดด้านล่างแสดงการแสดงรูปร่างเป็นภาพ JPEG แยกจากเอกสาร และบันทึกลงในสตรีม:

คลาส ImageSaveOptions ช่วยให้คุณระบุตัวเลือกที่หลากหลายเพื่อควบคุมวิธีการเรนเดอร์รูปภาพ ฟังก์ชันการทำงานที่อธิบายไว้ข้างต้นสามารถนำไปใช้ในลักษณะเดียวกันกับโหนด GroupShape และ Shape

แสดงผลไปยังวัตถุกราฟิก .NET

การแสดงผลโดยตรงไปยังออบเจ็กต์ Graphics ช่วยให้คุณกำหนดการตั้งค่าและสถานะของออบเจ็กต์ Graphics ของคุณเองได้ สถานการณ์ทั่วไปเกี่ยวข้องกับการเรนเดอร์รูปร่างโดยตรงในวัตถุ Graphics ที่ดึงมาจากแบบฟอร์ม Windows หรือบิตแมป เมื่อโหนด Shape ถูกเรนเดอร์ การตั้งค่าจะส่งผลต่อลักษณะที่ปรากฏของรูปร่าง ตัวอย่างเช่น คุณสามารถหมุนหรือปรับขนาดรูปร่างได้โดยใช้วิธี RotateTransform หรือ ScaleTransform สำหรับออบเจ็กต์ Graphics

ตัวอย่างด้านล่างแสดงวิธีแสดงรูปร่างให้กับออบเจ็กต์ .NET Graphics โดยแยกจากเอกสาร และใช้การหมุนกับรูปภาพที่เรนเดอร์:

ในทำนองเดียวกัน สำหรับวิธี RenderToSize วิธี RenderToSize ที่สืบทอดมาจาก NodeRendererBase นั้นมีประโยชน์สำหรับการสร้างภาพขนาดย่อของเนื้อหาเอกสาร ขนาดรูปร่างถูกระบุผ่านตัวสร้าง วิธี RenderToSize ยอมรับวัตถุ Graphics พิกัด X และ Y ของตำแหน่งรูปภาพ และขนาดของรูปภาพ (ความกว้างและความสูง) ที่จะวาดลงบนวัตถุ Graphics

Shape สามารถเรนเดอร์ได้ในระดับหนึ่งโดยใช้วิธี ShapeRenderer.RenderToScale ที่สืบทอดมาจากคลาส NodeRendererBase ซึ่งคล้ายกับวิธี Document.RenderToScale ที่ยอมรับพารามิเตอร์หลักที่เหมือนกัน ความแตกต่างระหว่างสองวิธีนี้ก็คือ เมื่อใช้วิธี ShapeRenderer.RenderToScale แทนที่จะเลือกขนาดตามตัวอักษร คุณจะเลือกค่าทศนิยมที่จะปรับขนาดรูปร่างในระหว่างการเรนเดอร์ หากค่าทศนิยมเท่ากับ 1.0 จะทำให้รูปร่างแสดงผลที่ 100% ของขนาดดั้งเดิม ค่าทศนิยม 0.5 จะลดขนาดภาพลงครึ่งหนึ่ง

การแสดงภาพรูปร่าง

คลาส Shape แสดงถึงวัตถุในเลเยอร์การวาด เช่น รูปร่างอัตโนมัติ กล่องข้อความ รูปแบบอิสระ วัตถุ OLE ตัวควบคุม ActiveX หรือรูปภาพ เมื่อใช้คลาส Shape คุณสามารถสร้างหรือแก้ไขรูปร่างในเอกสาร Microsoft Word ได้ คุณสมบัติที่สำคัญของรูปร่างคือ ShapeType รูปร่างประเภทต่างๆ สามารถมีความสามารถที่แตกต่างกันในเอกสาร Word ตัวอย่างเช่น เฉพาะรูปภาพและรูปร่าง OLE เท่านั้นที่สามารถมีรูปภาพอยู่ภายในได้ ในขณะที่รูปร่างส่วนใหญ่สามารถมีได้เฉพาะข้อความเท่านั้น

ตัวอย่างต่อไปนี้แสดงวิธีเรนเดอร์รูปภาพ Shape เป็นรูปภาพ JPEG แยกจากเอกสารและบันทึกลงในดิสก์:

การดึงข้อมูลขนาดรูปร่าง

คลาส ShapeRenderer ยังมีฟังก์ชันในการดึงขนาดของรูปร่างเป็นพิกเซลผ่านวิธี GetSizeInPixels วิธีการนี้ยอมรับพารามิเตอร์ float (เดี่ยว) สองตัว ได้แก่ สเกลและ DPI ซึ่งใช้ในการคำนวณขนาดรูปร่างเมื่อมีการเรนเดอร์รูปร่าง วิธีการส่งกลับวัตถุ Size ซึ่งมีความกว้างและความสูงของขนาดที่คำนวณได้ สิ่งนี้มีประโยชน์เมื่อจำเป็นต้องทราบขนาดของรูปร่างที่เรนเดอร์ไว้ล่วงหน้า เช่น เมื่อสร้างบิตแมปใหม่จากเอาท์พุตที่ถูกเรนเดอร์

ตัวอย่างด้านล่างแสดงวิธีการสร้างออบเจ็กต์บิตแมปและกราฟิกใหม่ด้วยความกว้างและความสูงของรูปร่างที่จะเรนเดอร์:

เมื่อใช้วิธีการ RenderToSize หรือ RenderToScale ขนาดภาพที่เรนเดอร์จะถูกส่งกลับในออบเจ็กต์ SizeF ด้วย ซึ่งสามารถกำหนดให้กับตัวแปรและใช้ในกรณีที่จำเป็น

คุณสมบัติ SizeInPoints ส่งคืนขนาดรูปร่างที่วัดเป็นพอยต์ (ดู ShapeRenderer ผลลัพธ์คือออบเจ็กต์ SizeF ที่มีความกว้างและความสูง