public void parse(File file, int maxPaths, ProgressMonitor monitor) throws Exception { monitor.beginTask(tr("Parsing PDF", 1)); PDDocument document = PDDocument.load(file); if (document.isEncrypted()) { throw new Exception(tr("Encrypted documents not supported.")); } List<?> allPages = document.getDocumentCatalog().getAllPages(); if (allPages.size() != 1) { throw new Exception(tr("The PDF file must have exactly one page.")); } PDPage page = (PDPage) allPages.get(0); PDRectangle pageSize = page.findMediaBox(); Integer rotationVal = page.getRotation(); int rotation = 0; if (rotationVal != null) { rotation = rotationVal.intValue(); } GraphicsProcessor p = new GraphicsProcessor(target, rotation, maxPaths, monitor); PageDrawer drawer = new PageDrawer(); drawer.drawPage(p, page); this.target.bounds = new Rectangle2D.Double( pageSize.getLowerLeftX(), pageSize.getLowerLeftY(), pageSize.getWidth(), pageSize.getHeight()); monitor.finishTask(); }
// renders a page to the given graphics public void renderPage( PDPage page, Paint paint, Canvas canvas, int width, int height, float scaleX, float scaleY) throws IOException { canvas.scale(scaleX, scaleY); // TODO should we be passing the scale to PageDrawer rather than messing with Graphics? PDRectangle cropBox = page.getCropBox(); int rotationAngle = page.getRotation(); if (rotationAngle != 0) { float translateX = 0; float translateY = 0; switch (rotationAngle) { case 90: translateX = cropBox.getHeight(); break; case 270: translateY = cropBox.getWidth(); break; case 180: translateX = cropBox.getWidth(); translateY = cropBox.getHeight(); break; } canvas.translate(translateX, translateY); canvas.rotate((float) Math.toRadians(rotationAngle)); } PageDrawer drawer = new PageDrawer(page); drawer.drawPage(paint, canvas, cropBox); }
// renders a page to the given graphics private void renderPage( PDPage page, Graphics2D graphics, int width, int height, float scaleX, float scaleY) throws IOException { graphics.clearRect(0, 0, width, height); graphics.scale(scaleX, scaleY); // TODO should we be passing the scale to PageDrawer rather than messing with Graphics? PDRectangle cropBox = page.getCropBox(); int rotationAngle = page.getRotation(); if (rotationAngle != 0) { float translateX = 0; float translateY = 0; switch (rotationAngle) { case 90: translateX = cropBox.getHeight(); break; case 270: translateY = cropBox.getWidth(); break; case 180: translateX = cropBox.getWidth(); translateY = cropBox.getHeight(); break; } graphics.translate(translateX, translateY); graphics.rotate((float) Math.toRadians(rotationAngle)); } // the end-user may provide a custom PageDrawer PageDrawerParameters parameters = new PageDrawerParameters(this, page); PageDrawer drawer = createPageDrawer(parameters); drawer.drawPage(graphics, cropBox); }