Этот вопрос я задавал много раз, но до сих пор не могу найти правильный ответ. Моя цель - загрузить PDF-файл (отсканированные страницы вопросника), пометить каждую страницу номером страницы и сохранить каждую в отдельных файлах JPEG для дальнейшего использования. Все работает нормально, за исключением того, что NSString не отрисовывается. Я отлично работал, когда создал NSGraphicsContext из растрового представления, но разрешение изображения было слишком низким. Итак, я пришел к выводу, что это проблема с PDF, но не мог понять, что это такое.
let PDFAsData = try Data(contentsOf: pathname)
let dataInPDF = NSPDFImageRep(data: PDFAsData)!
let numberOfPages = dataInPDF.pageCount
for i in 0..<numberOfPages {
let pdfPage=pdfDocument.page(at: i+1)!
let mediaBoxRect = pdfPage.getBoxRect(.mediaBox)
let scale:CGFloat = 200.0/72.0
let width = Int(mediaBoxRect.width * scale)
let height = Int(mediaBoxRect.height * scale)
let context = CGContext(data: nil, width: width, height: height, bitsPerComponent: 8, bytesPerRow: 0, space: colorSpace, bitmapInfo: bitmapInfo)!
context.interpolationQuality = .high
context.scaleBy(x: scale, y: scale)
context.drawPDFPage(pdfPage)
context.saveGState()
do {
let paragraphStyle = NSMutableParagraphStyle.default().mutableCopy() as! NSMutableParagraphStyle
paragraphStyle.alignment = NSTextAlignment.left
let textFontAttributes = [NSFontAttributeName: NSFont(name: "Arial Bold", size: 10.0)!,
NSForegroundColorAttributeName: NSColor.black,
NSParagraphStyleAttributeName: paragraphStyle]
let text = "\(fileNameNSString), page: \(i+1)" as NSString
text.draw(at: CGPoint(x:10, y:10), withAttributes: textFontAttributes)
}
context.flush()
context.restoreGState()
let image=context.makeImage()! // Creates and returns a CGImage to be saved as JPEG
}





Вы используете PDFKit в своем проекте? Если да, загрузите образец кода Apple здесь. и замените строку:
let string: NSString = "U s e r 3 1 4 1 5 9"
с этой строкой:
let string: NSString = NSString(format: "Page %@", "\(self.pageRef?.pageNumber ?? 0)")
Я нашел часть решения с помощью CATextLayer, но пока не могу изменить положение строки на странице ... let textLayer = CATextLayer () textLayer.string = "(fileNameNSString), page: (i + 1)" textLayer.font = "Arial Bold" как CFTypeRef? textLayer.fontSize = 10.0 textLayer.foregroundColor = CGColor.black textLayer.alignmentMode = kCAAlignmentLeft textLayer.frame = CGRect (x: 0, y: 0, ширина: 500, высота: 50) textLayer.draw (in: context) let image = context.makeImage ()!