Сгенерированный неверный формат файла PDF при открытии на Android

#pdf-generation #ionic4 #ionic-native #pdfmake #capacitor

#pdf-генерация #ionic4 #ionic-native #pdfmake #конденсатор

Вопрос:

Я использую Ionic 4, Capacitor и pdfMake для генерации PDF и открытия на эмуляторе Android. Поскольку запись в файл Capacitor не поддерживает blob, я отправляю его как base64.

Примечание: Я пытался использовать плагин Cordova для сохранения в виде большого двоичного объекта, но он не работает должным образом с capacitor. Также у меня есть решение, которое отлично работает только в проекте Cordova, но мне нужно использовать Capacitor.

Однако, когда я открываю pdf на устройстве, он сообщает, что он в недопустимом формате.
Есть идеи, что я здесь делаю не так?

 if (this.plt.is('cordova')) {
  this.pdfObj.getBase64((data) => {
    this.pdfBase64 = data;
    console.log(this.pdfBase64);
  });


downloadPdf() {
const { Filesystem } = Plugins;

if (this.plt.is('cordova')) {
  console.log('3');
    // Save the PDF to the data Directory of our App
    const fileName = 'defectreport.pdf';
    try {
      Filesystem.writeFile({
        path: fileName,
        data: this.pdfBase64,
        directory: FilesystemDirectory.Data,
        encoding: FilesystemEncoding.ASCII
      }).then((writeFileResult) => {
        console.log('File Written');
        Filesystem.getUri({
            directory: FilesystemDirectory.Data,
            path: fileName
        }).then((getUriResult) => {
            console.log(getUriResult);
            const path = getUriResult.uri;
            this.fileOpener.open(path, 'application/pdf')
            .then(() => console.log('File is opened'))
            .catch(error => console.log('Error openening file', error));
        }, (error) => {
            console.log(error);
        });
      });
      console.log('writeFile complete');
    } catch (error) {
      console.error('Unable to write file', error);
    }
  

Ответ №1:

Документация для файловой системы Capacitor вводит в заблуждение. Если вы передаете параметр encoding в Filesystem.WriteFile, предполагается, что это обычный текстовый файл. Если вы не укажете его, он принимает base64. Приведенный ниже код работает.

  Filesystem.writeFile({
        path: fileName,
        data: this.pdfBase64,
        directory: FilesystemDirectory.Documents