3

I have created a lambda function using serverless SAM and .NET core. This function is fired via API Gateway on a GET request and should return a pdf file. I'm using itextsharp to create pdf and trying to return the pdf file with the following command

public async Task<IActionResult> GenerateReport()
{
    var reportName = "test";
    var result = await reportHandler.GenerateReportAsync();         
    return File(result, System.Net.Mime.MediaTypeNames.Application.Pdf, reportName + ".pdf");
}

After take a look this thread AWS Lambda fails to return PDF file I also add application/pdf as binary mediatype in my API Gateway like this in my serverless.yaml

Globals:
  Api:
    BinaryMediaTypes:
    - application~1pdf
Resources:
  ApiGateway:
    Type: AWS::Serverless::Api
    Properties:
      StageName:
        Ref: Environment
      Name:
        Fn::Join:
          - "-"
          - - Ref: AWS::StackName
            - "api"  
    ContentHandling:
    - CONVERT_TO_BINARY

However when I try to open the PDF, I still got an error: "failed to open PDF Document". When I open the pdf file with notepad it looks something like this (I just make it shortend)

JVBERi0xLjQKJeLjz9MKMSAwIG9iago8PC9UeXBlL1hPYmplY3QvU3VidHlwZS9JbWFnZS9XaWR0aCAxNzIvSGVpZ2h0IDM2L0xlbmd0aCAxNjkwL0NvbG9yU3BhY2VbL0luZGV4ZWQvRGV2aWNlUkdCIDI1NSigoKBNTU0BAQGhoaECAgIXFxdMTEz9/f2Xl5f+/v7y8vJpaWkYGBjx8fHMzMxZWVkWFhalpaUcHBwZGRlLS0ukpKQGY1YzRlNjFhNjIwYjFkZjNjMDM1MjE1PjwwZTk1MTRhOGRmNWM0ZTYxYTYyMGIxZGYzYzAzNTIxNT5dPj4KJWlUZXh0LTUuNS4xMy4yCnN0YXJ0eHJlZgo0NTQzCiUlRU9GCg==

Anyone can help what is the problem here?

Note: It working fine in my local machine (I can open PDF perfectly). It just doesn't work after deployment

wapt49
  • 213
  • 2
  • 16
  • 1
    The file is being base64 encoded. Maybe trying this `https://stackoverflow.com/questions/59263288/how-to-stop-aws-api-gateway-from-base64-encoding-binary-responses` will help? – Frank Nielsen Mar 21 '21 at 18:23
  • @FrankNielsen I'm not sure where to put "x-amazon-apigateway-integration" in my serverless.yaml. However I try to add CONVERT_TO_BINARY in contenthandling (please see my serverless.yaml) but still doesn't work. Any Idea? – wapt49 Mar 21 '21 at 22:44

1 Answers1

1

Using sam 1.33.0, It worked with an AWS::Serverless::Api resource like this:

  LocalApi:
    Type: AWS::Serverless::Api
    Properties:
      StageName: dev
      DefinitionBody:
        x-amazon-apigateway-binary-media-types:
          - "*/*"