zoukankan      html  css  js  c++  java
  • 使用iText5.x创建PDF中文处理问题

    今天无意中在网上看到iText这个东东,iText 是利用Java 来操作PDF 操作的一种开源API

    简单说明下使用该API创建PDF文件的过程

    PS:使用的是iText5.x版本

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /**
         * 创建PDF文件
         * @param filePath  文件路径
         * @param content   需要写入的内容
         * @throws DocumentException
         * @throws IOException
         */
        public void createPdf(String filePath ,String content) throws DocumentException, IOException{
            //1.创建Document对象
            Document document = new Document();
            FileOutputStream fos = new FileOutputStream(filePath);
            //2.创建一个PdfWriter实例
            PdfWriter.getInstance(document, fos);
            //3.打开文档
            document.open();
            Paragraph graph = new Paragraph(content);
            //4.加入段落
            document.add(graph);
            //5.关闭文档
            document.close();
        }

    利用上述程序,运行结果。发现,只有英文部分被写入,中文部分无法被写入。百度得到结论:

    需要加入itextasian.jar包,itextasian.jar包有实现了对中文字体的支持。因此加载itextasian.jar到classpath下。

    在上述代码中加入如下代码:

    1
    2
    3
    BaseFont baseFontChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            Font fontChinese =  new  Font(baseFontChinese , 12 , Font.NORMAL);
            Paragraph graph = new Paragraph(content , fontChinese);

    运行,得到如下异常:

    Font 'STSong-Light' with 'UniGB-UCS2-H' is not recognized

    还是不行,继续研究,在网上前辈们说如下原因:

      iText5.x版本以上中的font和encoding文件都是从String RESOURCE_PATH = "com/itextpdf/text/pdf/fonts/"加载的,而老itextasian.jar的包名是com.lowagie.text.pdf.fonts, 包名不一致导致路径错误,。

    具体解决方法就是修改包的路径了,详细方法如下:

    1.解压iTextAsian.jar
      得到如下目录:
      iTextAsian
         --com
            --lowagie
              --text
                --pdf
                  --fonts
                    --...(字体属性文件)
    2.将解压后的com目录下的包名lowagie更改为itextpdf
    3.在命令行转至iTextAsian目录,重新打包为iTextAsian.jar文件
    4.打包命令如下:
      jar cvf iTextAsian.jar com/itextpdf/text/pdf/fonts/*
    5.执行后,将新的iTextAsian.jar加入classpath路径

    运行结果,OK,解决问题。

    最终代码如下:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    /**
         * 创建PDF文件
         * @param filePath  文件路径
         * @param content   需要写入的内容
         * @throws DocumentException
         * @throws IOException
         */
        public void createPdf(String filePath ,String content) throws DocumentException, IOException{
            //1.创建Document对象
            Document document = new Document();
            FileOutputStream fos = new FileOutputStream(filePath);
            //2.创建一个PdfWriter实例
            PdfWriter.getInstance(document, fos);
            //3.打开文档
            document.open();
            BaseFont baseFontChinese = BaseFont.createFont("STSong-Light", "UniGB-UCS2-H", BaseFont.NOT_EMBEDDED);
            Font fontChinese =  new  Font(baseFontChinese , 12 , Font.NORMAL);
            Paragraph graph = new Paragraph(content , fontChinese);
            document.add(graph);
            document.close();
        }

     继续研究ing~~

  • 相关阅读:
    Matlab Tricks(二十九) —— 使用 deal 将多个输入赋值给多个输出
    释名 —— 名称的含义、来源
    Eclipse快捷键 今天又学会了几个不常用的 收藏了
    HDU 2527
    UVAlive 2326 Moving Tables(贪心 + 区间问题)
    STM32关于优先级设定的理解 NVIC_SetPriority()
    linux6.2安装mysql
    【PAT】1009. Product of Polynomials (25)
    Android的重力传感器(3轴加速度传感器)简单实例
    out/target/common/obj/PACKAGING/public_api.txt android.view.KeyEvent.KEYCODE_has changed value from
  • 原文地址:https://www.cnblogs.com/jackydalong/p/2480559.html
Copyright © 2011-2022 走看看