SlideShare uma empresa Scribd logo
1 de 67
Baixar para ler offline
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

Mais conteúdo relacionado

Mais procurados

Advanced PLSQL Optimizing for Better Performance
Advanced PLSQL Optimizing for Better PerformanceAdvanced PLSQL Optimizing for Better Performance
Advanced PLSQL Optimizing for Better PerformanceZohar Elkayam
 
Oracle APEX Interactive Grid Essentials
Oracle APEX Interactive Grid EssentialsOracle APEX Interactive Grid Essentials
Oracle APEX Interactive Grid EssentialsKaren Cannell
 
Oracle APEX Social Login
Oracle APEX Social LoginOracle APEX Social Login
Oracle APEX Social Loginmsewtz
 
ORDS - Oracle REST Data Services
ORDS - Oracle REST Data ServicesORDS - Oracle REST Data Services
ORDS - Oracle REST Data ServicesJustin Michael Raj
 
Oracle database 12c sql worshop 2 student guide vol 2
Oracle database 12c sql worshop 2 student guide vol 2Oracle database 12c sql worshop 2 student guide vol 2
Oracle database 12c sql worshop 2 student guide vol 2Otto Paiz
 
İleri Seviye T-SQL Programlama - Chapter 13
İleri Seviye T-SQL Programlama - Chapter 13İleri Seviye T-SQL Programlama - Chapter 13
İleri Seviye T-SQL Programlama - Chapter 13Cihan Özhan
 
Oracle Real Application Clusters (RAC) 12c Rel. 2 - Operational Best Practices
Oracle Real Application Clusters (RAC) 12c Rel. 2 - Operational Best PracticesOracle Real Application Clusters (RAC) 12c Rel. 2 - Operational Best Practices
Oracle Real Application Clusters (RAC) 12c Rel. 2 - Operational Best PracticesMarkus Michalewicz
 
oracle ebs free web service integration tools
oracle ebs free web service integration toolsoracle ebs free web service integration tools
oracle ebs free web service integration toolsSmartDog Services
 
Automated testing APEX Applications
Automated testing APEX ApplicationsAutomated testing APEX Applications
Automated testing APEX ApplicationsRoel Hartman
 
Oracle Real Application Clusters 19c- Best Practices and Internals- EMEA Tour...
Oracle Real Application Clusters 19c- Best Practices and Internals- EMEA Tour...Oracle Real Application Clusters 19c- Best Practices and Internals- EMEA Tour...
Oracle Real Application Clusters 19c- Best Practices and Internals- EMEA Tour...Sandesh Rao
 
Capacitacion Apex 5 Oracle - Daniel Bermudez
Capacitacion Apex 5 Oracle - Daniel BermudezCapacitacion Apex 5 Oracle - Daniel Bermudez
Capacitacion Apex 5 Oracle - Daniel BermudezDaniel Bermudez
 
Modern Java web applications with Spring Boot and Thymeleaf
Modern Java web applications with Spring Boot and ThymeleafModern Java web applications with Spring Boot and Thymeleaf
Modern Java web applications with Spring Boot and ThymeleafLAY Leangsros
 
Reporting with Oracle Application Express (APEX)
Reporting with Oracle Application Express (APEX)Reporting with Oracle Application Express (APEX)
Reporting with Oracle Application Express (APEX)Dimitri Gielis
 
Oracle GoldenGate Architecture Performance
Oracle GoldenGate Architecture PerformanceOracle GoldenGate Architecture Performance
Oracle GoldenGate Architecture PerformanceEnkitec
 
Oracle db performance tuning
Oracle db performance tuningOracle db performance tuning
Oracle db performance tuningSimon Huang
 
Understanding oracle rac internals part 1 - slides
Understanding oracle rac internals   part 1 - slidesUnderstanding oracle rac internals   part 1 - slides
Understanding oracle rac internals part 1 - slidesMohamed Farouk
 
48742447 11g-sql-fundamentals-ii-additional-practices-and-solutions
48742447 11g-sql-fundamentals-ii-additional-practices-and-solutions48742447 11g-sql-fundamentals-ii-additional-practices-and-solutions
48742447 11g-sql-fundamentals-ii-additional-practices-and-solutionsAshwin Kumar
 
Oracle EBS R12.2 - Deployment and System Administration
Oracle EBS R12.2 - Deployment and System AdministrationOracle EBS R12.2 - Deployment and System Administration
Oracle EBS R12.2 - Deployment and System AdministrationMozammel Hoque
 

Mais procurados (20)

Advanced PLSQL Optimizing for Better Performance
Advanced PLSQL Optimizing for Better PerformanceAdvanced PLSQL Optimizing for Better Performance
Advanced PLSQL Optimizing for Better Performance
 
Oracle APEX Interactive Grid Essentials
Oracle APEX Interactive Grid EssentialsOracle APEX Interactive Grid Essentials
Oracle APEX Interactive Grid Essentials
 
Oracle APEX Social Login
Oracle APEX Social LoginOracle APEX Social Login
Oracle APEX Social Login
 
ORDS - Oracle REST Data Services
ORDS - Oracle REST Data ServicesORDS - Oracle REST Data Services
ORDS - Oracle REST Data Services
 
Oracle database 12c sql worshop 2 student guide vol 2
Oracle database 12c sql worshop 2 student guide vol 2Oracle database 12c sql worshop 2 student guide vol 2
Oracle database 12c sql worshop 2 student guide vol 2
 
İleri Seviye T-SQL Programlama - Chapter 13
İleri Seviye T-SQL Programlama - Chapter 13İleri Seviye T-SQL Programlama - Chapter 13
İleri Seviye T-SQL Programlama - Chapter 13
 
