Xamarin.Android pdf 生成器
Xamarin.Android pdf generator
我最近一直在研究 Xamarin.Android
。我需要使用 pdf 生成器通过电子邮件发送报告。
我遇到了以下 blog。我真的不知道要在 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);
首先确保在 Manifest
文件中允许 WriteExternalStorage
In order to read or write files on the external storage, your app must
acquire the READ_EXTERNAL_STORAGE or WRITE_EXTERNAL_STORAGE system
permissions. For example:
<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 Storage
- 将 PCL 存储库添加到您的 PCL 项目以及使用 nuget 的相关平台。
安装包PCL存储
将 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项目后,有时system.drawings和system.security会出现错误。解决方案是使用 iTEXT sharp 源代码删除所有 system.drawings 和 system.security 依赖项。
编码愉快。
我最近一直在研究 Xamarin.Android
。我需要使用 pdf 生成器通过电子邮件发送报告。
我遇到了以下 blog。我真的不知道要在 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);
首先确保在 Manifest
文件中允许 WriteExternalStorage
In order to read or write files on the external storage, your app must acquire the READ_EXTERNAL_STORAGE or WRITE_EXTERNAL_STORAGE system permissions. For example:
<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 Storage
- 将 PCL 存储库添加到您的 PCL 项目以及使用 nuget 的相关平台。
安装包PCL存储
将 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项目后,有时system.drawings和system.security会出现错误。解决方案是使用 iTEXT sharp 源代码删除所有 system.drawings 和 system.security 依赖项。
编码愉快。