c# pdf to tiff converter : Create signature pdf SDK Library service wpf asp.net web page dnn pcb362-part457

For cases where the C calling convention is “un-Pythonic,” it is common to write a small
wrapper function. In the solution, this code makes the divide() function return the
two results using a tuple instead:
# int divide(int, int, int *)
_divide = _mod.divide
_divide.argtypes = (ctypes.c_intctypes.c_intctypes.POINTER(ctypes.c_int))
_divide.restype = ctypes.c_int
def divide(xy):
rem = ctypes.c_int()
quot = _divide(x,y,rem)
return quotrem.value
The avg() function presents a new kind of challenge. The underlying C code expects
to receive a pointer and a length representing an array. However, from the Python side,
we must consider the following questions: What is an array? Is it a list? A tuple? An
array from the array module? A numpy array? Is it all of these? In practice, a Python
“array” could take many different forms, and maybe you would like to support multiple
possibilities.
The DoubleArrayType class shows how to handle this situation. In this class, a single
method from_param() is defined. The role of this method is to take a single parameter
and narrow it down to a compatible ctypes object (a pointer to a ctypes.c_double, in
the example). Within from_param(), you are free to do anything that you wish. In the
solution, the typename of the parameter is extracted and used to dispatch to a more
specialized method. For example, if a list is passed, the typename is list and a method
from_list() is invoked.
For lists and tuples, the from_list() method performs a conversion to a ctypes array
object. This looks a little weird, but here is an interactive example of converting a list to
ctypes array:
>>> nums = [123]
>>> a = (ctypes.c_double * len(nums))(*nums)
>>> a
<__main__.c_double_Array_3 object at 0x10069cd40>
>>> a[0]
1.0
>>> a[1]
2.0
>>> a[2]
3.0
>>>
For array objects, the from_array() method extracts the underlying memory pointer
and casts it to a ctypes pointer object. For example:
15.1. Accessing C Code Using ctypes  |  603
Create signature pdf - C# PDF File Permission Library: add, remove, update PDF file permission in C#.net, ASP.NET, MVC, WPF
Tell C# users how to set PDF file permissions, like printing, copying, modifying, extracting, annotating, form filling, etc
add signature to pdf file; create transparent signature stamp for pdf
Create signature pdf - VB.NET PDF File Permission Library: add, remove, update PDF file permission in vb.net, ASP.NET, MVC, WPF
VB.NET Tutorial for How to Set PDF File Access Permissions Using XDoc.PDF for .NET
adding a signature to a pdf file; pdf signature stamp
>>> import array
>>> a = array.array('d',[1,2,3])
>>> a
array('d', [1.0, 2.0, 3.0])
>>> ptr_ = a.buffer_info()
>>> ptr
4298687200
>>> ctypes.cast(ptrctypes.POINTER(ctypes.c_double))
<__main__.LP_c_double object at 0x10069cd40>
>>>
The from_ndarray() shows comparable conversion code for numpy arrays.
By defining the DoubleArrayType class and using it in the type signature of avg(), as
shown, the function can accept a variety of different array-like inputs:
>>> import sample
>>> sample.avg([1,2,3])
2.0
>>> sample.avg((1,2,3))
2.0
>>> import array
>>> sample.avg(array.array('d',[1,2,3]))
2.0
>>> import numpy
>>> sample.avg(numpy.array([1.0,2.0,3.0]))
2.0
>>>
The last part of this recipe shows how to work with a simple C structure. For structures,
you simply define a class that contains the appropriate fields and types like this:
class Point(ctypes.Structure):
_fields_ = [('x', ctypes.c_double),
('y'ctypes.c_double)]
Once defined, you can use the class in type signatures as well as in code that needs to
instantiate and work with the structures. For example:
>>> p1 = sample.Point(1,2)
>>> p2 = sample.Point(4,5)
>>> p1.x
1.0
>>> p1.y
2.0
>>> sample.distance(p1,p2)
4.242640687119285
>>>
A few final comments: ctypes is a useful library to know about if all you’re doing is
accessing a few C functions from Python. However, if you’re trying to access a large
library, you might want to look at alternative approaches, such as Swig (described in
Recipe 15.9) or Cython (described in Recipe 15.10).
604  |  Chapter 15: C Extensions
C# PDF Digital Signature Library: add, remove, update PDF digital
Barcode Read. Barcode Create. OCR. Twain. Edit Digital Signatures. |. Home ›› XDoc.PDF ›› C# PDF: Edit PDF Digital Signature. You maybe interested:
create a pdf signature file; create pdf stamp signature
VB.NET PDF Digital Signature Library: add, remove, update PDF
PDF in C#, C#.NET PDF Reading, C#.NET Annotate PDF in WPF, C#.NET PDF Create, C#.NET PDF Document Viewer Search unsigned signature field in PDF document.
create signature from pdf; add signature to pdf preview
The main problem with a large library is that since ctypes isn’t entirely automatic, you’ll
have to spend a fair bit of time writing out all of the type signatures, as shown in the
example. Depending on the complexity of the library, you might also have to write a
large number of small wrapper functions and supporting classes. Also, unless you fully
understand all of the low-level details of the C interface, including memory management
and error handling, it is often quite easy to make Python catastrophically crash with a
segmentation fault, access violation, or some similar error.
As an alternative to ctypes, you might also look at CFFI. CFFI provides much of the
same functionality, but uses C syntax and supports more advanced kinds of C code. As
of this writing, CFFI is still a relatively new project, but its use has been growing rapidly.
There has even been some discussion of including it in the Python standard library in
some future release. Thus, it’s definitely something to keep an eye on.
15.2. Writing a Simple C Extension Module
Problem
You want to write a simple C extension module directly using Python’s extension API
and no other tools.
Solution
For simple C code, it is straightforward to make a handcrafted extension module. As a
preliminary step, you probably want to make sure your C code has a proper header file.
For example,
/* sample.h */
#include <math.h>
extern int gcd(intint);
extern int in_mandel(double x0double y0int n);
extern int divide(int aint bint *remainder);
extern double avg(double *aint n);
typedef struct Point {
double x,y;
Point;
extern double distance(Point *p1Point *p2);
15.2. Writing a Simple C Extension Module  |  605
C# HTML5 Viewer: Load, View, Convert, Annotate and Edit PDF
XDoc. HTML5 Viewer for C# .NET enables you to create signatures to PDF, including freehand signature, text and date signature. If
copy and paste signature into pdf; add signature to preview pdf
C#: XDoc.HTML5 Viewer for .NET Online Help Manual
Click to convert PDF document to Word (.docx). PDF and Word (.docx). Annotation Tab. 2. Create Freehand Signature. Click to create a freehand signature.
add signature image to pdf acrobat; pdf signatures
Typically, this header would correspond to a library that has been compiled separately.
With that assumption, here is a sample extension module that illustrates the basics of
writing extension functions:
#include "Python.h"
#include "sample.h"
/* int gcd(int, int) */
static PyObject *py_gcd(PyObject *selfPyObject *args) {
int xyresult;
if (!PyArg_ParseTuple(args,"ii"&x&y)) {
return NULL;
}
result = gcd(x,y);
return Py_BuildValue("i", result);
}
/* int in_mandel(double, double, int) */
static PyObject *py_in_mandel(PyObject *selfPyObject *args) {
double x0, y0;
int n;
int result;
if (!PyArg_ParseTuple(args"ddi", &x0, &y0&n)) {
return NULL;
}
result = in_mandel(x0,y0,n);
return Py_BuildValue("i", result);
}
/* int divide(int, int, int *) */
static PyObject *py_divide(PyObject *selfPyObject *args) {
int abquotient, remainder;
if (!PyArg_ParseTuple(args"ii"&a, &b)) {
return NULL;
}
quotient = divide(a,b&remainder);
return Py_BuildValue("(ii)", quotient, remainder);
}
/* Module method table */
static PyMethodDef SampleMethods[] = {
{"gcd" py_gcd, METH_VARARGS, "Greatest common divisor"},
{"in_mandel"py_in_mandel, METH_VARARGS"Mandelbrot test"},
{"divide"py_divide, METH_VARARGS"Integer division"},
NULLNULL0NULL}
};
/* Module structure */
static struct PyModuleDef samplemodule = {
PyModuleDef_HEAD_INIT,
606  |  Chapter 15: C Extensions
C# PDF insert image Library: insert images into PDF in C#.net, ASP
Create high resolution PDF file without image quality losing in ASP.NET Import graphic picture, digital photo, signature and logo into PDF document.
adding signature to pdf document; adding signature to pdf form
.NET PDF SDK - Description of All PDF Processing Control Feastures
PDF Digital Signature. Create signatures in existing PDF signature fields; Create signatures in new fields which hold the signature;
pdf sign; pdf secure signature
"sample"          /* name of module */
"A sample module" /* Doc string (may be NULL) */
-1                /* Size of per-interpreter state or -1 */
SampleMethods       /* Method table */
};
/* Module initialization function */
PyMODINIT_FUNC
PyInit_sample(void) {
return PyModule_Create(&samplemodule);
}
For building the extension module, create a setup.py file that looks like this:
# setup.py
from distutils.core import setupExtension
setup(name='sample',
ext_modules=[
Extension('sample',
['pysample.c'],
include_dirs = ['/some/dir'],
define_macros = [('FOO','1')],
undef_macros = ['BAR'],
library_dirs = ['/usr/local/lib'],
libraries = ['sample']
)
]
)
Now, to build the resulting library, simply use python3 buildlib.py build_ext --
inplace. For example:
bash % python3 setup.py build_ext --inplace
running build_ext
building 'sample' extension
gcc -fno-strict-aliasing -DNDEBUG -g -fwrapv -O3 -Wall -Wstrict-prototypes
-I/usr/local/include/python3.3m -c pysample.c
-o build/temp.macosx-10.6-x86_64-3.3/pysample.o
gcc -bundle -undefined dynamic_lookup
build/temp.macosx-10.6-x86_64-3.3/pysample.o \
-L/usr/local/lib -lsample -o sample.so
bash %
As shown, this creates a shared library called sample.so. When compiled, you should
be able to start importing it as a module:
>>> import sample
>>> sample.gcd(3542)
7
>>> sample.in_mandel(00500)
1
>>> sample.in_mandel(2.01.0500)
15.2. Writing a Simple C Extension Module  |  607
C# WPF Viewer: Load, View, Convert, Annotate and Edit Tiff
functionalities. convert Tiff file to PDF, add annotations to Tiff, Create signature on tiff, etc. Please refer to more details below:
create signature pdf; export pdf sign in
C# WinForms Viewer: Load, View, Convert, Annotate and Edit Tiff
Viewer provides other utility features for processing Tiff while in preview, such as convert Tiff file to PDF, add annotations to Tiff, Create signature on tiff
create pdf signature field; add signature to pdf acrobat
0
>>> sample.divide(428)
(5, 2)
>>>
If you are attempting these steps on Windows, you may need to spend some time fiddling
with your environment and the build environment to get extension modules to build
correctly. Binary distributions  of  Python are  typically  built using Microsoft  Visual
Studio. To get extensions to work, you may have to compile them using the same or
compatible tools. See the Python documentation .
Discussion
Before attempting any kind of handwritten extension, it is absolutely critical that you
consult Python’s documentation on “Extending and Embedding the Python Interpret‐
er”. Python’s C extension API is large, and repeating all of it here is simply not practical.
However, the most important parts can be easily discussed.
First, in extension modules, functions that you write are all typically written with a
common prototype such as this:
static PyObject *py_func(PyObject *selfPyObject *args) {
...
}
PyObject is the C data type that represents any Python object. At a very high level, an
extension function is a C function that receives a tuple of Python objects (in PyObject
*args) and returns a new Python object as a result. The self argument to the function
is unused for simple extension functions, but comes into play should you want to define
new classes or object types in C (e.g., if the extension function were a method of a class,
then self would hold the instance).
The PyArg_ParseTuple() function is used to convert values from Python to a C rep‐
resentation. As input, it takes a format string that indicates the required values, such as
“i” for integer and “d” for double, as well as the addresses of C variables in which to place
the converted results. PyArg_ParseTuple() performs a variety of checks on the number
and type of arguments. If there is any mismatch with the format string, an exception is
raised and NULL is returned. By checking for this and simply returning NULL, an ap‐
propriate exception will have been raised in the calling code.
The Py_BuildValue() function is used to create Python objects from C data types. It
also accepts a format code to indicate the desired type. In the extension functions, it is
used to return results back to Python. One feature of Py_BuildValue() is that it can
build more complicated kinds of objects, such as tuples and dictionaries. In the code
for py_divide(), an example showing the return of a tuple is shown. However, here are
a few more examples:
608  |  Chapter 15: C Extensions
How to C#: Basic SDK Concept of XDoc.PDF for .NET
easily create, load, combine, and split PDF file(s), and add, create, insert, delete This class provides APIs for handling digital signature in a PDF document
add signature to pdf; add signature field to pdf
VB.NET PDF: Basic SDK Concept of XDoc.PDF
easily create, load, combine, and split PDF file(s), and add, create, insert, delete This class provides APIs for handling digital signature in a PDF document
add signature image to pdf acrobat; add signature to pdf acrobat reader
return Py_BuildValue("i"34);      // Return an integer
return Py_BuildValue("d"3.4);     // Return a double
return Py_BuildValue("s""Hello"); // Null-terminated UTF-8 string
return Py_BuildValue("(ii)"34); // Tuple (34)
Near the bottom of any extension module, you will find a function table such as the
SampleMethods table shown in this recipe. This table lists C functions, the names to use
in Python, as well as doc strings. All modules are required to specify such a table, as it
gets used in the initialization of the module.
The final function PyInit_sample() is the module initialization function that executes
when the module is first imported. The primary job of this function is to register the
module object with the interpreter.
As a final note, it must be stressed that there is considerably more to extending Python
with C functions than what is shown here (in fact, the C API contains well over 500
functions in it). You should view this recipe simply as a stepping stone for getting started.
To do more, start with the documentation on the PyArg_ParseTuple() and Py_Build
Value() functions, and expand from there.
15.3. Writing an Extension Function That Operates on
Arrays
Problem
You want to write a C extension function that operates on contiguous arrays of data, as
might be created by the array module or libraries like NumPy. However, you would like
your function to be general purpose and not specific to any one array library.
Solution
To receive and process arrays in a portable manner, you should write code that uses the
Buffer Protocol. Here is an example of a handwritten C extension function that receives
array data and calls the avg(double *buf, int len) function from this chapter’s in‐
troduction:
/* Call double avg(double *, int) */
static PyObject *py_avg(PyObject *selfPyObject *args) {
PyObject *bufobj;
Py_buffer view;
double result;
/* Get the passed Python object */
if (!PyArg_ParseTuple(args"O"&bufobj)) {
return NULL;
}
/* Attempt to extract buffer information from it */
15.3. Writing an Extension Function That Operates on Arrays  |  609
if (PyObject_GetBuffer(bufobj&view,
PyBUF_ANY_CONTIGUOUS | PyBUF_FORMAT) == -1) {
return NULL;
}
if (view.ndim != 1) {
PyErr_SetString(PyExc_TypeError"Expected a 1-dimensional array");
PyBuffer_Release(&view);
return NULL;
}
/* Check the type of items in the array */
if (strcmp(view.format,"d"!= 0) {
PyErr_SetString(PyExc_TypeError"Expected an array of doubles");
PyBuffer_Release(&view);
return NULL;
}
/* Pass the raw buffer and size to the C function */
result = avg(view.buf, view.shape[0]);
/* Indicate we're done working with the buffer */
PyBuffer_Release(&view);
return Py_BuildValue("d", result);
}
Here is an example that shows how this extension function works:
>>> import array
>>> avg(array.array('d',[1,2,3]))
2.0
>>> import numpy
>>> avg(numpy.array([1.0,2.0,3.0]))
2.0
>>> avg([1,2,3])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeError'list' does not support the buffer interface
>>> avg(b'Hello')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeErrorExpected an array of doubles
>>> a = numpy.array([[1.,2.,3.],[4.,5.,6.]])
>>> avg(a[:,2])
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
ValueErrorndarray is not contiguous
>>> sample.avg(a)
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
TypeErrorExpected a 1-dimensional array
>>> sample.avg(a[0])
610  |  Chapter 15: C Extensions
2.0
>>>
Discussion
Passing array objects to C functions might be one of the most common things you would
want to do with a extension function. A large number of Python applications, ranging
from image processing to scientific computing, are based on high-performance array
processing. By writing code that can accept and operate on arrays, you can write cus‐
tomized code that plays nicely with those applications as opposed to having some sort
of custom solution that only works with your own code.
The key to this code is the PyBuffer_GetBuffer() function. Given an arbitrary Python
object, it tries to obtain information about the underlying memory representation. If
it’s not possible, as is the case with most normal Python objects, it simply raises an
exception and returns  -1.  The  special flags  passed  to PyBuffer_GetBuffer()  give
additional  hints  about the  kind  of  memory  buffer that  is  requested.  For  example,
PyBUF_ANY_CONTIGUOUS specifies that a contiguous region of memory is required.
For arrays, byte strings, and other similar objects, a Py_buffer structure is filled with
information about the underlying memory. This includes a pointer to the memory, size,
itemsize, format, and other details. Here is the definition of this structure:
typedef struct bufferinfo {
void *buf             /* Pointer to buffer memory */
PyObject *obj         /* Python object that is the owner */
Py_ssize_t len;         /* Total size in bytes */
Py_ssize_t itemsize;    /* Size in bytes of a single item */
int readonly          /* Read-only access flag */
int ndim;               /* Number of dimensions */
char *format          /* struct code of a single item */
Py_ssize_t *shape;      /* Array containing dimensions */
Py_ssize_t *strides;    /* Array containing strides */
Py_ssize_t *suboffsets; /* Array containing suboffsets */
Py_buffer;
In this recipe, we are simply concerned with receiving a contiguous array of doubles.
To check if items are a double, the format attribute is checked to see if the string is
"d". This is the same code that the struct module uses when encoding binary values.
As a general rule, format could be any format string that’s compatible with the struct
module and might include multiple items in the case of arrays containing C structures.
Once we have verified the underlying buffer information, we simply pass it to the C
function, which treats it as a normal C array. For all practical purposes, it is not con‐
cerned with what kind of array it is or what library created it. This is how the function
is able to work with arrays created by the array module or by numpy.
15.3. Writing an Extension Function That Operates on Arrays  |  611
Before returning a final result,  the underlying buffer view must  be released using 
PyBuffer_Release(). This step is required to properly manage reference counts of
objects.
Again, this recipe only shows a tiny fragment of code that receives an array. If working
with arrays, you might run into issues with multidimensional data, strided data, different
data types, and more that will require study. Make sure you consult the official docu‐
mentation to get more details.
If you need to write many extensions involving array handling, you may find it easier
to implement the code in Cython. See Recipe 15.11
15.4. Managing Opaque Pointers in C Extension Modules
Problem
You have an extension module that needs to handle a pointer to a C data structure, but
you don’t want to expose any internal details of the structure to Python.
Solution
Opaque data structures are easily handled by wrapping them inside capsule objects.
Consider this fragment of C code from our sample code:
typedef struct Point {
double x,y;
Point;
extern double distance(Point *p1Point *p2);
Here is an example of extension code that wraps the Point structure and distance()
function using capsules:
/* Destructor function for points */
static void del_Point(PyObject *obj) {
free(PyCapsule_GetPointer(obj,"Point"));
}
/* Utility functions */
static Point *PyPoint_AsPoint(PyObject *obj) {
return (Point *PyCapsule_GetPointer(obj, "Point");
}
static PyObject *PyPoint_FromPoint(Point *pint must_free) {
return PyCapsule_New(p"Point"must_free ? del_Point : NULL);
}
/* Create a new Point object */
static PyObject *py_Point(PyObject *selfPyObject *args) {
612  |  Chapter 15: C Extensions
Documents you may be interested
Documents you may be interested