I had a niche need to draw lines on an existing PDF document using PDFBox, so I'll show you how. For example, in the form of submission to the government, it is assumed that a strikethrough is drawn on irrelevant parts according to the content of the application.
void line() throws IOException {
try (InputStream is = getInputStream("sample.pdf");
PDDocument doc = PDDocument.load(is)) {
PDPage page = doc.getPage(0);
PDPageContentStream contents = new PDPageContentStream(doc, page, AppendMode.APPEND, false);
contents.moveTo(290f, 808f); //Start point coordinates
contents.lineTo(365f, 808f); //End point coordinates
contents.setLineWidth(1f); //Line thickness
contents.stroke(); //drawing
contents.moveTo(290f, 805f); //Start point coordinates
contents.lineTo(365f, 805f); //End point coordinates
contents.setLineWidth(1f); //Line thickness
contents.stroke(); //drawing
contents.close();
doc.save("/tmp/output.pdf");
}
}
There seems to be a smarter way, such as using the right tools, but I didn't know, so I decided to draw the coordinate system myself, which is muddy.
void grid() throws IOException {
try (InputStream is = getInputStream("sample.pdf");
PDDocument doc = PDDocument.load(is)) {
PDPage page = doc.getPage(0);
//Draw a grid from the bottom left to the top right of the page
PDPageContentStream contents = new PDPageContentStream(doc, page, AppendMode.APPEND, false);
PDRectangle bbox = page.getBBox();
for (float x = 0; x < bbox.getWidth(); x += 10) {
contents.moveTo(bbox.getLowerLeftX() + x, bbox.getLowerLeftY());
contents.lineTo(bbox.getLowerLeftX() + x, bbox.getUpperRightY());
contents.setLineWidth((x % 100 == 0) ? 2f : 0.5f);
contents.stroke();
}
for (float y = 0; y < bbox.getHeight(); y += 10) {
contents.moveTo(bbox.getLowerLeftX(), bbox.getLowerLeftY() + y);
contents.lineTo(bbox.getUpperRightX(), bbox.getLowerLeftY() + y);
contents.setLineWidth((y % 100 == 0) ? 2f : 0.5f);
contents.stroke();
}
contents.close();
doc.save("/tmp/output.pdf");
}
}
After that, if you count the scale from the lower left, you can specify the rough coordinates of the position you want to draw.
If there is a better way, please let me know: sweat_smile: