CGPDF drawPDFPage с поддержкой вращения

Я сохраняю файл PDF с помощью CGPDF под iOS 10. Для этого я загружаю существующую страницу PDF и записываю ее в новый файл с контекстом. При этом информация о повороте теряется, и в полученном PDF-файле все страницы перестраиваются под углом 0°.

let writeContext: CGContext = CGContext(finalPDFURL, mediaBox: nil, nil)!

// Loop through all pages
let page: CGPDFPage = ...
var mediaBox = page.getBoxRect(.mediaBox)
writeContext.beginPage(mediaBox: &mediaBox)
writeContext.drawPDFPage(page)
writeContext.endPage()
// Loop finished

writeContext.closePDF()

Затем я придумал этот код, который прекрасно справляется с вращением, но, кажется, рисует содержимое с небольшим смещением. Использование его с PDF-файлом, в котором есть текст или что-либо еще близкое к полям, приводит к обрезанию содержимого. Позже попытался также установить x, y и т. Д. В словаре pageInfo, но я думаю, что я что-то неправильно понял, см. 2-й вопрос ниже.

let page: CGPDFPage = ...

// Set the rotation
var pageDict = [String: Int32]()
pageDict["Rotate"] = CGFloat.init(page.rotationAngle)

writeContext.beginPDFPage(pageDict as CFDictionary?)
writeContext.drawPDFPage(page)
writeContext.endPDFPage()

Итак, мои вопросы,

1) Как использовать первый подход, но с поддержкой вращения? Или второй, но без обрезки контента?

2) Где я могу найти полный список всех доступных пар ключ-значение pageInfo для этого метода? https://developer.apple.com/reference/coregraphics/cgcontext/1456578-beginpdfpage

Спасибо!


person Jim B    schedule 03.01.2017    source источник


Ответы (2)


Вопрос старый, но надеюсь, что следующий ответ будет полезен кому-то в будущем. Он сохранит информацию о повороте исходной страницы PDF.

  1. Как использовать первый подход, но с поддержкой вращения?
let writeContext: CGContext = CGContext(finalPDFURL, mediaBox: nil, nil)!

// Loop through all pages
let page: CGPDFPage = ...
var mediaBox = page.getBoxRect(.mediaBox)
writeContext.beginPage(mediaBox: &mediaBox)

let m = page.getDrawingTransform(.mediaBox, rect: mediaBox, rotate: 0, preserveAspectRatio: true)

// Following 3 lines makes the rotations so that the page look in the right direction
writeContext.translateBy(x: 0.0, y: mediaBox.size.height)
writeContext.scaleBy(x: 1, y: -1)
writeContext.concatenate(m)

writeContext.drawPDFPage(page)
writeContext.endPage()
// Loop finished

writeContext.closePDF()
person S.Basnagoda    schedule 18.11.2020

Я получил отзыв от другого программиста iOS, который предложил следующий принцип:

Эти три шага должны позволить вам воссоздать исходную страницу в месте назначения, сохраняя при этом поле поворота страницы: (1) установить поворот исходной страницы на странице назначения с помощью словаря страниц, (2) установить этот поворот (или, возможно, поворот * -1?) в CGContext, в который вы рисуете, и, наконец, (3) явно установите поле мультимедиа в месте назначения, чтобы оно было идентичным источнику (без поворота).

person Jim B    schedule 26.07.2017
comment
Как уже говорилось, я получил только отзывы, без примеров кода, я все еще думаю, что эти указатели могут когда-нибудь кому-нибудь помочь, поэтому я их добавил. Тем временем я перешел на обновленный PDFKit от Apple, с которым гораздо приятнее работать. - person Jim B; 18.03.2019