Manuel pour vous apprendre à utiliser le développement Java pour générer des documents PDF en ligne

Le sourire est pur. 2021-10-14 04:57:25
manuel pour vous apprendre utiliser


 Tous les matins à 7h30 , Pousser les marchandises sèches à temps 

Un.、Introduction

Dans le développement réel de l'entreprise , Les développeurs ont tendance à rencontrer beaucoup de ces scénarios , Les informations pertinentes sur les certificats électroniques doivent être fournies aux utilisateurs. , Par exemple, la Banque en ligne /AliPay/ Facture électronique pour le paiement des achats Wechat 、 Imprimer l'inventaire des commandes 、 Divers contrats de signature électronique, etc. , Pour la commodité de l'utilisateur 、 Imprimer ou télécharger .

Par exemple, la facture électronique ci - dessous !

36c9201c9635162ec2d393fdcd03f1d4.png

Chaussures pour enfants familières avec cette entreprise , Ça doit être très clair. , Les solutions les plus couramment utilisées à l'heure actuelle sont: : Mettre les données pertinentes , Générer des correspondances par certains moyens techniques PDF Documentation,Retour à l'utilisateur, Pour prévisualiser 、 Télécharger ou imprimer .

Chaussures pour enfants qui ne connaissent pas cette technique ,Et ne vous précipitez pas, Aujourd'hui, regardons en détail la génération en ligne PDF Moyens techniques de mise en œuvre des documents !

2.、Réalisation du cas

Avant d'introduire cette pratique de code , Regardons d'abord cette bibliothèque de tiers. :iText,C'est exact.,C'est vrai,C'est notre héros aujourd'hui..

iText Est un site open source bien connu sourceforgeUn projet,Est utilisé pour générerPDFUn des documentsjavaBibliothèque de classe,AdoptioniTextPeut non seulement générerPDFOurtfDocuments,Et vous pouvez aussiXMLHtmlFichier converti enPDFDocumentation.

iText Il existe actuellement deux versions ,Respectivement.iText5EtiText7.iText5 Il devrait y avoir plus d'une version en ligne .iText5 Parce que beaucoup de développeurs participent au Code de contribution , Il y a donc des irrégularités dans certaines spécifications et conceptions .iText7 C'est ce qui s'est passé. iText5Reconstruction de, Les deux versions sont très différentes. . Mais dans la pratique, , C'est assez simple. API, Donc vous n'avez pas à vous limiter à la version que vous utilisez .

2.1、Ajouter iText Paquets dépendants

Avant de l'utiliser, Nous introduisons d'abord des paquets de dépendances connexes !

<dependencies>
    <!-- pdf:start -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itextpdf</artifactId>
        <version>5.5.11</version>
    </dependency>
    <dependency>
        <groupId>com.itextpdf.tool</groupId>
        <artifactId>xmlworker</artifactId>
        <version>5.5.11</version>
    </dependency>
    <!-- Support chinois -->
    <dependency>
        <groupId>com.itextpdf</groupId>
        <artifactId>itext-asian</artifactId>
        <version>5.2.0</version>
    </dependency>
    <!-- Soutiencss Rendu de style  -->
    <dependency>
        <groupId>org.xhtmlrenderer</groupId>
        <artifactId>flying-saucer-pdf-itext5</artifactId>
        <version>9.1.16</version>
    </dependency>
    <!-- ConversionhtmlEst la normexhtmlSac -->
    <dependency>
        <groupId>net.sf.jtidy</groupId>
        <artifactId>jtidy</artifactId>
        <version>r938</version>
    </dependency>
    <!-- pdf:end -->    
</dependencies>

2.2、Mise en œuvre simple

Vieille règle, Commençons par un. hello world,Les codes sont les suivants::

public class CreatePDFMainTest {
    public static void main(String[] args) throws Exception {
        Document document = new Document(PageSize.A4);
        //Deuxième étape,CréationWriterExemple
        PdfWriter.getInstance(document, new FileOutputStream("hello.pdf"));
        // Créer une police chinoise
        BaseFont bfchinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
        Font fontChinese = new Font(bfchinese, 12, Font.NORMAL);
        //Troisième étape,Ouvrir le document
        document.open();
        //Quatrième étape,Écrire le contenu
        Paragraph paragraph = new Paragraph("hello world", fontChinese);
        document.add(paragraph);
        //Étape 5,Fermer le document
        document.close();
    }
}

Ouvre.hello.pdfDocumentation,Il se lit comme suit:!

a1dc335dc7e98087486f01bd22c5d613.png

2.3、 Mise en œuvre complexe

Dans le développement réel des affaires, Parce que les scénarios d'affaires sont très complexes , Et ça change vite. , Souvent, nous n'utilisons pas la méthode d'écriture décrite ci - dessus pour générer des fichiers ,C'est l'adoptionHTMLFichier converti enPDFDocumentation.

