จัดการวัตถุ Ink ของงานนำเสนอใน Python ผ่าน Java

คำนำ

PowerPoint มีฟีเจอร์ Ink ที่ให้คุณวาดเส้นอิสระ Ink สามารถใช้เพื่อทำไฮไลท์วัตถุอื่น ๆ แสดงการเชื่อมต่อและกระบวนการ และดึงความสนใจไปยังรายการเฉพาะบนสไลด์

Aspose.Slides มีประเภทที่จำเป็นสำหรับทำงานกับวัตถุ Ink ตัวอย่างเช่นคลาส Ink แทนวัตถุ Ink บนสไลด์

ความแตกต่างระหว่างอ็อบเจ็กต์ปกติและอ็อบเจ็กต์ Ink

อ็อบเจ็กต์บนสไลด์ PowerPoint ส่วนใหญ่จะแสดงด้วยอ็อบเจ็กต์ shape ในรูปแบบที่ง่ายที่สุด shape คือคอนเทนเนอร์ที่กำหนดพื้นที่ของอ็อบเจ็กต์เอง (เฟรม) พร้อมคุณสมบัติต่าง ๆ เช่น ขนาดคอนเทนเนอร์ รูปร่าง และพื้นหลัง รายละเอียดเพิ่มเติมดูที่ Shape Layout Format

อย่างไรก็ตามเมื่อ PowerPoint จัดการกับวัตถุ Ink จะละเลยคุณสมบัติทั้งหมดของเฟรมอ็อบเจ็กต์ (คอนเทนเนอร์) ยกเว้นขนาดของมัน ขนาดของพื้นที่คอนเทนเนอร์กำหนดโดยเมธอดมาตรฐาน Shape.getWidth และ Shape.getHeight:

ink_powerpoint1

ร่อง Ink

ร่อง Ink คือองค์ประกอบพื้นฐานที่ใช้บันทึกเส้นทางของปากกาเมื่อผู้ใช้เขียน Ink ดิจิทัล ร่องเก็บลำดับจุดที่ต่อเนื่องกัน

รูปแบบการเข้ารหัสที่ง่ายที่สุดระบุพิกัด X และ Y ของแต่ละจุดตัวอย่าง เมื่อจุดทั้งหมดที่ต่อกันถูกเรนเดอร์จะได้ภาพเช่นนี้:

ink_powerpoint2

คุณสมบัติ Brush สำหรับการวาด

Brush ใช้วาดเส้นที่เชื่อมต่อจุดของร่อง Ink Brush มีสีและขนาดของตนเอง โดยใช้เมธอด InkBrush.getColor และ InkBrush.getSize

ตั้งค่าสี Brush ของ Ink

ตัวอย่างโค้ด Python นี้แสดงวิธีตั้งค่าสีของ Brush Ink:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, Ink

Color = jpype.JClass("java.awt.Color")

