diff --git a/gradle/test/junit5.gradle b/gradle/test/junit5.gradle index 8ee928f..dddd158 100644 --- a/gradle/test/junit5.gradle +++ b/gradle/test/junit5.gradle @@ -14,8 +14,8 @@ test { failFast = false environment 'TMPDIR', '/var/tmp/gs' systemProperty 'java.awt.headless', 'true' - systemProperty 'jna.debug', 'true' - //systemProperty 'jna.library.path', file('src/test/resources/').toString() + systemProperty 'java.io.tmpdir', '/var/tmp/' + systemProperty 'jna.debug', 'false' systemProperty 'java.util.logging.config.file', 'src/test/resources/logging.properties' testLogging { events 'STARTED', 'PASSED', 'FAILED', 'SKIPPED' diff --git a/graphics-barcode/src/test/java/org/xbib/graphics/barcode/output/PDFRendererTest.java b/graphics-barcode/src/test/java/org/xbib/graphics/barcode/output/PDFRendererTest.java index a7f726d..2e44df8 100755 --- a/graphics-barcode/src/test/java/org/xbib/graphics/barcode/output/PDFRendererTest.java +++ b/graphics-barcode/src/test/java/org/xbib/graphics/barcode/output/PDFRendererTest.java @@ -24,7 +24,7 @@ import java.nio.file.Files; import java.nio.file.Paths; import java.util.Locale; -@DisabledOnOs(OS.MAC) +@DisabledOnOs({OS.MAC, OS.LINUX}) public class PDFRendererTest { private Locale originalDefaultLocale; @@ -98,6 +98,7 @@ public class PDFRendererTest { int height = (int) (symbol.getHeight() * magnification); Rectangle rectangle = new Rectangle(0, 0, width, height); PDFGraphics2D pdfGraphics2D = new PDFGraphics2D(rectangle); + // we need a trick here to generate HELVETICA font statements pdfGraphics2D.setFont(new Font(Font.SANS_SERIF, Font.PLAIN, 12)); BarcodeGraphicsRenderer barcodeGraphicsRenderer = new BarcodeGraphicsRenderer(pdfGraphics2D, rectangle, magnification, paper, ink, false, false); diff --git a/graphics-ghostscript/src/main/java/org/xbib/graphics/ghostscript/PDFConverter.java b/graphics-ghostscript/src/main/java/org/xbib/graphics/ghostscript/PDFConverter.java index a369e96..f62e3f7 100644 --- a/graphics-ghostscript/src/main/java/org/xbib/graphics/ghostscript/PDFConverter.java +++ b/graphics-ghostscript/src/main/java/org/xbib/graphics/ghostscript/PDFConverter.java @@ -83,7 +83,8 @@ public class PDFConverter { int processColorModel, int pdfsettings, String compatibilityLevel, - boolean pdfx, PaperSize paperSize) { + boolean pdfx, + PaperSize paperSize) { this.autoRotatePages = autoRotatePages; this.processColorModel = processColorModel; this.pdfsettings = pdfsettings; diff --git a/graphics-ghostscript/src/main/java/org/xbib/graphics/ghostscript/PDFRasterizer.java b/graphics-ghostscript/src/main/java/org/xbib/graphics/ghostscript/PDFRasterizer.java index b7ba360..65eecf3 100644 --- a/graphics-ghostscript/src/main/java/org/xbib/graphics/ghostscript/PDFRasterizer.java +++ b/graphics-ghostscript/src/main/java/org/xbib/graphics/ghostscript/PDFRasterizer.java @@ -4,6 +4,7 @@ import javax.imageio.ImageIO; import javax.imageio.ImageReadParam; import javax.imageio.ImageReader; import javax.imageio.stream.ImageInputStream; +import org.apache.pdfbox.io.MemoryUsageSetting; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.PDPageContentStream; @@ -203,7 +204,7 @@ public class PDFRasterizer implements Closeable { int pagecount = 0; List coverPageDocs = new ArrayList<>(); try (Stream files = Files.list(sourceDir); - PDDocument pdDocument = new PDDocument(); + PDDocument pdDocument = new PDDocument(MemoryUsageSetting.setupTempFileOnly()); OutputStream outputStream = new BufferedOutputStream(Files.newOutputStream(targetFile))) { List entries = files.sorted() .filter(PDFRasterizer::checkForRealFile) @@ -371,27 +372,23 @@ public class PDFRasterizer implements Closeable { Map map = new LinkedHashMap<>(); ImageReader pngReader = getImageReader("png"); if (pngReader != null) { - ImageReadParam param = pngReader.getDefaultReadParam(); - logger.log(Level.FINE, "PNG reader: " + pngReader.getClass().getName() + " param: " + param); + logger.log(Level.FINE, "PNG reader: " + pngReader.getClass().getName()); map.put("png", pngReader); } ImageReader pnmReader = getImageReader("pnm"); if (pnmReader != null) { - ImageReadParam param = pnmReader.getDefaultReadParam(); - logger.log(Level.FINE, "PNM reader: " + pnmReader.getClass().getName() + " param: " + param); + logger.log(Level.FINE, "PNM reader: " + pnmReader.getClass().getName()); map.put("pnm", pnmReader); } ImageReader jpegReader = getImageReader("jpeg"); if (jpegReader != null) { - ImageReadParam param = jpegReader.getDefaultReadParam(); - logger.log(Level.FINE, "JPEG reader: " + jpegReader.getClass().getName() + " param: " + param); + logger.log(Level.FINE, "JPEG reader: " + jpegReader.getClass().getName()); map.put("jpg", jpegReader); map.put("jpeg", jpegReader); } ImageReader tiffReader = getImageReader("tiff"); if (tiffReader != null) { - ImageReadParam param = tiffReader.getDefaultReadParam(); - logger.log(Level.FINE, "TIFF reader: " + tiffReader.getClass().getName() + " param: " + param); + logger.log(Level.FINE, "TIFF reader: " + tiffReader.getClass().getName()); map.put("tif", tiffReader); map.put("tiff", tiffReader); } @@ -425,7 +422,11 @@ public class PDFRasterizer implements Closeable { ImageReader imageReader = imageReaders.get(suffix); if (imageReader != null) { imageReader.setInput(imageInputStream); - BufferedImage bufferedImage = imageReader.read(0); + ImageReadParam param = imageReader.getDefaultReadParam(); + BufferedImage bufferedImage = imageReader.read(0, param); + logger.log(Level.FINE, "path = " + path + "loaded: width = " + bufferedImage.getWidth() + + " height = " + bufferedImage.getHeight() + + " color model = " + bufferedImage.getColorModel()); imageInputStream.close(); return bufferedImage; } else { diff --git a/graphics-ghostscript/src/test/java/org/xbib/graphics/ghostscript/test/PDFRasterizerTest.java b/graphics-ghostscript/src/test/java/org/xbib/graphics/ghostscript/test/PDFRasterizerTest.java index acd7ed7..1e24b24 100644 --- a/graphics-ghostscript/src/test/java/org/xbib/graphics/ghostscript/test/PDFRasterizerTest.java +++ b/graphics-ghostscript/src/test/java/org/xbib/graphics/ghostscript/test/PDFRasterizerTest.java @@ -33,14 +33,43 @@ public class PDFRasterizerTest { pdfRasterizer.close(); } + @Test + public void testPDFColorImage() throws IOException { + String creator = "Xbib PDF"; + String author = "Jörg Prante"; + String subject = "Test"; + Path sourceDir = Paths.get("src/test/resources/org/xbib/graphics/ghostscript/test/images"); + Path targetFile = Paths.get("build/color.pdf"); + PDFRasterizer pdfRasterizer = new PDFRasterizer(creator, author, subject); + int pagecount = pdfRasterizer.mergeImagesToPDF(sourceDir, targetFile); + logger.info("pagecount = " + pagecount); + pdfRasterizer.close(); + } + + @Test + public void testPDFUnpackRasterAndScale() throws IOException { + Path source = Paths.get("src/test/resources/org/xbib/graphics/ghostscript/test/20200024360.pdf"); + Path target = Paths.get("build/20200024360-new.pdf"); + Path tmp = Files.createTempDirectory("graphics-test"); + try { + PDFRasterizer pdfRasterizer = new PDFRasterizer("xbib", "Jörg Prante", "Test"); + pdfRasterizer.pdfToImage(source, tmp, null, null); + Path tmpTarget = tmp.resolve(target.getFileName()); + int pagecount = pdfRasterizer.mergeImagesToPDF(tmp, tmpTarget); + logger.info("pagecount = " + pagecount); + pdfRasterizer.scalePDF(tmpTarget, target); + pdfRasterizer.close(); + } finally { + delete(tmp); + } + } @Test public void testPDFRasterizerToImage() throws Exception { Path path = Paths.get("build/resources/test"); try (Stream stream = Files.list(path)) { stream.forEach(p -> { - if (p.toString().endsWith(".pdf")) { - logger.info("found " + p.toString()); + if (p.toString().endsWith("cjk.pdf")) { Path target = Paths.get("build/image-" + p.getFileName()); try { delete(target); diff --git a/graphics-ghostscript/src/test/resources/logging.properties b/graphics-ghostscript/src/test/resources/logging.properties index 86090ac..b1f9e8e 100644 --- a/graphics-ghostscript/src/test/resources/logging.properties +++ b/graphics-ghostscript/src/test/resources/logging.properties @@ -1,7 +1,7 @@ handlers=java.util.logging.ConsoleHandler,java.util.logging.FileHandler -.level=INFO +.level=ALL java.util.logging.SimpleFormatter.format=%1$tY-%1$tm-%1$td %1$tH:%1$tM:%1$tS.%1$tL %4$-7s [%3$s] %5$s %6$s%n -java.util.logging.ConsoleHandler.level=INFO +java.util.logging.ConsoleHandler.level=ALL java.util.logging.ConsoleHandler.formatter=java.util.logging.SimpleFormatter java.util.logging.FileHandler.level=INFO java.util.logging.FileHandler.pattern=build/test.log diff --git a/graphics-ghostscript/src/test/resources/org/xbib/graphics/ghostscript/test/20200024360.pdf b/graphics-ghostscript/src/test/resources/org/xbib/graphics/ghostscript/test/20200024360.pdf new file mode 100644 index 0000000..21466d2 Binary files /dev/null and b/graphics-ghostscript/src/test/resources/org/xbib/graphics/ghostscript/test/20200024360.pdf differ diff --git a/graphics-ghostscript/src/test/resources/org/xbib/graphics/ghostscript/test/images/001.png b/graphics-ghostscript/src/test/resources/org/xbib/graphics/ghostscript/test/images/001.png new file mode 100644 index 0000000..bf83a55 Binary files /dev/null and b/graphics-ghostscript/src/test/resources/org/xbib/graphics/ghostscript/test/images/001.png differ