Skip to content

Commit b8cab39

Browse files
committed
PDFBOX 2.x -> PDFBOX 3.x
1 parent dafb7cb commit b8cab39

File tree

9 files changed

+67
-24
lines changed

9 files changed

+67
-24
lines changed

src/qz/common/Constants.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,7 @@ public class Constants {
1414
public static final String HEXES = "0123456789ABCDEF";
1515
public static final char[] HEXES_ARRAY = HEXES.toCharArray();
1616
public static final int BYTE_BUFFER_SIZE = 8192;
17-
public static final Version VERSION = Version.valueOf("2.2.5-SNAPSHOT");
17+
public static final Version VERSION = Version.valueOf("2.2.4+pdfbox3");
1818
public static final Version JAVA_VERSION = SystemUtilities.getJavaVersion();
1919
public static final String JAVA_VENDOR = System.getProperty("java.vendor");
2020

src/qz/printer/action/PrintPDF.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,10 @@
33
import com.github.zafarkhaja.semver.Version;
44
import org.apache.logging.log4j.LogManager;
55
import org.apache.logging.log4j.Logger;
6+
import org.apache.pdfbox.Loader;
67
import org.apache.pdfbox.io.IOUtils;
8+
import org.apache.pdfbox.io.RandomAccessReadBuffer;
9+
import org.apache.pdfbox.io.RandomAccessReadBufferedFile;
710
import org.apache.pdfbox.multipdf.Splitter;
811
import org.apache.pdfbox.pdmodel.PDDocument;
912
import org.apache.pdfbox.pdmodel.PDPage;
@@ -118,10 +121,18 @@ public void parseData(JSONArray printData, PrintOptions options) throws JSONExce
118121
case PLAIN:
119122
// There's really no such thing as a 'PLAIN' PDF, assume it's a URL
120123
case FILE:
121-
doc = PDDocument.load(ConnectionUtilities.getInputStream(data.getString("data"), true));
124+
doc = Loader.loadPDF(
125+
new RandomAccessReadBuffer(
126+
ConnectionUtilities.protocolRestricted(data.getString("data")).openStream()
127+
)
128+
);
122129
break;
123130
default:
124-
doc = PDDocument.load(new ByteArrayInputStream(flavor.read(data.getString("data"))));
131+
doc = Loader.loadPDF(
132+
new RandomAccessReadBuffer(
133+
flavor.read(data.getString("data"))
134+
)
135+
);
125136
}
126137

127138
if (pxlOpts.getBounds() != null) {

src/qz/printer/action/PrintRaw.java

Lines changed: 13 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,9 @@
1111

1212
import com.ibm.icu.text.ArabicShapingException;
1313
import org.apache.commons.lang3.StringUtils;
14+
import org.apache.pdfbox.Loader;
15+
import org.apache.pdfbox.io.RandomAccessReadBuffer;
16+
import org.apache.pdfbox.io.RandomAccessReadBufferedFile;
1417
import org.apache.pdfbox.pdmodel.PDDocument;
1518
import org.apache.pdfbox.pdmodel.common.PDRectangle;
1619
import org.apache.pdfbox.rendering.PDFRenderer;
@@ -190,10 +193,18 @@ private ImageWrapper getPdfWrapper(String data, JSONObject opt, PrintingUtilitie
190193
case PLAIN:
191194
// There's really no such thing as a 'PLAIN' PDF, assume it's a URL
192195
case FILE:
193-
doc = PDDocument.load(ConnectionUtilities.getInputStream(data, true));
196+
doc = Loader.loadPDF(
197+
new RandomAccessReadBuffer(
198+
ConnectionUtilities.protocolRestricted(data).openStream()
199+
)
200+
);
194201
break;
195202
default:
196-
doc = PDDocument.load(new ByteArrayInputStream(seekConversion(flavor.read(data), rawOpts)));
203+
doc = Loader.loadPDF(
204+
new RandomAccessReadBuffer(
205+
seekConversion(flavor.read(data), rawOpts)
206+
)
207+
);
197208
}
198209

199210
double scale;

src/qz/printer/action/pdf/ParamPdfRenderer.java

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -39,8 +39,9 @@ public OpaquePageDrawer(PageDrawerParameters parameters) throws IOException {
3939
super(parameters);
4040

4141
// Note: These must match PdfFontPageDrawer's ignoreTransparency condition
42-
addOperator(new OpaqueDrawObject());
43-
addOperator(new OpaqueGraphicStateParameters());
42+
// TODO: These will throw NPE: Fix for PDFBOX 3.x
43+
addOperator(new OpaqueDrawObject(null));
44+
addOperator(new OpaqueGraphicStateParameters(null));
4445
}
4546
}
4647
}

src/qz/printer/rendering/OpaqueDrawObject.java

Lines changed: 11 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,7 @@
11
package qz.printer.rendering;
22

