pdf viewer c# open source : Bookmark a pdf file application SDK tool html wpf azure online calibre13-part871

calibre User Manual, Release 2.56.0
At the point there are no genres in the column. We are left with the last step: how to apply a genre to a book. A genre
does not exist in calibre until it appears on at least one book. To learn how to apply a genre for the first time,we must
go into some detail about what a genre looks like in the metadata fora book.
Ahierarchy of ‘things’ is built by creating an item consisting of phrases separated by periods. Continuing the genre
example, these items would “History.Military”, “Mysteries.Vampire”, “Science Fiction.Space Opera”, etc. Thus to
create a new genre, you pick a book that should have that genre, edit its metadata, and enter the new genre into
the column you created. Continuing our example, if you want to assign a new genre “Comics” with a sub-genre
“Superheroes” to a book, you would ‘edit metadata’ for that (comic) book, choose the Custommetadata tab, and then
enter “Comics.Superheroes” as shown in the following(ignore the othercustom columns):
Afterdoing the above,you see in the tag browser:
1.9. Tutorials
127
Bookmark a pdf file - add, remove, update PDF bookmarks in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Empower Your C# Project with Rapid PDF Internal Navigation Via Bookmark and Outline
export bookmarks from pdf to excel; adding bookmarks to pdf document
Bookmark a pdf file - VB.NET PDF bookmark library: add, remove, update PDF bookmarks in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Empower Your VB.NET Project with Rapid PDF Internal Navigation Via Bookmark and Outline
how to bookmark a pdf file in acrobat; pdf bookmarks
calibre User Manual, Release 2.56.0
From here on, to apply this new genre to a book (a comic book, presumably), you can either drag the book onto the
genre,or add it to the book using edit metadata in exactly the same way as done above.
Searching
The easiest way to search for genres is using the tag browser, clicking on the genre you wish to see. Clicking on a
genrewith children willshow you books withthat genre and all child genres. However,this mightbring up a question.
Just because a genre has children doesn’t mean that it isn’t a genre in its own right. For example, a book can have the
genre “History” but not “History.Military”. How do you search for books with only “History”?
The tag browser search mechanism knows if an item has children. If it does, clicking on the item cycles through
5searches instead of the normal three. The first is the normal green plus, which shows you books with that genre
only (e.g., History). The second is a doubled plus (shown above), which shows you books with that genre and all
sub-genres (e.g., History and History.Military). The third is the normal red minus, which shows you books without
that exact genre. The fourth is a doubled minus, which shows you books without that genre or sub-genres. The fifth is
back to the beginning,no mark, meaning no search.
Restrictions
If you search fora genre then create a saved search for it, you can use the ‘restrict to’ box to create a virtual library of
books with that genre. This is useful if you want to do other searches within the genre or to manage/update metadata
for books in the genre. Continuing our example, you can create a saved search named ‘History.Japanese’ by first
clicking on the genre Japanese inthe tag browsertogeta searchinto the search box,entering History.Japanese into the
saved search box, then pushing the “save search” button (the green box with the white plus, on the right-hand side).
128
Chapter 1. Sections
VB.NET PDF File Split Library: Split, seperate PDF into multiple
application. Divide PDF file into multiple files by outputting PDF file size. Split PDF document by PDF bookmark and outlines in VB.NET.
create bookmarks pdf; create pdf bookmark
VB.NET PDF File Compress Library: Compress reduce PDF size in vb.
Also able to uncompress PDF file in VB.NET programs. Offer flexible and royalty-free developing library license for VB.NET programmers to compress PDF file.
acrobat split pdf bookmark; add bookmark pdf
calibre User Manual, Release 2.56.0
Aftercreating the saved search, you can use it as a restriction.
Useful Template Functions
You might want to use the genre information in a template, such as with save to disk or send to device.
The question might then be “How do I get the outermost genre name or names?” A calibre template
function, subitems, is provided to make doing this easier.
Forexample,assume you wantto addtheoutermostgenre level to the save-to-disktemplate to makegenre
folders, as in “History/The Gathering Storm - Churchill, Winston”. To do this, you must extract the first
level of the hierarchy and add it to the front along with a slash to indicate that it should make a folder.
The template below accomplishes this:
{#genre:subitems(0,1)||/}{title} - {authors}
SeeThetemplatelanguage(page 131) for more information about templates and the subitems() function.
1.9.2 XPath Tutorial
In this tutorial,you will begiven agentle introduction toXPath
74
,a query language that can be used to selectarbitrary
partsofHTML
75
documents in calibre. XPath is a widely used standard,and googlingitwill yielda tonofinformation.
This tutorial, however,focuses on usingXPath forebook related tasks like finding chapterheadings in an unstructured
HTML document.
74
http://en.wikipedia.org/wiki/XPath
75
http://en.wikipedia.org/wiki/HTML
1.9. Tutorials
129
C# PDF File Split Library: Split, seperate PDF into multiple files
defined pages. Divide PDF file into multiple files by outputting PDF file size. Split PDF document by PDF bookmark and outlines. Also
how to bookmark a pdf in reader; create bookmark pdf file
VB.NET PDF File Merge Library: Merge, append PDF files in vb.net
Professional VB.NET PDF file merging SDK support Visual Studio .NET. Merge PDF without size limitation. Append one PDF file to the end of another one in VB.NET.
bookmark a pdf file; copy pdf bookmarks to another pdf
calibre User Manual, Release 2.56.0
Contents
• Selectingbytagname(page 130)
• Selectingbyattributes(page 130)
• Selectingbytagcontent(page 131)
• Sampleebook(page 131)
• XPathbuilt-infunctions(page 131)
Selecting by tagname
The simplest formofselection is to select tags by name. Forexample, suppose you wantto select all the <h2> tags in
adocument. The XPath query for this is simply:
//h:h2
(Selects all <h2> tags)
The prefix // means search at any level of the document. Now suppose you want to search for <span> tags that are
inside <a> tags. That can be achieved with:
//h:a/h:span
(Selects <span> tags inside <a> tags)
If you want to search for tags at a particular level inthe document, change the prefix:
/h:body/h:div/h:p (Selects <ptags that are e children n of <divtags that are
children of the <body> tag)
This will match only <p>A very short ebook to demonstrate the use of XPath.</p> in the
Sample ebook(page131)butnotanyoftheother<p>tags. Theh: : prefixintheaboveexamplesisneededto
match XHTML tags. This is because internally, calibre represents all content as XHTML. In XHTML tags have a
namespace, and h: is the namespace prefix for HTML tags.
Now suppose you want to select both <h1> and <h2> tags. To do that, we need a XPath construct called predicate.
Apredicate is simply a test that is used toselect tags. Tests can be arbitrarilypowerful and as this tutorial progresses,
you will see more powerful examples. A predicate is created by enclosing the test expression in square brackets:
//
*
[name()='h1' or name()='h2']
There are several new features in this XPath expression. The first is the use of the wildcard
*
.It means match any tag.
Now lookat the test expression name()=’h1’ or name()=’h2’.name()is an example of a built-in function. It
simply evaluates to the name of the tag. So by using it, we can select tags whose names are either h1 or h2. Note that
thename()function ignores namespaces so that there is no need for the h: prefix. XPath has several useful built-in
functions. A few more will be introduced in this tutorial.
Selecting by attributes
To select tags based ontheir attributes, the use of predicates is required:
//
*
[@style]
(Select all tags that have a style attribute)
//
*
[@class="chapter"]
(Select all tags that have class="chapter")
//h:h1[@class="bookTitle"] (Select all h1 tags that have class="bookTitle")
Here, the @ operatorrefers to the attributes of the tag. You can use some of theXPathbuilt-infunctions(page 131) to
perform more sophisticated matching on attribute values.
130
Chapter 1. Sections
C# PDF File Merge Library: Merge, append PDF files in C#.net, ASP.
Professional C#.NET PDF SDK for merging PDF file merging in Visual Studio .NET. Append one PDF file to the end of another and save to a single PDF file.
create pdf bookmarks; how to bookmark a pdf file in acrobat
C# PDF File Compress Library: Compress reduce PDF size in C#.net
Reduce image resources: Since images are usually or large size, images size reducing can help to reduce PDF file size effectively.
export pdf bookmarks to excel; adding bookmarks in pdf
calibre User Manual, Release 2.56.0
Selecting by tag content
Using XPath, you can even select tags based on the text they contain. The best way to do this is to use the power of
regular expressions via the built-in functionre:test():
//h:h2[re:test(.'chapter|section''i')] (Selects <h2tags that contain n the e words chapter or
section)
Here the . operatorrefers to the contents of the tag, just as the @ operator referred to its attributes.
Sample ebook
<html>
<head>
<title>A very short ebook</title>
<meta name="charset" value="utf-8" />
</head>
<body>
<h1 class="bookTitle">A very short ebook</h1>
<style="text-align:right">Written by Kovid Goyal</p>
<div class="introduction">
<p>A very short ebook to demonstrate the use of XPath.</p>
</div>
<h2 class="chapter">Chapter One</h2>
<p>This is a truly fascinating chapter.</p>
<h2 class="chapter">Chapter Two</h2>
<p>A worthy continuation of a fine tradition.</p>
</body>
</html>
XPath built-in functions
name() The name ofthe current tag.
contains() contains(s1, s2) returns true ifs1 contains s2.
re:test() re:test(src, pattern, flags) returns true if the string src matches the regular expression pat-
tern. A particularly useful flag is i,it makes matching case insensitive. Agood primeron the syntax for regular
expressions can be found atregexpsyntax
76
1.9.3 The calibre template language
The calibre template language is used in various places. It is used to control the folder structure and file name when
saving files from the calibre library to the diskor eBook reader. It is also used to define “virtual” columns that contain
data from other columns and so on.
The basic template language is very simple, buthas very powerfuladvancedfeatures. The basic idea is that a template
consists of textand names incurly brackets thatare then replaced by the corresponding metadata fromthe bookbeing
processed. So,forexample, the default template used for saving books to device in calibre is:
{author_sort}/{title}/{title} - {authors}
76
https://docs.python.org/2.7/library/re.html
1.9. Tutorials
131
C# PDF Library SDK to view, edit, convert, process PDF file for C#
and quick navigation link in PDF bookmark. C#.NET: Edit PDF Metadata. PDF SDK for .NET allows you to read, add, edit, update, and delete PDF file metadata, like
bookmarks pdf; how to add a bookmark in pdf
VB.NET Create PDF from Excel Library to convert xlsx, xls to PDF
C#.NET PDF file & pages edit, C#.NET PDF pages extract, copy, paste, C#.NET rotate PDF pages, C#.NET search text in PDF, C#.NET edit PDF bookmark, C#.NET edit
export pdf bookmarks to text file; how to bookmark a page in pdf document
calibre User Manual, Release 2.56.0
For the book “The Foundation” by “Isaac Asimov” it will become:
Asimov, Isaac/The Foundation/The Foundation - Isaac Asimov
The slashes are text, which is put into the template where it appears. For example,if yourtemplate is:
{author_sort} Some Important Text {title}/{title} - {authors}
For the book “The Foundation” by “Isaac Asimov” it will become:
Asimov, Isaac Some Important Text The Foundation/The Foundation - Isaac Asimov
You can use all the various metadata fields available in calibre in a template, including any custom columns you have
createdyourself. To findout the template name fora column simply hover yourmouseoverthecolumnheader. Names
for custom fields (columns you have created yourself) always have a # as the first character. For series type custom
fields,there is always an additional field named #seriesname_index that becomes the series index forthatseries.
So if you have a custom series field named #myseries,there will also be a field named #myseries_index.
In addition to the column based fields, you also can use:
{formats} - A list of formats available in the calibre library for a book
{identifiers:select(isbn)} - The ISBN number of the book
If a particularbook does not have a particular piece of metadata, the field inthe template is automatically removed for
that book. Consider,for example:
{author_sort}/{series}/{title} {series_index}
If a book has a series,the template will produce:
Asimov, Isaac/Foundation/Second Foundation 3
and if a book does not have a series:
Asimov, Isaac/Second Foundation
(calibre automatically removes multiple slashes and leading ortrailing spaces).
Advanced formatting
You can do more than just simple substitution with the templates. You can also conditionally include text and control
how the substituted data is formatted.
First, conditionally including text. There are cases where you might want to have text appear in the output only if
afield is not empty. A common case is series and series_index, where you want either nothing or the two
values with a hyphen between them. Calibre handles this case using a special field syntax.
For example, assume you want to use the template:
{series} - {series_index} - {title}
If the book has no series, the answer will be - - title. Many people would rather the result be simply title,
without the hyphens. To do this, use the extended syntax {field:|prefix_text|suffix_text}. When you
use this syntax,iffield has the value SERIES then the result willbe prefix_textSERIESsuffix_text. Iffield
has no value, then the result will be the empty string (nothing); the prefix and suffix are ignored. The prefix and suffix
can contain blanks. Do not use subtemplates (‘{ ... }‘) or functions (see below)as the prefix or the suffix.
Using this syntax, we cansolve the above series problem with the template:
132
Chapter 1. Sections
calibre User Manual, Release 2.56.0
{series}{series_index:| - - | | - }{title}
The hyphens will be included only if the book has a series index, which it will have only if it has a series.
Notes: you must include the : character if you want to use a prefix or a suffix. You must either use no | characters or
both of them; using one, as in {field:| - }, is not allowed. It is OK not to provide any text for one side or the
other,such as in {series:|| - }. Using {title:||} is the same as using {title}.
Second: formatting. Suppose you wanted to ensure that the series_index is always formatted as three digits with
leading zeros. This would do the trick:
{series_index:0>3s} - Three digits with leading zeros
If instead of leading zeros you want leading spaces,use:
{series_index:>3s} - Three digits with leading spaces
For trailing zeros, use:
{series_index:0<3s} - Three digits with trailing zeros
If you use series indices with sub values (e.g., 1.1), you might want to ensure that the decimal points line up. For
example,youmightwant the indices 1 and 2.5to appearas 01.00 and 02.50 so that they willsort correctly. To dothis,
use:
{series_index:0>5.2f} - Five characters, consisting of two digits with leading zeros, a decimal point, then 2 digits after the decimal point
If you want only the first two letters of the data, use:
{author_sort:.2- Only the first two letter of the author sort name
The calibre template language comes from python and for more details on the syntax of these advanced formatting
operations, look at thePythondocumentation
77
.
Advanced features
Using templates in custom columns
There are sometimes cases where you want to display metadata that calibre does not normally display, or to dis-
play data in a way different from how calibre normally does. For example, you might want to display the ISBN, a
field that calibre does not display. You can use custom columns for this by creating a column with the type ‘col-
umn built from other columns’ (hereafter called composite columns), and entering a template. Result: calibre will
display a column showing the result of evaluating that template. To display the ISBN, create the column and enter
{identifiers:select(isbn)} into the template box. To display a column containing the values of two series
custom columns separated by a comma, use {#series1:||,}{#series2}.
Composite columns can use any template option, includingformatting.
You cannot change the data contained in a composite column. If you edit a composite column by double-clicking on
any item, you will open the template for editing, not the underlying data. Editing the template on the GUI is a quick
way of testing and changing composite columns.
77 https://docs.python.org/2/library/string.html#format-string-syntax
1.9. Tutorials
133
calibre User Manual, Release 2.56.0
Using functions in templates - single-function mode
Suppose you want to display the value ofa field inupper case,when that fieldis normallyin title case. You cando this
(and many more things)using the functions available for templates. Forexample, to displaythe title in uppercase,use
{title:uppercase()}. To display it in title case,use {title:titlecase()}.
Function references appear in the format part, going after the : and before the first | or the closing }. If you have
both a format anda function reference,the function comes afteranother:. Functions must always end with(). Some
functions take extra values (arguments),and these go inside the ().
Functions are always applied before format specifications. See further down for an example of using both a format
and a function, where this orderis demonstrated.
The
syntax
for
using
functions
is
{field:function(arguments)},
or
{field:function(arguments)|prefix|suffix}. Arguments are separated by commas. Commas
inside arguments must be preceeded by a backslash ( ‘\’ ). The last (or only) argument cannot contain a closing
parenthesis ( ‘)’). Functions return the value of the field used in the template, suitably modified.
Important: If you have programming experience, please note that the syntax in this mode (single function) is not
what you might expect. Strings are not quoted. Spaces are significant. All arguments must be constants; there is no
sub-evaluation. Do not use subtemplates (‘{ ... }‘) as function arguments. Instead, usetemplateprogrammode
(page 136)andgeneralprogrammode (page 157).
Many functions use regular expressions. In all cases, regularexpression matching is case-insensitive.
The functions available arelistedbelow. Notethatthe definitive documentation forfunctions is available inthesection
Function classification(page141):
• lowercase() – return value ofthe field inlower case.
• uppercase() – return the value of the field in upper case.
• titlecase() – return the value of the field in title case.
• capitalize() – return the value with the first letter upper case and the rest lower case.
• contains(pattern, text if match, text if not match) – checks if field contains matches
for the regular expression pattern. Returns text if match if matches are found, otherwise it returns text if no
match.
• count(separator) – interprets the value as a list of items separated by separator, returning the num-
ber of items in the list. Most lists use a comma as the separator, but authors uses an ampersand. Examples:
{tags:count(,)}, {authors:count(&)}
• format_number(template) – interprets the value as a number and format that number using a python
formatting template such as “{0:5.2f}” or “{0:,d}” or “${0:5,.2f}”. The field_name part of the template must
be a 0 (zero)(the “{0:” in the above examples). See the template language and python documentation for more
examples. Returns the empty string ifformatting fails.
• human_readable() – expects the value to be a number and returns a stringrepresenting that number inKB,
MB, GB, etc.
• ifempty(text) – if the field is not empty,return the value of the field. Otherwise return text.
• in_list(separator, pattern, found_val, not_found_val) – interpret the field as a list of
items separated byseparator, comparingthe pattern againsteachvalue in the list. Ifthepatternmatches a value,
return found_val, otherwise return not_found_val.
• language_codes(lang_strings) – return the language codes for the strings passed in lang_strings.
The strings must be in the language of the current locale. Lang_strings is a comma-separated list.
134
Chapter 1. Sections
calibre User Manual, Release 2.56.0
• language_strings(lang_codes, localize) – return the strings for the language codes passed in
lang_codes. If localize is zero, return the strings in English. If localize is not zero, return the strings in the
language of the current locale. Lang_codes is a comma-separated list.
• list_item(index, separator) – interpret the field as a list of items separated by separator,returning
the index‘th item. The first item is number zero. The last item can be returned using ‘list_item(-1,separator). If
the item is not in the list, then the empty value is returned. The separator has the same meaning as in the count
function.
• lookup(pattern, field, pattern, field, ..., else_field) – like switch, except the ar-
guments are field (metadata) names, not text. The value of the appropriate field will be fetched and used. Note
that because composite columns are fields, you can use this function in one composite field to use the value of
some other composite field. This is extremely useful when constructing variable save paths (more later).
• re(pattern, replacement) – return the field after applying the regular expression. All instances of
pattern are replaced with replacement. As in all of calibre, these are python-compatible regularexpressions.
• select(key) – interpret the field as a comma-separated list of items, with the items being of the form
“id:value”. Find thepairwith theidequal tokey, andreturnthecorrespondingvalue. This functionis particularly
useful for extracting a value such as an isbn from the set of identifiers for a book.
• shorten(left chars, middle text, right chars) – Return a shortened version of the field,
consisting of left chars characters from the beginning of the field, followed by middle text, followed by right
chars characters from the end of the string. Left chars and right chars must be integers. For example, assume
the title of the book is Ancient English Laws in the Times of Ivanhoe, and you want it to fit in a space of at
most 15 characters. Ifyou use {title:shorten(9,-,5)},the result will be Ancient E-nhoe. If the field’s
lengthis less thanleft chars + right chars + the lengthofmiddle text, thenthe fieldwill be used
intact. For example,the title The Dome would not be changed.
• str_in_list(val, separator, string, found_val, not_found_val) – treat val as a list
ofitems separatedby separator,comparingthe string against each value in the list. If the string matches a value,
return found_val, otherwise return not_found_val. If the string contains separators, then it is also treated as a
list and each value is checked.
• subitems(val, start_index, end_index) – This function is used to break apart lists of tag-like
hierarchical items such as genres. It interprets the value as a comma-separated list of tag-like items, where each
item is a period-separated list. Returns a new list made by first finding all the period-separated tag-like items,
then for each such item extracting the components from start_index to end_index, then combining the results
back together. The first component in a period-separated list has an index of zero. If an index is negative, then
it counts from the end of the list. As a special case,an end_index of zero is assumed to be the length of the list.
Examples:
Assuming a #genre column n containing g "A.B.C":
{#genre:subitems(0,1)} returns "A"
{#genre:subitems(0,2)} returns "A.B"
{#genre:subitems(1,0)} returns "B.C"
Assuming a #genre column n containing g "A.B.C, , D.E":
{#genre:subitems(0,1)} returns "A, D"
{#genre:subitems(0,2)} returns "A.B, D.E"
• sublist(val, start_index, end_index, separator) – interpret the value as a list of items
separated by separator,returning a newlist made fromthe items from start_index‘to ‘end_index. The first item
is number zero. If an index is negative,thenit counts from the end ofthelist. As a special case,an end_index of
zero is assumed tobethelengthofthe list. Examplesassumingthatthe tags column (whichis comma-separated)
contains “A, B ,C”:
{tags:sublist(0,1,\,)} returns "A"
{tags:sublist(-1,0,\,)} returns "C"
{tags:sublist(0,-1,\,)} returns "A, B"
1.9. Tutorials
135
calibre User Manual, Release 2.56.0
• swap_around_comma(val) –givena value of the form B, A,return A B.This is mostuseful forconvert-
ing names in LN, FN format to FN LN. Ifthere is no comma, the function returns val unchanged.
• switch(pattern, value, pattern, value, ..., else_value) – for each pattern,
value pair, checks if the field matches the regular expression pattern and if so, returns that value. If
no pattern matches, then else_value is returned. You can have as many pattern, value pairs as
you want.
• test(text if not empty, text if empty) – return text if not empty ifthe field is not empty, oth-
erwise return text if empty.
• transliterate() – Returns a string in a latin alphabet formed by approximating the sound of the words in
the source field. For example, if the source field is Фёдор Михaйлович Достоевский the function returns
Fiodor Mikhailovich Dostoievskii.’
Now,what about using functions and formatting inthe same field. Suppose youhave an integer customcolumn called
#myint that youwant tosee with leading zeros,as in003. To do this, youwoulduse a format of0>3s. However, by
default, if a number(integer orfloat) equals zero then the field produces the empty value, so zero values will produce
nothing,not 000. If youreally wanttosee 000 values,then youuse boththe format string and the ifempty function
to change the empty value back toa zero. The field reference would be:
{#myint:0>3s:ifempty(0)}
Note that you can use the prefix and suffix as well. If you want the number to appear as [003] or [000], then use
the field:
{#myint:0>3s:ifempty(0)|[|]}
Using functions in templates - template program mode
Thetemplate languageprogrammodediffers fromsingle-function mode inthat it permits you to write templateexpres-
sions that refer to other metadata fields, modify values, and do arithmetic. It is a reasonably complete programming
language.
You canuse the functions documented above in template program mode. See below fordetails.
Beginningwith an example, assume that you want yourtemplate to show the series for a book if it has one,otherwise
show the value of a customfield #genre. You cannot do this in the basic language because you cannot make reference
to another metadata field within a template expression. In programmode, you can. The following expression works:
{#series:'ifempty($, field('#genre'))'}
The example shows several things:
• program mode is used if the expression begins with :’ and ends with ’. Anything else is assumed to be
single-function.
• the variable $ stands for the field the expression is operating upon, #series in this case.
• functions must be given all their arguments. There is no default value. For example,the standard built-in func-
tions must be given an additional initial parameter indicating the source field, which is a significant difference
fromsingle-function mode.
• white space is ignored and can be used anywhere within the expression.
• constant strings are enclosed in matching quotes, either ’ or ".
The language is similar to functional languages in that it is built almost entirely from functions. A statement is
afunction. An expression is a function. Constants and identifiers can be thought of as functions returning the value
indicated by the constant or stored in the identifier.
136
Chapter 1. Sections
Documents you may be interested
Documents you may be interested