从 Swift 上传 PDF 文件会产生空白 PDF

Posted

技术标签:

【中文标题】从 Swift 上传 PDF 文件会产生空白 PDF【英文标题】:Uploading a PDF File From Swift Yields a Blank PDF 【发布时间】:2021-10-05 14:58:24 【问题描述】:

我正在尝试上传从 UIImage 生成的 PDF。我使用我的相机框架拍照,上传一切正常,但 S3 上的 PDF 是空白的。以下是我正在使用的代码:

    我使用以下类从 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-parserhttps://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 的大小来判断它里面有什么东西。任何帮助将不胜感激。

谢谢。

【问题讨论】:

如何将 PDF 文档写入您上传的数据中?您在哪里说“测试正常”是否意味着您已经查看了生成的 PDF 文件的内容并验证了 PDF 是否正确生成? 那个叫'api'的人是什么?您如何将 PDF 文件转换为 Data 对象?您在哪里上传数据? 如果您尝试通过将Data 对象设为UIImageJPEGRepresentation 来上传JPEG 图像会发生什么? 我使用断点检查pdf对象的创建,打开它保存了一个有效的pdf。 'api' 是 api-header 的变量。我可以用一个更好的名字。我在 PDF 文档上使用数据表示来生成数据对象。我正在使用alamofire的分段上传功能,这部分:multiPart.append(document, withName: name, fileName: filename, mimeType: "application/pdf") 【参考方案1】:

我想通了,因为我专门使用 AWS API Gateway 和 Lambda,我需要将“二进制媒体类型”添加到 API Gateway。为此,我打开了 Api Gateway 控制台并选择我的 API。然后,选择设置并添加以下类型。

我重新部署了我的 api,一切正常,所以最后不是代码问题,而是 AWS 上的配置错误。

这篇博文很有帮助: AWS SAM Configuration for API Gateway Binary Response / Payloads

感谢大家的帮助。

【讨论】:

以上是关于从 Swift 上传 PDF 文件会产生空白 PDF的主要内容,如果未能解决你的问题,请参考以下文章

Libreoffice 在命令行上将 HTML 转换为 PDF 会产生空白页面

Xcode+Swift:UIImageView 自动产生空白区域。如何删除它?

如何使用 alamofire 将多个 PDF 文件上传到服务器? #Swift 4 #IOS [重复]

PDF怎么删除空白页,PDF删除空白页的方法

将 WebView 保存为 PDF 会返回空白图像?

将 PDF 内容上传到 S3 存储桶