6030 |
28 Oct 20 |
nicklas |
1 |
package net.sf.basedb.reggie.pdf; |
6030 |
28 Oct 20 |
nicklas |
2 |
|
6030 |
28 Oct 20 |
nicklas |
3 |
import java.io.IOException; |
6081 |
25 Nov 20 |
nicklas |
4 |
import java.util.ArrayList; |
6081 |
25 Nov 20 |
nicklas |
5 |
import java.util.List; |
6030 |
28 Oct 20 |
nicklas |
6 |
|
6081 |
25 Nov 20 |
nicklas |
7 |
import org.jdom2.Element; |
6081 |
25 Nov 20 |
nicklas |
8 |
|
6030 |
28 Oct 20 |
nicklas |
9 |
import net.sf.basedb.reggie.Reggie; |
6030 |
28 Oct 20 |
nicklas |
10 |
import net.sf.basedb.reggie.XmlConfig; |
6030 |
28 Oct 20 |
nicklas |
11 |
import net.sf.basedb.util.Values; |
6030 |
28 Oct 20 |
nicklas |
12 |
|
6030 |
28 Oct 20 |
nicklas |
13 |
/** |
6030 |
28 Oct 20 |
nicklas |
Holds path and page number for a template PDF document. |
6030 |
28 Oct 20 |
nicklas |
@since 4.28 |
6030 |
28 Oct 20 |
nicklas |
16 |
*/ |
6030 |
28 Oct 20 |
nicklas |
17 |
public class TemplateFilePage |
6030 |
28 Oct 20 |
nicklas |
18 |
{ |
6030 |
28 Oct 20 |
nicklas |
19 |
|
6030 |
28 Oct 20 |
nicklas |
20 |
/** |
6030 |
28 Oct 20 |
nicklas |
Create a template file from information in the reggie-config.xml file. |
6030 |
28 Oct 20 |
nicklas |
The xpath parameter should identify an element where the value is expected |
6030 |
28 Oct 20 |
nicklas |
to be an absolute path or only a filename (the file is the then expected to |
6030 |
28 Oct 20 |
nicklas |
be located in the default directory). The element may have a 'page' attribute |
6030 |
28 Oct 20 |
nicklas |
that tells which page from the template pdf that should be used. If not |
6030 |
28 Oct 20 |
nicklas |
specified, the first page is used. |
6030 |
28 Oct 20 |
nicklas |
27 |
*/ |
6030 |
28 Oct 20 |
nicklas |
28 |
public static TemplateFilePage fromConfig(String xpath, String parameterSet, String defaultDir, String defaultFile) |
6030 |
28 Oct 20 |
nicklas |
29 |
throws IOException |
6030 |
28 Oct 20 |
nicklas |
30 |
{ |
6030 |
28 Oct 20 |
nicklas |
31 |
XmlConfig cfg = Reggie.getConfig(); |
6030 |
28 Oct 20 |
nicklas |
32 |
String path = cfg.getConfig(xpath, parameterSet, defaultFile); |
6030 |
28 Oct 20 |
nicklas |
33 |
if (!path.contains("/")) path = defaultDir + "/" + path; |
6030 |
28 Oct 20 |
nicklas |
34 |
int page = Values.getInt(cfg.getConfig(xpath+"/@page", parameterSet, "1")); |
6030 |
28 Oct 20 |
nicklas |
35 |
Reggie.checkFile(path, false); |
6030 |
28 Oct 20 |
nicklas |
36 |
return new TemplateFilePage(path, page); |
6030 |
28 Oct 20 |
nicklas |
37 |
} |
6030 |
28 Oct 20 |
nicklas |
38 |
|
6081 |
25 Nov 20 |
nicklas |
39 |
/** |
6081 |
25 Nov 20 |
nicklas |
Load information about template files from the configuration file. |
6081 |
25 Nov 20 |
nicklas |
41 |
|
6081 |
25 Nov 20 |
nicklas |
@param xpath Search path to the <templates> tag, which should |
6081 |
25 Nov 20 |
nicklas |
contain one or more <file> tags |
6081 |
25 Nov 20 |
nicklas |
@param defaultDir Default directory for template files unless a full path is specifed |
6081 |
25 Nov 20 |
nicklas |
@return A list with the specified templates |
6081 |
25 Nov 20 |
nicklas |
@throws IOException |
6081 |
25 Nov 20 |
nicklas |
47 |
*/ |
6081 |
25 Nov 20 |
nicklas |
48 |
public static List<TemplateFilePage> fromConfig(String xpath, String defaultDir) |
6081 |
25 Nov 20 |
nicklas |
49 |
throws IOException |
6081 |
25 Nov 20 |
nicklas |
50 |
{ |
6081 |
25 Nov 20 |
nicklas |
51 |
XmlConfig cfg = Reggie.getConfig(); |
6081 |
25 Nov 20 |
nicklas |
52 |
Element templates = cfg.getElement(xpath); |
6081 |
25 Nov 20 |
nicklas |
53 |
List<Element> files = templates.getChildren("file"); |
6081 |
25 Nov 20 |
nicklas |
54 |
|
6081 |
25 Nov 20 |
nicklas |
55 |
List<TemplateFilePage> templatePages = new ArrayList<TemplateFilePage>(files.size()); |
6081 |
25 Nov 20 |
nicklas |
56 |
for (Element file : files) |
6081 |
25 Nov 20 |
nicklas |
57 |
{ |
6081 |
25 Nov 20 |
nicklas |
58 |
String path = file.getTextTrim(); |
6081 |
25 Nov 20 |
nicklas |
59 |
if (!path.contains("/")) path = defaultDir + "/" + path; |
6081 |
25 Nov 20 |
nicklas |
60 |
Reggie.checkFile(path, false); |
6081 |
25 Nov 20 |
nicklas |
61 |
String pages = file.getAttributeValue("pages", "1"); |
6081 |
25 Nov 20 |
nicklas |
62 |
|
6081 |
25 Nov 20 |
nicklas |
63 |
for (int pageNo : expandPageRange(pages)) |
6081 |
25 Nov 20 |
nicklas |
64 |
{ |
6081 |
25 Nov 20 |
nicklas |
65 |
templatePages.add(new TemplateFilePage(path, pageNo)); |
6081 |
25 Nov 20 |
nicklas |
66 |
} |
6081 |
25 Nov 20 |
nicklas |
67 |
} |
6081 |
25 Nov 20 |
nicklas |
68 |
return templatePages; |
6081 |
25 Nov 20 |
nicklas |
69 |
} |
6081 |
25 Nov 20 |
nicklas |
70 |
|
6081 |
25 Nov 20 |
nicklas |
71 |
/** |
6081 |
25 Nov 20 |
nicklas |
Parse the page specification and expand it into a list |
6081 |
25 Nov 20 |
nicklas |
specifying every page that are included. Entries are separated |
6081 |
25 Nov 20 |
nicklas |
by a comma and each entry is either a single page or a range. |
6081 |
25 Nov 20 |
nicklas |
Duplicate entries are preserved. |
6081 |
25 Nov 20 |
nicklas |
76 |
|
6081 |
25 Nov 20 |
nicklas |
Examples: |
6081 |
25 Nov 20 |
nicklas |
1 |
6081 |
25 Nov 20 |
nicklas |
1,2,5 |
6081 |
25 Nov 20 |
nicklas |
1,3-8,27 |
6081 |
25 Nov 20 |
nicklas |
81 |
|
6081 |
25 Nov 20 |
nicklas |
Invalid entries are ignored. |
6081 |
25 Nov 20 |
nicklas |
83 |
|
6081 |
25 Nov 20 |
nicklas |
@param pages A page specification with comma-separated page numbers |
6081 |
25 Nov 20 |
nicklas |
and ranges |
6081 |
25 Nov 20 |
nicklas |
@return All pages in the same order as they are specified |
6081 |
25 Nov 20 |
nicklas |
87 |
*/ |
6081 |
25 Nov 20 |
nicklas |
88 |
public static List<Integer> expandPageRange(String pages) |
6081 |
25 Nov 20 |
nicklas |
89 |
{ |
6081 |
25 Nov 20 |
nicklas |
90 |
List<Integer> allPages = new ArrayList<Integer>(); |
6081 |
25 Nov 20 |
nicklas |
91 |
|
6081 |
25 Nov 20 |
nicklas |
92 |
if (pages != null) |
6081 |
25 Nov 20 |
nicklas |
93 |
{ |
6081 |
25 Nov 20 |
nicklas |
94 |
for (String entry : pages.split("\\,")) |
6081 |
25 Nov 20 |
nicklas |
95 |
{ |
6081 |
25 Nov 20 |
nicklas |
96 |
entry = entry.strip(); |
6081 |
25 Nov 20 |
nicklas |
97 |
String[] range = entry.split("\\-"); |
6081 |
25 Nov 20 |
nicklas |
98 |
if (range.length == 2) |
6081 |
25 Nov 20 |
nicklas |
99 |
{ |
6081 |
25 Nov 20 |
nicklas |
100 |
int first = Values.getInt(range[0].strip()); |
6081 |
25 Nov 20 |
nicklas |
101 |
int last = Values.getInt(range[1].strip()); |
6081 |
25 Nov 20 |
nicklas |
102 |
for (int pageNo = first; pageNo <= last; pageNo++) |
6081 |
25 Nov 20 |
nicklas |
103 |
{ |
6081 |
25 Nov 20 |
nicklas |
104 |
allPages.add(pageNo); |
6081 |
25 Nov 20 |
nicklas |
105 |
} |
6081 |
25 Nov 20 |
nicklas |
106 |
} |
6081 |
25 Nov 20 |
nicklas |
107 |
else |
6081 |
25 Nov 20 |
nicklas |
108 |
{ |
6081 |
25 Nov 20 |
nicklas |
109 |
int pageNo = Values.getInt(entry, 0); |
6081 |
25 Nov 20 |
nicklas |
110 |
if (pageNo > 0) allPages.add(pageNo); |
6081 |
25 Nov 20 |
nicklas |
111 |
} |
6081 |
25 Nov 20 |
nicklas |
112 |
} |
6081 |
25 Nov 20 |
nicklas |
113 |
} |
6081 |
25 Nov 20 |
nicklas |
114 |
|
6081 |
25 Nov 20 |
nicklas |
115 |
return allPages; |
6081 |
25 Nov 20 |
nicklas |
116 |
} |
6081 |
25 Nov 20 |
nicklas |
117 |
|
6030 |
28 Oct 20 |
nicklas |
118 |
private final String path; |
6030 |
28 Oct 20 |
nicklas |
119 |
private final int page; |
6030 |
28 Oct 20 |
nicklas |
120 |
|
6030 |
28 Oct 20 |
nicklas |
121 |
/** |
6030 |
28 Oct 20 |
nicklas |
Create a template from a path and page number. |
6030 |
28 Oct 20 |
nicklas |
123 |
*/ |
6030 |
28 Oct 20 |
nicklas |
124 |
public TemplateFilePage(String path, int page) |
6030 |
28 Oct 20 |
nicklas |
125 |
{ |
6030 |
28 Oct 20 |
nicklas |
126 |
this.path = path; |
6030 |
28 Oct 20 |
nicklas |
127 |
this.page = page; |
6030 |
28 Oct 20 |
nicklas |
128 |
} |
6030 |
28 Oct 20 |
nicklas |
129 |
|
6030 |
28 Oct 20 |
nicklas |
130 |
/** |
6030 |
28 Oct 20 |
nicklas |
Get the path to the template PDF file. |
6030 |
28 Oct 20 |
nicklas |
132 |
*/ |
6030 |
28 Oct 20 |
nicklas |
133 |
public String getPath() |
6030 |
28 Oct 20 |
nicklas |
134 |
{ |
6030 |
28 Oct 20 |
nicklas |
135 |
return path; |
6030 |
28 Oct 20 |
nicklas |
136 |
} |
6030 |
28 Oct 20 |
nicklas |
137 |
|
6030 |
28 Oct 20 |
nicklas |
138 |
/** |
6030 |
28 Oct 20 |
nicklas |
Get the page that should be used from the PDF. |
6030 |
28 Oct 20 |
nicklas |
140 |
*/ |
6030 |
28 Oct 20 |
nicklas |
141 |
public int getPage() |
6030 |
28 Oct 20 |
nicklas |
142 |
{ |
6030 |
28 Oct 20 |
nicklas |
143 |
return page; |
6030 |
28 Oct 20 |
nicklas |
144 |
} |
6030 |
28 Oct 20 |
nicklas |
145 |
} |