天道酬勤,学无止境

Get ONLY word count from PDF document

I was hoping to get just the word count from a pdf document programmatically.

I've looked at PDFSharp, but it's awefully bulky for what I want to do. I don't have access to the server, so I can't install acrobat to get to their api's or anything. I'd be willing to do it in iTextSharp or another tool.

标签

评论

iTextSharp has a wonderful PdfTextExtractor object that will get you all of the text (assumming as @Rob A pointed out that its actually stored as text and not images or pure vector). Once you've got all of the text a simple RegEx will give you the word count.

The code below should do it for you. (Tested on iText 5.1.1.0)

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.IO;
using iTextSharp.text.pdf.parser;

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            string InputFile = System.IO.Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.Desktop), "Input.pdf");

            //Get all the text
            string T = ExtractAllTextFromPdf(InputFile);
            //Count the words
            int I = GetWordCountFromString(T);

        }

        public static string ExtractAllTextFromPdf(string inputFile)
        {
            //Sanity checks
            if (string.IsNullOrEmpty(inputFile))
                throw new ArgumentNullException("inputFile");
            if (!System.IO.File.Exists(inputFile))
                throw new System.IO.FileNotFoundException("Cannot find inputFile", inputFile);

            //Create a stream reader (not necessary but I like to control locks and permissions)
            using (FileStream SR = new FileStream(inputFile, FileMode.Open, FileAccess.Read, FileShare.Read))
            {
                //Create a reader to read the PDF
                iTextSharp.text.pdf.PdfReader reader = new iTextSharp.text.pdf.PdfReader(SR);

                //Create a buffer to store text
                StringBuilder Buf = new StringBuilder();

                //Use the PdfTextExtractor to get all of the text on a page-by-page basis
                for (int i = 1; i <= reader.NumberOfPages; i++)
                {
                    Buf.AppendLine(PdfTextExtractor.GetTextFromPage(reader, i));
                }

                return Buf.ToString();
            }
        }
        public static int GetWordCountFromString(string text)
        {
            //Sanity check
            if (string.IsNullOrEmpty(text))
                return 0;

            //Count the words
            return System.Text.RegularExpressions.Regex.Matches(text, "\\S+").Count;
        }
    }
}

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 使用Python搜索PDF中的文本?(Searching text in a PDF using Python?)
    问题 问题我正在尝试通过搜索文本(最好使用python)来确定文档的类型(例如,恳求,信函,传票等)。 所有PDF都是可搜索的,但是我还没有找到使用python解析它并应用脚本来搜索它的解决方案(缺少先将其转换为文本文件的方法,但是对于n个文档而言可能会占用大量资源)。 到目前为止我做了什么我研究了pypdf,pdfminer,adobe pdf文档,以及在这里可以找到的任何问题(尽管似乎没有一个问题可以直接解决此问题)。 PDFminer似乎最具潜力,但是在阅读了文档之后,我什至不知道从哪里开始。 是否有一种简单有效的方法来按页面,行或整个文档读取PDF文本? 或任何其他解决方法? 回答1 这被称为PDF挖掘,并且非常困难,因为: PDF是设计用于打印而非解析的文档格式。 在PDF文档中,文本没有特别的顺序(除非顺序对于打印很重要),在大多数情况下,原始文本结构都丢失了(字母不能分组,单词和单词也不能按句子分组)它们放置在纸张中通常是随机的)。 有大量生成PDF的软件,其中许多都是有缺陷的。 诸如PDFminer之类的工具使用试探法根据字母和单词在页面中的位置再次对其进行分组。 我同意,界面是相当低的级别,但是当您知道他们要解决的问题时,它就更有意义了(最后,重要的是选择字母/单词/行必须与邻居接近的顺序)视为段落的一部分)。 一个昂贵的选择(就时间/计算机功能而¨
  • 从PDF提取数据并添加到工作表(Extract Data from PDF and Add to Worksheet)
    问题 我正在尝试将PDF文档中的数据提取到工作表中。 PDF显示和文本可以手动复制并粘贴到Excel文档中。 我目前正在通过SendKeys进行此操作,但无法正常工作。 尝试从PDF文档粘贴数据时出现错误。 为什么我的粘贴不起作用? 如果我在宏停止运行后粘贴,它将正常粘贴。 Dim myPath As String, myExt As String Dim ws As Worksheet Dim openPDF As Object 'Dim pasteData As MSForms.DataObject Dim fCell As Range 'Set pasteData = New MSForms.DataObject Set ws = Sheets("DATA") If ws.Cells(ws.Rows.Count, "A").End(xlUp).Row > 1 Then Range("A3:A" & ws.Cells(ws.Rows.Count, "A").End(xlUp).Row).ClearContents myExt = "\*.pdf" 'When Scan Receipts Button Pressed Scan the selected folder/s for receipts For Each fCell In Range(ws.Cells(1, 1), ws
  • 使用Java和Itext编辑PDF文本(Editing PDF text using Java and Itext)
    问题 有什么方法可以编辑PDF文档文本? 喜欢查找和替换特定文本? 我有一个PDF文档,其中包含需要识别和替换或仅删除该文本的文本的占位符。 我能够使用特定的坐标(x,y)编辑pdf,但无法识别和替换。 我看到的所有库都是从头开始创建PDF并具有小的编辑功能。 无论如何,我可以使用itext进行上述编辑吗? 请指教...谢谢! **示例:pdf文档包含以下段落。 在这一段中,我需要将DATE:和FROM:标识为文本并将其替换为其他内容。 最古老的古典希腊语和拉丁语文字之间或其他文字之间几乎没有空格,也可能以ousophordon(交替方向)书写。 随着时间的流逝,文本方向(从左到右)变得标准化,并且单词分隔符和终端标点符号也变得很普遍。 **日期:发件人:将句子分成组的第一种方法是原始的paraos,类似于新组开始时的下划线-------------------- --------------------------------------- ** 回答1 请允许我复制本书第6章的简介: 当我写关于iText的第一本书时,出版商不喜欢副标题“创建和处理PDF”。 由于某些贬义性的含义,他不喜欢“操纵”一词。 如果您查阅Yahoo!上的字典! 教育,您将找到以下定义: 巧妙地或巧妙地影响或管理篡改或篡改以谋取私利显然,这不是本书要讲的。 出版商建议将“创建和编辑PDF”作为更好的字幕
  • ReportViewer-隐藏PDF导出(ReportViewer - Hide PDF Export)
    问题 我在VB.Net 2005应用程序中使用了ReportView组件。 如何禁用PDF导出功能,仅保留MS Excel格式? 回答1 我遇到了完全相同的问题,并使用下面的C#方法解决了: public void DisableUnwantedExportFormat(ReportViewer ReportViewerID, string strFormatName) { FieldInfo info; foreach (RenderingExtension extension in ReportViewerID.LocalReport.ListRenderingExtensions()) { if (extension.Name == strFormatName) { info = extension.GetType().GetField("m_isVisible", BindingFlags.Instance | BindingFlags.NonPublic); info.SetValue(extension, false); } } } 并在page_load上: DisableUnwantedExportFormat(ReportViewer1, "PDF"); 回答2 这是禁用导出选项的方法,只需将除Excel以外的所有选项都标记为false。
  • NLP主题模型:LDA 隐含狄利克雷分布,用Python+sklearn实现
    title: 2019-10-21NLP主题模型:LDA 隐含狄利克雷分布,用Python+sklearn实现 tags: python, LDA, sklearn, gensim author: Valuebai Introduction Topic Models, in a nutshell, are a type of statistical language models used for uncovering hidden structure in a collection of texts. In a practical and more intuitively, you can think of it as a task of: Dimensionality Reduction, where rather than representing a text T in its feature space as {Word_i: count(Word_i, T) for Word_i in Vocabulary}, you can represent it in a topic space as {Topic_i: Weight(Topic_i, T) for Topic_i in Topics} Unsupervised Learning, where it can be
  • How to get the number of pages in a Word Document on linux?
    I saw this question PHP - Get number of pages in a Word document . I also need to determine the pages count from given word file (doc/docx). I tried to investigate phplivedocx/ZF (@hobodave linked to those in the original post answers), but I lost my hands and legs there. I can't use any outer web service either (like DOC2PDF sites, and then count the pages in the PDF version, or so...). Simply: Is there any php code (using ZF or anything else in PHP, excluding COM object or other execution-files, such 'AbiWord'; I'm using shared Linux server, without exec or similar function), to find the
  • 如何计算文档中的行数?(How to count lines in a document?)
    问题 我有这样的台词,我想知道我实际上有几行... 09:16:39 AM all 2.00 0.00 4.00 0.00 0.00 0.00 0.00 0.00 94.00 09:16:40 AM all 5.00 0.00 0.00 4.00 0.00 0.00 0.00 0.00 91.00 09:16:41 AM all 0.00 0.00 4.00 0.00 0.00 0.00 0.00 0.00 96.00 09:16:42 AM all 3.00 0.00 1.00 0.00 0.00 0.00 0.00 0.00 96.00 09:16:43 AM all 0.00 0.00 1.00 0.00 1.00 0.00 0.00 0.00 98.00 09:16:44 AM all 0.00 0.00 0.00 0.00 0.00 0.00 0.00 0.00 100.00 09:16:45 AM all 2.00 0.00 6.00 0.00 0.00 0.00 0.00 0.00 92.00 有没有一种方法可以使用linux命令对它们进行计数? 回答1 使用wc : wc -l <filename> 这将输出<filename>的行数: $ wc -l /dir/file.txt 3272485 /dir/file.txt 或者,要从结果中省略<filename>
  • 如何调试损坏的 docx 文件?(How can I debug a corrupt docx file?)
    问题 我有一个问题,其中 .doc 和 .pdf 文件可以正常显示,但 .docx 文件已损坏。 为了解决这个问题,我正在尝试调试 .docx 损坏的原因。 我了解到 docx 格式在额外字符方面比 .pdf 或 .doc 更严格。 因此,我搜索了 docx 文件中的各种 xml 文件,以寻找无效的 XML。 但我找不到任何。 这一切都验证得很好。 有人可以建议我现在调查的方向吗? 更新: 文件夹内文件的完整列表如下: /_rels .rels /customXml /_rels .rels item1.xml itemProps1.xml /docProps app.xml core.xml /word /_rels document.xml.rels /media image1.jpeg /theme theme1.xml document.xml fontTable.xml numbering.xml settings.xml styles.xml stylesWithEffects.xml webSettings.xml [Content_Types].xml 更新 2: 我还应该提到损坏的原因几乎可以肯定是代表我发布了一个错误的二进制文件。 为什么 docx 文件被二进制文件损坏,但 .doc 和 .pdf 没问题? 更新 3: 我已经尝试了演示各种 docx 修复工具。
  • 将PDF转换为DOC(Python / Bash)(Convert PDF to DOC (Python/Bash))
    问题 我看到了一些页面,这些页面允许用户上传PDF并返回DOC文件,例如PdfToWord 是否可以使用Python或任何Unix命令将PDF文件转换为DOC/DOCX文件? 提前致谢 回答1 如果您安装了LibreOffice lowriter --invisible --convert-to doc '/your/file.pdf' 如果要为此使用Python: import os import subprocess for top, dirs, files in os.walk('/my/pdf/folder'): for filename in files: if filename.endswith('.pdf'): abspath = os.path.join(top, filename) subprocess.call('lowriter --invisible --convert-to doc "{}"' .format(abspath), shell=True) 回答2 这很困难,因为PDF是面向表示的,而Word文档是面向内容的。 我已经测试过,并且可以推荐以下项目。 PyPDF2 PDFMiner 但是,您绝对肯定会在转换中失去表现形式。 回答3 如果您想转换PDF-> docx之类的MS Word类型文件,我会遇到这种情况。 艾辛·沙伯(Ahsin
  • 大虾PDF中的页眉和页脚(header and footer in Prawn PDF)
    问题 我已经阅读了有关Prawn的所有相关文章,但没有提到页眉和页脚(即使在Prawn自己的文档中)。 但是,我确实在Prawnto自己的网站上看到了有关页眉和页脚的演示。 我复制了该演示的整个源,只是看它是否有效,但是有人抱怨未定义方法“ header”的错误。 我是不是了解Prawn最近在gem中取出了页眉和页脚,还是需要先做其他事情才能使用页眉和页脚? 演示页面:http://cracklabs.com/prawnto/code/prawn_demos/source/text/flowing_text_with_header_and_footer 所关注的代码部分: Prawn::Document.generate("flow_with_headers_and_footers.pdf") do header margin_box.top_left do text "Here's My Fancy Header", :size => 25, :align => :center end text "hello world!" end 以防万一,以防万一,我的意思是通常在文档每一页角落出现的单词片段。 就像您在帐单页面上的帐号一样。 谢谢! 回答1 该示例使用@GrantSayer thx,但这只会让您显示当前页码,而不是总页数。 您还可以为页脚使用number_pages函数:
  • R图中出现奇怪的线(Weird lines appearing in the R graph)
    问题 我要提交研究论文的期刊要求文章应以PDF格式提交。 我正在使用R进行统计和绘制图形。 我已经使用基本公式来打印图形。 barplot()用于条形图,boxplot()用于箱形图,以及VennDiagram包中的draw.triple.venn。 我没有对设备或图形参数使用特殊的命令或公式。 我在R中打印图形,然后“作为图元文件”复制它们以生成高质量的图形。 当我在R中附加这些图时,它们看起来就很好。 但是,当我在Word中以PDF格式打印我的作品时,这些线会出现在图形中。 第一张图的示例: venn.plot <- draw.triple.venn(45, 34, 32, 14, 5, 11, 3, c(sprintf("Elevated\nWB Cr and Co"), sprintf("Mixed or\nsolid PT"), sprintf("Moderate to severe\ng.minimus atrophy")), lwd = 4, lty = 'solid', cex = 3.5, fontface = "bold", fontfamily = "sans", cat.cex = 1.8, cat.fontface = "bold", cat.default.pos = "outer", cat.pos = c(-20, 20, 180), cat
  • How to fix extra blank Excel files after converting from PDF?
    The problem is that after converting from PDF to Excel, when browsing to save the output file it creates additional blank Excel file, no idea why. If I convert 2 PDF's it outputs 2 converted Excel files and 2 additional blank Excel documents. Below is the code: Option Explicit Sub PDF_To_Excel() Dim setting_sh As Worksheet Set setting_sh = ThisWorkbook.Sheets("Setting") Dim pdf_path As String Dim excel_path As String pdf_path = Application.GetOpenFilename(FileFilter:="PDF Files (*.PDF), *.PDF", Title:="Select File To Be Opened") excel_path = setting_sh.Range("E12").Value Dim objFile As File
  • 在`knitr`中,我如何测试输出是PDF还是word?(In `knitr` how can I test for if the output will be PDF or word?)
    问题 我想根据创建的格式包括特定的内容。 在此特定示例中,我的表在MS word输出中看起来很糟糕,但在HTML却很棒。 我想添加一些测试,以根据输出省略表。 这是一些伪代码: output.format <- opts_chunk$get("output") if(output.format != "MS word"){ print(table1) } 我确定这不是使用opts_chunk的正确方法,但这是我对knitr如何在knitr工作的理解的限制。 对此进行测试的正确方法是什么? 回答1 简短答案 在大多数情况下, opts_knit$get("rmarkdown.pandoc.to")提供所需的信息。 否则,查询rmarkdown::all_output_formats(knitr::current_input())并检查返回值是否包含word_document : if ("word_document" %in% rmarkdown::all_output_formats(knitr::current_input()) { # Word output } 长答案 我认为源文档是RMD,因为这是用于编织为不同的输出格式(例如MS Word,PDF和HTML)的常用/最常见的输入格式。 在这种情况下,不能使用knitr选项来确定最终的输出格式,因为从knitr的角度来看
  • 使用PDFbox确定文档中单词的坐标(Using PDFbox to determine the coordinates of words in a document)
    问题 我正在使用PDFbox提取PDF文档中单词/字符串的坐标,到目前为止,已经成功地确定了各个字符的位置。 到目前为止,这是来自PDFbox doc的代码: package printtextlocations; import java.io.*; import org.apache.pdfbox.exceptions.InvalidPasswordException; import org.apache.pdfbox.pdmodel.PDDocument; import org.apache.pdfbox.pdmodel.PDPage; import org.apache.pdfbox.pdmodel.common.PDStream; import org.apache.pdfbox.util.PDFTextStripper; import org.apache.pdfbox.util.TextPosition; import java.io.IOException; import java.util.List; public class PrintTextLocations extends PDFTextStripper { public PrintTextLocations() throws IOException { super.setSortByPosition
  • 使用PDFminer解析pdf(Devanagari脚本)会产生错误的输出[重复](Parsing a pdf(Devanagari script) using PDFminer gives incorrect output [duplicate])
    问题 这个问题已经在这里有了答案: 无法从pdf复制确切的印地文内容(1个答案) 5年前关闭。 我正在尝试解析一个包含印地文(Devanagari脚本)的印度选民名单的pdf文件。 PDF可以正确显示所有文本,但是当我尝试使用PDFminer将此pdf转储为文本格式时,它会输出与原始pdf字符不同的字符 例如,显示/正确的单词是सामान्य 但是输出字是सपमपनद 现在,我想知道为什么会发生这种情况,以及如何正确解析这种类型的pdf文件 我还包括示例pdf文件- http://164.100.180.82/Rollpdf/AC276/S24A276P001.pdf 回答1 此问题与此答案中讨论的问题非常相似,并且该示例文档的外观也确实提醒了此文档。 就像在另一个问题的文档中一样,此处在文档中使用的Devanagari脚本字体的ToUnicode映射将多个完全不同的字形映射到相同的Unicode代码点。 因此,基于此映射的文本提取必定会失败,并且大多数文本提取器都依赖于这些信息,尤其是在缺少像此处这样的字体Encoding条目的情况下。 一些文本提取器可以使用字形到嵌入式字体程序(如果存在)中包含的Unicode的映射。 但是在这里的文档中使用的Devanagari脚本字体程序中检查了此映射,结果发现它通过U + f062(名称为“ uniF020”等)将大多数字形与U +
  • itextsharp PdfCopy和横向页面(itextsharp PdfCopy and landscape pages)
    问题 我正在使用itextsharp加入多个pdf文档并添加页脚。 我的代码工作正常-除横向页面外-未检测到页面旋转-页脚未居中横向 public static int AddPagesFromStream(Document document, PdfCopy pdfCopy, Stream m, bool addFooter, int detailPages, string footer, int footerPageNumOffset, int numPages, string pageLangString, string printLangString) { CreateFont(); try { m.Seek(0, SeekOrigin.Begin); var reader = new PdfReader(m); // get page count var pdfPages = reader.NumberOfPages; var i = 0; // add pages while (i < pdfPages) { i++; // import page with pdfcopy var page = pdfCopy.GetImportedPage(reader, i); // get page center float posX; float posY; var
  • elasticsearch - Aggregation returns terms in key , but not the complete field, how can I get full field returned?
    In the elasticsearch implementation , I have few simple aggregations on the basis of few fields as shown below - "aggs" : { "author" : { "terms" : { "field" : "author" , "size": 20, "order" : { "_term" : "asc" } } }, "title" : { "terms" : { "field" : "title" , "size": 20 } }, "contentType" : { "terms" : { "field" : "docType" , "size": 20 } } } The aggregations work fine and I get the results accordingly. but the title key field returned (or any other field - multi word) , has single word aggregation and results. I need the full title in the returned result, rather then just a word- which doesn
  • Python-使用python实现pdf2txt
    本文的方法主要实现批处理pdf2txt。强推方法二!!! 方法一:使用pdfminer3k 参考来自GitHub的代码。 ###################################### # tesseract OCR from PIL import Image import pytesseract def img_to_str_tesseract(image_path, lang='chi_sim'): return pytesseract.image_to_string(Image.open(image_path), lang) ###################################### # 百度 OCR from aip import AipOcr config = { 'appId': '', 'apiKey': '', 'secretKey': '' } client = AipOcr(**config) def img_to_str_baidu(image_path): with open(image_path, 'rb') as fp: image = fp.read() result = client.basicGeneral(image) if 'words_result' in result: return '\n'.join([w
  • iText或iTextSharp基本文本编辑(iText or iTextSharp rudimentary text edit)
    问题 我可以通过多种方式从PDF页面提取文本: String pageText = PdfTextExtractor.GetTextFromPage(reader, i); 这可用于获取页面上的任何文本。 或者: byte[] contentBytes = iTextSharp.text.pdf.parser.ContentByteUtils.GetContentBytesForPage(reader, i); 可能性是无止境的。 现在,我想删除/编辑某些单词,例如显式单词,敏感信息(在其上放上黑匣子显然是一个坏主意:)或PDF中的所有内容(仅是简单的文本)。 使用上面的方法,我可以找到一个合适的单词。 我可以数出它的出现等等。 我不在乎布局,也不在乎PDF并不是真的要以这种方式进行操作。 我只想知道是否有一种机制可以让我以这种方式操纵PDF的原始内容。 您可能会说我正在寻找“ SetContentBytesForPage()” ... 回答1 如果要更改页面的内容,仅更改页面的内容流是不够的。 页面可能包含对包含要删除内容的Form XObjects的引用。 第二个问题是图像。 例如:假设您的文档包含经过OCR处理的扫描文档。 在这种情况下,仅删除(矢量)文本是不够的,您还需要操纵图像中的(像素)文本。 假设您的次要问题不存在,那么您将需要一种双重方法: 从页面获取内容作为文本
  • 软件测试5大用例设计笔试大题
    1.出租车计费软件答案解析:1 题答案:1. 公里跟 km 需求单位最好统一2. 时间范围不明确,在 5:00 及 23:00 是包含还是不包含的关系3. 空驶费部分等待时间是否会算空驶费4. 等待时间中 非 5 分钟整数倍怎么计算收费5. 跨时间段,起步价如何收费超出 35km,如果超出部分在跨时间段,空驶费的计算方式也要跨时间段?2 题答案:以下所有计算路程都以 1km 为单位,超出 1km 不足 2km 算 2km;所有时间都按 5 分钟为阶段,超出 5 分钟不足 10 分钟算 10 分钟;以此类推,测试用例包括:1)、5:00-23:00 时间段,行驶路程 =3km;计费 11 元2)、5:00-23:00 时间段,行驶路程 =4km,等待时间为 3min;计费 2.1*4+2.1*13)、5:00-23:00 时间段,行驶路程 =5555km,等待时间为 11min;计费 2.1*6+2.1*34)、5:00-23:00 时间段,行驶路程 =10km,等待时间为 15min;计费 2.1*10+2.1*35)、5:00-23:00 时间段,行驶路程 =11km,等待时间为 23min;计费 3.2* 11+3.2*56)、5:00-23:00 时间段,行驶路程 =36km,等待时间为 23min;计费 3.2*36+3.2*5+(36-35)*3.2*50%7)、23