org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode Java Examples
The following examples show how to use
org.apache.pdfbox.pdmodel.PDPageContentStream.AppendMode.
You can vote up the ones you like or vote down the ones you don't like,
and go to the original project or source file by following the links above each example. You may check out the related API usage on the sidebar.
Example #1
Source File: PDFCreator.java From Knowage-Server with GNU Affero General Public License v3.0 | 7 votes |
private static void writeFrontpageDetails(PDDocument doc, PDFont font, float fontSize, FrontpageDetails details) throws IOException { String name = "Name: " + details.getName(); String description = "Description: " + details.getDescription(); String date = "Date: " + DEFAULT_DATE_FORMATTER.format(details.getDate()); PDPage page = doc.getPage(0); PDRectangle pageSize = page.getMediaBox(); float stringWidth = font.getStringWidth(StringUtilities.findLongest(name, description, date)) * fontSize / 1000f; float stringHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() * fontSize / 1000f; int rotation = page.getRotation(); boolean rotate = rotation == 90 || rotation == 270; float pageWidth = rotate ? pageSize.getHeight() : pageSize.getWidth(); float pageHeight = rotate ? pageSize.getWidth() : pageSize.getHeight(); float startX = rotate ? pageHeight / 3f : (pageWidth - stringWidth - stringHeight) / 3f; float startY = rotate ? (pageWidth - stringWidth) / 1f : pageWidth / 0.9f; // append the content to the existing stream try (PDPageContentStream contentStream = new PDPageContentStream(doc, page, AppendMode.APPEND, true, true)) { // draw rectangle writeText(contentStream, new Color(4, 44, 86), font, fontSize, rotate, startX, startY, name, description, date); } }
Example #2
Source File: DenseMerging.java From testarea-pdfbox2 with Apache License 2.0 | 7 votes |
/** * <a href="https://stackoverflow.com/questions/60052967/how-to-dense-merge-pdf-files-using-pdfbox-2-without-whitespace-near-page-breaks"> * How to dense merge PDF files using PDFBox 2 without whitespace near page breaks? * </a> * <p> * This test checks the {@link PageVerticalAnalyzer} functionality. * </p> * <p> * Beware, as mentioned in the {@link PageVerticalAnalyzer} comments, * the processing in particular of curves is incorrect. The curve * used in this test is chosen not to create wrong results due to * this known issue. * </p> */ @Test public void testVerticalAnalyzer() throws IOException { PDDocument document = createTextDocument(new PDRectangle(0, 0, 400, 600), Matrix.getTranslateInstance(30, 300), "Document line 1", "Document line 2", "Document line 3"); PDPage page = document.getPage(0); try ( PDPageContentStream content = new PDPageContentStream(document, page, AppendMode.APPEND, false, true)) { content.setStrokingColor(Color.BLACK); content.moveTo(40, 40); content.lineTo(80, 80); content.lineTo(120, 100); content.stroke(); content.moveTo(40, 140); content.curveTo(80, 140, 160, 140, 80, 180); content.closeAndFillAndStroke(); } PageVerticalAnalyzer analyzer = new PageVerticalAnalyzer(page); analyzer.processPage(page); System.out.println(analyzer.getVerticalFlips()); try ( PDPageContentStream content = new PDPageContentStream(document, page, AppendMode.APPEND, false, true)) { content.setStrokingColor(Color.RED); content.setLineWidth(3); List<Float> flips = analyzer.getVerticalFlips(); float x = page.getCropBox().getLowerLeftX() + 20; for (int i = 0; i < flips.size() - 1; i+=2) { content.moveTo(x, flips.get(i)); content.lineTo(x, flips.get(i+1)); } content.stroke(); } document.save(new File(RESULT_FOLDER, "Test Document Vertically Marked.pdf")); }
Example #3
Source File: OverlayDocuments.java From testarea-pdfbox2 with Apache License 2.0 | 6 votes |
/** * <a href="https://issues.apache.org/jira/browse/PDFBOX-4797"> * Overlayed PDF file do not shows the difference * </a> * <br/> * <a href="https://issues.apache.org/jira/secure/attachment/12996277/10.pdf"> * 10.pdf * </a> * <br/> * <a href="https://issues.apache.org/jira/secure/attachment/12996276/114.pdf"> * 114.pdf * </a> * <p> * This test demonstrates how to use the blend mode when overlaying documents * for comparison. * </p> */ @Test public void testOverlayWithMultiply() throws IOException { try ( InputStream file1 = getClass().getResourceAsStream("10.pdf"); InputStream file2 = getClass().getResourceAsStream("114.pdf"); PDDocument document1 = Loader.loadPDF(file1); PDDocument document2 = Loader.loadPDF(file2); Overlay overlayer = new Overlay()) { overlayer.setInputPDF(document1); overlayer.setAllPagesOverlayPDF(document2); try ( PDDocument result = overlayer.overlay(Collections.emptyMap()) ) { result.save(new File(RESULT_FOLDER, "10and114.pdf")); try ( PDPageContentStream canvas = new PDPageContentStream(result, result.getPage(5), AppendMode.PREPEND, false, false)) { PDExtendedGraphicsState extGState = new PDExtendedGraphicsState(); extGState.setBlendMode(BlendMode.MULTIPLY); canvas.setGraphicsStateParameters(extGState); } result.save(new File(RESULT_FOLDER, "10and114multiply.pdf")); } } }
Example #4
Source File: ExtractBoxedText.java From testarea-pdfbox2 with Apache License 2.0 | 6 votes |
/** * <a href="https://stackoverflow.com/questions/51380677/extracting-text-from-pdf-java-using-pdfbox-library-from-a-tables-rows-with-di"> * Extracting text from pdf (java using pdfbox library) from a table's rows with different heights * </a> * <br/> * <a href="https://www.info.uvt.ro/wp-content/uploads/2018/07/Programare-licenta-5-Iulie-2018_1.pdf"> * Programare-licenta-5-Iulie-2018_1.pdf * </a> * <p> * This test draws a grid on the test file representing the boxes found by the * {@link PdfBoxFinder}. * </p> */ @Test public void testDrawBoxes() throws IOException { try ( InputStream resource = getClass().getResourceAsStream("Programare-licenta-5-Iulie-2018_1.pdf"); PDDocument document = Loader.loadPDF(resource) ) { for (PDPage page : document.getDocumentCatalog().getPages()) { PdfBoxFinder boxFinder = new PdfBoxFinder(page); boxFinder.processPage(page); try (PDPageContentStream canvas = new PDPageContentStream(document, page, AppendMode.APPEND, true, true)) { canvas.setStrokingColor(Color.RED); for (Rectangle2D rectangle : boxFinder.getBoxes().values()) { canvas.addRect((float)rectangle.getX(), (float)rectangle.getY(), (float)rectangle.getWidth(), (float)rectangle.getHeight()); } canvas.stroke(); } } document.save(new File(RESULT_FOLDER, "Programare-licenta-5-Iulie-2018_1-rectangles.pdf")); } }
Example #5
Source File: PDFCreator.java From Knowage-Server with GNU Affero General Public License v3.0 | 5 votes |
private static void writePageNumbering(PDDocument doc, PDFont font, float fontSize, PageNumbering pageNumbering) throws IOException { int totalPages = doc.getNumberOfPages(); int numberOfPages = pageNumbering.isLastIncluded() ? doc.getNumberOfPages() : doc.getNumberOfPages() - 1; for (int pageIndex = pageNumbering.isFirstIncluded() ? 0 : 1; pageIndex < numberOfPages; pageIndex++) { String footer = "Page " + (pageIndex + 1) + " of " + totalPages; PDPage page = doc.getPage(pageIndex); PDRectangle pageSize = page.getMediaBox(); float stringWidth = font.getStringWidth(footer) * fontSize / 1000f; float stringHeight = font.getFontDescriptor().getFontBoundingBox().getHeight() * fontSize / 1000f; int rotation = page.getRotation(); boolean rotate = rotation == 90 || rotation == 270; float pageWidth = rotate ? pageSize.getHeight() : pageSize.getWidth(); float pageHeight = rotate ? pageSize.getWidth() : pageSize.getHeight(); float startX = rotate ? pageHeight / 2f : (pageWidth - stringWidth - stringHeight) / 2f; float startY = rotate ? (pageWidth - stringWidth) : stringHeight; // append the content to the existing stream try (PDPageContentStream contentStream = new PDPageContentStream(doc, page, AppendMode.APPEND, true, true)) { // draw rectangle contentStream.setNonStrokingColor(255, 255, 255); // gray background // Draw a white filled rectangle drawRect(contentStream, Color.WHITE, new java.awt.Rectangle((int) startX, (int) startY - 3, (int) stringWidth + 2, (int) stringHeight), true); writeText(contentStream, new Color(4, 44, 86), font, fontSize, rotate, startX, startY, footer); } } }
Example #6
Source File: DashboardUtil.java From Insights with Apache License 2.0 | 5 votes |
/** * Footer is filled with varaibles selected in Grafana by user * * @param doc * @param title * @param variables * @return doc * @throws IOException */ private PDDocument footer(PDDocument doc, String title, String variables) throws IOException { try{ PDPageTree pages = doc.getPages(); for(PDPage p : pages){ PDPageContentStream contentStream = new PDPageContentStream(doc, p, AppendMode.APPEND, false); contentStream.beginText(); contentStream.newLineAtOffset(220, 780); contentStream.setFont(PDType1Font.HELVETICA, 11); contentStream.showText("OneDevOps Insights – "+title); contentStream.endText(); if(!variables.equals("") && variables != null){ contentStream.beginText(); contentStream.newLineAtOffset(2, 17); contentStream.setFont(PDType1Font.HELVETICA, 9); contentStream.showText("This Report is generated based on the user selected values as below."); contentStream.endText(); contentStream.beginText(); contentStream.newLineAtOffset(2, 5); contentStream.setFont(PDType1Font.HELVETICA, 7); contentStream.showText(variables); contentStream.endText(); } contentStream.close(); } }catch(Exception e){ Log.error("Error, Failed in Footer.. ", e.getMessage()); } return doc; }
Example #7
Source File: LayerUtility.java From gcs with Mozilla Public License 2.0 | 5 votes |
/** * Places the given form over the existing content of the indicated page (like an overlay). * The form is enveloped in a marked content section to indicate that it's part of an * optional content group (OCG), here used as a layer. This optional group is returned and * can be enabled and disabled through methods on {@link PDOptionalContentProperties}. * <p> * You may want to call {@link #wrapInSaveRestore(PDPage) wrapInSaveRestore(PDPage)} before calling this method to make * sure that the graphics state is reset. * * @param targetPage the target page * @param form the form to place * @param transform the transformation matrix that controls the placement of your form. You'll * need this if your page has a crop box different than the media box, or if these have negative * coordinates, or if you want to scale or adjust your form. * @param layerName the name for the layer/OCG to produce * @return the optional content group that was generated for the form usage * @throws IOException if an I/O error occurs */ public PDOptionalContentGroup appendFormAsLayer(PDPage targetPage, PDFormXObject form, AffineTransform transform, String layerName) throws IOException { PDDocumentCatalog catalog = targetDoc.getDocumentCatalog(); PDOptionalContentProperties ocprops = catalog.getOCProperties(); if (ocprops == null) { ocprops = new PDOptionalContentProperties(); catalog.setOCProperties(ocprops); } if (ocprops.hasGroup(layerName)) { throw new IllegalArgumentException("Optional group (layer) already exists: " + layerName); } PDRectangle cropBox = targetPage.getCropBox(); if ((cropBox.getLowerLeftX() < 0 || cropBox.getLowerLeftY() < 0) && transform.isIdentity()) { // PDFBOX-4044 LOG.warn("Negative cropBox " + cropBox + " and identity transform may make your form invisible"); } PDOptionalContentGroup layer = new PDOptionalContentGroup(layerName); ocprops.addGroup(layer); PDPageContentStream contentStream = new PDPageContentStream( targetDoc, targetPage, AppendMode.APPEND, !DEBUG); contentStream.beginMarkedContent(COSName.OC, layer); contentStream.saveGraphicsState(); contentStream.transform(new Matrix(transform)); contentStream.drawForm(form); contentStream.restoreGraphicsState(); contentStream.endMarkedContent(); contentStream.close(); return layer; }
Example #8
Source File: PlaceRotatedImage.java From testarea-pdfbox2 with Apache License 2.0 | 5 votes |
/** * @see #testPlaceByBoundingBox() */ void placeImage(PDDocument document, PDPage page, PDImageXObject image, float bbLowerLeftX, float bbLowerLeftY, float width, float height, float angle) throws IOException { try ( PDPageContentStream contentStream = new PDPageContentStream(document, page, AppendMode.APPEND, true, true) ) { float bbWidth = (float)(Math.abs(Math.sin(angle))*height + Math.abs(Math.cos(angle))*width); float bbHeight = (float)(Math.abs(Math.sin(angle))*width + Math.abs(Math.cos(angle))*height); contentStream.transform(Matrix.getTranslateInstance((bbLowerLeftX + .5f*bbWidth), (bbLowerLeftY + .5f*bbHeight))); contentStream.transform(Matrix.getRotateInstance(angle, 0, 0)); contentStream.drawImage(image, -.5f*width, -.5f*height, width, height); } }
Example #9
Source File: DetermineBoundingBox.java From testarea-pdfbox2 with Apache License 2.0 | 5 votes |
void drawBoundingBox(PDDocument pdDocument, PDPage pdPage) throws IOException { BoundingBoxFinder boxFinder = new BoundingBoxFinder(pdPage); boxFinder.processPage(pdPage); Rectangle2D box = boxFinder.getBoundingBox(); if (box != null) { try ( PDPageContentStream canvas = new PDPageContentStream(pdDocument, pdPage, AppendMode.APPEND, true, true)) { canvas.setStrokingColor(Color.magenta); canvas.addRect((float)box.getMinX(), (float)box.getMinY(), (float)box.getWidth(), (float)box.getHeight()); canvas.stroke(); } } }
Example #10
Source File: DenseMerging.java From testarea-pdfbox2 with Apache License 2.0 | 4 votes |
/** * <a href="https://stackoverflow.com/questions/60052967/how-to-dense-merge-pdf-files-using-pdfbox-2-without-whitespace-near-page-breaks"> * How to dense merge PDF files using PDFBox 2 without whitespace near page breaks? * </a> * <p> * This test checks the {@link PdfVeryDenseMergeTool} which allows * a very dense merging of multiple input PDFs. * </p> * <p> * Beware, as mentioned in the {@link PageVerticalAnalyzer} comments, * the processing in particular of curves is incorrect. The curve * used in this test is chosen not to create wrong results due to * this known issue. * </p> */ @Test public void testVeryDenseMerging() throws IOException { PDDocument document1 = createTextDocument(new PDRectangle(0, 0, 400, 600), Matrix.getTranslateInstance(30, 300), "Doc 1 line 1", "Doc 1 line 2", "Doc 1 line 3"); PDDocument document2 = createTextDocument(new PDRectangle(0, 0, 400, 600), Matrix.getTranslateInstance(40, 400), "Doc 2 line 1", "Doc 2 line 2", "Doc 2 line 3"); PDDocument document3 = createTextDocument(new PDRectangle(0, -300, 400, 600), Matrix.getTranslateInstance(50, -100), "Doc 3 line 1", "Doc 3 line 2", "Doc 3 line 3"); PDDocument document4 = createTextDocument(new PDRectangle(-200, -300, 400, 600), Matrix.getTranslateInstance(-140, -100), "Doc 4 line 1", "Doc 4 line 2", "Doc 4 line 3"); PDDocument document5 = createTextDocument(new PDRectangle(-200, -300, 400, 600), Matrix.getTranslateInstance(-140, -100), "Doc 5 line 1", "Doc 5 line 2", "Doc 5 line 3"); PDDocument document6 = createTextDocument(new PDRectangle(-200, -300, 400, 600), Matrix.getRotateInstance(Math.PI / 4, -120, 0), "Doc 6 line 1", "Doc 6 line 2", "Doc 6 line 3"); try ( PDPageContentStream content = new PDPageContentStream(document6, document6.getPage(0), AppendMode.APPEND, false, true)) { content.setStrokingColor(Color.BLACK); content.moveTo(40, 40); content.lineTo(80, 80); content.lineTo(120, 100); content.stroke(); content.moveTo(40, 140); content.curveTo(80, 140, 160, 140, 80, 180); content.closeAndFillAndStroke(); } document6.save(new File(RESULT_FOLDER, "Test Text and Graphics.pdf")); PdfVeryDenseMergeTool tool = new PdfVeryDenseMergeTool(PDRectangle.A4, 30, 30, 10); tool.merge(new FileOutputStream(new File(RESULT_FOLDER, "Merge with Text and Graphics, very dense.pdf")), Arrays.asList(document1, document2, document3, document4, document5, document6, document1, document2, document3, document4, document5, document6, document1, document2, document3, document4, document5, document6, document1, document2, document3, document4, document5, document6, document1, document2, document3, document4, document5, document6)); }