[JAVA] Tracez une ligne sur un document PDF existant à l'aide de PDFBox

J'avais un besoin de niche pour dessiner des lignes sur un document PDF existant en utilisant PDFBox, donc je vais vous montrer comment. Par exemple, sous forme de soumission au gouvernement, on suppose qu'une ligne d'annulation sera tracée sur les parties non pertinentes en fonction du contenu de la demande.

image.png

Environnement de confirmation

Méthode de réalisation

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); //Coordonnées du point de départ
        contents.lineTo(365f, 808f); //Coordonnées du point final
        contents.setLineWidth(1f);   //Épaisseur de ligne
        contents.stroke();           //dessin

        contents.moveTo(290f, 805f); //Coordonnées du point de départ
        contents.lineTo(365f, 805f); //Coordonnées du point final
        contents.setLineWidth(1f);   //Épaisseur de ligne
        contents.stroke();           //dessin

        contents.close();
        doc.save("/tmp/output.pdf");
    }
}

Spécification de la position du dessin

Il semble y avoir un moyen plus intelligent, comme utiliser les bons outils, mais je ne savais pas, alors j'ai décidé de dessiner moi-même le système de coordonnées, ce qui est flou.

void grid() throws IOException {
    try (InputStream is = getInputStream("sample.pdf");
         PDDocument doc = PDDocument.load(is)) {
        PDPage page = doc.getPage(0);

        //Dessinez une grille du bas à gauche vers le haut à droite de la 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");
    }
}

Après cela, si vous comptez l'échelle à partir du coin inférieur gauche, vous pouvez spécifier les coordonnées approximatives de la position que vous souhaitez dessiner.

image.png

S'il existe un meilleur moyen, veuillez me le faire savoir: sweat_smile:

Recommended Posts

Tracez une ligne sur un document PDF existant à l'aide de PDFBox
Utilisation du réseau local avec iOS 14
Dupliquer un objet à l'aide d'un type générique
Envoyer des e-mails à l'aide de JavaMail sur AWS