SlideShare una empresa de Scribd logo
1 de 67
Descargar para leer sin conexión
Printing with APEX: PL/PDF
Scott Spendolini
Executive Director, Enkitec
1
— Scott Spendolini
— scott.spendolini@enkitec.com
— @sspendol
— Ex-Oracle Employee of 10 years
— Senior Product Manager for Oracle APEX
from 2002 through 2005
— Founded Sumner Technologies
in October 2005
— Co-Founded Sumneva in January 2010
— Joined Enkitec in June 2012
— Oracle Ace Director
— Author, Expert Oracle Application Express Security
— Co-Author, Pro Oracle Application Express
— “Scott” on OTN Forums
About the Presenter
2
Agenda
— Overview
— Installation
— Integration
— Implementation
— Security
— Summary
4
OVERVIEW
5
What is PL/PDF?
6
—Third party product designed by Oranext
—http://plpdf.com
—Provides a set of PL/SQL based APIs that can
generate PDF files from the Oracle database
—Easy to securely
integrate with APEX
—Can be called from a
Page or Application
Process
PL/PDF Features
— Robust reporting engine
— Charts
— Bar, Line & Pie
— Barcode Printing
— Use Existing PDF files as Templates
— TrueType Font Embedding
— Encrypted PDF Documents
— Native Support for PNG & JPEG images
— Other types supported via Oracle InterMedia
7
Licensing
— Licensed per instance of Oracle
— $600 per instance
— Can download a trial for free
— 5 Page Maximum
— Watermark Appears on all pages
— No additional hardware is required
— PL/PDF installs into the same database as APEX
8
The BLOB!
— Result of PL/PDF is nothing more than an Oracle
BLOB
— Thus, you can do anything with PL/PDF output
that you can with an Oracle BLOB:
— E-Mail it as an attachment
— Download it to a browser
— Store it in a table
— Index it with Oracle Text
— Schedule a procedure to
generate and e-mail PDF files
9
Simple Example
10
plpdf.init;
plpdf.NewPage;
plpdf.SetPrintFont('Arial',NULL,12);
plpdf.PrintCell(50,10,'Hello World');
plpdf.SendDoc(l_blob);
Complex Example
— eSERT Evaluation Summary Report
11
Layout & Control
12
— All layout is handled via API calls
— There is no GUI tool to design a PL/PDF report
— Seems limiting, and can be at times
— Template feature allows you to use any tool to create the
structure of a document and use PL/PDF APIs only to
populate the data
— Also, there are APIs that minimize the amount of code
required when creating reports
Extras
13
— In addition to its core APIs, PL/PDF offers a
number of extra features
— Templates
— Charts
— Bar, Line & Pie
— Bar Codes
— Encryption
— OpenOffice Forms
— TrueType Font Support
Templates
14
— PL/PDF allows you to include a PDF template as a
background for any page
— No need to use PL/PDF to create the structure of a
document; focus on filling in the data
— Any PDF document can be used
— Easy to create PDF documents from Word, Acrobat, etc.
Templates
15
Charts
16
— Support for three types of charts
— Line
— Bar
— Pie
sumnevaSERT
Settings Summary 28 out of 37 possible points 75.68%
Session Duration
0%
0 out of 2 possible points
Security
60%
6 out of 10 possible points
Application Settings
84.62%
11 out of 13 possible points
Authentication Scheme
91.67%
11 out of 12 possible points
Security: 4
Application Settings: 2
Session Duration: 2
Authentication Scheme: 1
Exceptions Awaiting Approval
No Data Found
Stale Exceptions
No Data Found
Charts
17
Barcodes
18
— Support for a number of types of barcodes:
Feline Adult 20/22LB
8543
$36.99
101262640
Feline Adult 20/22LB
8543
$36.99
101262640
Feline Adult 20/22LB
8543
$36.99
101262640
Feline Adult 20/22LB
8543
$36.99
101262640
Feline Adult 20/22LB
8543
$36.99
101262640
Feline Adult 20/22LB
8543
$36.99
101262640
Feline Adult 20/22LB
8543
$36.99
101262640
Feline Adult 20/22LB
8543
$36.99
101262640
Feline Adult 20/22LB
8543
$36.99
101262640
Feline Adult 20/22LB
8543
$36.99
101262640
Feline Adult 20/22LB
8543
$36.99
101262640
Feline Adult 20/22LB
8543
$36.99
101262640
Feline Adult 20/22LB
8543
$36.99
101262640
Feline Adult 20/22LB
8543
$36.99
101262640
Feline Adult 20/22LB
8543
$36.99
101262640
Feline Adult 20/22LB
8543
$36.99
101262640
Feline Adult 20/22LB
8543
Feline Adult 20/22LB
8543
Feline Adult 20/22LB
8543
Feline Adult 20/22LB
8543
Other Features
19
— Ability to encrypt PDF files
— Support for OpenOffice PDF Forms
— LZW compression
— TrueType Font Support
Sweet Spots
— PL/PDF is the best solution when:
— The core report definition does not change often
— End Users do not need to create one-off reports
— You have an abundance of PL/SQL resources and little
money
20
INSTALLATION
21
Installation Options
22
— PL/PDF is installed by running a series of SQL
scripts
— Can use to install on any target OS
— Need to be able to connect to the target database via
SQL*Net
— Some additional features may need to be
manually installed
— Charts, Bar Codes, etc.
— Installation should take about 15 minutes
Where to Put It
— Since PL/PDF is a set of PL/SQL objects, you’ll
need to select a schema to put it in
— Typically use PLPDF, but can name the schema anything
— Best to use its own schema and then create
grants & synonyms to access from other schemas
— You’ll need to do this manually
— Start with just PLPDF & PLPDF_TYPE; synonyms for other
objects can be added as needed
23
INTEGRATION
24
APEX Integration
25
— Once installed and the corresponding grants are
created to your parse as schema, there is
NOTHING ADDITIONAL TO CONFIGURE in order to
integrate PL/PDF with APEX
— PL/PDF - like APEX - is PL/SQL
— Thus, as long as your parse-as schema can access the
PL/PDF objects, that’s all you’ll need
— Seriously.
— There’s nothing else to configure.
— Try it. You’ll see.
APEX Integration
— PL/PDF must be called as part of the Page
Rendering process in APEX
— And it must occur before anything else
— Best Practice:
— Create an On Load PL/SQL Process that calls PL/PDF
— Set the Condition to Request = Expression 1
— Add a button/link to that page which sets the Request to
trigger the PL/PDF call
26
PL/SQL Package
— It’s best to put the logic for a PL/PDF report into
a PL/SQL package
— Centralized
— Can re-use common functions
— More performant
— Easier to work with
— Be sure pass in parameters when possible so that
a single package may be called from multiple
pages or even outside of APEX
27
PL/SQL Process
— A simple PL/SQL Process should be created to
call the report package
— Must be set to fire Before Header and be the first
process executed
— Must be condition to only execute when Request = PRINT
— Can be an Application Process
— PL/SQL Code:
28
plpdf_print.print
(
p_order_id => :P29_ORDER_ID
);
Button
29
— A button can be used to trigger our PDF report
— Redirects to the page where the process is located
— Passes in PRINT to the Request value
Column Link
— A Column Link can also be used to print a report
— Redirects to the page where the process is located
— Passes in PRINT to the Request value
— Sets the value of the APEX Item which is passed to the
package
30
D E M O N S T R A T I O N
APEX INTEGRATION
31
IMPLEMENTATION
32
Goal
33
— To produce a Sales Receipt for an order
generated in the Sample Database Application
— Receipt will encompass a master-detail report
— Single row from the header
— Variable number of rows from the detail
— Should look professional and include a logo
Report Types
34
— PL/PDF can produce two “types” of reports
— Row/Column
— Produce rows & columns of data based on a SQL query
— Forms
— Fill in the data for a form, such as a Tax Form or Job Application
— It’s important to determine which type is needed
for a specific requirement up front
— OK to use both in a single report, if needed
Our Example
35
Form Report
Based on a single
row of data
across one or
more tables
Row/Column Report
Based on a SQL
Query returning
multiple rows of
data
Where to Start?
36
— PL/PDF can utilize a PDF
document as a template
— Simplifies code greatly, as
only the data needs to be
printed via the APIs
Eugene Bradley
Schoephoester Road
Windsor Locks, CT 06906
10/1/13 000003
00001 Business Shirt 1 $50 $50
00003 Trousers 2 $100 $200
$250
12345 Check
The ABCs of the APIs
37
— PL/PDF is nothing more than a set of PL/SQL APIs
— Like any other API set, there’s a learning curve
— Most APIs have default values on most
parameters
— Thus you only need to pass values to those you wish to set
— Use param => value notation for best results
— Refer to the documentation for full details
Where to Start
— Like any other problem, it all starts with the data
— Analyze the data required and determine the best way to get what you
need
— Create views where it makes sense to simplify SQL statements in APEX
or PL/SQL
38
DEMO_ORDERS
DEMO_ORDER_ITEMS
DEMO_CUSTOMERS
DEMO_ORDERS
— Since we’ll need to reference a row of
DEMO_ORDERS, it can be created as a ROWTYPE
variable and referenced throughout in the
PL/PDF APIs
39
DECLARE
l_order_t demo_orders%ROWTYPE;
BEGIN
-- Get the Order Row
SELECT * INTO l_order_t
FROM demo_orders
WHERE order_id = p_order_id;
init
— Called once to initialize PL/PDF
— Parameters:
— p_orientation
— p_unit
— p_format
40
newPage
— Creates a new page
— Called anytime a new page is needed
— PL/PDF will automatically create a new page when
needed if data overflows the current page
— Parameters:
— p_orientation
41
Initializing PL/PDF
42
-- Get the Template
SELECT blob_content INTO l_template_pdf
FROM wwv_flow_files
WHERE filename = 'sales_receipt.pdf';
l_template :=
plpdf_parser.getTemplate(l_template_pdf,1);
-- Initialize PL/PDF
plpdf.init(p_format => 'letter');
l_template_id := plpdf.InsTemplate(l_template);
-- Create a new page
plpdf.NewPage;
-- Place the template on the page
plpdf.useTemplate(l_template_id);
-- Get the Template
SELECT blob_content INTO l_template_pdf
FROM wwv_flow_files
WHERE filename = 'sales_receipt.pdf';
l_template :=
plpdf_parser.getTemplate(l_template_pdf,1);
-- Initialize PL/PDF
plpdf.init(p_format => 'letter');
l_template_id := plpdf.InsTemplate(l_template);
-- Create a new page
plpdf.NewPage;
-- Place the template on the page
plpdf.useTemplate(l_template_id);
setCurrentXY
— Sets the position of the cursor
— Parameters:
— p_x
— p_y
— Similar:
— setCurrentX
— setCurrentY
43
setPrintFont
— Sets the font family and style used for text
— Parameters:
— p_family
— p_style
— p_size
44
printCell
— Prints a line of text on the page
— Parameters:
45
• p_w
• p_h
• p_txt
• p_border
• p_ln
• p_align
• p_fill
• p_link
• p_clipping
lineBreak
— Places the cursor on the next line
— Parameters:
— p_h
46
Printing Customer Details
47
plpdf.SetPrintFont(
p_family => 'Courier', p_size => 10);
plpdf.setCurrentXY(11,60);
-- Customer Details
FOR x IN
(SELECT * FROM demo_customers
WHERE customer_id = l_order_t.customer_id)
LOOP
plpdf.printCell(70, 10, x.cust_first_name
|| ' ' || x.cust_last_name, NULL, NULL, 'L');
plpdf.LineBreak(4);
plpdf.setCurrentX(11);
plpdf.printCell(70, 10, x.cust_street_address1,
NULL, NULL, 'L');
Printing Customer Details
48
plpdf.LineBreak(4);
plpdf.setCurrentX(11);
IF x.cust_street_address2 IS NOT NULL THEN
plpdf.printCell(70,10,
x.cust_street_address2, NULL, NULL, 'L');
plpdf.LineBreak(4);
plpdf.setCurrentX(11);
END IF;
plpdf.printCell(70, 10, x.cust_city || ','
|| x.cust_state || ' '
|| x.cust_postal_code, NULL, NULL, 'L');
END LOOP;
Other Details
49
-- Date and Order Number
plpdf.setCurrentXY(152,60);
plpdf.printCell(26, 10,
TO_CHAR(l_order_t.order_timestamp,
'DD-MON-YYYY'),NULL,NULL,'C');
plpdf.printCell(30,10,'0000'
|| p_order_id,NULL,NULL,'C');
-- Payment Method
plpdf.setCurrentXY(10,95);
plpdf.printCell(28,10,'n/a' ,NULL,NULL,'C');
plpdf.printCell(28,10,'Credit',NULL,NULL,'C');
-- Reset Cursor
plpdf.setCurrentXY(10,114);
row_print
50
— ROW_PRINT allows for a lot more flexibility than
QUERY_PRINT
— Typically called from inside a loop
— FOR X IN (SELECT * FROM ...)
— DBMS_SQL
— Four different variations are available:
ROW_PRINT through ROW_PRINT4
row_print
— Sample Parameters
— p_data
— p_width
— p_align
— p_style
— p_maxline
— p_links
— p_h
— p_fill
— p_min_height
— p_clipping
51
Order Lines
52
— ROW_PRINT may or may not suffice for what you
need
— Often times just looping through a query and printing the
individual columns is just as effective
— Take some time to become familiar with it and
what it can and can’t do
Order Lines
53
LOOP
plpdf.printCell(29,10,'0000'
|| x.product_id ,NULL,NULL,'C');
plpdf.printCell(84,10,x.product_name,
NULL,NULL,'L');
plpdf.printCell(28,10,x.quantity,
NULL,NULL,'C');
plpdf.printCell(28,10,TO_CHAR(x.list_price,
'FML999G999G999G999G990D00'),
NULL,NULL,'R');
plpdf.printCell(28,10,TO_CHAR(x.list_price *
x.quantity,'FML999G999G999G999G990D00'),
NULL,NULL,'R');
plpdf.LineBreak(4);
END LOOP;
sendDoc
— Returns the PDF document to a BLOB variable
— Parameters:
— p_blob
54
Download File API
— You can also create a single procedure to handle
file downloads
— Pass in the BLOB and filename
— All PL/PDF reports can call this procedure
— In fact, it is recommended that PL/PDF reports
be based on a package
— Reusability
— Security
55
Printing the PDF
56
-- Send the contents of the PDF document to
l_blob and Print it
plpdf.SendDoc(l_blob);
-- Send the PDF document to the browser
owa_util.mime_header('application/pdf', FALSE);
htp.p('Content-Disposition: inline;
filename=' || p_filename || '.pdf') ;
htp.p('Content-Length: '
|| dbms_lob.getlength(l_blob)) ;
owa_util.http_header_close;
wpg_docload.download_file(l_blob);
apex_application.g_unrecoverable_error := TRUE;
Table of Contents
57
— PL/PDF allows you to automatically crete a Table
of Contents
— You can add “bookmarks” throughout your application that
link back to the main table of contents
— Fully automated; no need to calculate anything
SECURITY
58
PL/PDF Security
59
— Since PL/PDF is all PL/SQL, there are no specific
provisions when it comes to security
— Any database layer security will work
— Secure Views
— Label Security
— VPD
VPD Function
60
CREATE OR REPLACE FUNCTION plpdf_vpd
(p_schema IN VARCHAR2 DEFAULT NULL,
p_object IN VARCHAR2 DEFAULT NULL)
RETURN VARCHAR2
AS
BEGIN
RETURN q'!user_name = '!' || v('APP_USER')
|| q'!'!';
END;
/
Enabling VPD
61
BEGIN
DBMS_RLS.add_policy
(object_schema => 'PLPDF_OOW',
object_name => 'DEMO_ORDERS',
policy_name => 'DEMO_ORDERS_VPD',
function_schema => 'PLPDF_OOW',
policy_function => 'PLPDF_VPD',
statement_types => 'SELECT');
END;
/
Disabling VPD
62
BEGIN
DBMS_RLS.drop_policy
(object_schema => 'PLPDF_OOW',
object_name => 'DEMO_ORDERS',
policy_name => 'DEMO_ORDERS_VPD');
END;
/
D E M O N S T R A T I O N
VPD & PL/PDF
63
SUMMARY
64
PL/PDF Report Card
65
Installation
Integration
Implementation
& Ease of Use
Security
Cost
A
A
D
A
A
Summary
66
— PL/PDF provides a robust, cost effective
solution for producing high quality PDF
documents from any APEX application
— Not always the right tool for every job; but in many cases,
it works quite well
— Low cost and zero footprint means that it should at least
be seriously considered
http://www.odtug.com
67

Más contenido relacionado

La actualidad más candente

Intro to JavaScript for APEX Developers
Intro to JavaScript for APEX DevelopersIntro to JavaScript for APEX Developers
Intro to JavaScript for APEX DevelopersDaniel McGhan
 
Html Intro2
Html Intro2Html Intro2
Html Intro2mlackner
 
Oracle REST Data Services Best Practices/ Overview
Oracle REST Data Services Best Practices/ OverviewOracle REST Data Services Best Practices/ Overview
Oracle REST Data Services Best Practices/ OverviewKris Rice
 
Etiquetas mas utilizadas del lenguaje html
Etiquetas mas utilizadas del lenguaje htmlEtiquetas mas utilizadas del lenguaje html
Etiquetas mas utilizadas del lenguaje htmlDoraliza Hugo Vera
 
TEI HAL - import SWORD
TEI HAL - import SWORDTEI HAL - import SWORD
TEI HAL - import SWORDOAccsd
 
Linker and loader upload
Linker and loader   uploadLinker and loader   upload
Linker and loader uploadBin Yang
 
Lightweight Xtext Editors as SWT Widgets
Lightweight Xtext Editors as SWT WidgetsLightweight Xtext Editors as SWT Widgets
Lightweight Xtext Editors as SWT Widgetsmeysholdt
 
Get the Look and Feel You Want in Oracle APEX
Get the Look and Feel You Want in Oracle APEXGet the Look and Feel You Want in Oracle APEX
Get the Look and Feel You Want in Oracle APEXJorge Rimblas
 
Web html table tags
Web html  table tagsWeb html  table tags
Web html table tagsKainat Ilyas
 
Basic Html Notes
Basic Html NotesBasic Html Notes
Basic Html NotesNextGenr
 
Oracle apex training
Oracle apex trainingOracle apex training
Oracle apex trainingVasudha India
 
Introduction to Cascading Style Sheets
Introduction to Cascading Style SheetsIntroduction to Cascading Style Sheets
Introduction to Cascading Style SheetsTushar Joshi
 
Introduction to Bootstrap: Design for Developers
Introduction to Bootstrap: Design for DevelopersIntroduction to Bootstrap: Design for Developers
Introduction to Bootstrap: Design for DevelopersMelvin John
 
aligner ses autorités avec Viaf et IdRef
aligner ses autorités avec Viaf et IdRefaligner ses autorités avec Viaf et IdRef
aligner ses autorités avec Viaf et IdRefLuc Bellier
 
Creating RESTful API’s with Grails and Spring Security
Creating RESTful API’s with Grails and Spring SecurityCreating RESTful API’s with Grails and Spring Security
Creating RESTful API’s with Grails and Spring SecurityAlvaro Sanchez-Mariscal
 

La actualidad más candente (20)

Processing XML with Java
Processing XML with JavaProcessing XML with Java
Processing XML with Java
 
Intro to JavaScript for APEX Developers
Intro to JavaScript for APEX DevelopersIntro to JavaScript for APEX Developers
Intro to JavaScript for APEX Developers
 
Html Intro2
Html Intro2Html Intro2
Html Intro2
 
Oracle REST Data Services Best Practices/ Overview
Oracle REST Data Services Best Practices/ OverviewOracle REST Data Services Best Practices/ Overview
Oracle REST Data Services Best Practices/ Overview
 
Html basics
Html basicsHtml basics
Html basics
 
Etiquetas mas utilizadas del lenguaje html
Etiquetas mas utilizadas del lenguaje htmlEtiquetas mas utilizadas del lenguaje html
Etiquetas mas utilizadas del lenguaje html
 
PHP - Web Development
PHP - Web DevelopmentPHP - Web Development
PHP - Web Development
 
TEI HAL - import SWORD
TEI HAL - import SWORDTEI HAL - import SWORD
TEI HAL - import SWORD
 
Aula 02
Aula 02Aula 02
Aula 02
 
Linker and loader upload
Linker and loader   uploadLinker and loader   upload
Linker and loader upload
 
Lightweight Xtext Editors as SWT Widgets
Lightweight Xtext Editors as SWT WidgetsLightweight Xtext Editors as SWT Widgets
Lightweight Xtext Editors as SWT Widgets
 
Get the Look and Feel You Want in Oracle APEX
Get the Look and Feel You Want in Oracle APEXGet the Look and Feel You Want in Oracle APEX
Get the Look and Feel You Want in Oracle APEX
 
Web html table tags
Web html  table tagsWeb html  table tags
Web html table tags
 
Basic Html Notes
Basic Html NotesBasic Html Notes
Basic Html Notes
 
Oracle apex training
Oracle apex trainingOracle apex training
Oracle apex training
 
Introduction to Cascading Style Sheets
Introduction to Cascading Style SheetsIntroduction to Cascading Style Sheets
Introduction to Cascading Style Sheets
 
Html and its tags
Html and its tagsHtml and its tags
Html and its tags
 
Introduction to Bootstrap: Design for Developers
Introduction to Bootstrap: Design for DevelopersIntroduction to Bootstrap: Design for Developers
Introduction to Bootstrap: Design for Developers
 
aligner ses autorités avec Viaf et IdRef
aligner ses autorités avec Viaf et IdRefaligner ses autorités avec Viaf et IdRef
aligner ses autorités avec Viaf et IdRef
 
Creating RESTful API’s with Grails and Spring Security
Creating RESTful API’s with Grails and Spring SecurityCreating RESTful API’s with Grails and Spring Security
Creating RESTful API’s with Grails and Spring Security
 

Similar a Printing with APEX: PL/PDF

Apex behind the scenes
Apex behind the scenesApex behind the scenes
Apex behind the scenesEnkitec
 
Improve PowerShell reporting using SharePoint lists for results
Improve PowerShell reporting using SharePoint lists for resultsImprove PowerShell reporting using SharePoint lists for results
Improve PowerShell reporting using SharePoint lists for resultsFrank Daske
 
PLSQL Developer tips and tricks
PLSQL Developer tips and tricksPLSQL Developer tips and tricks
PLSQL Developer tips and tricksPatrick Barel
 
WCF made easy with Microsoft .NET Framework 4 and Windows Server AppFabric
WCF made easy with Microsoft .NET Framework 4 and Windows Server AppFabricWCF made easy with Microsoft .NET Framework 4 and Windows Server AppFabric
WCF made easy with Microsoft .NET Framework 4 and Windows Server AppFabricRobert MacLean
 
Creating custom reports ora app express apex listener
Creating custom reports  ora app express apex listenerCreating custom reports  ora app express apex listener
Creating custom reports ora app express apex listenerDarnette A
 
Automate Studio Training: Materials Maintenance Tips for Efficiency and Ease ...
Automate Studio Training: Materials Maintenance Tips for Efficiency and Ease ...Automate Studio Training: Materials Maintenance Tips for Efficiency and Ease ...
Automate Studio Training: Materials Maintenance Tips for Efficiency and Ease ...Precisely
 
ODBC Connector: Update and Improvements
ODBC Connector: Update and ImprovementsODBC Connector: Update and Improvements
ODBC Connector: Update and ImprovementsOdoo
 
14 Easy Steps to End-User Empowerment: Convert Custom Reports to BI Publisher
14 Easy Steps to End-User Empowerment: Convert Custom Reports to BI Publisher14 Easy Steps to End-User Empowerment: Convert Custom Reports to BI Publisher
14 Easy Steps to End-User Empowerment: Convert Custom Reports to BI PublisherMohan Dutt
 
EPAM ML/AI Accelerator - ODAHU
EPAM ML/AI Accelerator - ODAHUEPAM ML/AI Accelerator - ODAHU
EPAM ML/AI Accelerator - ODAHUDmitrii Suslov
 
Best practices and tools for PowerShell and SharePoint Scripting SharePointFe...
Best practices and tools for PowerShell and SharePoint Scripting SharePointFe...Best practices and tools for PowerShell and SharePoint Scripting SharePointFe...
Best practices and tools for PowerShell and SharePoint Scripting SharePointFe...Michael Blumenthal (Microsoft MVP)
 
PyCon Sweden 2022 - Dowling - Serverless ML with Hopsworks.pdf
PyCon Sweden 2022 - Dowling - Serverless ML with Hopsworks.pdfPyCon Sweden 2022 - Dowling - Serverless ML with Hopsworks.pdf
PyCon Sweden 2022 - Dowling - Serverless ML with Hopsworks.pdfJim Dowling
 

Similar a Printing with APEX: PL/PDF (20)

Apex RnD APEX 5 - Printing
Apex RnD APEX 5 - PrintingApex RnD APEX 5 - Printing
Apex RnD APEX 5 - Printing
 
Apex behind the scenes
Apex behind the scenesApex behind the scenes
Apex behind the scenes
 
Pdf open parameters
Pdf open parametersPdf open parameters
Pdf open parameters
 
Pdf open parameters
Pdf open parametersPdf open parameters
Pdf open parameters
 
Improve PowerShell reporting using SharePoint lists for results
Improve PowerShell reporting using SharePoint lists for resultsImprove PowerShell reporting using SharePoint lists for results
Improve PowerShell reporting using SharePoint lists for results
 
PSC & OOMXL
PSC & OOMXLPSC & OOMXL
PSC & OOMXL
 
PLSQL Developer tips and tricks
PLSQL Developer tips and tricksPLSQL Developer tips and tricks
PLSQL Developer tips and tricks
 
Enterprise Deployments & SOA
Enterprise Deployments & SOAEnterprise Deployments & SOA
Enterprise Deployments & SOA
 
PLSql.pptx
PLSql.pptxPLSql.pptx
PLSql.pptx
 
WCF made easy with Microsoft .NET Framework 4 and Windows Server AppFabric
WCF made easy with Microsoft .NET Framework 4 and Windows Server AppFabricWCF made easy with Microsoft .NET Framework 4 and Windows Server AppFabric
WCF made easy with Microsoft .NET Framework 4 and Windows Server AppFabric
 
Creating custom reports ora app express apex listener
Creating custom reports  ora app express apex listenerCreating custom reports  ora app express apex listener
Creating custom reports ora app express apex listener
 
FLossEd-BK Tequila Framework3.2.1
FLossEd-BK Tequila Framework3.2.1FLossEd-BK Tequila Framework3.2.1
FLossEd-BK Tequila Framework3.2.1
 
Automate Studio Training: Materials Maintenance Tips for Efficiency and Ease ...
Automate Studio Training: Materials Maintenance Tips for Efficiency and Ease ...Automate Studio Training: Materials Maintenance Tips for Efficiency and Ease ...
Automate Studio Training: Materials Maintenance Tips for Efficiency and Ease ...
 
ODBC Connector: Update and Improvements
ODBC Connector: Update and ImprovementsODBC Connector: Update and Improvements
ODBC Connector: Update and Improvements
 
14 Easy Steps to End-User Empowerment: Convert Custom Reports to BI Publisher
14 Easy Steps to End-User Empowerment: Convert Custom Reports to BI Publisher14 Easy Steps to End-User Empowerment: Convert Custom Reports to BI Publisher
14 Easy Steps to End-User Empowerment: Convert Custom Reports to BI Publisher
 
EPAM ML/AI Accelerator - ODAHU
EPAM ML/AI Accelerator - ODAHUEPAM ML/AI Accelerator - ODAHU
EPAM ML/AI Accelerator - ODAHU
 
Best practices and tools for PowerShell and SharePoint Scripting SharePointFe...
Best practices and tools for PowerShell and SharePoint Scripting SharePointFe...Best practices and tools for PowerShell and SharePoint Scripting SharePointFe...
Best practices and tools for PowerShell and SharePoint Scripting SharePointFe...
 
Intro to Application Express
Intro to Application ExpressIntro to Application Express
Intro to Application Express
 
PyCon Sweden 2022 - Dowling - Serverless ML with Hopsworks.pdf
PyCon Sweden 2022 - Dowling - Serverless ML with Hopsworks.pdfPyCon Sweden 2022 - Dowling - Serverless ML with Hopsworks.pdf
PyCon Sweden 2022 - Dowling - Serverless ML with Hopsworks.pdf
 
oracle-reports6i
oracle-reports6ioracle-reports6i
oracle-reports6i
 

Más de Enkitec

Using Angular JS in APEX
Using Angular JS in APEXUsing Angular JS in APEX
Using Angular JS in APEXEnkitec
 
Controlling execution plans 2014
Controlling execution plans   2014Controlling execution plans   2014
Controlling execution plans 2014Enkitec
 
Engineered Systems: Environment-as-a-Service Demonstration
Engineered Systems: Environment-as-a-Service DemonstrationEngineered Systems: Environment-as-a-Service Demonstration
Engineered Systems: Environment-as-a-Service DemonstrationEnkitec
 
Think Exa!
Think Exa!Think Exa!
Think Exa!Enkitec
 
In Memory Database In Action by Tanel Poder and Kerry Osborne
In Memory Database In Action by Tanel Poder and Kerry OsborneIn Memory Database In Action by Tanel Poder and Kerry Osborne
In Memory Database In Action by Tanel Poder and Kerry OsborneEnkitec
 
In Search of Plan Stability - Part 1
In Search of Plan Stability - Part 1In Search of Plan Stability - Part 1
In Search of Plan Stability - Part 1Enkitec
 
Mini Session - Using GDB for Profiling
Mini Session - Using GDB for ProfilingMini Session - Using GDB for Profiling
Mini Session - Using GDB for ProfilingEnkitec
 
Profiling Oracle with GDB
Profiling Oracle with GDBProfiling Oracle with GDB
Profiling Oracle with GDBEnkitec
 
Oracle Performance Tools of the Trade
Oracle Performance Tools of the TradeOracle Performance Tools of the Trade
Oracle Performance Tools of the TradeEnkitec
 
Oracle Performance Tuning Fundamentals
Oracle Performance Tuning FundamentalsOracle Performance Tuning Fundamentals
Oracle Performance Tuning FundamentalsEnkitec
 
SQL Tuning Tools of the Trade
SQL Tuning Tools of the TradeSQL Tuning Tools of the Trade
SQL Tuning Tools of the TradeEnkitec
 
Using SQL Plan Management (SPM) to Balance Plan Flexibility and Plan Stability
Using SQL Plan Management (SPM) to Balance Plan Flexibility and Plan StabilityUsing SQL Plan Management (SPM) to Balance Plan Flexibility and Plan Stability
Using SQL Plan Management (SPM) to Balance Plan Flexibility and Plan StabilityEnkitec
 
Oracle GoldenGate Architecture Performance
Oracle GoldenGate Architecture PerformanceOracle GoldenGate Architecture Performance
Oracle GoldenGate Architecture PerformanceEnkitec
 
OGG Architecture Performance
OGG Architecture PerformanceOGG Architecture Performance
OGG Architecture PerformanceEnkitec
 
APEX Security Primer
APEX Security PrimerAPEX Security Primer
APEX Security PrimerEnkitec
 
How Many Ways Can I Manage Oracle GoldenGate?
How Many Ways Can I Manage Oracle GoldenGate?How Many Ways Can I Manage Oracle GoldenGate?
How Many Ways Can I Manage Oracle GoldenGate?Enkitec
 
Understanding how is that adaptive cursor sharing (acs) produces multiple opt...
Understanding how is that adaptive cursor sharing (acs) produces multiple opt...Understanding how is that adaptive cursor sharing (acs) produces multiple opt...
Understanding how is that adaptive cursor sharing (acs) produces multiple opt...Enkitec
 
Sql tuning made easier with sqltxplain (sqlt)
Sql tuning made easier with sqltxplain (sqlt)Sql tuning made easier with sqltxplain (sqlt)
Sql tuning made easier with sqltxplain (sqlt)Enkitec
 
Profiling the logwriter and database writer
Profiling the logwriter and database writerProfiling the logwriter and database writer
Profiling the logwriter and database writerEnkitec
 
Fatkulin hotsos 2014
Fatkulin hotsos 2014Fatkulin hotsos 2014
Fatkulin hotsos 2014Enkitec
 

Más de Enkitec (20)

Using Angular JS in APEX
Using Angular JS in APEXUsing Angular JS in APEX
Using Angular JS in APEX
 
Controlling execution plans 2014
Controlling execution plans   2014Controlling execution plans   2014
Controlling execution plans 2014
 
Engineered Systems: Environment-as-a-Service Demonstration
Engineered Systems: Environment-as-a-Service DemonstrationEngineered Systems: Environment-as-a-Service Demonstration
Engineered Systems: Environment-as-a-Service Demonstration
 
Think Exa!
Think Exa!Think Exa!
Think Exa!
 
In Memory Database In Action by Tanel Poder and Kerry Osborne
In Memory Database In Action by Tanel Poder and Kerry OsborneIn Memory Database In Action by Tanel Poder and Kerry Osborne
In Memory Database In Action by Tanel Poder and Kerry Osborne
 
In Search of Plan Stability - Part 1
In Search of Plan Stability - Part 1In Search of Plan Stability - Part 1
In Search of Plan Stability - Part 1
 
Mini Session - Using GDB for Profiling
Mini Session - Using GDB for ProfilingMini Session - Using GDB for Profiling
Mini Session - Using GDB for Profiling
 
Profiling Oracle with GDB
Profiling Oracle with GDBProfiling Oracle with GDB
Profiling Oracle with GDB
 
Oracle Performance Tools of the Trade
Oracle Performance Tools of the TradeOracle Performance Tools of the Trade
Oracle Performance Tools of the Trade
 
Oracle Performance Tuning Fundamentals
Oracle Performance Tuning FundamentalsOracle Performance Tuning Fundamentals
Oracle Performance Tuning Fundamentals
 
SQL Tuning Tools of the Trade
SQL Tuning Tools of the TradeSQL Tuning Tools of the Trade
SQL Tuning Tools of the Trade
 
Using SQL Plan Management (SPM) to Balance Plan Flexibility and Plan Stability
Using SQL Plan Management (SPM) to Balance Plan Flexibility and Plan StabilityUsing SQL Plan Management (SPM) to Balance Plan Flexibility and Plan Stability
Using SQL Plan Management (SPM) to Balance Plan Flexibility and Plan Stability
 
Oracle GoldenGate Architecture Performance
Oracle GoldenGate Architecture PerformanceOracle GoldenGate Architecture Performance
Oracle GoldenGate Architecture Performance
 
OGG Architecture Performance
OGG Architecture PerformanceOGG Architecture Performance
OGG Architecture Performance
 
APEX Security Primer
APEX Security PrimerAPEX Security Primer
APEX Security Primer
 
How Many Ways Can I Manage Oracle GoldenGate?
How Many Ways Can I Manage Oracle GoldenGate?How Many Ways Can I Manage Oracle GoldenGate?
How Many Ways Can I Manage Oracle GoldenGate?
 
Understanding how is that adaptive cursor sharing (acs) produces multiple opt...
Understanding how is that adaptive cursor sharing (acs) produces multiple opt...Understanding how is that adaptive cursor sharing (acs) produces multiple opt...
Understanding how is that adaptive cursor sharing (acs) produces multiple opt...
 
Sql tuning made easier with sqltxplain (sqlt)
Sql tuning made easier with sqltxplain (sqlt)Sql tuning made easier with sqltxplain (sqlt)
Sql tuning made easier with sqltxplain (sqlt)
 
Profiling the logwriter and database writer
Profiling the logwriter and database writerProfiling the logwriter and database writer
Profiling the logwriter and database writer
 
Fatkulin hotsos 2014
Fatkulin hotsos 2014Fatkulin hotsos 2014
Fatkulin hotsos 2014
 

Último

Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Enterprise Knowledge
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)Gabriella Davis
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxMalak Abu Hammad
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationSafe Software
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024The Digital Insurer
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdfhans926745
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?Antenna Manufacturer Coco
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityPrincipled Technologies
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxKatpro Technologies
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Scriptwesley chun
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerThousandEyes
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationRadu Cotescu
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘RTylerCroy
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...Neo4j
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsMaria Levchenko
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsEnterprise Knowledge
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Servicegiselly40
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slidespraypatel2
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024Results
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsJoaquim Jorge
 

