XPdf实现pdf转txt格式方法实现

近期在弄一个项目,需要将pdf文档的每一个段落关键字提取出来。很直接的想法就是先将pdf先转成txt,再把txt每个段落抓出来。网上看了下,绝大多数人都是用的pdfbox这个java类库。网上的源码实现很多,大同小异,随便拿一个来用都行。发现转倒是能转,可是原来的pdf格式全不见了是什么鬼,莫名其妙地给我多了很多空格,什么段落顶格全没了,乱七八糟的排版,这样我怎么将txt中的每个段落提取出来啊!!!!

上网查了很久,发现这是个很经典的问题,貌似很多人都是这个问题。pdfbox会自动在某些读取文字中加入一些格式,比如回车、空格等,造成了很不好的效果。什么itext、pdfbox都是这个问题。我甚至去下了一个专门pdf格式转换的软件,转出来的效果那也是一个惨不忍睹(专业的都这样,那还有什么搞头)。就在我决定放弃的时候,看到一篇很古老的博客有说用到XPdf能比较好解决这个问题。那还说什么,马上开始试验。

一、XPDF的配置

1.我下载的是: xpdfbin-win-3.04.zip

另外还需要一个语言包:xpdf-chinese-simplified.tar.gz

2.工作路径设置 

在本文中以 c:\xpdftest\xpdf 作为xpdf的工作路径。 将 xpdfbin-win-3.04.zip 解压到 c:\xpdftest\xpdf 下。 将 xpdf-chinese-simplified.tar.gz 解压到 c:\xpdftest\xpdf\xpdf-chinese-simplified 下。


3.修改配置文件 

为了启用中文简体语言包,必须将 xpdf-chinese-simplified 目录下的 sample-xpdfrc 文件进行如下配置,并将其另存为 xpdfrc 文件 。

 注意:此文件为配置文件,而且名称必须是 xpdfrc 。如果是别的名字,即使调用 pdftotext.exe 时,传入 ” -cfg xpdfrc2 ” 来告诉 xpdf 配置文件的名字,好像 pdftotext.exe 也并没有使用这个配置文件。所以为了减少误解,请您将配置文件直接命名为 xpdfrc 。


 修改 sample-xpdfrc 文件之一 

在文件后面 加上一段话 :

 Txt代码

  1. #----- begin Chinese Simplified support package (2004-jul-27)  
  2.   
  3. cidToUnicode     Adobe-GB1  C:/xpdftest/xpdf/xpdf-chinese-simplified/Adobe-GB1.cidToUnicode  
  4.   
  5. unicodeMap ISO-2022-CN     C:/xpdftest/xpdf/xpdf-chinese-simplified/ISO-2022-CN.unicodeMap  
  6.   
  7. unicodeMap EUC-CN       C:/xpdftest/xpdf/xpdf-chinese-simplified/EUC-CN.unicodeMap  
  8.   
  9. unicodeMap GBK      C:/xpdftest/xpdf/xpdf-chinese-simplified/GBK.unicodeMap  
  10.   
  11. cMapDir      Adobe-GB1  C:/xpdftest/xpdf/xpdf-chinese-simplified/CMap  
  12.   
  13. toUnicodeDir                 C:/xpdf/chinese-simplified/CMap  
  14.   
  15. #displayCIDFontTT   Adobe-GB1  /usr/..../gkai00mp.ttf  
  16.   
  17. #----- end Chinese Simplified support package  

注意:路径要跟自己配置的一样。


修改 sample-xpdfrc 文件之二

 另外,配置文件中原先没有加上一个“ textPageBreaks ”控制。为了避免这个分页符号,我们需要在 sample-xpdfrc 文件 “ text output control ”下面 加上一段话 : Txt代码

  1. # If set to "yes", text extraction will  insert  page  
  2. # breaks  (form feed characters) between pages.  This  
  3. # defaults to "yes".  
  4. textPageBreaks      no 

设置 textPageBreaks 为 no 的意思是:在 PDF 文档的两页之间不加入分页符号。 之所以这样,是因为这个符号有时候会引起 SAX 解析 XML 上的困难。

 

 

  • 修改 sample-xpdfrc 文件之三

配置文件中原先把 textEncoding 注释了。这样默认的字符集是 Latin1 。我们必须打开它,并且就是指定 textEncoding UTF-8 ,而不是 GB2312 。即修改这句话 :

Txt代码
  1. textEncoding        UTF-8  


好了,配置弄好后就该代码实现了,代码不难,下面贴上来。


TestPdfToText.java

