У меня есть следующий фрагмент кода для преобразования страницы PDF в CGImage:
func testPrint(pp:UnsafePointer<Void>) { // debug to see bits
var p = UnsafePointer<UInt8>(pp)
var res = ""
for _ in 0..<200 {
res += "\(p.memory) "
p = p.advancedBy(1)
}
print(res)
}
func pageOneFromPDF(file:String) -> CGImage? {
let url = NSURL(fileURLWithPath: file)
let pdfDocument = CGPDFDocumentCreateWithURL(url)
let pageOne = CGPDFDocumentGetPage(pdfDocument, 1)
let rect = CGPDFPageGetBoxRect(pageOne, .MediaBox)
let width = Int(rect.size.width)
let height = Int(rect.size.height)
let context = CGBitmapContextCreate(nil, width, height, 8, width, CGColorSpaceCreateDeviceGray(), CGImageAlphaInfo.Only.rawValue)!
CGContextClearRect(context, rect)
CGContextDrawPDFPage(context, pageOne)
testPrint(CGBitmapContextGetData(context))
return CGBitmapContextCreateImage(context)
}
Это действительно преобразует мою страницу PDF в растровую карту с серой шкалой. Единственная проблема: в результате цвет CGImage
инвертирован (черный становится белым и наоборот). Я возился с параметрами CGBitmapContextCreate
, но безуспешно.
P.S. Я добавил этот фрагмент кода, чтобы обратить негативное на позитивное:
func inverse(pp:UnsafePointer<Void>, size:Int) {
var p = UnsafeMutablePointer<UInt8>(pp)
for _ in 0..<size {
p.memory = 255-p.memory
p = p.advancedBy(1)
}
}
что работает, но, конечно, я хотел бы в первую очередь получить правильное изображение.
РЕДАКТИРОВАТЬ: Думаю, я, должно быть, делаю что-то глупое. Когда я визуализирую, как указано выше, и инвертирую все изображение, это выглядит как
где слева это предварительный просмотр Finder, а справа мой рендеринг. Как я теперь заметил, это инвертирует части изображения. Я пробовал использовать код @Tricertops и получил (черные блоки выше / ниже из списка с другими PDF-файлами)
и, очевидно, у него правильные значения серого, но есть некоторая черная маска, которая скрывает изображение. Чистый текст слева теперь невидим, но изображения отображаются правильно.