Печать какао с помощью Swift: «Любая» настройка принтера имеет неправильные поля / размер страницы, есть ли обходной путь? - PullRequest
0 голосов
/ 11 января 2020

Я работаю над графическим приложением для ОС Ma c в Swift и хочу иметь профессиональные функции макета WYSIWYG для печати. ​​

Я выделил странное поведение системы печати Какао и просто интересно, если кто-нибудь знает о шаге установки, который я пропускаю или обойти. Проблема заключается в том, что принтер «Любой» имеет нерегулярные нецентрированные поля, даже если запрашивается горизонтальное + вертикальное центрирование. В частности, левый край моего документа размером с альбомную букву составляет 18 пт, а правый - 40 пт - больше 1/2 дюйма, что я считаю недопустимым противоречием, не говоря уже о досадной неспособности полагаться на запрашиваемое центрирование.

Мое приложение основано на NSDocument, и я установил поля printInfo на 0, центрированные поля на true и ориентацию на .landscape.

self.printInfo.topMargin = 0.0
self.printInfo.rightMargin = 0.0
self.printInfo.leftMargin = 0.0
self.printInfo.bottomMargin = 0.0
self.printInfo.isHorizontallyCentered = true
self.printInfo.isVerticallyCentered = true
self.printInfo.orientation = .landscape

let newPrintOp = NSPrintOperation(view: self.printView!, printInfo: self.printInfo)
newPrintOp.showsPrintPanel = true        
return newPrintOp

Я использую Page Setup в этом У меня есть принтер EPSON, который дает мне возможность выбрать обычную печать или печать без полей, и, выбрав любой из вариантов, выбрав пейзаж США, я получаю разумное изображение imageablePageBounds, которое, как сообщается, будет рисовать.

При настройке страницы без полей я get

... imageablePageBounds: (0.0, 0.0, 792.0, 612.0)

и с «обычной» буквой / альбомной ориентацией я получаю

... imageablePageBounds: (8.4000244140625, 8.399999618530273, 775.199951171875, 595.1999759674072)

Последний задает минимальный драйвер, но если вы удвоите смещение на 8,4 точки и добавите к высоте и ширине, вы все равно получите 792x612 == 11 дюймов x 8,5 дюймов

Если вместо этого я выберу «Любой» принтер в настройках страницы и выберите US Letter, landscape, imageablePageBounds сообщается (и применяется, даже при печати в PDF) как: ... imageablePageBounds: (18.0, 18.0, 734.0, 576.0)

Это дает 1/4 "(18-pt) поля слева, снизу и сверху, но заставляет отступ в 40 пт вправо (так как ширина всего 734 - она ​​должна быть 756 для 10,5-дюймовой области рисования). И действительно, если я попытаюсь нарисовать 10-дюймовое изображение, центрированное с полями 36pt, правый край очень досадно обрезается, если я не масштабирую или не сдвигаю его. Это даже обрезается с выходом PDF с этой настройкой. Вот изображение на панели печати, на котором показана эта вырезка: внешняя черная линия - это границы изображения, заданные системой печати, а синяя линия (обрезанный правый край) - изображение по центру 10 x 7,5.

Screenshot of printing panel with issue

Кто-нибудь знает, есть ли исправление для этого странного поведения? Идеальным решением было бы получить разумную 1/4 "границу по умолчанию для всего, что я пытаюсь напечатать, но даже если я не могу получить максимальную ширину по умолчанию выше 734pt, я все равно хочу, чтобы она была отцентрирована так, чтобы я может по крайней мере работать в пределах 1/2 "поля без каких-либо ограничений.

Ответы [ 2 ]

0 голосов
/ 15 января 2020

Вот мое тестовое приложение, оно печатает вид на одной странице без полей, может быть, это поможет:

Document.swift

override func windowControllerDidLoadNib(_ windowController: NSWindowController) {
    let newPrintInfo = NSPrintInfo()
    newPrintInfo.leftMargin = 0.0
    newPrintInfo.bottomMargin = 0.0
    newPrintInfo.rightMargin = 0.0
    newPrintInfo.topMargin = 0.0
    newPrintInfo.horizontalPagination = .clip
    newPrintInfo.verticalPagination = .clip
    self.printInfo = newPrintInfo
}

override var printInfo: NSPrintInfo {
    didSet {
        view.printInfoChanged(printInfo)
    }
}

override func printOperation(withSettings printSettings: [NSPrintInfo.AttributeKey : Any]) throws -> NSPrintOperation {
    return NSPrintOperation(view: view, printInfo: printInfo)
}

MyView.swift

func printInfoChanged(_ newPrintInfo: NSPrintInfo) {
    setFrameSize(newPrintInfo.paperSize)
}

override func locationOfPrintRect(_ rect: NSRect) -> NSPoint {
    return NSZeroPoint
}

override func knowsPageRange(_ range: NSRangePointer) -> Bool {
    range.pointee.location = 1
    range.pointee.length = 1
    return true
}

override func rectForPage(_ page: Int) -> NSRect {
    return bounds
}

override func draw(_ dirtyRect: NSRect) {
    super.draw(dirtyRect)
    NSColor.green.set()
    NSBezierPath(rect:bounds).stroke()
    NSColor.red.set()
    NSBezierPath(ovalIn:bounds).stroke()
}
0 голосов
/ 13 января 2020

Хотя исходное поведение выглядит как ошибка, похоже, что установка поля printInfo.paperSize может обеспечить частичное обходное решение, если в Ma c имеется установленный принтер.

В дополнение к другие мои настройки, если я добавлю строку

self.printInfo.paperSize = CGSize(width: 792.0, height: 612.0)

для моего альбомного документа US-Letter и по-прежнему использую параметры страницы для настройки принтера "Любой" и буквы / ландшафта, когда задание на печать фактически запускает его сейчас показывает, что выбрал драйвер из драйвера EPSON, а не оставлял ошибочные поля «Любой» для драйвера - результат красиво центрирован с минимальными полями по желанию.

enter image description here

Я тестировал на MacBook Pro без установленного принтера, и этот обходной путь не устранил проблему - он все еще отображается с смещенным от центра полем и обрезает рисунок. Таким образом, для обходного пути требуется установить какой-то реальный принтер.

Я сообщил об ошибке через помощника Apple по обратной связи, опубликует обновление, если будет обнаружено или устранено что-либо еще.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...