การแสดงผลรูปร่างแยกต่างหากจากเอกสาร

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

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

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

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

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

rendering-shapes-separately-from-a-document-aspose-words-cpp-1

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

rendering-shapes-separately-from-a-document-aspose-words-cpp-2

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

rendering-shapes-separately-from-a-document-aspose-words-cpp-3

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

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

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

การแสดงผลไปยังแฟ้มหรือสตรีม

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

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

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

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::SharedPtr<ShapeRenderer> r = shape->GetShapeRenderer();
// Define custom options which control how the image is rendered. Render the shape to the JPEG raster format.
System::SharedPtr<ImageSaveOptions> imageOptions = System::MakeObject<ImageSaveOptions>(SaveFormat::Emf);
imageOptions->set_Scale(1.5f);
System::String outputPath = outputDataDir + u"RenderShape.RenderShapeToDisk.emf";
// Save the rendered image to disk.
r->Save(outputPath, imageOptions);

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

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::SharedPtr<ShapeRenderer> r = System::MakeObject<ShapeRenderer>(shape);
// Define custom options which control how the image is rendered. Render the shape to the vector format EMF.
System::SharedPtr<ImageSaveOptions> imageOptions = System::MakeObject<ImageSaveOptions>(SaveFormat::Jpeg);
imageOptions->set_ImageColorMode(ImageColorMode::Grayscale);
imageOptions->set_ImageBrightness(0.45f);
System::String outputPath = outputDataDir + u"RenderShape.RenderShapeToStream.jpg";
System::SharedPtr<System::IO::FileStream> stream = System::MakeObject<System::IO::FileStream>(outputPath, System::IO::FileMode::Create);
// Save the rendered image to the stream using different options.
r->Save(stream, imageOptions);

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

การแสดงผลไปยังอ็อบเจ็กต์กราฟิก.NET

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

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

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::SharedPtr<ShapeRenderer> r = shape->GetShapeRenderer();
// Find the size that the shape will be rendered to at the specified scale and resolution.
System::Drawing::Size shapeSizeInPixels = r->GetSizeInPixels(1.0f, 96.0f);
// Rotating the shape may result in clipping as the image canvas is too small. Find the longest side
// And make sure that the graphics canvas is large enough to compensate for this.
int32_t maxSide = System::Math::Max(shapeSizeInPixels.get_Width(), shapeSizeInPixels.get_Height());
{
// Clearing resources under 'using' statement
DisposableHolder<System::Drawing::Bitmap> imageHolder(System::MakeObject<System::Drawing::Bitmap>((int32_t)(maxSide * 1.25), (int32_t)(maxSide * 1.25)));
{
// Rendering to a graphics object means we can specify settings and transformations to be applied to
// The shape that is rendered. In our case we will rotate the rendered shape.
// Clearing resources under 'using' statement
DisposableHolder<System::Drawing::Graphics> grHolder(System::Drawing::Graphics::FromImage(imageHolder.GetObject()));
// Clear the shape with the background color of the document.
grHolder.GetObject()->Clear(shape->get_Document()->get_PageColor());
// Center the rotation using translation method below
grHolder.GetObject()->TranslateTransform((float)imageHolder.GetObject()->get_Width() / 8, (float)imageHolder.GetObject()->get_Height() / 2);
// Rotate the image by 45 degrees.
grHolder.GetObject()->RotateTransform(45.0f);
// Undo the translation.
grHolder.GetObject()->TranslateTransform(-(float)imageHolder.GetObject()->get_Width() / 8, -(float)imageHolder.GetObject()->get_Height() / 2);
// Render the shape onto the graphics object.
r->RenderToSize(grHolder.GetObject(), 0.0f, 0.0f, shapeSizeInPixels.get_Width(), shapeSizeInPixels.get_Height());
}
System::String outputPath = outputDataDir + u"RenderShape.RenderShapeToGraphics.png";
imageHolder.GetObject()->Save(outputPath, System::Drawing::Imaging::ImageFormat::get_Png());
std::cout << "Shape rendered to graphics successfully." << std::endl << "File saved at " << outputPath.ToUtf8String() << std::endl;
}

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

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

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

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

ตัวอย่างต่อไปนี้แสดงวิธีการแสดงผลอิมเมจรูปร่างไปยังอิมเมจJPEGแยกต่างหากจากเอกสา:

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::String outputPath = outputDataDir + u"RenderShape.RenderShapeImage.jpg";
// Save the Shape image to disk in JPEG format and using default options.
shape->GetShapeRenderer()->Save(outputPath, nullptr);

ดึงขนาดรูปร่าง

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

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

For complete examples and data files, please go to https://github.com/aspose-words/Aspose.Words-for-C
System::Drawing::SizeF shapeSizeInDocument = shape->GetShapeRenderer()->get_SizeInPoints();
float width = shapeSizeInDocument.get_Width();
// The width of the shape.
float height = shapeSizeInDocument.get_Height();
// The height of the shape.
System::Drawing::Size shapeRenderedSize = shape->GetShapeRenderer()->GetSizeInPixels(1.0f, 96.0f);
{
// Clearing resources under 'using' statement
DisposableHolder<System::Drawing::Bitmap> imageHolder(System::MakeObject<System::Drawing::Bitmap>(shapeRenderedSize.get_Width(), shapeRenderedSize.get_Height()));
{
// Clearing resources under 'using' statement
DisposableHolder<System::Drawing::Graphics> gHolder(System::Drawing::Graphics::FromImage(imageHolder.GetObject()));
// Render shape onto the graphics object using the RenderToScale or RenderToSize methods of ShapeRenderer class.
}
}

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

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