前提是PDF里面是有文字的!

一次性取得所有页内容:

        /// <summary>
/// 改进前取得所有页的所有word
/// </summary>
/// <param name="pdfFilePath"></param>
/// <param name="txtDirectoryPath"></param>
public static void ConvertPdfToTxt(string pdfFilePath, string txtDirectoryPath)
{
CAcroAVDoc avDoc = (Acrobat.CAcroAVDoc)Microsoft.VisualBasic.Interaction.CreateObject("AcroExch.AVDoc"); //set AVDoc object
CAcroPDDoc pdDoc;
//open the PDF
if (avDoc.Open(pdfFilePath, ""))
{
pdDoc = (CAcroPDDoc)avDoc.GetPDDoc();
Object jsAcroObj = pdDoc.GetJSObject();
Type T = jsAcroObj.GetType();
object[] saveAsParam = { txtDirectoryPath, "com.adobe.acrobat.accesstext" };
T.InvokeMember("saveAs",
BindingFlags.InvokeMethod |
BindingFlags.Public |
BindingFlags.Instance,
null, jsAcroObj, saveAsParam);
object[] closeDocParam = { true };
T.InvokeMember("closeDoc",
BindingFlags.InvokeMethod |
BindingFlags.Public |
BindingFlags.Instance,
null, jsAcroObj, closeDocParam); if (!avDoc.Close()) avDoc.Close();
}
}

逐页取出:

        /// <summary>
/// 改进后取得每一页的所有word
/// </summary>
/// <param name="pdDoc"></param>
/// <returns></returns>
public static List<KeyValuePair<String, String>> PdDocGetText(AcroPDDoc pdDoc)
{
List<KeyValuePair<String, String>> txt = new List<KeyValuePair<string, string>>();
AcroPDPage page;
int pages = pdDoc.GetNumPages();
string pageText = "";
for (int i = ; i < pages; i++)
{
page = (AcroPDPage)pdDoc.AcquirePage(i);
object jso, jsNumWords, jsWord;
List<string> words = new List<string>();
try
{
jso = pdDoc.GetJSObject();
if (jso != null)
{
object[] args = new object[] { i };
jsNumWords = jso.GetType().InvokeMember("getPageNumWords", System.Reflection.BindingFlags.InvokeMethod, null, jso, args, null);
int numWords = Int32.Parse(jsNumWords.ToString());
for (int j = ; j <= numWords; j++)
{
object[] argsj = new object[] { i, j, false };
jsWord = jso.GetType().InvokeMember("getPageNthWord", System.Reflection.BindingFlags.InvokeMethod, null, jso, argsj, null);
words.Add((string)jsWord);
}
}
foreach (string word in words)
{
//取得当前page内容
pageText += word;
}
}
catch
{
} //当前页内容加入list
txt.Add(new KeyValuePair<string, string>((i + ).ToString(), pageText));
pageText = ""; jso = null;
}
return txt;
}

在这个基础之上我们再写一些比如搜索PDF内容的功能就容易多了吧。

补充:这里有一个问题,当遇到PDF排版是纵向的时候,读出来的是乱码,因为行是横向的。这个困扰我很久了,大家如果有思路的话可以说出来交流一下。

