首页 > 解决方案 > 如何在 base64 中转换 pdf 文件或 blob?

问题描述

我在 NodeJS 中的 API 正在使用 pdf 文件做出响应,但是我使用 react 的前端无法获取此文件并使其“可下载”,所以我试图将其转换为 base 64。问题是,如何?

我尝试以这种方式使用这个npm 包

  const bytes = await utf8.encode(bill)
  const encoded = await base64.encode(bytes)
  console.log(typeof encoded)
  console.log(typeof bytes)

在这个项目中,我也使用这个模块,他使用 PDFkit 生成一个方坯,我在这个项目中使用 Adonis

    const duplicata = await Duplicata.findBy('id', params.id)
const banco = await duplicata.banco().fetch()
const empresa = await duplicata.empresa().fetch()
const cliente = await Cliente.findBy('cnpj', auth.user.cnpj)
const clienteEnderecos = await cliente.clienteEnderecos().fetch()
const endereco = await clienteEnderecos.toJSON().find(endereco => {
  if (endereco.tipo_endereco === 'COBRANCA') {
    return endereco
  }
  if (endereco.tipo_endereco === 'PRINCIPAL') {
    return endereco
  }
  if (endereco.tipo_endereco === 'ENTREGA') {
    return endereco
  }
})

empresa.bairro = empresa.bairro.trim()
cliente.nome_razao = cliente.nome_razao.trim()
cliente.sobrenome_fantasia = cliente.sobrenome_fantasia.trim()

const boleto = {
  banco: Utils.getBankModel(banco.cod_banco),
  pagador: {
    Nome: cliente.nome_razao + ' ' + cliente.sobrenome_fantasia,
    RegistroNacional: cliente.cnpj,
    Logradouro: endereco.endereco,
    Bairro: endereco.bairro,
    Uf: endereco.uf,
    Cep: endereco.cep
  },
  beneficiario: {
    dadosBancarios: {
      carteira: banco.carteira,
      agencia: banco.agencia,
      agenciaDigito: banco.digito,
      conta: banco.conta,
      contaDigito: banco.digito_conta,
      nossoNumero: duplicata.nro_documento.slice(0, -1),
      nossoNumeroDigito: duplicata.nro_documento && duplicata.nro_documento.charAt(duplicata.nro_documento.length - 1)
    },
    dadosEndereco: {
      descricao: empresa.descricao,
      endereco: empresa.endereco,
      bairro: empresa.bairro,
      cidade: empresa.cidade,
      uf: empresa.uf,
      cep: empresa.cep,
      numero: empresa.numero,
      cnpj_empresa: empresa.cnpj_empresa
    }
  },
  boleto: {
    numeroDocumento: duplicata.nro_duplicata + ' ' + duplicata.serie_duplicata,
    especieDocumento: 'DM',
    valor: parseFloat(duplicata.valor_duplicata),
    datas: {
      vencimento: moment(duplicata.vencimento_duplicata, 'mm-dd-yyyy'),
      processamento: moment(duplicata.emissao_duplicata, 'mm-dd-yyyy'),
      documentos: moment(duplicata.emissao_duplicata, 'mm-dd-yyyy')
    }
  },
  instrucao: {
    Juros: parseFloat(duplicata.juros_mora)
  }

}

const novoBoleto = Utils.gerarBoleto(boleto)
    try {
  if (!fs.existsSync((Helpers.tmpPath('boletos')))) fs.mkdirSync('./tmp/boletos')
  const stream = fs.createWriteStream(Helpers.tmpPath('boletos/boleto.pdf'))

  const boleto = await new Gerador.boleto.Gerador(novoBoleto).gerarPDF({
    creditos: '',
    stream: stream
  })
  boleto.end()

  const bytes = await utf8.encode(boleto)
  const encoded = await base64.encode(bytes)
  console.log(encoded)
  console.log(bytes)

  response.type('pdf')
  response.implicitEnd = false

  boleto.pipe(response.response)

这个包中的主要变量是葡萄牙语

但是我的控制台我无法得到任何答案,只是一个空字符串,只是在编码的变量中,但我没有使用 utf8 编码器进行编码,但响应不是我所期望的(base64 答案)。

我不知道如何以有用的方式显示我的代码所以我愿意接受任何建议或我需要显示哪些信息以更好地获得解决方案,tks :D

标签: javascriptnode.jsapibase64encode

解决方案


推荐阅读