从 Swift 上传 PDF 文件生成空白 PDF
Uploading a PDF File From Swift Yields a Blank PDF
我正在尝试上传从 UIImage 生成的 PDF。我使用我的相机框架拍照,上传一切正常,但 S3 上的 PDF 是空白的。下面是我使用的代码:
- 我使用以下 class 从 UIImage 创建 PDF,测试正常。
// Using PDFKit
func generatePDF(source: UIImage) -> PDFDocument {
let pdfDocument = PDFDocument()
let pdfPage = PDFPage(image: source)
pdfDocument.insert(pdfPage!, at: 0)
return pdfDocument
}
- 我用Alamofire对pdf进行了分段上传,测试没问题。
class NetworkManager {
static let shared = NetworkManager()
func upload(document: Data, name: String) {
let filename = "\(name).pdf"
let urlString = endpoint + "?filename=" + filename
let url = URL(string: urlString)!
var request = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 30)
request.method = .post
request.setValue(key, forHTTPHeaderField: api)
AF.upload(multipartFormData: { multiPart in
multiPart.append(document, withName: name, fileName: filename, mimeType: "application/pdf")
}, with: request)
.uploadProgress(queue: .main, closure: { progress in
print("Upload Progress: \(progress.fractionCompleted)")
})
.responseJSON(completionHandler: { data in
print("data: \(data)")
})
}
}
- 在 AWS 上,我使用以下框架将多部分数据重建回 PDF
lambda-multipart-parser
https://www.npmjs.com/package/lambda-multipart-parser
我如何在 Lambda 中使用它:
let filename = event.queryStringParameters.filename;
let documentData = await imageParser.parse(event);
let document = documentData.files[0];
var data = {
Bucket: 'order-scanned-copy',
Key: filename,
Body: document.content,
ContentType: "application/pdf",
};
let uploadFile = await s3.putObject(data).promise();
没有错误,没有警告,只是一个空白的 PDF。我可以从大约 500kb-1mb 的大小看出它里面有东西。任何帮助将不胜感激。
谢谢。
我想通了,因为我专门使用 AWS API 网关和 Lambda,所以我需要将“二进制媒体类型”添加到 API 网关。为此,我打开 Api 网关控制台并选择我的 API。然后,选择设置并添加以下类型。
我重新部署了我的 api,一切正常,所以最后这不是代码问题,而是 AWS 上的配置错误。
这篇博客 post 非常有帮助:
AWS SAM Configuration for API Gateway Binary Response / Payloads
感谢大家的帮助。
我正在尝试上传从 UIImage 生成的 PDF。我使用我的相机框架拍照,上传一切正常,但 S3 上的 PDF 是空白的。下面是我使用的代码:
- 我使用以下 class 从 UIImage 创建 PDF,测试正常。
// Using PDFKit
func generatePDF(source: UIImage) -> PDFDocument {
let pdfDocument = PDFDocument()
let pdfPage = PDFPage(image: source)
pdfDocument.insert(pdfPage!, at: 0)
return pdfDocument
}
- 我用Alamofire对pdf进行了分段上传,测试没问题。
class NetworkManager {
static let shared = NetworkManager()
func upload(document: Data, name: String) {
let filename = "\(name).pdf"
let urlString = endpoint + "?filename=" + filename
let url = URL(string: urlString)!
var request = URLRequest(url: url, cachePolicy: .useProtocolCachePolicy, timeoutInterval: 30)
request.method = .post
request.setValue(key, forHTTPHeaderField: api)
AF.upload(multipartFormData: { multiPart in
multiPart.append(document, withName: name, fileName: filename, mimeType: "application/pdf")
}, with: request)
.uploadProgress(queue: .main, closure: { progress in
print("Upload Progress: \(progress.fractionCompleted)")
})
.responseJSON(completionHandler: { data in
print("data: \(data)")
})
}
}
- 在 AWS 上,我使用以下框架将多部分数据重建回 PDF
lambda-multipart-parser
https://www.npmjs.com/package/lambda-multipart-parser
我如何在 Lambda 中使用它:
let filename = event.queryStringParameters.filename;
let documentData = await imageParser.parse(event);
let document = documentData.files[0];
var data = {
Bucket: 'order-scanned-copy',
Key: filename,
Body: document.content,
ContentType: "application/pdf",
};
let uploadFile = await s3.putObject(data).promise();
没有错误,没有警告,只是一个空白的 PDF。我可以从大约 500kb-1mb 的大小看出它里面有东西。任何帮助将不胜感激。
谢谢。
我想通了,因为我专门使用 AWS API 网关和 Lambda,所以我需要将“二进制媒体类型”添加到 API 网关。为此,我打开 Api 网关控制台并选择我的 API。然后,选择设置并添加以下类型。
我重新部署了我的 api,一切正常,所以最后这不是代码问题,而是 AWS 上的配置错误。
这篇博客 post 非常有帮助: AWS SAM Configuration for API Gateway Binary Response / Payloads
感谢大家的帮助。