PDF抽取文字 C# with Adobe API的更多相关文章

  1. PDF转图片 C# with Adobe API

    PDF转图片大概有十几种方式,褒贬不一,我就详细给大家说一下我认为效率最高的方式,使用Adobe官方的SDK 安装acrobat reader 9.0以上即可,勾选如下组件.

  2. 自动生成pdf书签(仅适用于Adobe Acrobat on windows )

    必备软件 1.Adobe Acrobat. 2.AutoBookmark 为adobe acrobat的自动生成书签的插件(我用的这个:AutoBookmark Standard Plug-in),下 ...

  3. C# 使用itextsharp 读取pdf中文字坐标

      程序调用: using iTextSharp.text.pdf; using System; using System.Collections.Generic; using System.Linq ...

  4. 使用PDFminer3k解析pdf为文字遇到:WARING:root:GBK-EUC-H

    最近需要把PDF解析为文字,查了查python的模块,发现PDFminer3k能满足需求.我使用的是 windows平台下的python3.6,python2的则下载pdfminer. 首先下载:直接 ...

  5. c# iText 生成PDF 有文字,图片,表格,文字样式,对齐方式,页眉页脚,等等等,

    #region 下载说明书PDF protected void lbtnDownPDF_Click(object sender, EventArgs e) { int pid = ConvertHel ...

  6. 开发笔记:PDF生成文字和图片水印

    背景 团队手里在做的一个项目,其中一个小功能是用户需要上传PDF文件到文件服务器上,都是一些合同或者技术评估文档,鉴于知识版权和防伪的目的,需要在上传的PDF文件打上水印, 这时候我们需要提供能力给客 ...

  7. Ubuntu下安装PDF 文档阅读器Adobe Reader 9.5.5

    由于没有PPA所以我们必须在Adobe的官方FTP上下载安装,下面的方法同时适用于32位和64位系统: wget ftp://ftp.adobe.com/pub/adobe/reader/unix/9 ...

  8. Java编辑PDF写入文字 插入图片

    package com.test; import com.itextpdf.text.BaseColor; import com.itextpdf.text.Font; import com.itex ...

  9. 凸优化 Convex Optimization PDF 扫描文字识别版

    凸优化理论 Convex Optimization 清华大学出版社 王书宁许窒黄晓霖译 Stephen Boyd Lieven Vandenbergt原著 2013 年l 月第1 版 下载链接 链接: ...

随机推荐

  1. 23讲 URL

    这是看完23讲后的小笔记,关于URL规则.伪静态. 一.URL规则 2.此处的区分大小写,也只是对第一个字母区分,并非对整个模块名. 3.模块名复杂时,且区分大小写,此时在地址栏访问时要用" ...

  2. 应用程序无法正常启动0xc0150002 解决方式

        我也遇到过此问题,解决的方法: 方案一: 在项目的"属性|配置属性|链接器|常规"中的"启用增量链接"选择"否".此方法阻断了问题产 ...

  3. Decode Ways -- LeetCode

    原题链接: http://oj.leetcode.com/problems/decode-ways/  这道题要求解一个数字串依照字符串编码方式可解析方式的数量.看到这样的求数量的,我们非常easy想 ...

  4. 【Java】通过DES加密和解密工具,对字符串进行加密和解密操作

    分享一个非常不错的字符串加密和解密的程序. 可以指定不同的密钥对同一字符串进行不同的加密操作,增强加密性能. Java代码如下: package com.app; import java.securi ...

  5. CCControlSlider和CCControlStepper用法

    一开始,size的大小是系统分配.玩家可以通过setDefaultSize()更改值 1. CCControlSlider用法 CCSpriteFrameCache::sharedSpriteFram ...

  6. Google Map API v2 (四)----- 导航路径

    仍然是建议个异步小任务 private GetPathTask mGetPathTask = null; private void getGuidePath(LatLng origin){ if(mG ...

  7. vim 编辑器笔记

    vim 编辑器 命令模式(默认),尾行模式 : / 两种方式 (Esc比较慢,连续连词esc,删除全部尾行内容),编辑模式 a,i,o,s :q 退出编辑不保存 :wq 保存编辑并退出 :w 保存并写 ...

  8. html 之前学习响应式的笔记

    响应式的设计,根据用户设备的不同,用户屏幕大小不同,提供不同的网页设计http://mediaqueri.es/PhoneGap 使用2,如何模拟手机设备chome 浏览器 在32以上设备检测用 de ...

  9. 解决Visual Studio 找不到报表控件、rdlc中文乱码

    找回报表控件 运行安装程序中的 ..\packages\Reporting Services\RVAddon.msi 工具栏,右键选择ReportViewer,注意选择的版本 如果不能编辑报表文件(. ...

  10. java-字符串学习总结

    Java字符串类(java.lang.String)是Java中使用最多的类,也是最为特殊的一个类. String 类相关基础认知: 1.String类是final的,不可被继承.public fin ...