Skip to content

Commit fef2037

Browse files
committed
0.2.4: use DPI
1 parent e36a952 commit fef2037

File tree

2 files changed

+170
-133
lines changed

2 files changed

+170
-133
lines changed

man/pdf2svg.1

Lines changed: 14 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,11 @@
1-
.TH PDF2SVG 1 "14 Jun 2018" "0.2.3" "User Manual"
1+
.TH PDF2SVG 1 "02 Jun 2020" "0.2.4" "User Manual"
22
.SH NAME
33
pdf2svg \- PDF to SVG convertor
44
.SH SYNOPSIS
55
.B pdf2svg
66
.RI pdffile
77
.RI svgfile
8+
.RI [ dpi=72 ]
89
.RI [ "page number" ]
910
.SH DESCRIPTION
1011
pdf2svg is a tiny command-line utility using Cairo and Poppler to
@@ -16,20 +17,28 @@ The program does not follow the usual GNU command line syntax.
1617
The first argument is the source PDF file, the second argument is
1718
the filename of the output SVG file (or a specification, see below
1819
for details).
20+
1921
.SH OPTIONS
22+
.TP
23+
.SS dpi
24+
use DPI (default = 72)
25+
.TP
26+
.SS "page number"
2027
The third parameter is optional and serves as a page selector. If
2128
omitted it defaults to the first page of the passed PDF. If passed it
2229
must be a valid page label (typically it is a value such as "iii"
2330
or "3").
24-
.SS all
25-
This special selector causes the program to iterate over all pages
31+
.B all
32+
- this special selector causes the program to iterate over all pages
2633
in the PDF. Because it cannot save multiple pages into one single SVG
2734
the second parameter is expected to contain a sensible file
28-
specification:
29-
.PP
35+
specification.
36+
37+
.SH EXAMPLE
3038
.B pdf2svg
3139
.RI document.pdf
3240
.RI output\-page%d.svg
41+
.RI \fI150\fP
3342
.RI \fIall\fP
3443
.PP
3544
The usual format modificators work as well: \fIoutput\-page%02d.svg\fP

pdf2svg.c

Lines changed: 156 additions & 128 deletions
Original file line numberDiff line numberDiff line change
@@ -33,142 +33,170 @@
3333
// Begin theft from ePDFview (Copyright (C) 2006 Emma's Software) under the GPL
3434
gchar *getAbsoluteFileName(const gchar *fileName)
3535
{
36-
gchar *absoluteFileName = NULL;
37-
if (g_path_is_absolute(fileName)) {
38-
absoluteFileName = g_strdup(fileName);
39-
}
40-
else {
41-
gchar *currentDir = g_get_current_dir();
42-
absoluteFileName = g_build_filename(currentDir, fileName, NULL);
43-
g_free(currentDir);
44-
}
45-
return absoluteFileName;
36+
gchar *absoluteFileName = NULL;
37+
if (g_path_is_absolute(fileName))
38+
{
39+
absoluteFileName = g_strdup(fileName);
40+
}
41+
else
42+
{
43+
gchar *currentDir = g_get_current_dir();
44+
absoluteFileName = g_build_filename(currentDir, fileName, NULL);
45+
g_free(currentDir);
46+
}
47+
return absoluteFileName;
4648
}
4749
// End theft from ePDFview
4850

4951