Par exemple, le reçu suivant !

f84916ea05d2d3c7dc72e0577bf5a33a.png

Comment pouvons - nous le faire rapidement? ?

Tout d'abord,,Nous adoptonshtml Écrivez une page de réception dans la langue , Commandez - le comme suit: printDemo.html,Le code source est le suivant::

<html>
 <head></head>
 <body>
  <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
  <title>Émission doc</title>
  <div>
   <div>
    <table width="100%" border="0" cellspacing="0" cellpadding="0">
     <tbody>
      <tr>
       <td height="40" colspan="2"><h3 style="font-weight: bold; text-align: center; letter-spacing: 5px; font-size: 24px;">Reçu doc</h3></td>
       <td width="12%" height="20" rowspan="2">
        <img style="width: 105px;height: 105px;" src="data:image/jpeg;base64,iVBORw0KGgoAAAANSUhEUgAAAH0AAAB9AQAAAACn+1GIAAAAqElEQVR42u3VMQ7DMAwDQP6A//8lx24qKRRw0s1yu8Uw4OQGIaHsBHUfLzzwAxCAInoZg6dI9dUUBIOyHEG56CmodAaxwtfbboLTVWpeU9+EDAH37m9CmkTYxDGUE0agMIakk3y4Ut8G37iom02M4bPniHWAtqFDTjjSGLrZvXAOmTnL1124C73r6Yo8Ane61k6eQeVjIM2h482D1RwScrpNjuH5R/0b3s6ZZNyKlt3iAAAAAElFTkSuQmCC" />
       </td>
      </tr>
      <tr>
       <td width="50%" height="30">Opérateur:xxx</td>
       <td width="50%" height="30" colspan="2">Temps de création:2021-09-14 12:00:00</td>
      </tr>
     </tbody>
    </table>
   </div>
   <div style="margin-top: 5px; margin-bottom: 6px; margin-left: 4px"></div>
   <div>
    <table width="100%"
     style="border-collapse: collapse; border-spacing: 0;border:0px;">
      <tr style="height: 25px;">
       <td style="background: #eaeaea; text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000;"
        width="10%">Numéro de série</td>
       <td style="background: #eaeaea; text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000;"
        width="30%">Produits de base</td>
       <td style="background: #eaeaea; text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000;"
        width="30%">Unité</td>
       <td style="background: #eaeaea; text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000; border-right: 1px solid #000000;"
        width="30%">Nombre</td>
      </tr>
      <tr>
       <td style="text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000;">1</td>
       <td style="text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000;">xxxGel de douche</td>
       <td style="text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000;">Box</td>
       <td style="text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000; border-right: 1px solid #000000;">3</td>
      </tr>
      <tr>
       <td style="text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000;">2</td>
       <td style="text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000;">xxxShampooing</td>
       <td style="text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000;">Box</td>
       <td style="text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000; border-right: 1px solid #000000;">4</td>
      </tr>
      <tr>
       <td style="text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000;">3</td>
       <td style="text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000;">xxxPoudre à laver</td>
       <td style="text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000;">Box</td>
       <td style="text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000; border-right: 1px solid #000000;">5</td>
      </tr>
      <tr>
       <td style="text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000; border-bottom: 1px solid #000000;">4</td>
       <td style="text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000; border-bottom: 1px solid #000000;">xxxLotion faciale</td>
       <td style="text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000; border-bottom: 1px solid #000000;">Box</td>
       <td style="text-align: center; border-left: 1px solid #000000; border-top: 1px solid #000000; border-right: 1px solid #000000; border-bottom: 1px solid #000000;">5</td>
      </tr>
    </table>
   </div>
  </div>
 </body>
</html>

Et voilà.,On vahtmlLe document a été converti enPDFDocumentation,Le code source est le suivant::

