Logika NSPrint MacOS / appkit untuk mencetak laporan yang panjang dan rumit

Kami memiliki aplikasi yang memiliki banyak laporan, dan beberapa laporan tersebut memiliki loop pencetakan yang rumit.

Dulu (IE PowerPlant, Carbon, Core Printing) kami biasa membuat loop cetak yang memiliki semacam pasangan BeginPage() / EndPage(). Seringkali, pasangan tersebut tertanam dalam logika loop cetak laporan.

Dampak akhirnya adalah banyak laporan yang tidak diberi nomor halaman sebelum dicetak, namun diberi nomor halaman saat dicetak. Laporan-laporan ini diulang melalui ribuan objek dan memenuhi halaman sebanyak mungkin, kemudian disebut EndPage(), dan kemudian dilanjutkan ke halaman berikutnya dengan memanggil BeginPage(), semuanya sambil mempertahankan “keadaan” kompleks dari di- laporan kemajuan yang dicetak.

Dengan sebagian besar Core Printing tidak digunakan lagi, TAMPAKNYA dengan logika NSPrint, pendekatan laporan tercetak yang mendorong penomoran halaman tidak mungkin dilakukan. NSPrintOperation sangat ingin dapat meminta satu halaman penuh untuk menggambar drawRect NSView khusus, dan NSView khusus tersebut sebaiknya dapat dimulai di halaman APAPUN. Apakah itu berarti SETIAP laporan harus diberi nomor halaman sebelumnya?

Tampaknya ada metode berbeda yang merupakan bagian dari penomoran halaman "otomatis":

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

Jika saya membaca dokumentasi dengan benar, katakanlah saya memiliki laporan 10 halaman yang mengharuskan saya menemukan tempat yang cocok untuk membaginya. Sepertinya saya dapat memperlakukan laporan itu sebagai satu tampilan panjang, lalu memanggil metode di atas saat saya berada di drawRect, menyebabkan halaman yang saya gambar menjadi LEBIH PENDEK, dan dengan demikian mendorong materi ke halaman berikutnya.

Dokumentasi tidak memberikan banyak detail tentang bagaimana penyesuaian tersebut akan diterapkan ke lusinan (atau ratusan) halaman.

Apakah ada metode lain untuk mendorong pencetakan dan penomoran halaman dari kode pembuatan laporan, selain pendekatan pasif yang dijelaskan di atas?


person SMGreenfield    schedule 17.04.2020    source sumber


Jawaban (1)


Jika saya membaca dokumentasi dengan benar, katakanlah saya memiliki laporan 10 halaman yang mengharuskan saya menemukan tempat yang cocok untuk membaginya. Sepertinya saya bisa menganggap laporan itu sebagai laporan jangka panjang,

Ya,

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

lalu panggil metode di atas saat saya berada di drawRect saya

Tidak, dokumentasinya mengatakan:

Ditimpa oleh subkelas untuk menyesuaikan tinggi halaman selama penomoran halaman otomatis. Metode ini dipanggil dengan print:. Tampilan dapat menaikkan tepi bawah dan mengembalikan nilai baru di newBottom, memungkinkannya mencegah item seperti baris teks terbagi di seluruh halaman.

 

Dokumentasi tidak memberikan banyak detail tentang bagaimana penyesuaian tersebut akan diterapkan ke lusinan (atau ratusan) halaman.

Saya berasumsi halaman-halaman berikut bergeser ke atas.

Apakah ada metode lain untuk mendorong pencetakan dan penomoran halaman dari kode pembuatan laporan, selain pendekatan pasif yang dijelaskan di atas?

Ya, timpa

- (BOOL)knowsPageRange:(NSRangePointer)range;

Dan

- (NSRect)rectForPage:(NSInteger)page;

Hal ini mengharuskan laporan tersebut sudah diberi nomor halaman sebelumnya.

Lihat Memilih Batas Halaman untuk Konten yang Melebihi Satu Halaman

di Panduan Pemrograman Pencetakan untuk Mac.

person Willeke    schedule 17.04.2020
comment
Inilah yang aneh: Ketika dokumen mengatakan, Metode ini dipanggil oleh print:. Tampilan dapat menaikkan tepi bawah dan mengembalikan nilai baru di newBottom, yang tidak disebutkan di sini adalah BAGAIMANA cara menyesuaikanPageHeightNew lolos di halaman MANA yang ditanyakan? - person SMGreenfield; 18.04.2020
comment
Nomor halaman tidak masalah. adjustPageHeightNew bertanya Apakah tepi bawah ini berada pada posisi yang nyaman?. - person Willeke; 18.04.2020
comment
Jadi itulah inti dari penomoran halaman, Apakah tepi bawah [HALAMAN KHUSUS] berada pada posisi yang nyaman. Kalau tidak, posisi nyaman tidak ada artinya sama sekali... - person SMGreenfield; 18.04.2020
comment
Jika lokasi y tertentu harus berada pada halaman tertentu, maka penomoran halaman otomatis tidak dapat digunakan. - person Willeke; 18.04.2020