Java代码
  1. package pdfToText;  
  2. public class TestPdfToText {  
  3.   
  4.     /** 
  5.      * @param args 
  6.      */  
  7.     public static void main(String[] args) {  
  8.         String rootPath = "c:\\061231";  
  9.         //pdf文件路径  
  10.         String pdffile = rootPath + ".pdf";  
  11.         //用xpdf生成的txt文件路径  
  12.         String xpdfToTxtfile = rootPath + "_xpdf.txt";  
  13.         //XPDF  
  14.         try{  
  15.             long begin = System.currentTimeMillis();   
  16.             XpdfToText xpToTxt = new XpdfToText(pdffile);  
  17.             xpToTxt.toTextFile(xpdfToTxtfile);  
  18.             long end = System.currentTimeMillis();   
  19.             System.out.println("xpdf\t cost:\t" + (end - begin) + " ms");  
  20.         }catch(Exception e){  
  21.             e.printStackTrace();  
  22.         }    
  23.     }  
  24. }  

XpdfToText.java

  1. package pdfToText;  
  2.   
  3. import java.io.File;  
  4. import java.io.IOException;  
  5.   
  6. public class XpdfToText {  
  7.     // PDF文件名  
  8.     private File pdffile;  
  9.     // 转换器的存放位置,默认在c:\xpdftest\xpdf下面  
  10.     private String CONVERTOR_STORED_PATH = "c:\\xpdftest\\xpdf\\";  
  11.     // 转换器的名称,默认为pdftotext  
  12.     private String CONVERTOR_NAME = "pdftotext";  
  13.   
  14.     // 构造函数,参数为pdf文件的路径  
  15.     public XpdfToText(String pdffile) throws IOException {  
  16.         this.pdffile = new File(pdffile);  
  17.     }  
  18.   
  19.     // 将pdf转为文本文档,参数为目标文件的路径  
  20.     public void toTextFile(String targetfile) throws IOException {  
  21.         toTextFile(targetfile, true);  
  22.     }  
  23.   
  24.     // 将pdf转为文本文档,参数1为目标文件的路径,  
  25.     // 参数2为true则表示使用PDF文件中的布局  
  26.     public void toTextFile(String targetfile, boolean isLayout)  
  27.             throws IOException {  
  28.         String[] cmd = getCmd(new File(targetfile), isLayout);  
  29.         Runtime.getRuntime().exec(cmd);  
  30.     }  
  31.   
  32.     // 获取PDF转换器的路径  
  33.     public String getCONVERTOR_STORED_PATH() {  
  34.         return CONVERTOR_STORED_PATH;  
  35.     }  
  36.   
  37.     // 设置PDF转换器的路径  
  38.     public void setCONVERTOR_STORED_PATH(String path) {  
  39.         if (!path.trim().endsWith("\\"))  
  40.             path = path.trim() + "\\";  
  41.         this.CONVERTOR_STORED_PATH = path;  
  42.     }  
  43.   
  44.     // 解析命令行参数  
  45.     private String[] getCmd(File targetfile, boolean isLayout) {  
  46.   
  47.         // 命令字符  
  48.         String command = CONVERTOR_STORED_PATH + CONVERTOR_NAME;  
  49.         // PDF文件的绝对路径  
  50.         String source_absolutePath = pdffile.getAbsolutePath();  
  51.         // 输出文本文件的绝对路径  
  52.         String target_absolutePath = targetfile.getAbsolutePath();  
  53.         // 保持原来的layout  
  54.         String layout = "-layout";  
  55.         // 设置编码方式  
  56.         String encoding = "-enc";  
  57.         String character = "GBK";  
  58.         // 设置不打印任何消息和错误  
  59.         String mistake = "-q";  
  60.         // 页面之间不加入分页  
  61.         String nopagebrk = "-nopgbrk";  
  62.         // 如果isLayout为false,则设置不保持原来的layout  
  63.         if (!isLayout)  
  64.             layout = "";  
  65.         return new String[] { command, layout, encoding, character, mistake,  
  66.                 nopagebrk, source_absolutePath, target_absolutePath };  
  67.     }  
  68. }  
运行结果还是挺可观的,如下图,格式什么的还是在的。