50-
int convertPage(PopplerPage *page, const char* svgFilename)
52+
int convertPage(PopplerPage *page, const char* svgFilename, double dpi)
5153
{
52-
// Poppler stuff
53-
double width, height;
54-
55-
// Cairo stuff
56-
cairo_surface_t *surface;
57-
cairo_t *drawcontext;
58-
59-
if (page == NULL) {
60-
fprintf(stderr, "Page does not exist\n");
61-
return -1;
62-
}
63-
poppler_page_get_size (page, &width, &height);
64-
65-
// Open the SVG file
66-
surface = cairo_svg_surface_create(svgFilename, width, height);
67-
drawcontext = cairo_create(surface);
68-
69-
// Render the PDF file into the SVG file
70-
poppler_page_render_for_printing(page, drawcontext);
71-
cairo_show_page(drawcontext);
72-
73-
// Close the SVG file
74-
cairo_destroy(drawcontext);
75-
cairo_surface_destroy(surface);
76-
77-
// Close the PDF file
78-
g_object_unref(page);
79-
80-
return 0;
54+
// Poppler stuff
55+
double width, height;
56+
57+
// Cairo stuff
58+
cairo_surface_t *surface;
59+
cairo_t *drawcontext;
60+
61+
if (page == NULL)
62+
{
63+
fprintf(stderr, "Page does not exist\n");
64+
return -1;
65+
}
66+
poppler_page_get_size (page, &width, &height);
67+
68+
// Use DPI
69+
double dpi_ratio = dpi / 72.0;
70+
71+
// Open the SVG file
72+
surface = cairo_svg_surface_create(svgFilename, width * dpi_ratio, height * dpi_ratio);
73+
drawcontext = cairo_create(surface);
74+
75+
// Use DPI
76+
cairo_scale(drawcontext, dpi_ratio, dpi_ratio);
77+
78+
// Render the PDF file into the SVG file
79+
poppler_page_render_for_printing(page, drawcontext);
80+
cairo_show_page(drawcontext);
81+
82+
// Close the SVG file
83+
cairo_destroy(drawcontext);
84+
cairo_surface_destroy(surface);
85+
86+
// Close the PDF file
87+
g_object_unref(page);
88+
89+
return 0;
8190
}
8291

