Source Code How to generate PDF files in FMX Android project using JAVA classes (Delphi Firemonkey native class)

emailx45

Premium
Joined
May 5, 2008
Messages
2,478
Reaction score
2,222
Location
here and there
How to generate PDF files in FMX Android project using JAVA classes (Delphi Firemonkey native class)
  • How to generate a PDF with Delphi on Android 5.0 and above
  • Extra: How to open a PDF viewer with Delphi on Android 5.0 and above.
  • by Alessandro Martini
[SHOWTOGROUPS=4,20]
How-To-Generate-PDFin-FMXAndroid-Delphi.png


NOTE: original post by Alessandro Martini on GitHub! AlessandroMartini/Delphi-Android-GeraPDF

Code:
unit GeradorPDF;

interface

uses
  System.SysUtils,
  System.Types,
  System.UITypes,
  System.Classes,
  System.Variants,
  FMX.Types,
  FMX.Controls,
  FMX.Forms,
  FMX.Graphics,
  FMX.Dialogs,
  FMX.Controls.Presentation,
  FMX.StdCtrls,
  FMX.Objects;

type
  TForm1 = class(TForm)
    Image1: TImage;
    btGerarPDF: TButton;
    procedure btGerarPDFClick(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

uses
  Androidapi.JNI.GraphicsContentViewText,
  Androidapi.JNI.JavaTypes,
  Androidapi.JNI.Net,
  Androidapi.Helpers,
  System.IOUtils,
  FMX.Helpers.android,
  FMX.surfaces;

{$R *.fmx}

function FileNameToUri(const FileName: string): Jnet_Uri;
var
  JavaFile: JFile;
begin
  JavaFile := TJFile.JavaClass.init(StringToJString(FileName));
  Result   := TJnet_Uri.JavaClass.fromFile(JavaFile);
end;

procedure TForm1.btGerarPDFClick(Sender: TObject);
var
  Document    : JPdfDocument;
  PageInfo    : JPdfDocument_PageInfo;
  Page        : JPdfDocument_Page;
  Canvas      : JCanvas;
  Paint       : JPaint;
  Recto       : JRect;
  Rect        : JRect;
  FileName    : string;
  OutputStream: JFileOutputStream;
  Intent      : JIntent;
  NativeBitmap: JBitmap;
  sBitMap     : TBitmapSurface;
begin
  // create Pdf document
  Document := TJPdfDocument.JavaClass.init;
  try
    // create page  1
    PageInfo := TJPageInfo_Builder.JavaClass.init(100, 100, 1).create;
    Page     := Document.startPage(PageInfo);

    Canvas := Page.getCanvas;
    Paint  := TJPaint.JavaClass.init;

    Paint.setARGB($FF, 0, 0, $FF);
    Canvas.drawText(StringToJString('Página 1'), 10, 50, Paint);

    Document.finishPage(Page);

    // create page 2
    PageInfo := TJPageInfo_Builder.JavaClass.init(100, 100, 2).create;
    Page     := Document.startPage(PageInfo);

    Canvas := Page.getCanvas;
    Paint  := TJPaint.JavaClass.init;

    Paint.setARGB($FF, $FF, 0, 0);
    Canvas.drawLine(10, 10, 90, 10, Paint);

    Paint.setStrokeWidth(1);
    Paint.setARGB($FF, 0, $FF, 0);
    Canvas.drawLine(10, 20, 90, 20, Paint);

    Paint.setStrokeWidth(2);
    Paint.setARGB($FF, 0, 0, $FF);
    Canvas.drawLine(10, 30, 90, 30, Paint);

    Paint.setARGB($FF, $FF, $FF, 0);
    Canvas.drawRect(10, 40, 90, 60, Paint);

    Rect := TJRect.JavaClass.init;
    Rect.&set(15, 50, 65, 100);
    Recto := TJRect.JavaClass.init;
    Recto.&set(0, 0, Image1.Bitmap.Width, Image1.Bitmap.Height);
    Paint.setARGB($FF, $FF, 0, $FF);

    NativeBitmap := TJBitmap.JavaClass.createBitmap(Image1.Bitmap.Width, Image1.Bitmap.Height, TJBitmap_Config.JavaClass.ARGB_8888);
    sBitMap      := TBitmapSurface.create;
    sBitMap.Assign(Image1.Bitmap);
    SurfaceToJBitmap(sBitMap, NativeBitmap);

    Canvas.drawBitmap(NativeBitmap, Recto, Rect, Paint);

    Document.finishPage(Page);

    // write PDF document to file
    FileName     := TPath.Combine(TPath.GetSharedDocumentsPath, 'demo.pdf');
    OutputStream := TJFileOutputStream.JavaClass.init(StringToJString(FileName));
    try
      Document.writeTo(OutputStream);
    finally
      OutputStream.close;
    end;
  finally
    Document.close;
  end;

  // start PDF viewer
  Intent := TJIntent.JavaClass.init;
  Intent.setAction(TJIntent.JavaClass.ACTION_VIEW);
  Intent.setDataAndType(FileNameToUri(FileName), StringToJString('application/pdf'));
  Intent.setFlags(TJIntent.JavaClass.FLAG_ACTIVITY_NO_HISTORY or TJIntent.JavaClass.FLAG_ACTIVITY_CLEAR_TOP);
  SharedActivity.StartActivity(Intent);
end;

end.

[/SHOWTOGROUPS]
 
Top