附上项目源码下载地址

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: Poppler是一个用于解析PDF文档的开源库,它提供了一系列的API函数供开发者使用。而Qt是一个跨平台的应用程序开发框架,可以用于开发图形界面应用程序。当我们使用Linux系统,并借助Qt框架进行应用程序开发时,可以使用Poppler库实现PDF阅读器的功能。 使用Poppler库,我们可以将PDF文档解析为一系列的页面,然后在Qt的界面上进行显示和操作。通过Qt的绘图功能,可以将PDF页面渲染为图像,并在界面中显示。同时,我们也可以使用Poppler提供的API函数,实现PDF文档的页面切换、缩放、搜索等操作。 在实现PDF阅读器功能时,我们首先需要在Qt项目中引入Poppler库。然后,通过调用Poppler提供的函数,加载PDF文档,获取并渲染PDF页面,并显示在Qt的界面上。可以通过Qt提供的滚动区域和按钮等控件,实现页面切换的功能。通过输入框等控件,实现PDF文档的搜索功能。另外,可以添加缩放功能,使用户能够放大或缩小PDF页面。 使用Linux系统并结合Qt和Poppler库实现PDF阅读器,可以提供功能丰富、易用的界面,使用户可以方便地阅读和操作PDF文档。同时,开放源代码的特性也使得我们可以根据实际需求对PDF阅读器进行二次开发和定制,满足不同用户的需求。 ### 回答2: Linux Qt 是一个开源的跨平台的应用程序开发框架,而 Poppler 是一个广泛用于处理 PDF 文件的库。通过结合使用 Linux Qt 和 Poppler,可以实现功能强大的 PDF 阅读器。 Poppler 库是在 Xpdf 项目的基础上发展而来的,它提供了各种用于解析和渲染 PDF 文件的函数和工具。在 Linux Qt 中使用 Poppler,可以方便地实现PDF 文件的加载、解析和渲染。 首先,我们需要在 Linux Qt 项目中引入 Poppler 库。可以通过在项目的配置文件中添加相应的依赖项来实现。然后,在代码中使用 Poppler 的接口来读取和处理 PDF 文件。 通过调用 Poppler 提供的函数,我们可以实现以下功能: 1. 加载 PDF 文件:使用 Poppler 的函数,可以从文件系统中加载选定的 PDF 文件,并将其读取到内存中进行处理。 2. 解析 PDF 内容:Poppler 提供了解析 PDF 文档的功能,可以分析文件的结构、页面、文本和图像等内容。通过解析 PDF 文档,可以实现对页面、文字和图像的访问和处理。 3. 渲染 PDF 页面:Poppler 支持将 PDF 页面渲染为 QImage 或者 QPixmap 对象,以便在 Linux Qt 中显示和操作。通过渲染页面,可以实现PDF 页面的放大、缩小、旋和平移等操作。 4. 实现用户交互:通过 Linux Qt 提供的用户界面组件,可以实现PDF 阅读器的用户交互功能,比如页面滚动、缩放、搜索和标注等。同时,结合 Poppler 提供的函数,可以实现PDF 内容的选择、复制和粘贴等操作。 总之,通过结合使用 Linux Qt 和 Poppler,我们可以方便地实现功能丰富的 PDF 阅读器。Linux Qt 提供了丰富的界面交互组件,而 Poppler 则提供了强大的 PDF 处理功能,这使得我们能够开发出易用性高、功能强大的 PDF 阅读器应用程序。 ### 回答3: Linux Qt 使用 Poppler 实现 PDF 阅读器可以通过以下步骤进行: 1. 首先,需要安装 Qt 并设置开发环境。Qt 是一个跨平台的应用程序开发框架,可以用于构建图形用户界面和应用程序。可以从 Qt 官网下载并安装 Qt。 2. 接下来,需要安装 Poppler 库。Poppler 是一个开源的 PDF 渲染库,可以用于提取和渲染 PDF 文件的内容。可以通过 package manager(例如 apt-get 或 yum)在 Linux 中安装 Poppler 库。 3. 打开 Qt 开发环境,创建一个新的项目。可以选择一个基本的 Qt Widgets 应用程序模板。 4. 导入 Poppler 库的头文件和链接库。在 Qt 项目的.pro 文件中添加对应的头文件路径和链接库名。例如: ``` INCLUDEPATH += /usr/include/poppler LIBS += -lpoppler-qt5 ``` 5. 创建一个 QWidget 作为 PDF 阅读器的主窗口。可以使用 QWidget 或 QMainWindow 类作为主窗口,并添加显示 PDF 页面的组件(例如 QScrollArea 或 QPainter)。 6. 在窗口中创建一个按钮或菜单项,用于打开 PDF 文件。当用户点击该按钮时,可以调用 Poppler 库来加载和解析 PDF 文件,并将每个页面渲染到 QWidget 中的组件上。 7. 实现页面导航功能。可以添加翻页按钮或滚动条来切换显示不同的 PDF 页面。在按钮点击事件或滚动条值改变事件中,调用 Poppler 库来渲染并显示相应的页面。 8. 可以进一步实现搜索、缩放、打印等功能,通过调用 Poppler 提供的相应函数来实现。 9. 最后,构建和运行项目。可以使用 Qt Creator 进行构建和调试。在 Linux 终端中导航到项目目录,并使用 qmake 来生成 Makefile,然后使用 make 命令编译项目。 通过以上步骤,我们可以在 Linux Qt 上实现一个简单的 PDF 阅读器,并使用 Poppler 库来加载、解析和渲染 PDF 文件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值