Skip to content

Commit

Permalink
redirecting stderr of MuPDF
Browse files Browse the repository at this point in the history
  • Loading branch information
JorjMcKie committed Nov 16, 2018
1 parent 5939401 commit 5be2eef
Show file tree
Hide file tree
Showing 6 changed files with 108 additions and 53 deletions.
10 changes: 5 additions & 5 deletions README.md
Expand Up @@ -4,7 +4,7 @@

Release date: November 15, 2018

**Travis-CI:** [![Build Status](https://travis-ci.org/rk700/PyMuPDF.svg?branch=master)](https://travis-ci.org/rk700/PyMuPDF)
**Travis-CI:** [![Build Status](https://travis-ci.org/JorjMcKie/py-mupdf.svg?branch=master)](https://travis-ci.org/JorjMcKie/py-mupdf)

On **[PyPI](https://pypi.org/project/PyMuPDF)** since August 2016: [![](https://pepy.tech/badge/pymupdf)](https://pepy.tech/project/pymupdf)

Expand Down Expand Up @@ -32,14 +32,14 @@ The platform tag for Linux is `manylinux1_x86_64`, which makes these wheels usab

On other operating systems you need to generate PyMuPDF yourself. Before you can do this, you must download and generate MuPDF. This process depends very much on your system. For most platforms, the MuPDF source contains prepared procedures for achieving this.

Be sure to download the official MuPDF source release from [here](https://mupdf.com/downloads). Do **not use** MuPDF's [GitHub repo](https://github.com/ArtifexSoftware/mupdf). It contains their current **development source**, which is **not compatible** with the published PyMuPDF version most of the time.
Be sure to download the official MuPDF source release from [here](https://mupdf.com/downloads). Do **not use** MuPDF's [GitHub repo](https://github.com/ArtifexSoftware/mupdf). It contains their current **development source**, which is **not compatible** with this PyMuPDF version most of the time.

Once this is done, adjust directories in ``setup.py`` and the rest should be as easy as running the usual ``python setup.py install``.
Once this is done, adjust directories in ``setup.py`` and run ``python setup.py install``.

The following sections contain some platform-specific comments.
The following sections contain further comments for some platforms.

## Ubuntu
One of our users (thanks to **@gileadslostson**!) has documented his MuPDF installation experience from sources in this [Wiki page](https://github.com/rk700/PyMuPDF/wiki/Experience-from-an-Ubuntu-installation).
Our users (thanks to **@gileadslostson** and **@jbarlow83**!) have documented their MuPDF installation experiences from sources in this [Wiki page](https://github.com/rk700/PyMuPDF/wiki/Experience-from-an-Ubuntu-installation).

## OSX
First, install the MuPDF headers and libraries, which are provided by mupdf-tools: ``brew install mupdf-tools``.
Expand Down
24 changes: 18 additions & 6 deletions fitz/fitz.i
Expand Up @@ -145,7 +145,11 @@ fz_set_stderr(gctx, JM_fitz_stderr);
if (JM_fitz_stderr && JM_fitz_stdout)
{;}
else
PySys_WriteStdout("error redefining stdout/stderr!\n");
PySys_WriteStdout("error redirecting stdout/stderr!\n");

JM_error_log = PyList_New(0);
JM_output_log = PyList_New(0);

//-----------------------------------------------------------------------------
// STOP redirect stdout/stderr
//-----------------------------------------------------------------------------
Expand Down Expand Up @@ -5987,17 +5991,25 @@ struct Tools
return JM_fitz_config();
}
void _store_debug()
{
fz_debug_store(gctx);
}
%feature("autodoc","Empty the glyph cache.") glyph_cache_empty;
void glyph_cache_empty()
{
fz_purge_glyph_cache(gctx);
}
%pythoncode%{@property%}
PyObject *fitz_stderr()
{
return PyUnicode_Join(Py_BuildValue("s", ""), JM_error_log);
}
%feature("autodoc","Empty fitz error log.") empty_error_log;
void fitz_stderr_reset()
{
Py_CLEAR(JM_error_log);
JM_error_log = PyList_New(0);
}
PyObject *transform_rect(PyObject *rect, PyObject *matrix)
{
return JM_py_from_rect(fz_transform_rect(JM_rect_from_py(rect), JM_matrix_from_py(matrix)));
Expand Down
20 changes: 13 additions & 7 deletions fitz/fitz.py
Expand Up @@ -106,8 +106,8 @@ class _object:

VersionFitz = "1.14.0"
VersionBind = "1.14.0"
VersionDate = "2018-11-15 05:11:14"
version = (VersionBind, VersionFitz, "20181115051114")
VersionDate = "2018-11-16 05:14:22"
version = (VersionBind, VersionFitz, "20181116051422")


class Matrix():
Expand Down Expand Up @@ -4089,15 +4089,21 @@ def fitz_config(self):
return _fitz.Tools_fitz_config(self)


def _store_debug(self):
"""_store_debug(self)"""
return _fitz.Tools__store_debug(self)


def glyph_cache_empty(self):
"""Empty the glyph cache."""
return _fitz.Tools_glyph_cache_empty(self)

@property

def fitz_stderr(self):
"""fitz_stderr(self) -> PyObject *"""
return _fitz.Tools_fitz_stderr(self)


def fitz_stderr_reset(self):
"""fitz_stderr_reset(self)"""
return _fitz.Tools_fitz_stderr_reset(self)


def transform_rect(self, rect, matrix):
"""transform_rect(self, rect, matrix) -> PyObject *"""
Expand Down
80 changes: 57 additions & 23 deletions fitz/fitz_wrap.c
Expand Up @@ -4086,26 +4086,29 @@ struct fz_store_s
//-----------------------------------------------------------------------------
// START redirect stdout/stderr
//-----------------------------------------------------------------------------
PyObject *JM_error_log;
PyObject *JM_output_log;

static void
JM_write_stdout(fz_context *ctx, void *opaque, const void *buffer, size_t count)
{
if (!buffer || !count) return;
PyObject *c = Py_BuildValue("s#", (char *) buffer, (int) count);
char *text = JM_Python_str_AsChar(c);
PySys_WriteStdout("%s", text);
JM_Python_str_DelForPy3(text);
Py_DECREF(c);
PyObject *c = Py_BuildValue("s#", (const char *) buffer, (Py_ssize_t) count);
if (!c || c == NONE) return;
PyList_Append(JM_output_log, c);
Py_CLEAR(c);
return;
}

static void
JM_write_stderr(fz_context *ctx, void *opaque, const void *buffer, size_t count)
{
if (!buffer || !count) return;
PyObject *c = Py_BuildValue("s#", (char *) buffer, (int) count);
char *text = JM_Python_str_AsChar(c);
PySys_WriteStderr("%s", text);
JM_Python_str_DelForPy3(text);
Py_DECREF(c);
PyObject *c = Py_BuildValue("s#", (const char *) buffer, (Py_ssize_t) count);
if (!c || c == NONE) return;
PyList_Append(JM_error_log, c);
Py_CLEAR(c);
return;
}

fz_output *JM_fitz_stdout;
Expand Down Expand Up @@ -13341,12 +13344,16 @@ SWIGINTERN size_t Tools_store_maxsize(struct Tools *self){
SWIGINTERN PyObject *Tools_fitz_config(struct Tools *self){
return JM_fitz_config();
}
SWIGINTERN void Tools__store_debug(struct Tools *self){
fz_debug_store(gctx);
}
SWIGINTERN void Tools_glyph_cache_empty(struct Tools *self){
fz_purge_glyph_cache(gctx);
}
SWIGINTERN PyObject *Tools_fitz_stderr(struct Tools *self){
return PyUnicode_Join(Py_BuildValue("s", ""), JM_error_log);
}
SWIGINTERN void Tools_fitz_stderr_reset(struct Tools *self){
Py_CLEAR(JM_error_log);
JM_error_log = PyList_New(0);
}
SWIGINTERN PyObject *Tools_transform_rect(struct Tools *self,PyObject *rect,PyObject *matrix){
return JM_py_from_rect(fz_transform_rect(JM_rect_from_py(rect), JM_matrix_from_py(matrix)));
}
Expand Down Expand Up @@ -20956,41 +20963,63 @@ SWIGINTERN PyObject *_wrap_Tools_fitz_config(PyObject *SWIGUNUSEDPARM(self), PyO
}


SWIGINTERN PyObject *_wrap_Tools__store_debug(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
SWIGINTERN PyObject *_wrap_Tools_glyph_cache_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
struct Tools *arg1 = (struct Tools *) 0 ;
void *argp1 = 0 ;
int res1 = 0 ;
PyObject * obj0 = 0 ;

if (!PyArg_ParseTuple(args,(char *)"O:Tools__store_debug",&obj0)) SWIG_fail;
if (!PyArg_ParseTuple(args,(char *)"O:Tools_glyph_cache_empty",&obj0)) SWIG_fail;
res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tools, 0 | 0 );
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tools__store_debug" "', argument " "1"" of type '" "struct Tools *""'");
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tools_glyph_cache_empty" "', argument " "1"" of type '" "struct Tools *""'");
}
arg1 = (struct Tools *)(argp1);
Tools__store_debug(arg1);
Tools_glyph_cache_empty(arg1);
resultobj = SWIG_Py_Void();
return resultobj;
fail:
return NULL;
}


SWIGINTERN PyObject *_wrap_Tools_glyph_cache_empty(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
SWIGINTERN PyObject *_wrap_Tools_fitz_stderr(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
struct Tools *arg1 = (struct Tools *) 0 ;
void *argp1 = 0 ;
int res1 = 0 ;
PyObject * obj0 = 0 ;
PyObject *result = 0 ;

if (!PyArg_ParseTuple(args,(char *)"O:Tools_glyph_cache_empty",&obj0)) SWIG_fail;
if (!PyArg_ParseTuple(args,(char *)"O:Tools_fitz_stderr",&obj0)) SWIG_fail;
res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tools, 0 | 0 );
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tools_glyph_cache_empty" "', argument " "1"" of type '" "struct Tools *""'");
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tools_fitz_stderr" "', argument " "1"" of type '" "struct Tools *""'");
}
arg1 = (struct Tools *)(argp1);
Tools_glyph_cache_empty(arg1);
result = (PyObject *)Tools_fitz_stderr(arg1);
resultobj = result;
return resultobj;
fail:
return NULL;
}


SWIGINTERN PyObject *_wrap_Tools_fitz_stderr_reset(PyObject *SWIGUNUSEDPARM(self), PyObject *args) {
PyObject *resultobj = 0;
struct Tools *arg1 = (struct Tools *) 0 ;
void *argp1 = 0 ;
int res1 = 0 ;
PyObject * obj0 = 0 ;

if (!PyArg_ParseTuple(args,(char *)"O:Tools_fitz_stderr_reset",&obj0)) SWIG_fail;
res1 = SWIG_ConvertPtr(obj0, &argp1,SWIGTYPE_p_Tools, 0 | 0 );
if (!SWIG_IsOK(res1)) {
SWIG_exception_fail(SWIG_ArgError(res1), "in method '" "Tools_fitz_stderr_reset" "', argument " "1"" of type '" "struct Tools *""'");
}
arg1 = (struct Tools *)(argp1);
Tools_fitz_stderr_reset(arg1);
resultobj = SWIG_Py_Void();
return resultobj;
fail:
Expand Down Expand Up @@ -21323,8 +21352,9 @@ static PyMethodDef SwigMethods[] = {
{ (char *)"Tools_store_size", _wrap_Tools_store_size, METH_VARARGS, (char *)"Current store size."},
{ (char *)"Tools_store_maxsize", _wrap_Tools_store_maxsize, METH_VARARGS, (char *)"Maximum store size."},
{ (char *)"Tools_fitz_config", _wrap_Tools_fitz_config, METH_VARARGS, (char *)"Show configuration data."},
{ (char *)"Tools__store_debug", _wrap_Tools__store_debug, METH_VARARGS, (char *)"Tools__store_debug(self)"},
{ (char *)"Tools_glyph_cache_empty", _wrap_Tools_glyph_cache_empty, METH_VARARGS, (char *)"Empty the glyph cache."},
{ (char *)"Tools_fitz_stderr", _wrap_Tools_fitz_stderr, METH_VARARGS, (char *)"Tools_fitz_stderr(self) -> PyObject *"},
{ (char *)"Tools_fitz_stderr_reset", _wrap_Tools_fitz_stderr_reset, METH_VARARGS, (char *)"Tools_fitz_stderr_reset(self)"},
{ (char *)"Tools_transform_rect", _wrap_Tools_transform_rect, METH_VARARGS, (char *)"Tools_transform_rect(self, rect, matrix) -> PyObject *"},
{ (char *)"Tools_invert_matrix", _wrap_Tools_invert_matrix, METH_VARARGS, (char *)"Tools_invert_matrix(self, matrix) -> PyObject *"},
{ (char *)"new_Tools", _wrap_new_Tools, METH_VARARGS, (char *)"new_Tools() -> Tools"},
Expand Down Expand Up @@ -22118,7 +22148,11 @@ SWIG_init(void) {
;
}
else
PySys_WriteStdout("error redefining stdout/stderr!\n");
PySys_WriteStdout("error redirecting stdout/stderr!\n");

JM_error_log = PyList_New(0);
JM_output_log = PyList_New(0);

//-----------------------------------------------------------------------------
// STOP redirect stdout/stderr
//-----------------------------------------------------------------------------
Expand Down
23 changes: 13 additions & 10 deletions fitz/helper-other.i
Expand Up @@ -744,26 +744,29 @@ struct fz_store_s
//-----------------------------------------------------------------------------
// START redirect stdout/stderr
//-----------------------------------------------------------------------------
PyObject *JM_error_log;
PyObject *JM_output_log;

static void
JM_write_stdout(fz_context *ctx, void *opaque, const void *buffer, size_t count)
{
if (!buffer || !count) return;
PyObject *c = Py_BuildValue("s#", (char *) buffer, (int) count);
char *text = JM_Python_str_AsChar(c);
PySys_WriteStdout("%s", text);
JM_Python_str_DelForPy3(text);
Py_DECREF(c);
PyObject *c = Py_BuildValue("s#", (const char *) buffer, (Py_ssize_t) count);
if (!c || c == NONE) return;
PyList_Append(JM_output_log, c);
Py_CLEAR(c);
return;
}

static void
JM_write_stderr(fz_context *ctx, void *opaque, const void *buffer, size_t count)
{
if (!buffer || !count) return;
PyObject *c = Py_BuildValue("s#", (char *) buffer, (int) count);
char *text = JM_Python_str_AsChar(c);
PySys_WriteStderr("%s", text);
JM_Python_str_DelForPy3(text);
Py_DECREF(c);
PyObject *c = Py_BuildValue("s#", (const char *) buffer, (Py_ssize_t) count);
if (!c || c == NONE) return;
PyList_Append(JM_error_log, c);
Py_CLEAR(c);
return;
}

fz_output *JM_fitz_stdout;
Expand Down
4 changes: 2 additions & 2 deletions fitz/version.i
@@ -1,6 +1,6 @@
%pythoncode %{
VersionFitz = "1.14.0"
VersionBind = "1.14.0"
VersionDate = "2018-11-15 05:11:14"
version = (VersionBind, VersionFitz, "20181115051114")
VersionDate = "2018-11-16 05:14:22"
version = (VersionBind, VersionFitz, "20181116051422")
%}

0 comments on commit 5be2eef

Please sign in to comment.