8392
int main(int argn, char *args[])
8493
{
85-
// Poppler stuff
86-
PopplerDocument *pdffile;
87-
PopplerPage *page;
88-
89-
// Initialise the GType library
90-
g_type_init ();
91-
92-
// Get command line arguments
93-
if ((argn < 3)||(argn > 4)) {
94-
printf("Usage: pdf2svg <in file.pdf> <out file.svg> [<page no>]\n");
95-
return -2;
96-
}
97-
gchar *absoluteFileName = getAbsoluteFileName(args[1]);
98-
gchar *filename_uri = g_filename_to_uri(absoluteFileName, NULL, NULL);
99-
gchar *pageLabel = NULL;
100-
101-
char* svgFilename = args[2];
102-
103-
g_free(absoluteFileName);
104-
if (argn == 4) {
105-
// Get page number
106-
pageLabel = g_strdup(args[3]);
107-
}
108-
109-
// Open the PDF file
110-
pdffile = poppler_document_new_from_file(filename_uri, NULL, NULL);
111-
g_free(filename_uri);
112-
if (pdffile == NULL) {
113-
fprintf(stderr, "Unable to open file\n");
114-
return -3;
115-
}
116-
117-
int conversionErrors = 0;
118-
// Get the page
119-
120-
if(pageLabel == NULL) {
121-
page = poppler_document_get_page(pdffile, 0);
122-
conversionErrors = convertPage(page, svgFilename);
123-
}
124-
else {
125-
if(strcmp(pageLabel, "all") == 0) {
126-
int curError;
127-
int pageCount = poppler_document_get_n_pages(pdffile);
128-
129-
if(pageCount > 9999999) {
130-
fprintf(stderr, "Too many pages (>9,999,999)\n");
131-
return -5;
132-
}
133-
134-
size_t svgFilenameBufLen = strlen(svgFilename) + 1;
135-
char *svgFilenameBuffer = (char*)malloc(svgFilenameBufLen);
136-
assert(svgFilenameBuffer != NULL);
137-
138-
int pageInd;
139-
for(pageInd = 0; pageInd < pageCount; pageInd++) {
140-
while (1) {
141-
size_t _wr_len = snprintf(svgFilenameBuffer, svgFilenameBufLen, svgFilename, pageInd + 1);
142-
if (_wr_len >= svgFilenameBufLen) {
143-
svgFilenameBufLen = _wr_len + 1;
144-
svgFilenameBuffer = (char*)realloc(svgFilenameBuffer, svgFilenameBufLen);
145-
assert(svgFilenameBuffer != NULL);
146-
continue;
147-
}
148-
break;
149-
}
150-
151-
page = poppler_document_get_page(pdffile, pageInd);
152-
curError = convertPage(page, svgFilenameBuffer);
153-
if(curError != 0)
154-
conversionErrors = -1;
155-
}
156-
free(svgFilenameBuffer);
157-
}
158-
else {
159-
page = poppler_document_get_page_by_label(pdffile, pageLabel);
160-
conversionErrors = convertPage(page, svgFilename);
161-
g_free(pageLabel);
162-
}
163-
}
164-
165-
g_object_unref(pdffile);
166-
167-
if(conversionErrors != 0) {
168-
return -4;
169-
}
170-
else {
171-
return 0;
172-
}
94+
// Poppler stuff
95+
PopplerDocument *pdffile;
96+
PopplerPage *page;
97+
double dpi = 72.0;
98+
99+
// Initialise the GType library
100+
g_type_init ();
101+
102+
// Get command line arguments
103+
if ((argn < 3)||(argn > 5))
104+
{
105+
printf("Usage: pdf2svg <in file.pdf> <out file.svg> [<dpi=72>] [<page no>]\n");
106+
return -2;
107+
}
108+
gchar *absoluteFileName = getAbsoluteFileName(args[1]);
109+
gchar *filename_uri = g_filename_to_uri(absoluteFileName, NULL, NULL);
110+
gchar *pageLabel = NULL;
111+
112+
char* svgFilename = args[2];
113+
114+
g_free(absoluteFileName);
115+
if (argn > 3)
116+
{
117+
// Get DPI
118+
dpi = atof(args[3]);
119+
}
120+
if (argn > 4)
121+
{
122+
// Get page number
123+
pageLabel = g_strdup(args[4]);
124+
}
125+
126+
// Open the PDF file
127+
pdffile = poppler_document_new_from_file(filename_uri, NULL, NULL);
128+
g_free(filename_uri);
129+
if (pdffile == NULL)
130+
{
131+
fprintf(stderr, "Unable to open file\n");
132+
return -3;
133+
}
134+
135+
int conversionErrors = 0;
136+
// Get the page
137+
138+
if(pageLabel == NULL)
139+
{
140+
page = poppler_document_get_page(pdffile, 0);
141+
conversionErrors = convertPage(page, svgFilename, dpi);
142+
}
143+
else
144+
{
145+
if(strcmp(pageLabel, "all") == 0)
146+
{
147+
int curError;
148+
int pageCount = poppler_document_get_n_pages(pdffile);
149+
150+
if(pageCount > 9999999)
151+
{
152+
fprintf(stderr, "Too many pages (>9,999,999)\n");
153+
return -5;
154+
}
155+
156+
size_t svgFilenameBufLen = strlen(svgFilename) + 1;
157+
char *svgFilenameBuffer = (char*)malloc(svgFilenameBufLen);
158+
assert(svgFilenameBuffer != NULL);
159+
160+
int pageInd;
161+
for(pageInd = 0; pageInd < pageCount; pageInd++)
162+
{
163+
while (1)
164+
{
165+
size_t _wr_len = snprintf(svgFilenameBuffer, svgFilenameBufLen, svgFilename, pageInd + 1);
166+
if (_wr_len >= svgFilenameBufLen)
167+
{
168+
svgFilenameBufLen = _wr_len + 1;
169+
svgFilenameBuffer = (char*)realloc(svgFilenameBuffer, svgFilenameBufLen);
170+
assert(svgFilenameBuffer != NULL);
171+
continue;
172+
}
173+
break;
174+
}
175+
176+
page = poppler_document_get_page(pdffile, pageInd);
177+
curError = convertPage(page, svgFilenameBuffer, dpi);
178+
if(curError != 0)
179+
conversionErrors = -1;
180+
}
181+
free(svgFilenameBuffer);
182+
}
183+
else
184+
{
185+
page = poppler_document_get_page_by_label(pdffile, pageLabel);
186+
conversionErrors = convertPage(page, svgFilename, dpi);
187+
g_free(pageLabel);
188+
}
189+
}
190+
191+
g_object_unref(pdffile);
192+
193+
if(conversionErrors != 0)
194+
{
195+
return -4;
196+
}
197+
else
198+
{
199+
return 0;
200+
}
173201

174202
}

0 commit comments

Comments
 (0)