私は一連の画像(1ページに1つの画像)にPDFを変換するには、次の機能を持っている:PDFをPNGに効率的に変換するには?
import Quartz
func convertPDF(at sourceURL: URL, to destinationURL: URL, fileType: NSBitmapImageFileType, dpi: CGFloat = 200) throws -> [URL] {
let fileExtension: String
switch fileType {
case .BMP: fileExtension = "bmp"
case .GIF: fileExtension = "gif"
case .JPEG, .JPEG2000: fileExtension = "jpeg"
case .PNG: fileExtension = "png"
case .TIFF: fileExtension = "tiff"
}
let data = try Data(contentsOf: sourceURL)
let pdfImageRep = NSPDFImageRep(data: data)!
var imageURLs = [URL]()
for i in 0..<pdfImageRep.pageCount {
pdfImageRep.currentPage = i
let width = pdfImageRep.size.width/72 * dpi
let height = pdfImageRep.size.height/72 * dpi
let image = NSImage(size: CGSize(width: width, height: height), flipped: false) { dstRect in
pdfImageRep.draw(in: dstRect)
}
let bitmapImageRep = NSBitmapImageRep(data: image.tiffRepresentation!)!
let bitmapData = bitmapImageRep.representation(using: fileType, properties: [:])!
let imageURL = destinationURL.appendingPathComponent("\(sourceURL.deletingPathExtension().lastPathComponent)-Page\(i+1).\(fileExtension)")
try bitmapData.write(to: imageURL, options: [.atomic])
imageURLs.append(imageURL)
}
return imageURLs
}
これは罰金、パフォーマンスが猛烈に速くない動作しますが、それは重要ではありません。私の問題はメモリ消費と関係があります。のは、私が長いPDFを変換していましょう(Appleの10-Q、51ページの長さ):
let sourceURL = URL(string: "http://files.shareholder.com/downloads/AAPL/4907179320x0x952191/4B5199AE-34E7-47D7-8502-CF30488B3B05/10-Q_Q3_2017_As-Filed_.pdf")!
let destinationURL = URL(fileURLWithPath: "/Users/mike/PDF")
let _ = try convertPDF(at: sourceURL, to: destinationURL, fileType: .PNG, dpi: 200)
メモリ使用量は、最後のページの最後で〜11ギガバイトに増加し続けます!
私も気づかいくつかのこと:
- 私は楽器を介してこれを実行したときには、驚くべきことに、何の漏出を示しませんでした。 2つの大きなメモリの豚は
bitmapImageRep
とbitmapData
です。それらは反復の間に解放されたようには見えない。 - これをプロファイリングすると、Debugビルドと比較してもパフォーマンスが低下します。
- DPIを小さくするとメモリの占有面積は明らかに減少しますが、動作は変わりません。メモリはページ数に比例して増加します。
- 51ページのPDFを1ページに変換するのか、1ページの51ページのPDFを変換するのかは同じです。
どのようにしてメモリフットプリントを減らすことができますか? PDFを画像に変換するより良い方法はありますか?
質問があります - 私のapiレスポンスは "image"という文字列を返します。タイプは "png"または "pdf"をキャプチャする別のプロパティタイプです。文字列base64Encodedを使用して、どのようにpngにこのデコードされたデータを変換するのですか?任意のポインタ? – user2525211