pdf viewer for asp.net web application : How to add image to pdf control software system azure winforms asp.net console postgresql-9.4-A4198-part2832

Chapter 50. PostgreSQL Coding Conventions
parens
auth
xact
Rationale: This will improve consistency.
50.3.16. Localization
Keep in mind thaterror message texts needtobe translatedinto other languages. Follow theguidelines
in Section 51.2.2 to avoid making life difficult for translators.
1908
How to add image to pdf - insert images into PDF in C#.net, ASP.NET, MVC, Ajax, WinForms, WPF
Sample C# code to add image, picture, logo or digital photo into PDF document page using PDF page editor control
add jpeg to pdf; add picture to pdf file
How to add image to pdf - VB.NET PDF insert image library: insert images into PDF in vb.net, ASP.NET, MVC, Ajax, WinForms, WPF
Guide VB.NET Programmers How to Add Images in PDF Document
how to add photo to pdf in preview; add photo to pdf preview
Chapter 51. Native Language Support
51.1. For the Translator
PostgreSQL programs (server and client) can issue their messages in your favorite language — if the
messages have been translated. Creating and maintaining translated message sets needs the help of
people who speak their own language well and want to contribute to the PostgreSQL effort. You do
not have to be a programmer at all to do this. This section explains how to help.
51.1.1. Requirements
We won’t judge your language skills — this section is about software tools. Theoretically, you only
need a text editor. But this is only in the unlikely event that you do not want to try out your translated
messages. When you configure your source tree, be sure to use the
--enable-nls
option. This will
also check for the libintl library and the
msgfmt
program, which all end users will need anyway. To
tryout your work, follow the applicable portions of the installation instructions.
If you want to start a new translation effort or want to do a message catalog merge (described later),
you will need the programs
xgettext
and
msgmerge
,respectively, in a GNU-compatible imple-
mentation. Later, we willtryto arrange itsothatif you use a packaged source distribution, youwon’t
need
xgettext
.(If working from Git, you willstill need it.) GNUGettext 0.10.36or later is currently
recommended.
Your local gettext implementationshould come withits owndocumentation. Some of that is probably
duplicated in what follows, but for additional details you should look there.
51.1.2. Concepts
The pairs of original (English) messages and their (possibly) translated equivalents are kept in mes-
sage catalogs, one for eachprogram (although related programs can share a message catalog) and for
each target language. There are two file formats for message catalogs: The first is the “PO” file (for
Portable Object), which is a plain text file with special syntax that translators edit. The second is the
“MO” file (for Machine Object), which is a binary file generated from the respective PO file and is
used while the internationalized program is run. Translators do not deal with MO files; in fact hardly
anyone does.
The extension of the message catalog file is to no surprise either
.po
or
.mo
.The base name is either
the name of the program it accompanies, or the language the file is for, depending on the situation.
This is a bit confusing. Examples are
psql.po
(PO file for psql) or
fr.mo
(MO file in French).
The file format of the PO files is illustrated here:
# comment
msgid "original string"
msgstr "translated string"
msgid "more original"
1909
C# PDF Image Extract Library: Select, copy, paste PDF images in C#
Get image information, such as its location, zonal information, metadata, and so on. Able to edit, add, delete, move, and output PDF document image.
add image in pdf using java; adding image to pdf in preview
VB.NET PDF Password Library: add, remove, edit PDF file password
VB: Add Password to PDF with Permission Settings Applied. This VB.NET example shows how to add PDF file password with access permission setting.
how to add image to pdf in preview; add photo to pdf
Chapter 51. Native Language Support
msgstr "another translated"
"string can be broken up like this"
...
The msgid’s are extracted from the program source. (They need not be, but this is the most common
way.) The msgstr lines are initially empty and are filled in with useful strings by the translator. The
strings can contain C-style escape characters and can be continued across lines as illustrated. (The
next line must start at the beginning of the line.)
The # character introduces a comment. If whitespace immediately follows the # character, then this
is a comment maintained by the translator. There can also be automatic comments, which have a
non-whitespace character immediately following the #. These are maintainedbythe various tools that
operate on the PO files and are intended to aid the translator.
#. automatic comment
#: filename.c:1023
#, flags, flags
The #. style comments are extracted from the source file where the message is used. Possibly the
programmer has inserted information for the translator, such as about expected alignment. The #:
comment indicates the exact location(s) where the message is used in the source. The translator need
not look at the program source, but he can if there is doubt about the correct translation. The #,
comments contain flags that describe the message in some way. There are currently two flags:
fuzzy
is set if the message has possibly been outdated because of changes in the program source. The
translator can then verify this and possibly remove the fuzzy flag. Note that fuzzy messages are not
made available to the end user. The other flag is
c-format
,which indicates that the message is a
printf
-style format template. This means that the translation should also be a format string with the
same number andtype of placeholders. There are tools thatcan verifythis, whichkey off thec-format
flag.
51.1.3. Creating and Maintaining Message Catalogs
OK, so how does one create a “blank” message catalog? First, go into the directory that contains the
program whose messages you want to translate. If there is a file
nls.mk
,then this program has been
prepared for translation.
If there are alreadysome
.po
files, then someonehas alreadydone sometranslationwork. Thefiles are
named
language
.po
,where
language
is the ISO 639-1 two-letter language code (in lower case)
1
,
e.g.,
fr.po
for French. If there is really a need for more than one translation effort per language
then the files can also be named
language
_
region
.po
where
region
is the ISO 3166-1 two-letter
country code (in upper case)
2
,e.g.,
pt_BR.po
for Portuguese in Brazil. If you find the language you
wanted you can just start working on that file.
If you need to start a new translation effort, then first run the command:
make init-po
This will create a file
progname
.pot
.(
.pot
to distinguish it from PO files that are “in production”.
The
T
stands for “template”.) Copy this file to
language
.po
and edit it. To make it known that the
new language is available, also edit the file
nls.mk
and add the language (or language and country)
code to the line that looks like:
1. http://www.loc.gov/standards/iso639-2/php/English_list.php
2. http://www.iso.org/iso/country_names_and_code_elements
1910
C# PDF Password Library: add, remove, edit PDF file password in C#
C# Sample Code: Add Password to PDF with Permission Settings Applied in C#.NET. This example shows how to add PDF file password with access permission setting.
add image to pdf reader; add image to pdf
VB.NET PDF Image Extract Library: Select, copy, paste PDF images
DLLs for PDF Image Extraction in VB.NET. In order to run the sample code, the following steps would be necessary. Add necessary references:
add picture pdf; add photo to pdf file
Chapter 51. Native Language Support
AVAIL_LANGUAGES := de fr
(Other languages can appear, of course.)
As the underlying program or library changes, messages might be changed or addedby the program-
mers. In this case you do not needto start from scratch. Instead, run the command:
make update-po
which will create a new blank message catalog file (the pot file you started with) and will merge it
with the existing PO files. If the merge algorithm is not sure about a particular message it marks it
“fuzzy” as explained above. The new PO file is saved with a
.po.new
extension.
51.1.4. Editing the PO Files
The PO files can be edited with a regular text editor. The translator should only change the area
between the quotes after the msgstr directive, add comments, and alter the fuzzy flag. There is (un-
surprisingly) a PO mode for Emacs, which I find quite useful.
The PO files neednotbe completely filledin. The software will automaticallyfall back tothe original
string if no translation (or an empty translation) is available. It is no problem to submit incomplete
translations for inclusions in the source tree; that gives room for other people to pick up your work.
However, you are encouraged togive priority to removing fuzzy entries after doing a merge. Remem-
ber that fuzzy entries will not be installed; they only serve as reference for what might be the right
translation.
Here are some things to keep in mind while editing the translations:
Make sure that if the original ends with a newline, the translation does, too. Similarly for tabs, etc.
If the original is a
printf
format string, the translation alsoneeds to be. Thetranslationalso needs
to have the same format specifiers in the same order. Sometimes the natural rules of the language
make this impossible or at least awkward. In that case you can modify the format specifiers like
this:
msgstr "Die Datei %2$s hat %1$u Zeichen."
Then the first placeholder will actually use the second argument from the list. The
digits
$
needs
to follow the % immediately, before any other format manipulators. (This feature really exists in
the
printf
family of functions. You might not have heard of it before because there is little use
for it outside of message internationalization.)
If the original string contains a linguistic mistake, report that (or fix it yourself in the program
source) and translate normally. The corrected string can be merged in when the program sources
have been updated. If the original string contains a factual mistake, report that (or fix it yourself)
and do not translate it. Instead, you can mark the string with a comment in the PO file.
Maintain the style and tone of the original string. Specifically, messages that are not sentences
(
cannot open file %s
)should probably not start with a capital letter (if your language distin-
guishes letter case) or end with a period (if your language uses punctuation marks). It might help
to read Section 50.3.
If you don’t know what a message means, or if it is ambiguous, askon the developers’ mailing list.
Chances are that English speaking end users might also not understand it or find it ambiguous, so
it’s best to improve the message.
1911
C# Create PDF from images Library to convert Jpeg, png images to
List<Bitmap> images = new List<Bitmap>(); images.Add(new Bitmap(Program.RootPath + "\\" 1.gif")); / Build a PDF document with GIF image.
add an image to a pdf in preview; add image to pdf in preview
C# PDF Sticky Note Library: add, delete, update PDF note in C#.net
C#.NET PDF SDK - Add Sticky Note to PDF Page in C#.NET. Able to add notes to PDF using C# source code in Visual Studio .NET framework.
add photo to pdf in preview; add picture to pdf in preview
Chapter 51. Native Language Support
51.2. For the Programmer
51.2.1. Mechanics
This section describes how to implement native language support in a program or library that is part
of the PostgreSQL distribution. Currently, it only applies to C programs.
Adding NLS Support to a Program
1. Insert this code into the start-up sequence of the program:
#ifdef ENABLE_NLS
#include <locale.h>
#endif
...
#ifdef ENABLE_NLS
setlocale(LC_ALL, "");
bindtextdomain("
progname
", LOCALEDIR);
textdomain("
progname
");
#endif
(The
progname
can actually be chosen freely.)
2. Wherever a message thatis a candidate for translation is found, a call to
gettext()
needs to be
inserted. E.g.:
fprintf(stderr, "panic level %d\n", lvl);
would be changed to:
fprintf(stderr, gettext("panic level %d\n"), lvl);
(
gettext
is defined as a no-op if NLS support is not configured.)
This tends to add a lot of clutter. One common shortcut is to use:
#define _(x) gettext(x)
Another solution is feasible if the program does much of its communication through one or a
few functions, such as
ereport()
in the backend. Then you make this function call
gettext
internally on all input strings.
3. Adda file
nls.mk
in the directory with the program sources. This file will be read as a makefile.
The following variable assignments need to be made here:
CATALOG_NAME
The program name, as provided in the
textdomain()
call.
AVAIL_LANGUAGES
List of provided translations — initially empty.
GETTEXT_FILES
List of files that contain translatable strings, i.e., those marked with
gettext
or an alterna-
tive solution. Eventually, this will include nearly all source files of the program. If this list
gets too long you can make the first “file” be a
+
and the second word be a file that contains
one file name per line.
1912
C# PDF remove image library: remove, delete images from PDF in C#.
C# Read: PDF Image Extract; C# Write: Insert text into PDF; C# Write: Add Image to PDF; Remove Image from PDF Page Using C#. Add necessary references:
add jpg to pdf; adding a jpg to a pdf
VB.NET PDF remove image library: remove, delete images from PDF in
C# Read: PDF Image Extract; C# Write: Insert text into PDF; C# Write: Add Image to PDF; VB.NET: Remove Image from PDF Page. Add necessary references:
add picture to pdf online; add signature image to pdf acrobat
Chapter 51. Native Language Support
GETTEXT_TRIGGERS
The tools that generate message catalogs for the translators to work on need to know what
function calls contain translatable strings. By default, only
gettext()
calls are known. If
you used
_
or other identifiers you need to list them here. If the translatable string is not
the first argument, the item needs to be of the form
func:2
(for the second argument). If
you have a function that supports pluralized messages, the item should look like
func:1,2
(identifying the singular and plural message arguments).
The build system will automatically take care of building and installing the message catalogs.
51.2.2. Message-writing Guidelines
Here are some guidelines for writing messages that are easily translatable.
Do not construct sentences at run-time, like:
printf("Files were %s.\n", flag ? "copied" : "removed");
The word order within the sentence might be different in other languages. Also, even if you re-
member to call
gettext()
on each fragment, the fragments might not translate well separately.
It’s better to duplicate a little code so that each message to be translated is a coherent whole. Only
numbers, file names, andsuch-like run-time variables should be insertedat run timeinto a message
text.
For similar reasons, this won’t work:
printf("copied %d file%s", n, n!=1 ? "s" : "");
because it assumes how the plural is formed. If you figured you could solve it like this:
if (n==1)
printf("copied 1 file");
else
printf("copied %d files", n):
then be disappointed. Some languages have more than two forms, with some peculiar rules. It’s
often best to design the message to avoid the issue altogether, for instance like this:
printf("number of copied files: %d", n);
If you really want to construct a properly pluralized message, there is support for this, but it’s a
bit awkward. When generating a primary or detail error message in
ereport()
,you can write
something like this:
errmsg_plural("copied %d file",
"copied %d files",
n,
n)
The first argument is the format string appropriate for English singular form, the second is the
format string appropriate for English plural form, and the third is the integer control value that
determines which plural form to use. Subsequent arguments are formatted per the format string as
usual. (Normally, the pluralization control value will also be one of the values to be formatted, so
it has to be writtentwice.) InEnglish it only matters whether
n
is 1 or not 1, but inother languages
there can be many different plural forms. The translator sees the two English forms as a group and
has the opportunity to supply multiple substitute strings, with the appropriate one being selected
based on the run-time value of
n
.
1913
Chapter 51. Native Language Support
If youneedto pluralize a message that isn’t goingdirectly toan
errmsg
or
errdetail
report, you
have to use the underlying function
ngettext
.See the gettext documentation.
If you want to communicate something to the translator, such as about how a message is intended
to line up with other output, precede the occurrence of the string with a comment that starts with
translator
,e.g.:
/
*
translator: This message is not what it seems to be.
*
/
These comments are copied to the message catalog files so that the translators can see them.
1914
Chapter 52. Writing A Procedural Language
Handler
All calls to functions that are written in a language other than the current “version 1” interface for
compiled languages (this includes functions in user-defined procedural languages, functions written
in SQL, and functions using the version 0 compiled language interface) go through a call handler
function for the specific language. It is the responsibility of the call handler toexecute the function in
ameaningful way, such as by interpreting the supplied source text. This chapter outlines how a new
procedural language’s call handler can be written.
The call handler for a procedural language is a “normal” function that must be written in a compiled
language such as C, using the version-1 interface, and registered with PostgreSQL as taking no ar-
guments and returning the type
language_handler
.This special pseudotype identifies the function
as a call handler and prevents it from being called directly in SQL commands. For more details on C
language calling conventions and dynamic loading, see Section35.9.
The call handler is called in the same way as any other function: It receives a pointer to a
FunctionCallInfoData struct
containing argument values and information about the called
function, and it is expected to return a
Datum
result (and possibly set the
isnull
field of the
FunctionCallInfoData
structure, if it wishes to return an SQL null result). The difference
between a call handler and an ordinary callee function is that the
flinfo->fn_oid
field of the
FunctionCallInfoData
structure will contain the OID of the actual function to be called, not of
the call handler itself. The call handler must use this field to determine which function to execute.
Also, the passed argument list has been set up according to the declaration of the target function, not
of the call handler.
It’s up to the call handler to fetch the entry of the function from the
pg_proc
system catalog and
to analyze the argument and return types of the called function. The
AS
clause from the
CREATE
FUNCTION
command for the function willbe found in the
prosrc
column of the
pg_proc
row. This
is commonly source text in the procedural language, but in theory it could be something else, such as
apath name to a file, or anything else that tells the call handler what to do in detail.
Often, the same function is called many times per SQL statement. A call handler can avoid repeated
lookups of information about the called function by using the
flinfo->fn_extra
field. This will
initially be
NULL
,but can be set by the call handler to point at information about the called func-
tion. On subsequent calls, if
flinfo->fn_extra
is already non-
NULL
then it can be used and the
information lookup stepskipped. The call handler must make sure that
flinfo->fn_extra
is made
to point at memory that will live at least until the end of the current query, since an
FmgrInfo
data
structure couldbekept that long. One waytodothis is to allocate the extra data inthe memorycontext
specified by
flinfo->fn_mcxt
;such data will normally have the same lifespan as the
FmgrInfo
itself. But the handler could also choose to use a longer-lived memory context so that it can cache
function definition information across queries.
When a procedural-language function is invoked as a trigger, no arguments are passed in the usual
way, but the
FunctionCallInfoData
’s
context
field points at a
TriggerData
structure, rather
than being
NULL
as it is in a plain function call. A language handler should provide mechanisms for
procedural-language functions to get at the trigger information.
This is a template for a procedural-language handler written in C:
#include "postgres.h"
1915
Chapter 52. Writing A Procedural Language Handler
#include "executor/spi.h"
#include "commands/trigger.h"
#include "fmgr.h"
#include "access/heapam.h"
#include "utils/syscache.h"
#include "catalog/pg_proc.h"
#include "catalog/pg_type.h"
#ifdef PG_MODULE_MAGIC
PG_MODULE_MAGIC;
#endif
PG_FUNCTION_INFO_V1(plsample_call_handler);
Datum
plsample_call_handler(PG_FUNCTION_ARGS)
{
Datum
retval;
if (CALLED_AS_TRIGGER(fcinfo))
{
/
*
*
Called as a trigger procedure
*
/
TriggerData
*
trigdata = (TriggerData
*
) fcinfo->context;
retval = ...
}
else
{
/
*
*
Called as a function
*
/
retval = ...
}
return retval;
}
Only a few thousand lines of code have tobe added instead of the dots to complete the call handler.
After havingcompiled the handler function intoa loadable module (see Section 35.9.6), the following
commands thenregister the sample procedural language:
CREATE FUNCTION plsample_call_handler() RETURNS language_handler
AS ’
filename
LANGUAGE C;
CREATE LANGUAGE plsample
HANDLER plsample_call_handler;
Although providinga call handler is sufficientto create a minimal procedural language, there are two
other functions that can optionally be provided to make the language more convenient to use. These
area validator andaninline handler. A validator can beprovidedtoallowlanguage-specific checking
to be done during CREATE FUNCTION. An inline handler can be provided to allow the language to
support anonymous code blocks executedvia the DO command.
1916
Chapter 52. Writing A Procedural Language Handler
If a validator is provided by a procedural language, it must be declared as a function taking a single
parameter of type
oid
.The validator’s result is ignored, so it is customarily declared to return
void
.
The validator will be calledat the end of a
CREATE FUNCTION
commandthathas created or updateda
function writtenin the procedural language. The passed-in OID is the OIDof the function’s
pg_proc
row. The validator must fetch this row in the usual way, and do whatever checking is appropriate.
First, call
CheckFunctionValidatorAccess()
to diagnose explicit calls to the validator that the
user could not achieve through
CREATE FUNCTION
.Typical checks then include verifying that the
function’s argument and result types are supported by the language, and that the function’s body
is syntactically correct in the language. If the validator finds the function to be okay, it should just
return. If it finds an error, it shouldreport thatvia the normal
ereport()
error reporting mechanism.
Throwing an error will force a transaction rollback and thus prevent the incorrect function definition
from being committed.
Validator functions should typically honor the check_function_bodies parameter: if it is turned off
thenanyexpensive or context-sensitive checking should be skipped. If the language provides for code
execution at compilation time, the validator must suppress checks that would induce such execution.
In particular, this parameter is turned off by pg_dump so that it can load procedural language func-
tions without worrying about side effects or dependencies of the function bodies on other database
objects. (Because of this requirement, the call handler should avoid assuming that the validator has
fully checked the function. The point of having a validator is not to let the call handler omit checks,
but to notify the user immediately if there are obvious errors in a
CREATE FUNCTION
command.)
While the choice of exactly what to check is mostly left to the discretion of the validator function,
note that the core
CREATE FUNCTION
code only executes
SET
clauses attached to a function when
check_function_bodies
is on. Therefore, checks whose results might be affected by GUC pa-
rameters definitely should be skipped when
check_function_bodies
is off, to avoid false failures
whenreloading a dump.
If an inline handler is provided by a procedural language, it must be declared as a function taking a
single parameter of type
internal
.The inline handler’s result is ignored, so it is customarily de-
clared to return
void
.The inline handler will be called when a
DO
statement is executed specifying
the procedural language. The parameter actually passed is a pointer to an
InlineCodeBlock
struct,
which contains information about the
DO
statement’s parameters, in particular the text of the anony-
mous code block to be executed. The inline handler should execute this code and return.
It’s recommended that you wrap all these function declarations, as well as the
CREATE LANGUAGE
command itself, into an extension so that a simple
CREATE EXTENSION
command is sufficient to
install the language. See Section 35.15 for information about writing extensions.
The procedural languages included in the standard distribution are good references when trying to
writeyour own languagehandler. Lookinto the
src/pl
subdirectoryof thesource tree. The CREATE
LANGUAGE reference page also has some useful details.
1917
Documents you may be interested
Documents you may be interested