public class CreatePDFMainTest {
    /**
     * CréationPDFDocumentation
     * @param htmlStr
     * @throws Exception
     */
    private static void writeToOutputStreamAsPDF(String htmlStr) throws Exception {
        String targetFile = "pdfDemo.pdf";
        File targeFile = new File(targetFile);
        if(targeFile.exists()) {
            targeFile.delete();
        }
        //DéfinitionpdfTaille du fichier,AdoptionA4Coupe transversale
        Document document = new Document(PageSize.A4, 25, 25, 15, 40);// Gauche.、A droite、Allez.、Espacement inférieur
        // Définir le chemin de sortie
        PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(targetFile));
        PdfReportHeaderFooter header = new PdfReportHeaderFooter("", 8, PageSize.A4);
        writer.setPageEvent(header);
        writer.addViewerPreference(PdfName.PRINTSCALING, PdfName.NONE);
        document.open();
        // CSS
        CSSResolver cssResolver = new StyleAttrCSSResolver();
        CssAppliers cssAppliers = new CssAppliersImpl(new XMLWorkerFontProvider(){
            @Override
            public Font getFont(String fontname, String encoding, boolean embedded, float size, int style, BaseColor color) {
                try {
                    // Pour l'affichage en chinois Provider
                    BaseFont bfChinese = BaseFont.createFont("STSongStd-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
                    return new Font(bfChinese, size, style);
                } catch (Exception e) {
                    return super.getFont(fontname, encoding, size, style);
                }
            }
        });
        //html
        HtmlPipelineContext htmlContext = new HtmlPipelineContext(cssAppliers);
        htmlContext.setTagFactory(Tags.getHtmlTagProcessorFactory());
        htmlContext.setImageProvider(new AbstractImageProvider() {
            @Override
            public Image retrieve(String src) {
                // Prise en charge de l'affichage des images
                int pos = src.indexOf("base64,");
                try {
                    if (src.startsWith("data") && pos > 0) {
                        byte[] img = Base64.decode(src.substring(pos + 7));
                        return Image.getInstance(img);
                    } else if (src.startsWith("http")) {
                        return Image.getInstance(src);
                    }
                } catch (BadElementException ex) {
                    return null;
                } catch (IOException ex) {
                    return null;
                }
                return null;
            }
            @Override
            public String getImageRootPath() {
                return null;
            }
        });
        // Pipelines
        PdfWriterPipeline pdf = new PdfWriterPipeline(document, writer);
        HtmlPipeline html = new HtmlPipeline(htmlContext, pdf);
        CssResolverPipeline css = new CssResolverPipeline(cssResolver, html);
        // XML Worker
        XMLWorker worker = new XMLWorker(css, true);
        XMLParser p = new XMLParser(worker);
        p.parse(new ByteArrayInputStream(htmlStr.getBytes()));
        document.close();
    }
    /**
     * Lire HTML Documentation
     * @return
     */
    private static String readHtmlFile() {
        StringBuffer textHtml = new StringBuffer();
        try {
            File file = new File("printDemo.html");
            BufferedReader reader = new BufferedReader(new FileReader(file));
            String tempString = null;
            //  Lire une ligne à la fois , Jusqu'à ce qu'il soit lu null Fin du fichier
            while ((tempString = reader.readLine()) != null) {
                textHtml.append(tempString);
            }
            reader.close();
        } catch (IOException e) {
            return null;
        }
        return textHtml.toString();
    }
    public static void main(String[] args) throws Exception {
        //LirehtmlDocumentation
        String htmlStr = readHtmlFile();
        //Oui.htmlLe document a été converti enPDF
        writeToOutputStreamAsPDF(htmlStr);
    }
}

Exécuter le programme,Ouvre.pdfDemo.pdf,Les résultats sont les suivants:!

6d593845c4c4e6aa998f38c43418b676.png

2.4、 Méthode de remplacement des variables

Au - dessushtmlDocumentation, C'est ce que nous avons édité. , Pour rendre correctement .

Mais dans le développement réel des affaires, , Par exemple, le contenu de l'article suivant , Entièrement dynamique ,Toujoursxxx-202109Reçu docNom de,Et Code QR,Tout est dynamique.

À ce moment - là.,Nous pouvons adopterfreemarkerMoteur de modèle, Remplir dynamiquement le contenu en définissant des variables , Jusqu'à ce que le résultat de la conversion soit ce que nous voulons htmlPage.

Bien sûr.,Il y a un autre moyen., Voici un exemple: ,On peut aussihtml Définition dans la page ${name}Variables, Et après avoir lu le fichier , Nous avons remplacé ses variables par n'importe quelle valeur que nous voulions remplir , C'est en fait l'un des jeux les plus importants du moteur Template .

<html>
 <head>
  <meta charset="utf-8">
  <title></title>
 </head>
 <body>
  <div>Bonjour:${name}</div>
  <div>Bienvenue, Connectez - vous au site du blog </div>
 </body>
</html>

Trois、Résumé

itext Le cadre est un tiers très pratique pdf Bibliothèque de génération de fichiers , Surtout quand c'est plus simple. pdf Lorsque le contenu du fichier est rendu , Il répond entièrement à nos besoins .

Mais pour ce genre de complexité, pdfDocumentation, Nous pourrions avoir besoin de développer l'adaptation nous - mêmes . Jeu de profondeur spécifique , Vous pouvez voir itextOfficiellementAPI.

Compte tenu de la faiblesse de l'auteur, , Il y a des choses que vous ne comprenez pas. , Bienvenue à la critique des internautes !

Quatre、RÉFÉRENCES

1、La blogosphère - JAVAUtiliserItextPDF

< END >