Último (20)

Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...Driving Behavioral Change for Information Management through Data-Driven Gree...
Driving Behavioral Change for Information Management through Data-Driven Gree...
 
A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)A Domino Admins Adventures (Engage 2024)
A Domino Admins Adventures (Engage 2024)
 
The Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptxThe Codex of Business Writing Software for Real-World Solutions 2.pptx
The Codex of Business Writing Software for Real-World Solutions 2.pptx
 
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time AutomationFrom Event to Action: Accelerate Your Decision Making with Real-Time Automation
From Event to Action: Accelerate Your Decision Making with Real-Time Automation
 
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
Bajaj Allianz Life Insurance Company - Insurer Innovation Award 2024
 
[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf[2024]Digital Global Overview Report 2024 Meltwater.pdf
[2024]Digital Global Overview Report 2024 Meltwater.pdf
 
What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?What Are The Drone Anti-jamming Systems Technology?
What Are The Drone Anti-jamming Systems Technology?
 
Boost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivityBoost PC performance: How more available memory can improve productivity
Boost PC performance: How more available memory can improve productivity
 
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptxFactors to Consider When Choosing Accounts Payable Services Providers.pptx
Factors to Consider When Choosing Accounts Payable Services Providers.pptx
 
Automating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps ScriptAutomating Google Workspace (GWS) & more with Apps Script
Automating Google Workspace (GWS) & more with Apps Script
 
How to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected WorkerHow to Troubleshoot Apps for the Modern Connected Worker
How to Troubleshoot Apps for the Modern Connected Worker
 
Scaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organizationScaling API-first – The story of a global engineering organization
Scaling API-first – The story of a global engineering organization
 
🐬 The future of MySQL is Postgres 🐘
🐬  The future of MySQL is Postgres   🐘🐬  The future of MySQL is Postgres   🐘
🐬 The future of MySQL is Postgres 🐘
 
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...Workshop - Best of Both Worlds_ Combine  KG and Vector search for  enhanced R...
Workshop - Best of Both Worlds_ Combine KG and Vector search for enhanced R...
 
Handwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed textsHandwritten Text Recognition for manuscripts and early printed texts
Handwritten Text Recognition for manuscripts and early printed texts
 
IAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI SolutionsIAC 2024 - IA Fast Track to Search Focused AI Solutions
IAC 2024 - IA Fast Track to Search Focused AI Solutions
 
CNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of ServiceCNv6 Instructor Chapter 6 Quality of Service
CNv6 Instructor Chapter 6 Quality of Service
 
Slack Application Development 101 Slides
Slack Application Development 101 SlidesSlack Application Development 101 Slides
Slack Application Development 101 Slides
 
A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024A Call to Action for Generative AI in 2024
A Call to Action for Generative AI in 2024
 
Artificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and MythsArtificial Intelligence: Facts and Myths
Artificial Intelligence: Facts and Myths
 

Printing with APEX: PL/PDF

  • 1. Printing with APEX: PL/PDF Scott Spendolini Executive Director, Enkitec 1
  • 2. — Scott Spendolini — scott.spendolini@enkitec.com — @sspendol — Ex-Oracle Employee of 10 years — Senior Product Manager for Oracle APEX from 2002 through 2005 — Founded Sumner Technologies in October 2005 — Co-Founded Sumneva in January 2010 — Joined Enkitec in June 2012 — Oracle Ace Director — Author, Expert Oracle Application Express Security — Co-Author, Pro Oracle Application Express — “Scott” on OTN Forums About the Presenter 2
  • 3.
  • 4. Agenda — Overview — Installation — Integration — Implementation — Security — Summary 4
  • 6. What is PL/PDF? 6 —Third party product designed by Oranext —http://plpdf.com —Provides a set of PL/SQL based APIs that can generate PDF files from the Oracle database —Easy to securely integrate with APEX —Can be called from a Page or Application Process
  • 7. PL/PDF Features — Robust reporting engine — Charts — Bar, Line & Pie — Barcode Printing — Use Existing PDF files as Templates — TrueType Font Embedding — Encrypted PDF Documents — Native Support for PNG & JPEG images — Other types supported via Oracle InterMedia 7
  • 8. Licensing — Licensed per instance of Oracle — $600 per instance — Can download a trial for free — 5 Page Maximum — Watermark Appears on all pages — No additional hardware is required — PL/PDF installs into the same database as APEX 8
  • 9. The BLOB! — Result of PL/PDF is nothing more than an Oracle BLOB — Thus, you can do anything with PL/PDF output that you can with an Oracle BLOB: — E-Mail it as an attachment — Download it to a browser — Store it in a table — Index it with Oracle Text — Schedule a procedure to generate and e-mail PDF files 9
  • 11. Complex Example — eSERT Evaluation Summary Report 11
  • 12. Layout & Control 12 — All layout is handled via API calls — There is no GUI tool to design a PL/PDF report — Seems limiting, and can be at times — Template feature allows you to use any tool to create the structure of a document and use PL/PDF APIs only to populate the data — Also, there are APIs that minimize the amount of code required when creating reports
  • 13. Extras 13 — In addition to its core APIs, PL/PDF offers a number of extra features — Templates — Charts — Bar, Line & Pie — Bar Codes — Encryption — OpenOffice Forms — TrueType Font Support
  • 14. Templates 14 — PL/PDF allows you to include a PDF template as a background for any page — No need to use PL/PDF to create the structure of a document; focus on filling in the data — Any PDF document can be used — Easy to create PDF documents from Word, Acrobat, etc.
  • 16. Charts 16 — Support for three types of charts — Line — Bar — Pie
  • 17. sumnevaSERT Settings Summary 28 out of 37 possible points 75.68% Session Duration 0% 0 out of 2 possible points Security 60% 6 out of 10 possible points Application Settings 84.62% 11 out of 13 possible points Authentication Scheme 91.67% 11 out of 12 possible points Security: 4 Application Settings: 2 Session Duration: 2 Authentication Scheme: 1 Exceptions Awaiting Approval No Data Found Stale Exceptions No Data Found Charts 17
  • 18. Barcodes 18 — Support for a number of types of barcodes: Feline Adult 20/22LB 8543 $36.99 101262640 Feline Adult 20/22LB 8543 $36.99 101262640 Feline Adult 20/22LB 8543 $36.99 101262640 Feline Adult 20/22LB 8543 $36.99 101262640 Feline Adult 20/22LB 8543 $36.99 101262640 Feline Adult 20/22LB 8543 $36.99 101262640 Feline Adult 20/22LB 8543 $36.99 101262640 Feline Adult 20/22LB 8543 $36.99 101262640 Feline Adult 20/22LB 8543 $36.99 101262640 Feline Adult 20/22LB 8543 $36.99 101262640 Feline Adult 20/22LB 8543 $36.99 101262640 Feline Adult 20/22LB 8543 $36.99 101262640 Feline Adult 20/22LB 8543 $36.99 101262640 Feline Adult 20/22LB 8543 $36.99 101262640 Feline Adult 20/22LB 8543 $36.99 101262640 Feline Adult 20/22LB 8543 $36.99 101262640 Feline Adult 20/22LB 8543 Feline Adult 20/22LB 8543 Feline Adult 20/22LB 8543 Feline Adult 20/22LB 8543
  • 19. Other Features 19 — Ability to encrypt PDF files — Support for OpenOffice PDF Forms — LZW compression — TrueType Font Support
  • 20. Sweet Spots — PL/PDF is the best solution when: — The core report definition does not change often — End Users do not need to create one-off reports — You have an abundance of PL/SQL resources and little money 20
  • 22. Installation Options 22 — PL/PDF is installed by running a series of SQL scripts — Can use to install on any target OS — Need to be able to connect to the target database via SQL*Net — Some additional features may need to be manually installed — Charts, Bar Codes, etc. — Installation should take about 15 minutes
  • 23. Where to Put It — Since PL/PDF is a set of PL/SQL objects, you’ll need to select a schema to put it in — Typically use PLPDF, but can name the schema anything — Best to use its own schema and then create grants & synonyms to access from other schemas — You’ll need to do this manually — Start with just PLPDF & PLPDF_TYPE; synonyms for other objects can be added as needed 23
  • 25. APEX Integration 25 — Once installed and the corresponding grants are created to your parse as schema, there is NOTHING ADDITIONAL TO CONFIGURE in order to integrate PL/PDF with APEX — PL/PDF - like APEX - is PL/SQL — Thus, as long as your parse-as schema can access the PL/PDF objects, that’s all you’ll need — Seriously. — There’s nothing else to configure. — Try it. You’ll see.
  • 26. APEX Integration — PL/PDF must be called as part of the Page Rendering process in APEX — And it must occur before anything else — Best Practice: — Create an On Load PL/SQL Process that calls PL/PDF — Set the Condition to Request = Expression 1 — Add a button/link to that page which sets the Request to trigger the PL/PDF call 26
  • 27. PL/SQL Package — It’s best to put the logic for a PL/PDF report into a PL/SQL package — Centralized — Can re-use common functions — More performant — Easier to work with — Be sure pass in parameters when possible so that a single package may be called from multiple pages or even outside of APEX 27
  • 28. PL/SQL Process — A simple PL/SQL Process should be created to call the report package — Must be set to fire Before Header and be the first process executed — Must be condition to only execute when Request = PRINT — Can be an Application Process — PL/SQL Code: 28 plpdf_print.print ( p_order_id => :P29_ORDER_ID );
  • 29. Button 29 — A button can be used to trigger our PDF report — Redirects to the page where the process is located — Passes in PRINT to the Request value
  • 30. Column Link — A Column Link can also be used to print a report — Redirects to the page where the process is located — Passes in PRINT to the Request value — Sets the value of the APEX Item which is passed to the package 30
  • 31. D E M O N S T R A T I O N APEX INTEGRATION 31
  • 33. Goal 33 — To produce a Sales Receipt for an order generated in the Sample Database Application — Receipt will encompass a master-detail report — Single row from the header — Variable number of rows from the detail — Should look professional and include a logo
  • 34. Report Types 34 — PL/PDF can produce two “types” of reports — Row/Column — Produce rows & columns of data based on a SQL query — Forms — Fill in the data for a form, such as a Tax Form or Job Application — It’s important to determine which type is needed for a specific requirement up front — OK to use both in a single report, if needed
  • 35. Our Example 35 Form Report Based on a single row of data across one or more tables Row/Column Report Based on a SQL Query returning multiple rows of data
  • 36. Where to Start? 36 — PL/PDF can utilize a PDF document as a template — Simplifies code greatly, as only the data needs to be printed via the APIs Eugene Bradley Schoephoester Road Windsor Locks, CT 06906 10/1/13 000003 00001 Business Shirt 1 $50 $50 00003 Trousers 2 $100 $200 $250 12345 Check
  • 37. The ABCs of the APIs 37 — PL/PDF is nothing more than a set of PL/SQL APIs — Like any other API set, there’s a learning curve — Most APIs have default values on most parameters — Thus you only need to pass values to those you wish to set — Use param => value notation for best results — Refer to the documentation for full details
  • 38. Where to Start — Like any other problem, it all starts with the data — Analyze the data required and determine the best way to get what you need — Create views where it makes sense to simplify SQL statements in APEX or PL/SQL 38 DEMO_ORDERS DEMO_ORDER_ITEMS DEMO_CUSTOMERS
  • 39. DEMO_ORDERS — Since we’ll need to reference a row of DEMO_ORDERS, it can be created as a ROWTYPE variable and referenced throughout in the PL/PDF APIs 39 DECLARE l_order_t demo_orders%ROWTYPE; BEGIN -- Get the Order Row SELECT * INTO l_order_t FROM demo_orders WHERE order_id = p_order_id;
  • 40. init — Called once to initialize PL/PDF — Parameters: — p_orientation — p_unit — p_format 40
  • 41. newPage — Creates a new page — Called anytime a new page is needed — PL/PDF will automatically create a new page when needed if data overflows the current page — Parameters: — p_orientation 41
  • 42. Initializing PL/PDF 42 -- Get the Template SELECT blob_content INTO l_template_pdf FROM wwv_flow_files WHERE filename = 'sales_receipt.pdf'; l_template := plpdf_parser.getTemplate(l_template_pdf,1); -- Initialize PL/PDF plpdf.init(p_format => 'letter'); l_template_id := plpdf.InsTemplate(l_template); -- Create a new page plpdf.NewPage; -- Place the template on the page plpdf.useTemplate(l_template_id); -- Get the Template SELECT blob_content INTO l_template_pdf FROM wwv_flow_files WHERE filename = 'sales_receipt.pdf'; l_template := plpdf_parser.getTemplate(l_template_pdf,1); -- Initialize PL/PDF plpdf.init(p_format => 'letter'); l_template_id := plpdf.InsTemplate(l_template); -- Create a new page plpdf.NewPage; -- Place the template on the page plpdf.useTemplate(l_template_id);
  • 43. setCurrentXY — Sets the position of the cursor — Parameters: — p_x — p_y — Similar: — setCurrentX — setCurrentY 43
  • 44. setPrintFont — Sets the font family and style used for text — Parameters: — p_family — p_style — p_size 44
  • 45. printCell — Prints a line of text on the page — Parameters: 45 • p_w • p_h • p_txt • p_border • p_ln • p_align • p_fill • p_link • p_clipping
  • 46. lineBreak — Places the cursor on the next line — Parameters: — p_h 46
  • 47. Printing Customer Details 47 plpdf.SetPrintFont( p_family => 'Courier', p_size => 10); plpdf.setCurrentXY(11,60); -- Customer Details FOR x IN (SELECT * FROM demo_customers WHERE customer_id = l_order_t.customer_id) LOOP plpdf.printCell(70, 10, x.cust_first_name || ' ' || x.cust_last_name, NULL, NULL, 'L'); plpdf.LineBreak(4); plpdf.setCurrentX(11); plpdf.printCell(70, 10, x.cust_street_address1, NULL, NULL, 'L');
  • 48. Printing Customer Details 48 plpdf.LineBreak(4); plpdf.setCurrentX(11); IF x.cust_street_address2 IS NOT NULL THEN plpdf.printCell(70,10, x.cust_street_address2, NULL, NULL, 'L'); plpdf.LineBreak(4); plpdf.setCurrentX(11); END IF; plpdf.printCell(70, 10, x.cust_city || ',' || x.cust_state || ' ' || x.cust_postal_code, NULL, NULL, 'L'); END LOOP;
  • 49. Other Details 49 -- Date and Order Number plpdf.setCurrentXY(152,60); plpdf.printCell(26, 10, TO_CHAR(l_order_t.order_timestamp, 'DD-MON-YYYY'),NULL,NULL,'C'); plpdf.printCell(30,10,'0000' || p_order_id,NULL,NULL,'C'); -- Payment Method plpdf.setCurrentXY(10,95); plpdf.printCell(28,10,'n/a' ,NULL,NULL,'C'); plpdf.printCell(28,10,'Credit',NULL,NULL,'C'); -- Reset Cursor plpdf.setCurrentXY(10,114);
  • 50. row_print 50 — ROW_PRINT allows for a lot more flexibility than QUERY_PRINT — Typically called from inside a loop — FOR X IN (SELECT * FROM ...) — DBMS_SQL — Four different variations are available: ROW_PRINT through ROW_PRINT4
  • 51. row_print — Sample Parameters — p_data — p_width — p_align — p_style — p_maxline — p_links — p_h — p_fill — p_min_height — p_clipping 51
  • 52. Order Lines 52 — ROW_PRINT may or may not suffice for what you need — Often times just looping through a query and printing the individual columns is just as effective — Take some time to become familiar with it and what it can and can’t do
  • 53. Order Lines 53 LOOP plpdf.printCell(29,10,'0000' || x.product_id ,NULL,NULL,'C'); plpdf.printCell(84,10,x.product_name, NULL,NULL,'L'); plpdf.printCell(28,10,x.quantity, NULL,NULL,'C'); plpdf.printCell(28,10,TO_CHAR(x.list_price, 'FML999G999G999G999G990D00'), NULL,NULL,'R'); plpdf.printCell(28,10,TO_CHAR(x.list_price * x.quantity,'FML999G999G999G999G990D00'), NULL,NULL,'R'); plpdf.LineBreak(4); END LOOP;
  • 54. sendDoc — Returns the PDF document to a BLOB variable — Parameters: — p_blob 54
  • 55. Download File API — You can also create a single procedure to handle file downloads — Pass in the BLOB and filename — All PL/PDF reports can call this procedure — In fact, it is recommended that PL/PDF reports be based on a package — Reusability — Security 55
  • 56. Printing the PDF 56 -- Send the contents of the PDF document to l_blob and Print it plpdf.SendDoc(l_blob); -- Send the PDF document to the browser owa_util.mime_header('application/pdf', FALSE); htp.p('Content-Disposition: inline; filename=' || p_filename || '.pdf') ; htp.p('Content-Length: ' || dbms_lob.getlength(l_blob)) ; owa_util.http_header_close; wpg_docload.download_file(l_blob); apex_application.g_unrecoverable_error := TRUE;
  • 57. Table of Contents 57 — PL/PDF allows you to automatically crete a Table of Contents — You can add “bookmarks” throughout your application that link back to the main table of contents — Fully automated; no need to calculate anything
  • 59. PL/PDF Security 59 — Since PL/PDF is all PL/SQL, there are no specific provisions when it comes to security — Any database layer security will work — Secure Views — Label Security — VPD
  • 60. VPD Function 60 CREATE OR REPLACE FUNCTION plpdf_vpd (p_schema IN VARCHAR2 DEFAULT NULL, p_object IN VARCHAR2 DEFAULT NULL) RETURN VARCHAR2 AS BEGIN RETURN q'!user_name = '!' || v('APP_USER') || q'!'!'; END; /
  • 61. Enabling VPD 61 BEGIN DBMS_RLS.add_policy (object_schema => 'PLPDF_OOW', object_name => 'DEMO_ORDERS', policy_name => 'DEMO_ORDERS_VPD', function_schema => 'PLPDF_OOW', policy_function => 'PLPDF_VPD', statement_types => 'SELECT'); END; /
  • 62. Disabling VPD 62 BEGIN DBMS_RLS.drop_policy (object_schema => 'PLPDF_OOW', object_name => 'DEMO_ORDERS', policy_name => 'DEMO_ORDERS_VPD'); END; /
  • 63. D E M O N S T R A T I O N VPD & PL/PDF 63
  • 66. Summary 66 — PL/PDF provides a robust, cost effective solution for producing high quality PDF documents from any APEX application — Not always the right tool for every job; but in many cases, it works quite well — Low cost and zero footprint means that it should at least be seriously considered