presentation = Presentation("pres.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    ink = slide.getShapes().get_Item(0)
    if isinstance(ink, Ink):
        traces = ink.getTraces()
        if len(traces) > 0:
            brush = traces[0].getBrush()
            brush.setColor(Color.RED)
        else:
            print("The ink object has no traces.")
    else:
        print("The first shape is not an ink object.")
finally:
    presentation.dispose()

ตั้งค่าขนาด Brush ของ Ink

ตัวอย่างโค้ด Python นี้แสดงวิธีตั้งค่าขนาดของ Brush Ink:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, Ink

Dimension = jpype.JClass("java.awt.Dimension")

presentation = Presentation("pres.pptx")
try:
    slide = presentation.getSlides().get_Item(0)
    ink = slide.getShapes().get_Item(0)
    if isinstance(ink, Ink):
        traces = ink.getTraces()
        if len(traces) > 0:
            brush = traces[0].getBrush()
            brush_size = Dimension(5, 10)
            brush.setSize(brush_size)
        else:
            print("The ink object has no traces.")
    else:
        print("The first shape is not an ink object.")
finally:
    presentation.dispose()

โดยทั่วไปความกว้างและความสูงของ Brush จะไม่เท่ากัน ดังนั้น PowerPoint จึงไม่แสดงขนาดของ Brush (ส่วนข้อมูลที่สอดคล้องจะสีเทา) เมื่อความกว้างและความสูงของ Brush เท่ากัน PowerPoint จะแสดงขนาดดังนี้:

ink_powerpoint3

เพื่อความชัดเจน เราจะเพิ่มความสูงของวัตถุ Ink และตรวจสอบมิติที่สำคัญ:

ink_powerpoint4

คอนเทนเนอร์ (เฟรม) ไม่คำนึงถึงขนาดของ Brush – มันจะสมมติว่าความหนาของเส้นเป็นศูนย์ (ดูรูปก่อนหน้า)

ดังนั้นเพื่อกำหนดพื้นที่ที่มองเห็นของวัตถุ Ink ทั้งหมด ต้องคำนึงถึงขนาด Brush ของร่องที่เกี่ยวข้อง ที่นี่วัตถุเป้าหมาย (ร่องข้อความที่เขียนด้วยมือ) ได้ถูกสเกลไปยังขนาดของคอนเทนเนอร์ (เฟรม) เมื่อขนาดของคอนเทนเนอร์เปลี่ยนแปลง Brush จะคงที่ และในทางกลับกัน

ink_powerpoint5

PowerPoint ใช้พฤติลักษณะเดียวกันสำหรับวัตถุข้อความ:

ink_powerpoint6

ควบคุมการแสดงผล Ink ระหว่างการส่งออกและการเรนเดอร์

Aspose.Slides มีคลาส InkOptions เพื่อควบคุมวิธีการที่วัตถุ Ink ปรากฏในผลลัพธ์ที่ส่งออกหรือเรนเดอร์ คุณสามารถใช้คุณสมบัติต่าง ๆ เพื่อซ่อน Ink อย่างสมบูรณ์หรือเปลี่ยนวิธีการตีความการทำงานของ mask Brush Ink

ตัวเลือก Ink สามารถใช้ได้ผ่านตัวเลือกการส่งออกหรือการเรนเดอร์สำหรับหลายรูปแบบผลลัพธ์:

Output Ink options property
PDF PdfOptions.getInkOptions
HTML HtmlOptions.getInkOptions
SVG SVGOptions.getInkOptions
TIFF TiffOptions.getInkOptions
Slide image RenderingOptions.getInkOptions

เมธอด InkOptions ต่อไปนี้เปิดเผยการตั้งค่าสองอย่างเดียวกัน:

  • getHideInk กำหนดว่าวัตถุ Ink จะรวมอยู่ในผลลัพธ์หรือไม่ ค่าเริ่มต้นคือ False
  • getInterpretMaskOpAsOpacity กำหนดว่าการดำเนินการ mask จะตีความเป็นความทึบแสงเมื่อเรนเดอร์ Brush Ink หรือไม่ ค่าเริ่มต้นคือ True; เรียก setInterpretMaskOpAsOpacity กับ False เพื่อใช้การดำเนินการ ROP แทน

ซ่อนวัตถุ Ink ในผลลัพธ์ PDF

โดยค่าเริ่มต้นวัตถุ Ink จะยังคงมองเห็นได้เมื่อส่งออก หากต้องการผลลัพธ์ที่สะอาดโดยไม่มีหมายเหตุเขียนด้วยมือหรือเนื้อหา Ink อื่น ๆ ให้เรียก InkOptions.setHideInk กับ True

ตัวอย่าง Python ด้านล่างส่งออกงานนำเสนอเป็น PDF พร้อมซ่อนวัตถุ Ink ทั้งหมด:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, PdfOptions, SaveFormat

presentation = Presentation("presentation.pptx")
try:
    pdf_options = PdfOptions()
    pdf_options.getInkOptions().setHideInk(True)

    presentation.save("presentation_without_ink.pdf", SaveFormat.Pdf, pdf_options)
finally:
    presentation.dispose()

ซ่อนวัตถุ Ink เมื่อเรนเดอร์สไลด์เป็นรูปภาพ

เพื่อซ่อนวัตถุ Ink เมื่อเรนเดอร์สไลด์เป็นภาพบิตแมพ ให้กำหนดค่า RenderingOptions.getInkOptions และส่งตัวเลือกการเรนเดอร์ไปยัง Slide.getImage

ตัวอย่าง Python ด้านล่างเรนเดอร์สไลด์แรกเป็นภาพ PNG โดยไม่มีวัตถุ Ink:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, RenderingOptions, ImageFormat

presentation = Presentation("presentation.pptx")
try:
    rendering_options = RenderingOptions()
    rendering_options.getInkOptions().setHideInk(True)

    slide = presentation.getSlides().get_Item(0)
    image = slide.getImage(rendering_options)
    try:
        image.save("slide_without_ink.png", ImageFormat.Png)
    finally:
        image.dispose()
finally:
    presentation.dispose()

ควบคุมการเรนเดอร์ Mask ของ Ink

การตั้งค่า InkOptions.getInterpretMaskOpAsOpacity ควบคุมวิธีการตีความการดำเนินการ mask เมื่อเรนเดอร์ Brush Ink ค่าเริ่มต้นคือ True (ใช้ความทึบแสง) หากต้องการใช้การดำเนินการ ROP ให้เรียก InkOptions.setInterpretMaskOpAsOpacity กับ False

ตัวอย่าง Python ด้านล่างส่งออกสไลด์เป็น SVG และใช้การเรนเดอร์แบบ ROP สำหรับการดำเนินการ mask ของ Ink:

import jpype
import asposeslides

if not jpype.isJVMStarted():
    jpype.startJVM()

from asposeslides.api import Presentation, SVGOptions

FileOutputStream = jpype.JClass("java.io.FileOutputStream")

presentation = Presentation("presentation.pptx")
try:
    svg_options = SVGOptions()
    svg_options.getInkOptions().setInterpretMaskOpAsOpacity(False)

    stream = FileOutputStream("slide.svg")
    try:
        slide = presentation.getSlides().get_Item(0)
        slide.writeAsSvg(stream, svg_options)
    finally:
        stream.close()
finally:
    presentation.dispose()

การตั้งค่าเดียวกันสามารถใช้ผ่าน TiffOptions.getInkOptions เมื่อส่งออกงานนำเสนอหรือเรนเดอร์สไลด์เป็น TIFF

เลือกว่าจะซ่อนหรือรักษา Ink

เมื่อต้องการเวอร์ชันที่สะอาดของงานนำเสนอที่มีหมายเหตุสำหรับการกระจายโดยไม่มีเครื่องหมายตรวจสอบ ให้เรียก InkOptions.setHideInk กับ True ขณะส่งออก

ทิ้งให้ InkOptions.getHideInk มีค่าเริ่มต้นเป็น False เมื่อหมายเหตุ Ink เป็นส่วนหนึ่งของเนื้อหาที่ต้องการ เช่น ความคิดเห็นการตรวจสอบ โน้ตเขียนด้วยมือ ไฮไลท์ หรือการวาดที่ควรคงมองเห็นในผลลัพธ์ที่ส่งออก วิธีนี้ทำให้แอปพลิเคชันสร้างผลลัพธ์การตรวจสอบและผลลัพธ์ขั้นสุดท้ายแยกกันจากงานนำเสนอเดียวกันโดยไม่ต้องแก้ไขวัตถุ Ink ต้นฉบับ

คำถามที่พบบ่อย

ฉันสามารถเปลี่ยนสีหรือขนาดของเส้น Ink ที่มีอยู่ได้หรือไม่?
ได้ คุณสามารถเรียก Ink.getTraces เพื่อรับร่อง แล้วเปลี่ยน InkTrace.getBrush โดยเรียก InkBrush.setColor หรือ InkBrush.setSize

การซ่อน Ink จะทำให้งานนำเสนอที่เป็นแหล่งข้อมูลเปลี่ยนแปลงหรือไม่?
ไม่ได้ การเรียก InkOptions.setHideInk มีผลเฉพาะกับผลลัพธ์ที่เรนเดอร์หรือส่งออก ไม่ได้ลบหรือแก้ไขวัตถุ Ink ในงานนำเสนอที่เป็นแหล่งข้อมูล

รูปแบบการส่งออกใดบ้างที่รองรับ Ink options?
คุณสามารถกำหนด Ink options สำหรับ PDF, HTML, SVG, TIFF และรูปภาพสไลด์แบบบิตแมพผ่านตัวเลือกการส่งออกหรือการเรนเดอร์ที่แสดงข้างต้น

อ่านต่อ