Bonne nouvelle.,JavaGeek Technology Reader Exchange Group(La pêche est la principale activité),Intervalle de temps 2 Ouvert de nouveau après un an,Amis intéressés,Vous pouvez répondre sur le mâle:999

04a366204e72ddad9af99ecdf61ce28f.png

Oui.Partager

L'identification est- Oui.

Le soutienJe regarde

Un bouton et quatre liens,La tienne.offerMême quatre.dbdfcb7a0ec7261eef5cf4f78de9433b.gif

版权声明
本文为[Le sourire est pur.]所创,转载请带上原文链接,感谢
https://javamana.com/2021/10/20211014043912161c.html

  1. What are the new features of Java 10?
  2. What are the new features of Java 9?
  3. Is the report too ugly? Try this open source project reportplus!
  4. Spring 2021 report released: who is the real brother?
  5. À bientôt, docker.
  6. Recommend a super easy to use markdown editor
  7. Java 17 new features overview
  8. New developer friendly features after Java 8
  9. Concise and efficient eclipse collections API
  10. Practice of deploying spring boot microservices on kubernetes
  11. Garbage collectors in the new JDK: Shenandoah, ZGC and improved G1
  12. À bientôt, docker.
  13. Oracle exécute le format syntaxique d'une procédure stockée ou d'un lot
  14. [Azure Cloud Service] Azure Cloud Service ajoute des champs personnalisés pour le rôle Web (hôte IIS) (ajoute le champ user agent dans l'en - tête de demande http au Journal de sortie IIS)
  15. The Linux kernel will be implemented with the latest zstd
  16. JetBrains publishes the raw data of the developer ecosystem survey in 2021
  17. Linux 5.16 will support KVM and disable amd PSF function
  18. Linux 5.16 brings DisplayPort 2.0 initial support for amdgpu driver
  19. Announcement of the election results of the technical advisory committee of the Linux foundation in 2021
  20. Java虚拟机|JVM【适合初学者入门】
  21. Spring Cloud 2021.0.0-M2 发布
  22. [Azure Cloud Service] Azure Cloud Service ajoute des champs personnalisés pour le rôle Web (hôte IIS) (ajoute le champ user agent dans l'en - tête de demande http au Journal de sortie IIS)
  23. Spring Cloud 2021.0.0-M2 發布
  24. Java虛擬機|JVM【適合初學者入門】
  25. Spring Cloud 2021.0.0-m2 Release
  26. Machine virtuelle Java | JVM [convient aux débutants]
  27. 10412 Xiaopeng cars announced sales results in September
  28. Apprendre le mécanisme des événements Java
  29. Java script RPC (07) - timeout timeout Processing from zero
  30. Introduction à la page Web de rabbitmq (3)
  31. MySQL read - Write Separation Cluster Construction and Integration with mycat
  32. Analyse du principe du conteneur du CIO printanier
  33. Java面向对象基础
  34. Java communique avec les capteurs industriels via socket et DTu, RTU
  35. Xiaopeng automobile delivered 10412 units in September, with a monthly sales volume of more than 10000 for the first time
  36. Java Object Oriented Foundation
  37. Introduction au développement Android PDF, un tour pour vous apprendre à comprendre netty
  38. Hadoop Foundation - 01 - concepts de base
  39. Hadoop Foundation - 02 - Basic Structure
  40. Hadoop Foundation - 03 - hdfs (Hadoop Distributed File System) Basic Concepts
  41. Hadoop Foundation - 04 - hdfs API Programming
  42. Hadoop Foundation - 05 - hdfs Project (word Frequency Statistics)
  43. Hadoop Foundation - 06 - hdfs Data Read and write
  44. The "monthly test" report card of the new car built under the lack of core: Xiaopeng and Weilai took the lead in "breaking 10000", and the ideal plummeted by 25%
  45. Introduction to making arch linux software package
  46. Hard core observation 407 HTTPS everywhere browser extension is about to retire
  47. How to use busybox on Linux
  48. In 2021, the talent incentive plan of Linux foundation open source software School Park was officially launched
  49. It's not windows or Linux. Shrink is the "God operating system"
  50. Install anydesk on Ubuntu Linux
  51. 2021, can we recommend using Linux to play games?
  52. not exist:org.springframework.kafka.listener.AbstractMessageListenerContaingetContainerProperties()
  53. Are you sure HTTPS is asymmetric encryption for content encryption? See the answers and reasons
  54. MySQL online slow log query
  55. Java JDK server installation
  56. 手把手教你使用Java开发在线生成pdf文档
  57. Questions d'entrevue dans la base de données MySQL (dernière version 2021)
  58. Java零基础小白入门必做题汇总(建议收藏)第一篇
  59. Day15 Java Foundation
  60. Day16 Java Foundation