how to generate pdf in asp net mvc : Convert pdf file to txt file control SDK system azure wpf asp.net console manual-report-generator-List-Label8-part167

Programming Using the API 
81 
4.5.1. API Functions Needed 
The name of the API functions needed to control this functionality begin with LlDb… 
or LlPrintDb…. You can add  tables  (LlDbAddTable()), define sortings  for the tables 
(LlDbAddTableSortOrder())  and  define  relations  between  tables  (LlDbAddTable-
Relation()). 
At print time you can query the currently active table (LlPrintDbGetCurrentTable()) as 
well  as  the  currently  active  relation  and  sort  order  (LlPrintDbGetCurrentTableSort-
Order(), LlPrintDbGetCurrentTableRelation()). You will find detailed descriptions later 
in this chapter. 
4.5.2. Calling the Designer 
First all tables have to be declared to List & Label, so that they can be inserted into 
the project: 
LlDbAddTable(hJob, "", ""); // delete existing tables 
LlDbAddTable(hJob, "Orders", "ORDERS"); 
LlDbAddTable(hJob, "OrderDetails", "ORDER DETAILS"); 
The  first  parameter  is  the  usual  job  handle  of  the  List  &  Label  job.  The  second 
parameter  is  the  table  ID,  which  will  be  returned  during  printout  by 
LlPrintDbGetCurrentTable().  The third  parameter is the display name of the table in 
the  Designer. If you  pass  NULL  or an  empty  string,  the  table  ID  will be used as 
display name as well. 
A special role is assigned to the table name "LLStaticTable". This is reserved and can 
be used for the insertion of 'static' contents (fixed texts or contents of variables, chart 
signatures etc.). This type of static table can only be filled with data lines by the user 
in  the Designer. You must react accordingly to  the table in  your code - a detailed 
explanation is provided in the Printing subchapter. 
In the next step the relations between the tables will be defined. List & Label does 
not directly  differ between different types relationships  (n:m,  1:n) – you declare a 
relation with a relation ID which can be queried at print time: 
LlDbAddTableRelation(hJob, "OrderDetails", "Orders",  
"Orders2OrderDetails", NULL); 
With  this  command,  you  have  established  a  relationship  between  the  child  table 
"OrderDetails" and the parent table "Orders". In this case only the ID of the relation 
was passed and will be displayed in the Designer. 
Finally you can pass sort orders for the tables. Again, you define a unique ID for every 
sort order that can then be queried at print time: 
LlDbAddTableSortOrder(hJob, "Orders", "OrderDate ASC",  
"Order Date [+]"); 
LlDbAddTableSortOrder(hJob, "Orders", "OrderDate DESC",  
"Order Date [-]"); 
Convert pdf file to txt file - control SDK system:C# PDF Convert to Text SDK: Convert PDF to txt files in C#.net, ASP.NET MVC, WinForms, WPF application
C# PDF to Text (TXT) Converting Library to Convert PDF to Text
www.rasteredge.com
Convert pdf file to txt file - control SDK system:VB.NET PDF Convert to Text SDK: Convert PDF to txt files in vb.net, ASP.NET MVC, WinForms, WPF application
VB.NET Guide and Sample Codes to Convert PDF to Text in .NET Project
www.rasteredge.com
Programming Using the API 
82 
This  allows  the  user  to  choose  one  of  these  sort  orders  (as  well  as  the  default 
"unsorted") in the Designer. 
The remaining action when calling the Designer is analogous to the "normal" call, i.e. 
the complete scheme for calling the Designer with multiple tables looks like this: 
<open job> 
(LlJobOpen, LlJobOpenLCID) 
<define List & Label-settings> 
(LlSetOption, 
LlSetOptionString, 
LlSetDebug, 
LlSetFileExtensions, 
LlSetNotificationMessage, 
LlSetNotificationCallback) 
<which file?> 
LlSelectFileDlgTitleEx 
<define data structure> 
(LlDbAddTable, 
LlDbAddTableRelation, 
LlDbAddTableSortOrder) 
<define variables> 
(LlDefineVariableStart, 
LlDefineVariable,  
LlDefineVariableExt, 
LlDefineVariableExtHandle) 
<define fields> 
(LlDefineFieldStart, 
LlDefineField,  
LlDefineFieldExt, 
LlDefineFieldExtHandle) 
<disable funtions> 
(LlDesignerProhibitAction, 
LlDesignerProhibitFunction) 
<call designer> 
(LlDefineLayout) 
<close job> 
(LlJobClose) 
Make sure that you pass all field names in the form of "<tableid>.<fieldname>" in 
order to enable List & Label can connect these to their corresponding table (e.g. 
"Orders.OrderID").  
If you want to add fields of a 1:1 relation, please refer to chapter "4.5.4. Handling 
1:1 Relation". 
4.5.3. Controlling the Print Engine 
The control of hierarchical reports with List & Label occurs more or less analogously 
to the print flow in the last chapter. With the function LlPrintDbGetCurrentTable() you 
control SDK system:Online Convert PDF to Text file. Best free online PDF txt
from other C# .NET PDF to text conversion controls, RasterEdge C# PDF to text converter control toolkit can convert PDF document to text file with good
www.rasteredge.com
control SDK system:C# PDF Converter Library SDK to convert PDF to other file formats
Allow users to convert PDF to Text (TXT) file. It's easy to be integrated into your C# program and convert PDF to .txt file with original PDF layout.
www.rasteredge.com
Programming Using the API 
83 
can query which table's values are to be passed – as usual with LlDefineField[Ext]() 
and LlPrintFields(). Depending on the layout, there are two specific cases: 
• Tables can be consecutive (multiple tables following each other at the same level) 
• The user could have added a sub-table to the current table 
We will deal with these cases in the next two sections. 
Multiple Independent Tables on the Same Level 
An example for this would be a list of customers followed by a chart of employees. 
Both tables can be independent. The print loop for this looks very similar to the print 
loop in the last chapter – with one difference. Usually, you tell List & Label that a table 
is finished (no more data) by calling LlPrintFieldsEnd(). Now you may get the return 
value LL_WRN_TABLECHANGE,  meaning  that there is  another table to print in  the 
layout. 
We suggest splitting your print loop into different subroutines. 
The first part declares the data and the structure, starts the print job and initializes 
the  first page  so that  printing of  a  table  can  be  started. For ease of reading,  the 
optional part of the print loop is not shown here, as it has already been shown in the 
last chapter. 
<define data structure> 
(LlDbAddTable, 
LlDbAddTableRelation, 
LlDbAddTableSortOrder) 
<define all possible variables> 
(LlDefineVariableStart, 
LlDefineVariable,  
LlDefineVariableExt, 
LlDefineVariableExtHandle) 
<define all possible fields> 
(LlDefineFieldStart, 
LlDefineField,  
LlDefineFieldExt, 
LlDefineFieldExtHandle) 
LlSetPrinterDefaultsDir 
<begin print> 
(LlPrintStart, 
LlPrintWithBoxStart) 
<define options> 
(LlPrintSetOption, 
LlPrintSetOptionString, 
LlPreviewSetTempPath)   
<define fixed variables> 
(LlDefineVariable,  
LlDefineVariableExt, 
LlDefineVariableExtHandle, 
LlPrintIsVariableUsed) 
<print variables> 
(print all objects) 
(LlPrint) 
control SDK system:VB.NET Create PDF from Text to convert txt files to PDF in vb.net
Batch convert editable & searchable PDF document from TXT formats in VB.NET class. Able to copy and paste all text content from .txt file to PDF file by keeping
www.rasteredge.com
control SDK system:C# WPF PDF Viewer SDK to convert and export PDF document to other
2. To TIFF. Export PDF to TIFF file format. 3. To TXT. Export and convert PDF to TXT file. 4. To Image. Convert PDF to image formats, such as PNG, JPG, BMP and
www.rasteredge.com
Programming Using the API 
84 
<as long as warning repeat> 
(LlPrint) 
The second part of the print loop needs an auxiliary function. This function prints the 
data of a single (database) table 
function PrintTable(DataTable Dataobject) 
// DataTable is an adequate object for data access, e.g. a 
// table of a database, a class array or similar 
<repeat> 
<define fields of DataTable> 
(LlDefineField,  
LlDefineFieldExt, 
LlDefineFieldExtHandle, 
LlPrintIsFieldUsed) 
<print line> 
(LlPrintFields) 
<as long as warning repeat > 
(LlPrint, 
LlPrintFields) 
<next data record in DataTable> 
<until last data record in DataTable reached> 
<print footer line> 
(Ret = LlPrintFieldsEnd) 
<as long as warning "page full" repeat> 
(Ret = LlPrintFieldsEnd) 
<result = Ret> 
The return value  specifies whether  another table follows (LlPrintFieldsEnd()  returns 
LL_WRN_TABLECHANGE) or if the print can be finished (return value 0). 
With this function, the second part of the print – the part after the initialization of the 
first page – can be coded as follows: 
<repeat> 
<get current table name > 
(LlPrintDbGetCurrentTable) 
<get current sorting> 
(LlPrintDbGetCurrentTableSortOrder)  
<generate a corresponding DataTable object> 
<Ret=PrintTable(DataTable)>  
<until Ret <> LL_WRN_TABLECHANGE> 
control SDK system:C# Create PDF Library SDK to convert PDF from other file formats
Create writable PDF from text (.txt) file. HTML webpage to interactive PDF file creator freeware. Create multipage PDF from OpenOffice and CSV file.
www.rasteredge.com
control SDK system:C# Create PDF from Text to convert txt files to PDF in C#.net, ASP
message can be copied and pasted to PDF file by keeping NET class source code for creating PDF document from Convert plain text to PDF text with multiple fonts
www.rasteredge.com
Programming Using the API 
85 
<finish printout> 
(LlPrintEnd) 
If you have  declared the "LLStaticTable" table for static contents and  LlPrintDbGet-
CurrentTable() provides this table as the current table, your printing loop must react 
to it by printing a single data line via LlPrintFields(). In the above example, you could 
simply  generate  a  DataTable  object  with  just  one  data  record  for  the  case  of 
"LLStaticTable", and printing will then automatically run correctly. 
This  code  already  allows  an arbitrary  sequence  of multiple  tables  in  series. In  the 
following chapter, we will expand it to print sub-tables as well. 
Simple 1:n Relations 
The  typical example  for this  case  is  the  previously  discussed  1:n relation  order  – 
order details. After each record with order data, the order details for that data shall 
be printed. 
The printing of a data line is triggered by LlPrintFields(). Analogously to the behavior 
of LlPrintFieldsEnd() in the last section, the function returns LL_WRN_TABLECHANGE 
if the user has placed a sub-table, and you then have to respond.  
You can ask for the table relation with LlPrintDbGetCurrentRelation() and for the name 
of the child table with LlPrintDbGetCurrentTableName().  With this information,  you 
can  invoke  the  auxiliary  function  PrintTable()  from the last  section  again.  This  call 
must be placed directly after LlPrintFields() – thus from the function PrintTable() itself. 
The function must be changed in order to call itself recursively: 
function PrintTable(DataTable data object) 
// DataTable is an adequate object for data access, e.g. a 
// table of a database, a class array or similar 
<repeat> 
<define fields of DataTable> 
(LlDefineField,  
LlDefineFieldExt, 
LlDefineFieldExtHandle, 
LlPrintIsFieldUsed) 
<print row> 
(LlPrintFields) 
<as long as warning repeat> 
(LlPrint, 
Ret = LlPrintFields) 
<as long as Ret = LL_WRN_TABLECHANGE repeat> 
<get current table name> 
(LlPrintDbGetCurrentTable) 
<get current relation> 
(LlPrintDbGetCurrentTableRelation) 
control SDK system:C# WinForms Viewer: Load, View, Convert, Annotate and Edit
C# WinForms Viewer: Load, View, Convert, Annotate and Edit Except to process PDF, Microsoft Office documents and such as OpenOffice document, CSV file and TXT
www.rasteredge.com
control SDK system:C# WPF Viewer: Load, View, Convert, Annotate and Edit OpenOffice
Load Text file from computer, stream and byte array. Conversion. • Convert ODT to PDF document (.pdf). • Convert ODS to PDF document (.pdf).
www.rasteredge.com
Programming Using the API 
86 
<get current sorting> 
(LlPrintDbGetCurrentTableSortOrder) 
<generate an appropriate DataTable child object> 
<Ret = PrintTable(child DataTable)>  
<next record in DataTable> 
<until last record in DataTable is reached> 
<print footer line> 
(Ret = LlPrintFieldsEnd) 
< as long as warning "page full" repeat > 
(Ret = LlPrintFieldsEnd) 
<result = Ret> 
Any sequence of tables and sub-tables can be printed with this code. The recursion 
ensures  that it works  properly with  any  "depth", i.e. this code can control arbitrary 
multilevel relations. 
The Recursive Print Loop 
For a complete print loop which is supporting sequence tables und sub-tables, there 
is  nothing more to  do. The  code from  the last two sections makes sure  that the 
complete tree of the table structure is printed. 
So only the finishing touches have to be added – e.g. to display a progress bar. The 
structure of a layout can be quite complex. Thus it is not possible to just take the 
current position inside the data source as percentage. This approach does not work 
as soon as the user puts two tables in series. Therefore List & Label allows you to get 
the count of tables at the root level (LlPrintDbGetRootTableCount()). Whenever you 
display a data record from the root level, you can update the progress bar. 
The following holds for the maximum available percentage of a table: 
INT nMaxPerc = 100/LlPrintDbGetRootTableCount(); 
If  you  index  the  root  tables  from  0..  LlPrintDbGetRootTableCount()-1,  you  can 
calculate the total percentage as 
INT nPercTotal = nMaxPerc*nIndexCurrentTable+(nPerc/100*nMaxPerc); 
where nPerc is the percentage position in the current table. To properly update the 
progress  bar,  you  can  adapt  the  function  PrintTable()  from  the  last  section.  The 
current depth of the recursion can be determined with another input parameter – if 
this  parameter  is  0,  a  "root"  data  record  is  printed  and  the  progress  bar  can  be 
updated: 
function PrintTable(DataTable data object, depth of recursion depth) 
<repeat> 
Programming Using the API 
87 
<define fields of DataTable> 
... 
<if depth==0 update progress bar> 
(LlPrintDbGetRootTableCount, 
LlPrintSetBoxText) 
<print row> 
(LlPrintFields) 
<as long as warning repeat > 
(LlPrint, 
Ret = LlPrintFields)      
<repeat until Ret <> LL_WRN_TABLECHANGE > 
... 
<generate an appropriate DataTable child object> 
<Ret = PrintTable(child DataTable, depth+1)> 
... 
Supplying Master Data as Variables 
In the case of an order with the relevant order details, it could be desirable to offer 
the "master" data, i.e. in this example the data of the table orders, as variables. So the 
addressee could e.g.  be displayed in a text object and the order details in a table 
object. Therefore, at the root level of the table object you need to have access to the 
sub-tables of the master table. In order to achieve this, call LlDbSetMasterTable(). The 
necessary calls are 
LlDbAddTable(hJob, "Orders", ""); 
LlDbAddTable(hJob, "OrderDetails", ""); 
LlDbAddTableRelation(hJob, "OrderDetails", "Orders",  
"Orders2OrderDetails", NULL); 
LlDbSetMasterTable(hJob, "Orders"); 
The  print  loop  is  analogous  to  the  description  above,  but  you  have to  make  the 
appropriate child table available on the top level (see Chapter"Multiple Independent 
Tables on the Same Level"): 
<repeat> 
<get current table name> 
(LlPrintDbGetCurrentTable) 
<get current sorting> 
(LlPrintDbGetCurrentTableSortOrder) 
<get current relation> 
(LlPrintDbGetCurrentTableRelation) 
<if relation empty> 
<generate an appropriate DataTable object> 
<else> 
<generate an appropriate child DataTable object> 
Programming Using the API 
88 
<Ret = PrintTable(DataTable)>  
<until Ret <> LL_WRN_TABLECHANGE> 
<close printing> 
(LlPrintEnd) 
4.5.4. Handling 1:1 Relations 
When reporting 1:1 relations, the data is usually combined by a database query with 
a SQL JOIN, so that the data is available in one table. If this is not the case or if you 
don't want this, you can display the  1:1 relations in the list of variables below the 
fields of  the  parent  table. To  accomplish  this, you have to  declare  the  fields in a 
special syntax. 
1:1 Relations Without a Key Field Definition 
If the key fields for the relation are not relevant - if, for example, you are dealing with 
a trivial, single 1:1 relation between the two connected tables - you can declare the 
fields as follows: 
<parent table>:<linked table>.<field name>, e.g. 
OrderDetails:Orders.OrderDate 
This  adds  a  folder  with  the  field  OrderDate  to  the  list  of  variables  below  the 
OrderDetails hierarchy: 
Of course, you must make sure that when printing the OrderDetails table, you fill this 
field with the corresponding value for each record. 
1:1 Relation With Key Field Definition 
In case of multiple 1:1 connections, it might be important for the user to see which 
of the key fields are linking the tables together. In this case you can declare the fields 
as follows: 
<parent  table>.<key  field  parent  table>@<linked  table>.<key  field  linked 
table>:<field name>, e.g. 
OrderDetails.OrderID@Orders.OrderID:OrderDate 
Programming Using the API 
89 
(SQL equivalent: "SELECT OrderDate FROM Orders WHERE OrderDetails.OrderID= 
Orders.OrderID") 
Now the key field declaration is displayed in the tool window list of variables next to 
the table name: 
Again, remember to update the field contents when the parent table is printed! 
Performance Hints 
When using 1:1 relations, it is very important to check whether the user has actually 
placed a field of the linked table. You can do this by using the wildcard option with 
LlPrintIsFieldUsed().  If  you  want  to  check  whether  a  field  of  the  1:1  linked  table 
Orders inside the table OrderDetails is being used, you can call 
LlPrintIsFieldUsed(hJob, "OrderDetails.OrderID@Orders.OrderID*"); 
If the result is 0, no field of the table orders is being used and it is not necessary to 
update the values. 
4.6. Callbacks and Notifications 
This  chapter  is  only  required  if  you're  not  working  with  one  of  the  components 
(.NET/VCL/OCX). If you're using one of these components, you may skip this chapter. 
4.6.1. Overview 
The  following  principle  is  to  be  understood  by  the  expressions  "callbacks  and 
notifications": when List & Label needs information then  it just asks your program. 
You don't have to pre-program all answers, just those for which you explicitly wish a 
modified behavior. 
For example, there are objects which are program definable (user objects, see next 
chapter) which are handled by List & Label as a "black box". And when List & Label 
has to print such an object it turns to your program to ask it to carry out this function. 
This allows your application to extend the support for special objects, for example 
graphics with formats not implemented in List & Label. This is easier than a whole 
COM interface, because you need to supply only one function for the job. 
Using the callback function you can add data to a page (important for labels: when 
needed  you  can  add  information  like  page  no.,  print  date or  similar  onto  a  page 
outside  of  the  labels)  which  is  controlled  by  the  programmer  (and  consequently 
Programming Using the API 
90 
cannot be removed by the user in the Designer). Objects can be hidden (this can also 
be done with LlPrintEnableObject() or the appearance condition of an object). 
All this is possible if you implement one of the following: 
•  a  callback  routine  is  defined  and  its  address  is  passed on  to  List  & Label by 
LlSetNotificationCallback(), or 
•  you react to messages sent by List & Label via Windows messages. These are 
sent  by  List  &  Label  to  the  window  which  is  stated  with  LlDefineLayout()  and 
LlPrintWithBoxStart(). 
In  both  cases  you  obtain  detailed  information  about  the  function  which  is  to  be 
carried out. 
The rest of this chapter describes how to implement such a callback routine. For an 
overview of all available callbacks, see chapter 5.2. Callback Reference. 
4.6.2. User Objects 
As  List  &  Label cannot  draw all possible  objects - be they spline objects,  statistic 
graphs or drawings with an unknown format - a function has been built into List & 
Label  to  offer  the  programmer  so-called  user  objects,  as  even  metafile  variables 
cannot cover all areas. 
If you have defined a variable in your program with 
LlDefineVariableExt(hJob, <Name>, <Content>, LL_DRAWING_USEROBJ, NULL); 
the user can define an object in the Designer which is connected to this variable. This 
takes place analogously to normal LL_DRAWING variables. 
When List & Label needs to print this object, it calls your program using the callback 
LL_CMND_DRAW_USEROBJ to pass this task on to your program, as List & Label 
has no idea what kind of "visual" action needs to be taken. 
The same can be done for table fields, so that the user has the capability of including 
an user object in a table: 
LlDefineFieldExt(hJob, <Name>, <Content>, LL_DRAWING_USEROBJ, NULL); 
For  variables,  but  not  for  fields,  it  is  also  possible  to  define  user  objects  whose 
parameters  can  be  changed  by  the  user  in  the  Designer,  just  like  the  object 
properties  of  List  &  Label's  own  objects.  These  objects  are  defined  with  the 
LL_DRAWING_USEROBJ_DLG type:  
LlDefineVariableExt(hJob, <Name>, <Content>, LL_DRAWING_USEROBJ_DLG, NULL); 
(This means that editable user objects cannot be inserted in tables. Only non-editable 
user objects can be used as table field.) 
Documents you may be interested
Documents you may be interested