3+
import org.apache.pdfbox.contentstream.PDFGraphicsStreamEngine;
4+
import org.apache.pdfbox.contentstream.PDFStreamEngine;
35
import org.apache.pdfbox.contentstream.operator.MissingOperandException;
46
import org.apache.pdfbox.contentstream.operator.Operator;
57
import org.apache.pdfbox.contentstream.operator.graphics.GraphicsOperatorProcessor;
@@ -16,7 +18,9 @@
1618
// override draw object to remove any calls to show transparency
1719
public class OpaqueDrawObject extends GraphicsOperatorProcessor {
1820

19-
public OpaqueDrawObject() { }
21+
public OpaqueDrawObject(PDFGraphicsStreamEngine context) {
22+
super(context);
23+
}
2024

2125
public void process(Operator operator, List<COSBase> operands) throws IOException {
2226
if (operands.isEmpty()) {
@@ -25,26 +29,26 @@ public void process(Operator operator, List<COSBase> operands) throws IOExceptio
2529
COSBase base0 = operands.get(0);
2630
if (base0 instanceof COSName) {
2731
COSName objectName = (COSName)base0;
28-
PDXObject xobject = context.getResources().getXObject(objectName);
32+
PDXObject xobject = getGraphicsContext().getResources().getXObject(objectName);
2933

3034
if (xobject == null) {
3135
throw new MissingResourceException("Missing XObject: " + objectName.getName());
3236
} else {
3337
if (xobject instanceof PDImageXObject) {
3438
PDImageXObject image = (PDImageXObject)xobject;
35-
context.drawImage(image);
39+
getGraphicsContext().drawImage(image);
3640
} else if (xobject instanceof PDFormXObject) {
3741
try {
38-
context.increaseLevel();
39-
if (context.getLevel() <= 25) {
42+
getGraphicsContext().increaseLevel();
43+
if (getGraphicsContext().getLevel() <= 25) {
4044
PDFormXObject form = (PDFormXObject)xobject;
41-
context.showForm(form);
45+
getGraphicsContext().showForm(form);
4246
}
4347

4448
//LOG.error("recursion is too deep, skipping form XObject");
4549
}
4650
finally {
47-
context.decreaseLevel();
51+
getGraphicsContext().decreaseLevel();
4852
}
4953
}
5054

src/qz/printer/rendering/OpaqueGraphicStateParameters.java

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -39,6 +39,10 @@ public class OpaqueGraphicStateParameters extends OperatorProcessor
3939
{
4040
private static final Log LOG = LogFactory.getLog(OpaqueGraphicStateParameters.class);
4141

42+
public OpaqueGraphicStateParameters(PDFStreamEngine context) {
43+
super(context);
44+
}
45+
4246
@Override
4347
public void process(Operator operator, List<COSBase> arguments) throws IOException
4448
{

src/qz/printer/rendering/PdfFontPageDrawer.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -33,8 +33,8 @@ public PdfFontPageDrawer(PageDrawerParameters parameters, boolean ignoresTranspa
3333

3434
if (ignoresTransparency) {
3535
// Note: These must match ParamPdfRenderer's OpaquePageDrawer
36-
addOperator(new OpaqueDrawObject());
37-
addOperator(new OpaqueGraphicStateParameters());
36+
addOperator(new OpaqueDrawObject(null));
37+
addOperator(new OpaqueGraphicStateParameters(null));
3838
}
3939
}
4040

src/qz/utils/ConnectionUtilities.java

Lines changed: 20 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@
1616
import java.net.URISyntaxException;
1717
import java.net.URL;
1818
import java.net.URLConnection;
19+
import java.nio.file.Path;
1920
import java.nio.file.Paths;
2021
import java.security.cert.Certificate;
2122
import java.security.cert.X509Certificate;
@@ -44,14 +45,7 @@ public final class ConnectionUtilities {
4445
*/
4546
public static InputStream getInputStream(String urlString, boolean protocolRestricted) throws IOException {
4647
try {
47-
URL url = new URL(urlString);
48-
if(protocolRestricted) {
49-
String allowed = PrefsSearch.getString(ArgValue.SECURITY_DATA_PROTOCOLS);
50-
if(!isAllowed(allowed, url)) {
51-
log.error("URL '{}' is not a valid http or https location. Configure property '{}' to modify this behavior.", url, ArgValue.SECURITY_DATA_PROTOCOLS.getMatch());
52-
throw new IOException(String.format("URL '%s' is not a valid [%s] location", url, allowed));
53-
}
54-
}
48+
URL url = protocolRestricted ? protocolRestricted(urlString) : new URL(urlString);
5549
URLConnection urlConn = url.openConnection();
5650
for( String key : getRequestProperties().keySet()) {
5751
urlConn.setRequestProperty(key, requestProps.get(key));
@@ -65,6 +59,24 @@ public static InputStream getInputStream(String urlString, boolean protocolRestr
6559
}
6660
}
6761

62+
/**
63+
* Checks <code>urlString</code> for restricted protocol throws IOException if not permitted
64+
* returns Path if permitted
65+
*
66+
* @param urlString
67+
* @return a URL
68+
* @throws IOException
69+
*/
70+
public static URL protocolRestricted(String urlString) throws IOException {
71+
URL url = new URL(urlString);
72+
String allowed = PrefsSearch.getString(ArgValue.SECURITY_DATA_PROTOCOLS);
73+
if(!isAllowed(allowed, url)) {
74+
log.error("URL '{}' is not a valid http or https location. Configure property '{}' to modify this behavior.", url, ArgValue.SECURITY_DATA_PROTOCOLS.getMatch());
75+
throw new IOException(String.format("URL '%s' is not a valid [%s] location", url, allowed));
76+
}
77+
return url;
78+
}
79+
6880
private static boolean isAllowed(String allowed, URL url) {
6981
if(url == null) return false;
7082
String urlProtocol = url.getProtocol();

0 commit comments

Comments
 (0)