Xamarin的.Android pdf生成器

本文关键字:pdf Android Xamarin | 更新日期: 2023-09-27 18:17:25

我最近一直在做Xamarin.Android。我需要使用pdf生成器通过电子邮件发送报告。

我被介绍到下面的博客。我真的不知道该在FileStream fs = new FileStream (???????);里放什么,除此之外,我想在屏幕上打开或看到那个pdf。

using System;
using Android.App;
using Android.Content;
using Android.Runtime;
using Android.Views;
using Android.Widget;
using Android.OS;
using System.IO;
using XamiTextSharpLGPL;
using iTextSharp.text;
using iTextSharp.text.pdf;
using iTextSharp;

namespace PDFAapp
{
    [Activity (Label = "PDFAapp", MainLauncher = true, Icon = "@drawable/icon")]
    public class MainActivity : Activity
    {
        int count = 1;
        protected override void OnCreate (Bundle bundle)
        {
            base.OnCreate (bundle);
            // Set our view from the "main" layout resource
            SetContentView (Resource.Layout.Main);
            FileStream fs = new FileStream (???????);
            Document document = new Document (PageSize.A4, 25, 25, 30, 30);
            PdfWriter writer = PdfWriter.GetInstance (document, fs);
            document.Add(new Paragraph("Hello World"));
            document.Close();
            writer.Close();
            fs.Close();
        }
    }
}

编辑1:

使用以下代码打开生成的Pdf,但显示Pdf格式无效

Java.IO.File file = new Java.IO.File(filePath);
Intent intent = new Intent(Intent.ActionView);
intent.SetDataAndType(Android.Net.Uri.FromFile(file), "application/pdf");
StartActivity(intent);

Xamarin的.Android pdf生成器

首先确保在Manifest文件中允许WriteExternalStorage

为了在外部存储器上读写文件,你的应用程序必须获取READ_EXTERNAL_STORAGE或WRITE_EXTERNAL_STORAGE系统权限。例如:

 <manifest ...>
     <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
 </manifest>

FileStream构造函数(众多构造函数之一)接受字符串作为路径和FileMode,因此一个示例解决方案将是。

  var directory = new Java.IO.File(Android.OS.Environment.ExternalStorageDirectory, "pdf").ToString();
  if (!Directory.Exists(directory))
  {
      Directory.CreateDirectory(directory);
  }
  var path = Path.Combine(directory, "myTestFile.pdf");
  var fs = new FileStream(path, FileMode.Create);

这将创建名为"pdf"的文件夹到外部存储,然后创建pdf文件。在创建文件之前,可以包含额外的代码来检查文件是否存在。

编辑:完整的例子,只是在我的设备上测试:
        protected override void OnCreate(Bundle bundle)
        {
            base.OnCreate(bundle);
            // Set our view from the "main" layout resource
            SetContentView(Resource.Layout.Main);
            var directory = new Java.IO.File(Android.OS.Environment.ExternalStorageDirectory, "pdf").ToString();
            if (!Directory.Exists(directory))
            {
                Directory.CreateDirectory(directory);
            }
            var path = Path.Combine(directory, "myTestFile.pdf");
            if (File.Exists(path))
            {
                File.Delete(path);
            }
            var fs = new FileStream(path, FileMode.Create);
            Document document = new Document(PageSize.A4, 25, 25, 30, 30);
            PdfWriter writer = PdfWriter.GetInstance(document, fs);
            document.Open();
            document.Add(new Paragraph("Hello World"));
            document.Close();
            writer.Close();
            fs.Close();
            Java.IO.File file = new Java.IO.File(path);
            Intent intent = new Intent(Intent.ActionView);
            intent.SetDataAndType(Android.Net.Uri.FromFile(file), "application/pdf");
            StartActivity(intent);
        }

如果您正在进行跨平台开发,最好在注释处生成PDF。请参阅以下使用iTEXT sharp在PCL中创建PDF的代码。iTEXT PDF

这里我使用PCL存储库进行IO访问,这对PCL非常有用。你可以在这里找到更多信息PCL存储

  1. 将PCL存储库添加到您的PCL项目中,以及使用nuget的相关平台。

安装包PCLStorage

  • 将iTEXT PDF添加到您的PCL项目

    安装包iTextSharp

  • 在PCL项目中使用下面的代码

    public class PdfHelper
    {
      public async Task PCLGenaratePdf(string path)
      {
        IFolder rootFolder = await FileSystem.Current.GetFolderFromPathAsync(path);
        IFolder folder = await rootFolder.CreateFolderAsync("folder", CreationCollisionOption.OpenIfExists);
        IFile file = await folder.CreateFileAsync("file.pdf", CreationCollisionOption.ReplaceExisting);
        using (var fs = await file.OpenAsync(FileAccess.ReadAndWrite))
        {
            var document = new Document(PageSize.A4, 25, 25, 30, 30);
            PdfWriter writer = PdfWriter.GetInstance(document, fs);
            document.Open();
            document.Add(new Paragraph("heloo everyone"));
            document.Close();
            writer.Close();
        }
     }
     public async Task<string> PCLReadFile(string path)
     {
        IFile file = await FileSystem.Current.GetFileFromPathAsync(path);
        return file.Path;
     }
    }
    
  • 在android项目中使用下面的代码

    生成PDF

        private async void Genarate(string path)
        {
            var creator = new PdfHelper();
            await creator.PCLGenaratePdf(path);
        }
    

    使用intent阅读PDF

        private async void ReadPDF(object sender, EventArgs e)
         {
            String sdCardPath = Environment.ExternalStorageDirectory.AbsolutePath;
            String fullpath = Path.Combine(sdCardPath, "folder/" + "file.pdf");
            var creator = new PdfHelper();
            string filePath = await creator.PCLReadFile(fullpath);
            Uri pdfPath = Uri.FromFile(new File(filePath));
            Intent intent = new Intent(Intent.ActionView);
            intent.SetDataAndType(pdfPath, "application/pdf");
            intent.SetFlags(ActivityFlags.NewTask);
            Application.Context.StartActivity(intent);
        }
    
  • 编写ios代码来生成和获取PDF。

    注意: 有时系统会出现错误。图纸和系统。在编译PCL项目后,将使用解决方案是使用iTEXT尖锐的源代码删除所有系统。图纸和系统。安全依赖关系。

    快乐编码。