ตรรกะ MacOS / appkit NSPrint สำหรับการพิมพ์รายงานที่ซับซ้อนและยาว

เรามีแอปที่มีรายงานจำนวนมาก และรายงานบางส่วนมีลูปการพิมพ์ที่ซับซ้อน

ย้อนกลับไปในสมัยนั้น (IE PowerPlant , Carbon, Core Printing) เราใช้ในการสร้างลูปการพิมพ์ที่มีคู่ BeginPage() / EndPage() บ่อยครั้ง คู่เหล่านั้นถูกฝังอยู่ในตรรกะการวนรอบการพิมพ์รายงาน

ผลกระทบสุทธิก็คือรายงานจำนวนมากไม่ได้แบ่งหน้าก่อนการพิมพ์ แต่จะมีการแบ่งหน้าตามที่พิมพ์ รายงานเหล่านี้วนซ้ำผ่านออบเจ็กต์หลายพันรายการและเติมเต็มหน้าเว็บให้มากที่สุดเท่าที่จะเป็นไปได้ จากนั้นเรียกว่า EndPage() จากนั้นดำเนินการต่อในหน้าถัดไปโดยการเรียก BeginPage() ทั้งหมดนี้ในขณะเดียวกันก็รักษา "สถานะ" ที่ซับซ้อนของข้อมูลใน- รายงานความคืบหน้าการพิมพ์

เนื่องจาก Core Printing ส่วนใหญ่เลิกใช้งานแล้ว ดูเหมือนว่าด้วยตรรกะของ NSPrint วิธีการพิมพ์รายงานที่ขับเคลื่อนการแบ่งหน้าจึงเป็นไปไม่ได้ NSPrintOperation ค่อนข้างอยากจะขอหน้าเต็มสำหรับ DrawRect ของ NSView แบบกำหนดเองเพื่อวาด และ NSView แบบกำหนดเองนั้นสามารถเริ่มต้นจากหน้าใดก็ได้ดีกว่า นั่นหมายความว่าทุกรายงานจะต้องมีการแบ่งหน้าล่วงหน้าใช่หรือไม่

ดูเหมือนว่าจะมีวิธีการอื่นที่เป็นส่วนหนึ่งของการแบ่งหน้า "อัตโนมัติ":

 - (void)adjustPageHeightNew:(CGFloat *)newBottom top:(CGFloat)oldTop bottom:(CGFloat)oldBottom limit:(CGFloat)bottomLimit;

หากฉันอ่านเอกสารอย่างถูกต้อง สมมติว่าฉันมีรายงาน 10 หน้าซึ่งต้องหาที่ที่เหมาะสมในการแบ่ง ดูเหมือนว่าฉันสามารถถือว่ารายงานนั้นเป็นมุมมองแบบยาวได้ จากนั้นเรียกใช้เมธอดข้างต้นในขณะที่ฉันอยู่ใน DrawRect ทำให้หน้าที่ฉันกำลังวาดสั้นลง และด้วยเหตุนี้จึงผลักเนื้อหาออกไปที่หน้าถัดไป

เอกสารไม่ได้ให้รายละเอียดมากนักว่าการปรับเปลี่ยนดังกล่าวจะเผยแพร่ไปยังหลายสิบหน้า (หรือหลายร้อย) หน้าอย่างไร

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


person SMGreenfield    schedule 17.04.2020    source แหล่งที่มา


คำตอบ (1)


หากฉันอ่านเอกสารถูกต้อง สมมติว่าฉันมีรายงาน 10 หน้าซึ่งต้องหาที่ที่เหมาะสมในการแบ่ง ดูเหมือนว่าฉันสามารถถือว่ารายงานนั้นเป็นมุมมองแบบยาวได้

ใช่,

 - (void)adjustPageHeightNew:(CGFloat *)newBottom top:(CGFloat)oldTop bottom:(CGFloat)oldBottom limit:(CGFloat)bottomLimit;

จากนั้นเรียกวิธีการข้างต้นขณะที่ฉันอยู่ใน DrawRect

ไม่ เอกสารระบุว่า:

ถูกแทนที่โดยคลาสย่อยเพื่อปรับความสูงของหน้าระหว่างการแบ่งหน้าอัตโนมัติ วิธีการนี้ถูกเรียกใช้โดย print:. มุมมองสามารถยกขอบด้านล่างขึ้นและส่งกลับค่าใหม่ใน newBottom ทำให้สามารถป้องกันไม่ให้รายการต่างๆ เช่น บรรทัดข้อความถูกแบ่งข้ามหน้าต่างๆ

 

เอกสารไม่ได้ให้รายละเอียดมากนักว่าการปรับปรุงดังกล่าวจะเผยแพร่ไปยังหลายสิบหน้า (หรือหลายร้อย) หน้าอย่างไร

ฉันถือว่าหน้าต่อไปนี้เลื่อนขึ้น

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

ใช่ แทนที่

- (BOOL)knowsPageRange:(NSRangePointer)range;

และ

- (NSRect)rectForPage:(NSInteger)page;

ซึ่งกำหนดให้รายงานต้องมีการแบ่งหน้าล่วงหน้า

ดู การเลือกขอบเขตหน้าสำหรับเนื้อหาที่เกินหน้าเดียว

ใน คู่มือการเขียนโปรแกรมการพิมพ์สำหรับ Mac

person Willeke    schedule 17.04.2020
comment
นี่คือสิ่งที่แปลก: เมื่อเอกสารบอกว่า This method ถูกเรียกใช้โดย print: มุมมองสามารถยกขอบด้านล่างและส่งกลับค่าใหม่ใน newBottom สิ่งที่ไม่ได้บอกว่าจะปรับPageHeightNew ผ่านในหน้าใดที่มันถูกถามถึง - person SMGreenfield; 18.04.2020
comment
หมายเลขหน้าไม่สำคัญ adjustPageHeightNewถามว่าขอบล่างนี้อยู่ในตำแหน่งที่สะดวกหรือไม่. - person Willeke; 18.04.2020
comment
นั่นคือจุดรวมของการแบ่งหน้า ขอบด้านล่าง [ของหน้าเฉพาะ] อยู่ในตำแหน่งที่สะดวกหรือไม่ ไม่อย่างนั้นตำแหน่งที่สะดวกก็ไม่มีความหมายแต่อย่างใด... - person SMGreenfield; 18.04.2020
comment
หากตำแหน่ง y เฉพาะเจาะจงต้องอยู่ในหน้าใดหน้าหนึ่ง จะไม่สามารถใช้การแบ่งหน้าอัตโนมัติได้ - person Willeke; 18.04.2020