Oracle Real Application Clusters (RAC) 12c Rel. 2 - Operational Best Practices
Oracle Real Application Clusters (RAC) 12c Rel. 2 - Operational Best PracticesOracle Real Application Clusters (RAC) 12c Rel. 2 - Operational Best Practices
Oracle Real Application Clusters (RAC) 12c Rel. 2 - Operational Best Practices
 
oracle ebs free web service integration tools
oracle ebs free web service integration toolsoracle ebs free web service integration tools
oracle ebs free web service integration tools
 
Automated testing APEX Applications
Automated testing APEX ApplicationsAutomated testing APEX Applications
Automated testing APEX Applications
 
Oracle Real Application Clusters 19c- Best Practices and Internals- EMEA Tour...
Oracle Real Application Clusters 19c- Best Practices and Internals- EMEA Tour...Oracle Real Application Clusters 19c- Best Practices and Internals- EMEA Tour...
Oracle Real Application Clusters 19c- Best Practices and Internals- EMEA Tour...
 
Capacitacion Apex 5 Oracle - Daniel Bermudez
Capacitacion Apex 5 Oracle - Daniel BermudezCapacitacion Apex 5 Oracle - Daniel Bermudez
Capacitacion Apex 5 Oracle - Daniel Bermudez
 
APEX Themes and Templates
APEX Themes and TemplatesAPEX Themes and Templates
APEX Themes and Templates
 
Modern Java web applications with Spring Boot and Thymeleaf
Modern Java web applications with Spring Boot and ThymeleafModern Java web applications with Spring Boot and Thymeleaf
Modern Java web applications with Spring Boot and Thymeleaf
 
Reporting with Oracle Application Express (APEX)
Reporting with Oracle Application Express (APEX)Reporting with Oracle Application Express (APEX)
Reporting with Oracle Application Express (APEX)
 
Oracle GoldenGate Architecture Performance
Oracle GoldenGate Architecture PerformanceOracle GoldenGate Architecture Performance
Oracle GoldenGate Architecture Performance
 
Oracle db performance tuning
Oracle db performance tuningOracle db performance tuning
Oracle db performance tuning
 
Understanding oracle rac internals part 1 - slides
Understanding oracle rac internals   part 1 - slidesUnderstanding oracle rac internals   part 1 - slides
Understanding oracle rac internals part 1 - slides
 
48742447 11g-sql-fundamentals-ii-additional-practices-and-solutions
48742447 11g-sql-fundamentals-ii-additional-practices-and-solutions48742447 11g-sql-fundamentals-ii-additional-practices-and-solutions
48742447 11g-sql-fundamentals-ii-additional-practices-and-solutions
 
One PDB to go, please!
One PDB to go, please!One PDB to go, please!
One PDB to go, please!
 
Oracle EBS R12.2 - Deployment and System Administration
Oracle EBS R12.2 - Deployment and System AdministrationOracle EBS R12.2 - Deployment and System Administration
Oracle EBS R12.2 - Deployment and System Administration
 

Semelhante 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
 

Semelhante 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
 

Mais 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
 
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
 
Combining ACS Flexibility with SPM Stability
Combining ACS Flexibility with SPM StabilityCombining ACS Flexibility with SPM Stability
Combining ACS Flexibility with SPM StabilityEnkitec
 

Mais 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
 
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
 
Combining ACS Flexibility with SPM Stability
Combining ACS Flexibility with SPM StabilityCombining ACS Flexibility with SPM Stability
Combining ACS Flexibility with SPM Stability
 

Último

"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersThousandEyes
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Mattias Andersson
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Patryk Bandurski
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024BookNet Canada
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Allon Mureinik
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Scott Keck-Warren
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024BookNet Canada
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsMark Billinghurst
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr LapshynFwdays
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationSafe Software
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Alan Dix
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraDeakin University
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupFlorian Wilhelm
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticscarlostorres15106
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 

Último (20)

"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for PartnersEnhancing Worker Digital Experience: A Hands-on Workshop for Partners
Enhancing Worker Digital Experience: A Hands-on Workshop for Partners
 
Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?Are Multi-Cloud and Serverless Good or Bad?
Are Multi-Cloud and Serverless Good or Bad?
 
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
Integration and Automation in Practice: CI/CD in Mule Integration and Automat...
 
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
#StandardsGoals for 2024: What’s new for BISAC - Tech Forum 2024
 
Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)Injustice - Developers Among Us (SciFiDevCon 2024)
Injustice - Developers Among Us (SciFiDevCon 2024)
 
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptxE-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
E-Vehicle_Hacking_by_Parul Sharma_null_owasp.pptx
 
Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024Advanced Test Driven-Development @ php[tek] 2024
Advanced Test Driven-Development @ php[tek] 2024
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC BiblioShare - Tech Forum 2024
 
Human Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR SystemsHuman Factors of XR: Using Human Factors to Design XR Systems
Human Factors of XR: Using Human Factors to Design XR Systems
 
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
"Federated learning: out of reach no matter how close",Oleksandr Lapshyn
 
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry InnovationBeyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
Beyond Boundaries: Leveraging No-Code Solutions for Industry Innovation
 
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...Swan(sea) Song – personal research during my six years at Swansea ... and bey...
Swan(sea) Song – personal research during my six years at Swansea ... and bey...
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
Artificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning eraArtificial intelligence in the post-deep learning era
Artificial intelligence in the post-deep learning era
 
Streamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project SetupStreamlining Python Development: A Guide to a Modern Project Setup
Streamlining Python Development: A Guide to a Modern Project Setup
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmaticsKotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
Kotlin Multiplatform & Compose Multiplatform - Starter kit for pragmatics
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 

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