add @background option to pdfload
Add a "background" option to pdfload to help support PDFs with a transparent background. For example: vips copy transparent.pdf[background=0] x.png see https://github.com/jcupitt/libvips/issues/995
This commit is contained in:
parent
495e0b2d14
commit
fb64d3607a
@ -24,6 +24,7 @@
|
|||||||
- remove vips7 stuff from default API ... you must now #include it explicitly
|
- remove vips7 stuff from default API ... you must now #include it explicitly
|
||||||
- added vips_argument_get_id() to fix derived classes on win32 [angelmixu]
|
- added vips_argument_get_id() to fix derived classes on win32 [angelmixu]
|
||||||
- fix compile with MSVC 2017 [angelmixu]
|
- fix compile with MSVC 2017 [angelmixu]
|
||||||
|
- pdfload has a option for background
|
||||||
|
|
||||||
12/3/18 started 8.6.4
|
12/3/18 started 8.6.4
|
||||||
- better fitting of fonts with overhanging edges [Adrià]
|
- better fitting of fonts with overhanging edges [Adrià]
|
||||||
|
@ -8,6 +8,8 @@
|
|||||||
* - set page-height, if we can
|
* - set page-height, if we can
|
||||||
* 28/6/17
|
* 28/6/17
|
||||||
* - use a much larger strip size, thanks bubba
|
* - use a much larger strip size, thanks bubba
|
||||||
|
* 8/6/18
|
||||||
|
* - add background param
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -81,6 +83,10 @@ typedef struct _VipsForeignLoadPdf {
|
|||||||
*/
|
*/
|
||||||
double scale;
|
double scale;
|
||||||
|
|
||||||
|
/* Background colour.
|
||||||
|
*/
|
||||||
|
VipsArrayDouble *background;
|
||||||
|
|
||||||
/* Poppler is not thread-safe, so we run inside a single-threaded
|
/* Poppler is not thread-safe, so we run inside a single-threaded
|
||||||
* cache. On the plus side, this means we only need one @page pointer,
|
* cache. On the plus side, this means we only need one @page pointer,
|
||||||
* even though we change this during _generate().
|
* even though we change this during _generate().
|
||||||
@ -99,6 +105,10 @@ typedef struct _VipsForeignLoadPdf {
|
|||||||
VipsRect image;
|
VipsRect image;
|
||||||
VipsRect *pages;
|
VipsRect *pages;
|
||||||
|
|
||||||
|
/* The [double] background converted to the image format.
|
||||||
|
*/
|
||||||
|
VipsPel *ink;
|
||||||
|
|
||||||
} VipsForeignLoadPdf;
|
} VipsForeignLoadPdf;
|
||||||
|
|
||||||
typedef VipsForeignLoadClass VipsForeignLoadPdfClass;
|
typedef VipsForeignLoadClass VipsForeignLoadPdfClass;
|
||||||
@ -302,6 +312,14 @@ vips_foreign_load_pdf_header( VipsForeignLoad *load )
|
|||||||
|
|
||||||
vips_foreign_load_pdf_set_image( pdf, load->out );
|
vips_foreign_load_pdf_set_image( pdf, load->out );
|
||||||
|
|
||||||
|
/* Convert the background to the image format.
|
||||||
|
*/
|
||||||
|
if( !(pdf->ink = vips__vector_to_ink( class->nickname,
|
||||||
|
load->out,
|
||||||
|
VIPS_AREA( pdf->background )->data, NULL,
|
||||||
|
VIPS_AREA( pdf->background )->n )) )
|
||||||
|
return( -1 );
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -322,10 +340,9 @@ vips_foreign_load_pdf_generate( VipsRegion *or,
|
|||||||
r->left, r->top, r->width, r->height );
|
r->left, r->top, r->width, r->height );
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Poppler won't always paint the background. Use 255 (white) for the
|
/* Poppler won't always paint the background.
|
||||||
* bg, PDFs generally assume a paper backgrocund colour.
|
|
||||||
*/
|
*/
|
||||||
vips_region_paint( or, r, 255 );
|
vips_region_paint_pel( or, r, pdf->ink );
|
||||||
|
|
||||||
/* Search through the pages we are drawing for the first containing
|
/* Search through the pages we are drawing for the first containing
|
||||||
* this rect. This could be quicker, perhaps a binary search, but who
|
* this rect. This could be quicker, perhaps a binary search, but who
|
||||||
@ -462,6 +479,13 @@ vips_foreign_load_pdf_class_init( VipsForeignLoadPdfClass *class )
|
|||||||
G_STRUCT_OFFSET( VipsForeignLoadPdf, scale ),
|
G_STRUCT_OFFSET( VipsForeignLoadPdf, scale ),
|
||||||
0.001, 100000.0, 1.0 );
|
0.001, 100000.0, 1.0 );
|
||||||
|
|
||||||
|
VIPS_ARG_BOXED( class, "background", 14,
|
||||||
|
_( "Background" ),
|
||||||
|
_( "Background value" ),
|
||||||
|
VIPS_ARGUMENT_OPTIONAL_INPUT,
|
||||||
|
G_STRUCT_OFFSET( VipsForeignLoadPdf, background ),
|
||||||
|
VIPS_TYPE_ARRAY_DOUBLE );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -471,6 +495,7 @@ vips_foreign_load_pdf_init( VipsForeignLoadPdf *pdf )
|
|||||||
pdf->scale = 1.0;
|
pdf->scale = 1.0;
|
||||||
pdf->n = 1;
|
pdf->n = 1;
|
||||||
pdf->current_page = -1;
|
pdf->current_page = -1;
|
||||||
|
pdf->background = vips_array_double_newv( 1, 255.0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct _VipsForeignLoadPdfFile {
|
typedef struct _VipsForeignLoadPdfFile {
|
||||||
@ -677,6 +702,7 @@ vips_foreign_load_pdf_is_a( const char *filename )
|
|||||||
* * @n: %gint, load this many pages
|
* * @n: %gint, load this many pages
|
||||||
* * @dpi: %gdouble, render at this DPI
|
* * @dpi: %gdouble, render at this DPI
|
||||||
* * @scale: %gdouble, scale render by this factor
|
* * @scale: %gdouble, scale render by this factor
|
||||||
|
* * @background: #VipsArrayDouble background colour
|
||||||
*
|
*
|
||||||
* Render a PDF file into a VIPS image. Rendering uses the libpoppler library
|
* Render a PDF file into a VIPS image. Rendering uses the libpoppler library
|
||||||
* and should be fast.
|
* and should be fast.
|
||||||
@ -696,6 +722,9 @@ vips_foreign_load_pdf_is_a( const char *filename )
|
|||||||
* you can scale the rendering from the default 1 point == 1 pixel by
|
* you can scale the rendering from the default 1 point == 1 pixel by
|
||||||
* setting @scale.
|
* setting @scale.
|
||||||
*
|
*
|
||||||
|
* Use @background to set the background colour, including transparency. The
|
||||||
|
* default is 255 (solid white).
|
||||||
|
*
|
||||||
* The operation fills a number of header fields with metadata, for example
|
* The operation fills a number of header fields with metadata, for example
|
||||||
* "pdf-author". They may be useful.
|
* "pdf-author". They may be useful.
|
||||||
*
|
*
|
||||||
@ -732,6 +761,7 @@ vips_pdfload( const char *filename, VipsImage **out, ... )
|
|||||||
* * @n: %gint, load this many pages
|
* * @n: %gint, load this many pages
|
||||||
* * @dpi: %gdouble, render at this DPI
|
* * @dpi: %gdouble, render at this DPI
|
||||||
* * @scale: %gdouble, scale render by this factor
|
* * @scale: %gdouble, scale render by this factor
|
||||||
|
* * @background: #VipsArrayDouble background colour
|
||||||
*
|
*
|
||||||
* Read a PDF-formatted memory block into a VIPS image. Exactly as
|
* Read a PDF-formatted memory block into a VIPS image. Exactly as
|
||||||
* vips_pdfload(), but read from a memory buffer.
|
* vips_pdfload(), but read from a memory buffer.
|
||||||
|
@ -2,6 +2,8 @@
|
|||||||
*
|
*
|
||||||
* 5/4/18
|
* 5/4/18
|
||||||
* - from pdfload.c
|
* - from pdfload.c
|
||||||
|
* 8/6/18
|
||||||
|
* - add background param
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -81,6 +83,10 @@ typedef struct _VipsForeignLoadPdf {
|
|||||||
*/
|
*/
|
||||||
double scale;
|
double scale;
|
||||||
|
|
||||||
|
/* Background colour.
|
||||||
|
*/
|
||||||
|
VipsArrayDouble *background;
|
||||||
|
|
||||||
FPDF_DOCUMENT *doc;
|
FPDF_DOCUMENT *doc;
|
||||||
FPDF_PAGE *page;
|
FPDF_PAGE *page;
|
||||||
int current_page;
|
int current_page;
|
||||||
@ -95,6 +101,10 @@ typedef struct _VipsForeignLoadPdf {
|
|||||||
VipsRect image;
|
VipsRect image;
|
||||||
VipsRect *pages;
|
VipsRect *pages;
|
||||||
|
|
||||||
|
/* The [double] background converted to the image format.
|
||||||
|
*/
|
||||||
|
VipsPel *ink;
|
||||||
|
|
||||||
} VipsForeignLoadPdf;
|
} VipsForeignLoadPdf;
|
||||||
|
|
||||||
typedef VipsForeignLoadClass VipsForeignLoadPdfClass;
|
typedef VipsForeignLoadClass VipsForeignLoadPdfClass;
|
||||||
@ -347,6 +357,14 @@ vips_foreign_load_pdf_header( VipsForeignLoad *load )
|
|||||||
|
|
||||||
vips_foreign_load_pdf_set_image( pdf, load->out );
|
vips_foreign_load_pdf_set_image( pdf, load->out );
|
||||||
|
|
||||||
|
/* Convert the background to the image format.
|
||||||
|
*/
|
||||||
|
if( !(pdf->ink = vips__vector_to_ink( class->nickname,
|
||||||
|
load->out,
|
||||||
|
VIPS_AREA( pdf->background )->data, NULL,
|
||||||
|
VIPS_AREA( pdf->background )->n )) )
|
||||||
|
return( -1 );
|
||||||
|
|
||||||
return( 0 );
|
return( 0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -367,10 +385,9 @@ vips_foreign_load_pdf_generate( VipsRegion *or,
|
|||||||
r->left, r->top, r->width, r->height );
|
r->left, r->top, r->width, r->height );
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/* Poppler won't always paint the background. Use 255 (white) for the
|
/* PDFium won't always paint the background.
|
||||||
* bg, PDFs generally assume a paper backgrocund colour.
|
|
||||||
*/
|
*/
|
||||||
vips_region_paint( or, r, 255 );
|
vips_region_paint_pel( or, r, pdf->ink );
|
||||||
|
|
||||||
/* Search through the pages we are drawing for the first containing
|
/* Search through the pages we are drawing for the first containing
|
||||||
* this rect. This could be quicker, perhaps a binary search, but who
|
* this rect. This could be quicker, perhaps a binary search, but who
|
||||||
@ -505,6 +522,13 @@ vips_foreign_load_pdf_class_init( VipsForeignLoadPdfClass *class )
|
|||||||
G_STRUCT_OFFSET( VipsForeignLoadPdf, scale ),
|
G_STRUCT_OFFSET( VipsForeignLoadPdf, scale ),
|
||||||
0.001, 100000.0, 1.0 );
|
0.001, 100000.0, 1.0 );
|
||||||
|
|
||||||
|
VIPS_ARG_BOXED( class, "background", 14,
|
||||||
|
_( "Background" ),
|
||||||
|
_( "Background value" ),
|
||||||
|
VIPS_ARGUMENT_OPTIONAL_INPUT,
|
||||||
|
G_STRUCT_OFFSET( VipsForeignLoadPdf, background ),
|
||||||
|
VIPS_TYPE_ARRAY_DOUBLE );
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static void
|
static void
|
||||||
@ -514,6 +538,7 @@ vips_foreign_load_pdf_init( VipsForeignLoadPdf *pdf )
|
|||||||
pdf->scale = 1.0;
|
pdf->scale = 1.0;
|
||||||
pdf->n = 1;
|
pdf->n = 1;
|
||||||
pdf->current_page = -1;
|
pdf->current_page = -1;
|
||||||
|
pdf->background = vips_array_double_newv( 1, 255.0 );
|
||||||
}
|
}
|
||||||
|
|
||||||
typedef struct _VipsForeignLoadPdfFile {
|
typedef struct _VipsForeignLoadPdfFile {
|
||||||
|
Loading…
Reference in New Issue
Block a user