天道酬勤,学无止境

用Java脚本从pdf提取文本(extract text from pdf in Javascript)

问题

我想知道是否可以仅使用Javascript将文本包含在PDF文件中? 如果是,谁能告诉我如何?

我知道有一些服务器端的Java,C#等库,但我宁愿不使用服务器。 谢谢

回答1

这是一个古老的问题,但是由于pdf.js多年来一直在发展,所以我想给出一个新的答案。 也就是说,它可以在本地完成,而无需涉及任何服务器或外部服务。 新的pdf.js具有一个函数:page.getTextContent()。 您可以从中获取文本内容。 我已经用下面的代码成功地做到了。

  1. 您在每个步骤中得到的都是诺言。 您需要使用以下方式进行编码: .then( function(){...})继续进行下一步。

    1) PDFJS.getDocument( data ).then( function(pdf) {PDFJS.getDocument( data ).then( function(pdf) {

    2) pdf.getPage(i).then( function(page){pdf.getPage(i).then( function(page){

    3) page.getTextContent().then( function(textContent){

  2. 您最终得到的是一个字符串数组textContent.bidiTexts[] 。 您将它们串联起来可获得1页的文本。 文本块的坐标用于判断是否需要插入换行符或空格。 (这可能并不完全健壮,但是从我的测试来看似乎还可以。)

  3. 输入参数data必须是URL或ArrayBuffer类型的数据。 我使用FileReader API中的ReadAsArrayBuffer(file)函数来获取数据。

希望这可以帮助。

注意:根据其他用户的说法,该库已更新并导致代码中断。 根据下面async5的评论,您需要将textContent.bidiTexts替换为textContent.items

    function Pdf2TextClass(){
     var self = this;
     this.complete = 0;

    /**
     *
     * @param data ArrayBuffer of the pdf file content
     * @param callbackPageDone To inform the progress each time
     *        when a page is finished. The callback function's input parameters are:
     *        1) number of pages done;
     *        2) total number of pages in file.
     * @param callbackAllDone The input parameter of callback function is 
     *        the result of extracted text from pdf file.
     *
     */
     this.pdfToText = function(data, callbackPageDone, callbackAllDone){
     console.assert( data  instanceof ArrayBuffer  || typeof data == 'string' );
     PDFJS.getDocument( data ).then( function(pdf) {
     var div = document.getElementById('viewer');

     var total = pdf.numPages;
     callbackPageDone( 0, total );        
     var layers = {};        
     for (i = 1; i <= total; i++){
        pdf.getPage(i).then( function(page){
        var n = page.pageNumber;
        page.getTextContent().then( function(textContent){
          if( null != textContent.bidiTexts ){
            var page_text = "";
            var last_block = null;
            for( var k = 0; k < textContent.bidiTexts.length; k++ ){
                var block = textContent.bidiTexts[k];
                if( last_block != null && last_block.str[last_block.str.length-1] != ' '){
                    if( block.x < last_block.x )
                        page_text += "\r\n"; 
                    else if ( last_block.y != block.y && ( last_block.str.match(/^(\s?[a-zA-Z])$|^(.+\s[a-zA-Z])$/) == null ))
                        page_text += ' ';
                }
                page_text += block.str;
                last_block = block;
            }

            textContent != null && console.log("page " + n + " finished."); //" content: \n" + page_text);
            layers[n] =  page_text + "\n\n";
          }
          ++ self.complete;
          callbackPageDone( self.complete, total );
          if (self.complete == total){
            window.setTimeout(function(){
              var full_text = "";
              var num_pages = Object.keys(layers).length;
              for( var j = 1; j <= num_pages; j++)
                  full_text += layers[j] ;
              callbackAllDone(full_text);
            }, 1000);              
          }
        }); // end  of page.getTextContent().then
      }); // end of page.then
    } // of for
  });
 }; // end of pdfToText()
}; // end of class
回答2

我无法使gm2008的示例正常工作(pdf.js上的内部数据结构已明显更改),因此我编写了自己的完全基于承诺的解决方案,该解决方案不使用任何DOM元素,queryselectors或canvas,而是使用更新的pdf Mozilla示例中的.js

由于我将其与node-webkit一起使用,因此它会占用上传文件的路径。 您需要确保已下载了cmap,并指向了某个地方,然后您需要pdf.js和pdf.worker.js才能正常工作。

    /**
     * Extract text from PDFs with PDF.js
     * Uses the demo pdf.js from https://mozilla.github.io/pdf.js/getting_started/
     */
    this.pdfToText = function(data) {

        PDFJS.workerSrc = 'js/vendor/pdf.worker.js';
        PDFJS.cMapUrl = 'js/vendor/pdfjs/cmaps/';
        PDFJS.cMapPacked = true;

        return PDFJS.getDocument(data).then(function(pdf) {
            var pages = [];
            for (var i = 0; i < pdf.numPages; i++) {
                pages.push(i);
            }
            return Promise.all(pages.map(function(pageNumber) {
                return pdf.getPage(pageNumber + 1).then(function(page) {
                    return page.getTextContent().then(function(textContent) {
                        return textContent.items.map(function(item) {
                            return item.str;
                        }).join(' ');
                    });
                });
            })).then(function(pages) {
                return pages.join("\r\n");
            });
        });
    }

用法:

 self.pdfToText(files[0].path).then(function(result) {
      console.log("PDF done!", result);
 })
回答3

以下是一些JavaScript代码,该代码可使用http://hublog.hubmed.org/archives/001948.html中的Pdf.js来完成您的工作:

var input = document.getElementById("input");  
var processor = document.getElementById("processor");  
var output = document.getElementById("output");  

// listen for messages from the processor  
window.addEventListener("message", function(event){  
  if (event.source != processor.contentWindow) return;  

  switch (event.data){  
    // "ready" = the processor is ready, so fetch the PDF file  
    case "ready":  
      var xhr = new XMLHttpRequest;  
      xhr.open('GET', input.getAttribute("src"), true);  
      xhr.responseType = "arraybuffer";  
      xhr.onload = function(event) {  
        processor.contentWindow.postMessage(this.response, "*");  
      };  
      xhr.send();  
    break;  

    // anything else = the processor has returned the text of the PDF  
    default:  
      output.textContent = event.data.replace(/\s+/g, " ");  
    break;  
  }  
}, true);

...这是一个例子:

http://git.macropus.org/2011/11/pdftotext/example/

回答4

注意:此代码假定您使用的是nodejs。 这意味着您正在解析本地文件,而不是网页中的文件,因为原始问题并没有明确询问在网页上解析pdf的问题。

@ gm2008的答案是一个很好的起点(请阅读它及其注释以获取更多信息),但是需要一些更新(08/19)并具有一些未使用的代码。 我也喜欢更完整的示例。 可以进行更多的重构和调整(例如,使用await ),但是目前它已经尽可能接近原始答案了。

和以前一样,它使用Mozilla的PDFjs库。 npmjs软件包位于https://www.npmjs.com/package/pdfjs-dist。

以我的经验,这在寻找放置空间的位置上并不太好,但这又是一个问题。

[编辑:我相信对.transform的使用更新已恢复了原来的空白。]

// This file is called myPDFfileToText.js and is in the root folder
let PDFJS = require('pdfjs-dist');

let pathToPDF = 'path/to/myPDFfileToText.pdf';

let toText = Pdf2TextObj();
let onPageDone = function() {}; // don't want to do anything between pages
let onFinish = function(fullText) { console.log(fullText) };
toText.pdfToText(pathToPDF, onPageDone, onFinish);

function Pdf2TextObj() {
    let self = this;
    this.complete = 0;

    /**
     *
     * @param path Path to the pdf file.
     * @param callbackPageDone To inform the progress each time
     *        when a page is finished. The callback function's input parameters are:
     *        1) number of pages done.
     *        2) total number of pages in file.
     *        3) the `page` object itself or null.
     * @param callbackAllDone Called after all text has been collected. Input parameters:
     *        1) full text of parsed pdf.
     *
     */
    this.pdfToText = function(path, callbackPageDone, callbackAllDone) {
        // console.assert(typeof path == 'string');
        PDFJS.getDocument(path).promise.then(function(pdf) {

            let total = pdf.numPages;
            callbackPageDone(0, total, null);

            let pages = {};
            // For some (pdf?) reason these don't all come in consecutive
            // order. That's why they're stored as an object and then
            // processed one final time at the end.
            for (let pagei = 1; pagei <= total; pagei++) {
                pdf.getPage(pagei).then(function(page) {
                    let pageNumber = page.pageNumber;
                    page.getTextContent().then(function(textContent) {
                        if (null != textContent.items) {
                            let page_text = "";
                            let last_item = null;
                            for (let itemsi = 0; itemsi < textContent.items.length; itemsi++) {
                                let item = textContent.items[itemsi];
                                // I think to add whitespace properly would be more complex and
                                // would require two loops.
                                if (last_item != null && last_item.str[last_item.str.length - 1] != ' ') {
                                    let itemX = item.transform[5]
                                    let lastItemX = last_item.transform[5]
                                    let itemY = item.transform[4]
                                    let lastItemY = last_item.transform[4]
                                    if (itemX < lastItemX)
                                        page_text += "\r\n";
                                    else if (itemY != lastItemY && (last_item.str.match(/^(\s?[a-zA-Z])$|^(.+\s[a-zA-Z])$/) == null))
                                        page_text += ' ';
                                } // ends if may need to add whitespace

                                page_text += item.str;
                                last_item = item;
                            } // ends for every item of text

                            textContent != null && console.log("page " + pageNumber + " finished.") // " content: \n" + page_text);
                            pages[pageNumber] = page_text + "\n\n";
                        } // ends if has items

                        ++self.complete;

                        callbackPageDone(self.complete, total, page);


                        // If all done, put pages in order and combine all
                        // text, then pass that to the callback
                        if (self.complete == total) {
                            // Using `setTimeout()` isn't a stable way of making sure 
                            // the process has finished. Watch out for missed pages.
                            // A future version might do this with promises.
                            setTimeout(function() {
                                let full_text = "";
                                let num_pages = Object.keys(pages).length;
                                for (let pageNum = 1; pageNum <= num_pages; pageNum++)
                                    full_text += pages[pageNum];
                                callbackAllDone(full_text);
                            }, 1000);
                        }
                    }); // ends page.getTextContent().then
                }); // ends page.then
            } // ends for every page
        });
    }; // Ends pdfToText()

    return self;
}; // Ends object factory

在终端中运行:

node myPDFfileToText.js

回答5

更新了02/2021

<script src="https://npmcdn.com/pdfjs-dist/build/pdf.js"></script>
    <script>
    
function Pdf2TextClass(){
    var self = this;
    this.complete = 0;

    this.pdfToText = function(data, callbackPageDone, callbackAllDone){
    console.assert( data  instanceof ArrayBuffer  || typeof data == 'string' );
    var loadingTask = pdfjsLib.getDocument(data);
    loadingTask.promise.then(function(pdf) {


    var total = pdf._pdfInfo.numPages;
    //callbackPageDone( 0, total );        
    var layers = {};        
    for (i = 1; i <= total; i++){
       pdf.getPage(i).then( function(page){
       var n = page.pageNumber;
       page.getTextContent().then( function(textContent){
       
       //console.log(textContent.items[0]);0
         if( null != textContent.items ){
           var page_text = "";
           var last_block = null;
           for( var k = 0; k < textContent.items.length; k++ ){
               var block = textContent.items[k];
               if( last_block != null && last_block.str[last_block.str.length-1] != ' '){
                   if( block.x < last_block.x )
                       page_text += "\r\n"; 
                   else if ( last_block.y != block.y && ( last_block.str.match(/^(\s?[a-zA-Z])$|^(.+\s[a-zA-Z])$/) == null ))
                       page_text += ' ';
               }
               page_text += block.str;
               last_block = block;
           }

           textContent != null && console.log("page " + n + " finished."); //" content: \n" + page_text);
           layers[n] =  page_text + "\n\n";
         }
         ++ self.complete;
         //callbackPageDone( self.complete, total );
         if (self.complete == total){
           window.setTimeout(function(){
             var full_text = "";
             var num_pages = Object.keys(layers).length;
             for( var j = 1; j <= num_pages; j++)
                 full_text += layers[j] ;
             console.log(full_text);
           }, 1000);              
         }
       }); // end  of page.getTextContent().then
     }); // end of page.then
   } // of for
 });
}; // end of pdfToText()
}; // end of class
var pdff = new Pdf2TextClass();
pdff.pdfToText('PDF_URL');
    </script>
回答6

对于实际上想要在节点服务器上使用它的所有人员:

/**
 * Created by velten on 25.04.16.
 */
"use strict";
let pdfUrl = "http://example.com/example.pdf";
let request = require('request');
var pdfParser = require('pdf2json');

let pdfPipe = request({url: pdfUrl, encoding:null}).pipe(pdfParser);

pdfPipe.on("pdfParser_dataError", err => console.error(err) );
pdfPipe.on("pdfParser_dataReady", pdf => {
    //optionally:
    //let pdf = pdfParser.getMergedTextBlocksIfNeeded();

    let count1 = 0;
    //get text on a particular page
    for (let page of pdf.formImage.Pages) {
        count1 += page.Texts.length;
    }

    console.log(count1);
    pdfParser.destroy();
});
回答7

可能但是:

  • 您仍然必须使用服务器,否则无法在不将文件传输到服务器的情况下获取用户计算机上文件的内容的方法
  • 我还没有人写过这样的库

因此,如果您有空闲时间,您可以学习pdf格式并自己编写此类库,或者当然也可以使用服务器端库。

受限制的 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>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 如何从PDF文件中提取文本?(How to extract text from a PDF file?)
    问题 我正在尝试使用Python提取此PDF文件中包含的文本。 我正在使用PyPDF2模块,并具有以下脚本: import PyPDF2 pdf_file = open('sample.pdf') read_pdf = PyPDF2.PdfFileReader(pdf_file) number_of_pages = read_pdf.getNumPages() page = read_pdf.getPage(0) page_content = page.extractText() print page_content 运行代码时,得到以下输出,该输出与PDF文档中包含的输出不同: !"#$%#$%&%$&'()*%+,-%./01'*23%4 5'%1$#26%3/%7/))/8%&)/26%8#3"%3"*%313/9#&) % 如何提取PDF文档中的原样? 回答1 我一直在寻找适用于python 3.x和Windows的简单解决方案。 不幸的是,textract似乎没有提供支持,但是,如果您正在寻找针对Windows / python 3的简单解决方案,请检出tika软件包,真的可以直接阅读pdf。 Tika-Python是与Apache Tika™REST服务绑定的Python,允许在Python社区中本地调用Tika。 from tika import parser #
  • 使用python中的PDFMiner从PDF文件中提取文本?(Extracting text from a PDF file using PDFMiner in python?)
    问题 我正在寻找有关如何使用带有Python的PDFMiner从PDF文件提取文本的文档或示例。 看来PDFMiner更新了他们的API,我发现的所有相关示例都包含过时的代码(类和方法已更改)。 我发现的那些使从PDF文件提取文本的任务更容易的库正在使用旧的PDFMiner语法,因此我不确定如何执行此操作。 实际上,我只是在查看源代码,以查看是否可以解决。 回答1 这是一个使用当前版本的PDFMiner从PDF文件提取文本的工作示例(2016年9月) from pdfminer.pdfinterp import PDFResourceManager, PDFPageInterpreter from pdfminer.converter import TextConverter from pdfminer.layout import LAParams from pdfminer.pdfpage import PDFPage from io import StringIO def convert_pdf_to_txt(path): rsrcmgr = PDFResourceManager() retstr = StringIO() codec = 'utf-8' laparams = LAParams() device = TextConverter(rsrcmgr, retstr
  • 从python中的MS Word文件中提取文本(extracting text from MS word files in python)
    问题 为了在python中处理MS Word文件,有python win32扩展名,可以在Windows中使用。 我该如何在linux中做同样的事情? 有图书馆吗? 回答1 您可以对反词进行子流程调用。 Antiword是一个Linux命令行实用程序,用于从word doc中转储文本。 适用于简单文档(显然会丢失格式)。 它可以通过apt(可能是RPM)获得,也可以自己编译。 回答2 使用本机Python docx模块。 以下是从文档中提取所有文本的方法: document = docx.Document(filename) docText = '\n\n'.join( paragraph.text for paragraph in document.paragraphs ) print(docText) 请参阅Python DocX网站 还要检查Textract,它可以拉出桌子等。 使用正则表达式解析XML会调用cthulu。 不要做! 回答3 本杰明的答案是一个很好的答案。 我刚刚合并了... import zipfile, re docx = zipfile.ZipFile('/path/to/file/mydocument.docx') content = docx.read('word/document.xml').decode('utf-8') cleaned = re
  • 在Python中从PDF提取图像而无需重新采样?(Extract images from PDF without resampling, in python?)
    问题 如何以原始分辨率和格式从pdf文档中提取所有图像? (意味着将tiff提取为tiff,将jpeg提取为jpeg等,而无需重新采样)。 布局并不重要,我不在乎源图像是否位于页面上。 我使用的是python 2.7,但可以根据需要使用3.x。 回答1 您可以使用模块PyMuPDF。 这会将所有图像输出为.png文件,但是开箱即用,速度很快。 import fitz doc = fitz.open("file.pdf") for i in range(len(doc)): for img in doc.getPageImageList(i): xref = img[0] pix = fitz.Pixmap(doc, xref) if pix.n < 5: # this is GRAY or RGB pix.writePNG("p%s-%s.png" % (i, xref)) else: # CMYK: convert to RGB first pix1 = fitz.Pixmap(fitz.csRGB, pix) pix1.writePNG("p%s-%s.png" % (i, xref)) pix1 = None pix = None 在这里查看更多资源 回答2 在带有PyPDF2和Pillow库的Python中,它很简单: import PyPDF2 from PIL
  • 从pdf提取页面作为jpeg(Extract a page from a pdf as a jpeg)
    问题 在python代码中,如何有效地将pdf中的某个页面另存为jpeg文件? (用例:我有一个python flask网络服务器,将在其中上传pdf-s,并存储与每个页面相对应的jpeg-s。) 该解决方案已经结束,但是问题在于它不会将整个页面转换为jpeg。 回答1 可以使用pdf2image库。 您可以使用以下方法简单地安装它: pip install pdf2image 安装后,您可以使用以下代码获取图像。 from pdf2image import convert_from_path pages = convert_from_path('pdf_file', 500) 以jpeg格式保存页面 for page in pages: page.save('out.jpg', 'JPEG') 编辑:Github仓库pdf2image也提到它使用pdftoppm ,并且需要其他安装: pdftoppm是执行实际操作的软件。 它作为更大的软件包poppler的一部分分发。 Windows用户必须为Windows安装poppler。 Mac用户必须为Mac安装poppler。 如果不是Linux用户,则将在发行版中预装pdftoppm(已在Ubuntu和Archlinux上进行了测试),请运行sudo apt install poppler-utils 。
  • 如何从Word文件.doc,docx,.xlsx,.pptx php中提取文本(How to extract text from word file .doc,docx,.xlsx,.pptx php)
    问题 在某些情况下,我们可能需要从Word文档中获取文本以供将来在用户上载的文档中搜索字符串,例如在cv / resumes中进行搜索,并出现了一个常见的问题,即如何获取文本,打开并阅读用户上载Word文档时,有一些有用的链接,但不能解决整个问题。我们需要在上载时获取文本并将文本保存在数据库中,这样我们才能轻松地在数据库中搜索。 回答1 这是一个简单的类,适用于.doc / .docx和PHP docx阅读器:将MS Word Docx文件转换为文本。 class DocxConversion{ private $filename; public function __construct($filePath) { $this->filename = $filePath; } private function read_doc() { $fileHandle = fopen($this->filename, "r"); $line = @fread($fileHandle, filesize($this->filename)); $lines = explode(chr(0x0D),$line); $outtext = ""; foreach($lines as $thisline) { $pos = strpos($thisline, chr(0x00)); if (($pos
  • 如何使用Java读取PDF文件? [关闭](How to read PDF files using Java? [closed])
    问题 从目前的情况来看,这个问题不适合我们的问答形式。 我们希望答案会得到事实,参考或专业知识的支持,但是这个问题可能会引起辩论,争论,民意测验或进一步的讨论。 如果您认为此问题可以解决并且可以重新提出,请访问帮助中心以获取指导。 7年前关闭。 我想使用Java从PDF文件中读取一些文本数据。 我怎样才能做到这一点? 回答1 PDFBox是为此目的而我找到的最好的库,它非常全面,如果您只是在进行基本的文本提取,那么它确实非常易于使用。 示例可以在这里找到。 它在页面上对此进行了解释,但是要注意的一件事是,使用setStartPage()和setEndPage()时的开始索引和结束索引都包含在内。 我第一次绕过了这个解释,然后花了我一段时间才意识到为什么每次打电话我回头一页以上! Itext是另一种也可以与C#一起使用的替代方法,尽管我个人从未使用过它。 它比PDFBox级别低,因此如果您只需要基本文本提取,则不太适合该工作。 回答2 使用Apache PDFBox时,它是这样的: PDDocument document = PDDocument.load(new File("test.pdf")); if (!document.isEncrypted()) { PDFTextStripper stripper = new PDFTextStripper(); String text
  • 在VB.NET或C#中使用itextsharp dll读取PDF内容(Reading PDF content with itextsharp dll in VB.NET or C#)
    问题 如何使用带有Pdfreader类的itextsharp读取PDF内容。 我的PDF可能包含纯文本或文本图像。 回答1 using iTextSharp.text.pdf; using iTextSharp.text.pdf.parser; using System.IO; public string ReadPdfFile(string fileName) { StringBuilder text = new StringBuilder(); if (File.Exists(fileName)) { PdfReader pdfReader = new PdfReader(fileName); for (int page = 1; page <= pdfReader.NumberOfPages; page++) { ITextExtractionStrategy strategy = new SimpleTextExtractionStrategy(); string currentText = PdfTextExtractor.GetTextFromPage(pdfReader, page, strategy); currentText = Encoding.UTF8.GetString(ASCIIEncoding.Convert(Encoding.Default
  • 使用JavaScript在div中从HTML生成pdf(Generate pdf from HTML in div using Javascript)
    问题 我有以下html代码: <!DOCTYPE html> <html> <body> <p>don't print this to pdf</p> <div id="pdf"> <p><font size="3" color="red">print this to pdf</font></p> </div> </body> </html> 我要做的就是将div中ID为“ pdf”的任何内容打印为pdf。 这必须使用JavaScript来完成。 然后应自动下载文件名为“ foobar.pdf”的“ pdf”文档 我一直在使用jspdf来执行此操作,但是它具有的唯一功能是仅接受字符串值的“文本”。 我想将HTML提交给jspdf,而不是文本。 回答1 jsPDF可以使用插件。 为了使其能够打印HTML,您必须包括某些插件,因此必须执行以下操作: 转到https://github.com/MrRio/jsPDF并下载最新版本。 在您的项目中包括以下脚本: jspdf.js jspdf.plugin.from_html.js jspdf.plugin.split_text_to_size.js jspdf.plugin.standard_fonts_metrics.js 如果要忽略某些元素,则必须用ID标记它们,然后可以在jsPDF的特殊元素处理程序中忽略该ID。 因此
  • extract text from pdf in Javascript
    I wonder if is possible to get the text inside of a PDF file by using only Javascript? If yes, can anyone show me how? I know there are some server-side java, c#, etc libraries but I would prefer not using a server. thanks
  • 如何从路径中提取文件名?(How to extract file name from path?)
    问题 如何从VBA中的C:\Documents\myfile.pdf提取文件名myfile.pdf ? 回答1 这摘自snippets.dzone.com: Function GetFilenameFromPath(ByVal strPath As String) As String ' Returns the rightmost characters of a string upto but not including the rightmost '\' ' e.g. 'c:\winnt\win.ini' returns 'win.ini' If Right$(strPath, 1) <> "\" And Len(strPath) > 0 Then GetFilenameFromPath = GetFilenameFromPath(Left$(strPath, Len(strPath) - 1)) + Right$(strPath, 1) End If End Function 回答2 在VBA for Office 2000/2003中使用文件和目录的最佳方法是使用脚本库。 添加对Microsoft脚本运行时的引用(IDE中的“工具”>“引用”)。 创建一个文件系统对象,并使用该对象执行所有操作。 Dim fso as new FileSystemObject Dim
  • 使用Python从HTML文件中提取文本(Extracting text from HTML file using Python)
    问题 我想使用Python从HTML文件中提取文本。 如果要从浏览器复制文本并将其粘贴到记事本中,我希望得到的输出基本上相同。 我想要比使用正则表达式更健壮的东西,因为正则表达式可能在格式不正确的HTML上失败。 我见过很多人都推荐Beautiful Soup,但使用它时遇到了一些问题。 例如,它拾取了不需要的文本,例如JavaScript源。 此外,它没有解释HTML实体。 例如,我希望&#39; 将HTML源代码中的HTML转换为文本中的撇号,就像我将浏览器内容粘贴到记事本中一样。 更新html2text看起来很有希望。 它正确处理HTML实体,并忽略JavaScript。 但是,它并不能完全产生纯文本;它只能生成纯文本。 它会产生markdown,然后必须将其转换为纯文本。 它没有示例或文档,但是代码看起来很干净。 相关问题: 过滤掉HTML标签并解析python中的实体在Python中将XML / HTML实体转换为Unicode字符串 回答1 html2text是一个Python程序,在此方面做得很好。 回答2 我发现的用于提取文本而不获取JavaScript或不需要的东西的最佳代码是: from urllib.request import urlopen from bs4 import BeautifulSoup url = "http://news.bbc.co.uk
  • HTML抓取的选项? [关闭](Options for HTML scraping? [closed])
    问题 关门了。 这个问题需要更加集中。 它当前不接受答案。 想改善这个问题吗? 更新问题,使其仅通过编辑此帖子即可将重点放在一个问题上。 7年前关闭。 改善这个问题 我正在考虑尝试Beautiful Soup,这是用于HTML抓取的Python包。 还有其他我应该查看的HTML抓包工具吗? 不需要Python,实际上我也很想了解其他语言。 到目前为止的故事: Python 美丽的汤 xml文件 HTQL cra草机械化红宝石能吉里杏子机械化 scrAPI scrubyt! 袋熊瓦蒂尔 。网 HTML敏捷包瓦丁佩尔 WWW ::机械化网页抓取工具爪哇标签汤 HtmlUnit 网络收割 [jARVEST] 21 so Jericho HTML解析器的JavaScript 要求啦啦队阿图节点马幻影的PHP [古特] 29 htmlSQL PHP简单HTML DOM解析器使用CURL进行PHP爬取猩红查询走 goquery 数据流套件他们大多数屏幕刮板 回答1 在Ruby世界中,相当于Beautiful Soup的是Why_the_lucky_stiff的Hpricot。 回答2 在.NET世界中,我建议使用HTML Agility Pack。 虽然不如上述某些选项(例如HTMLSQL)那么简单,但是它非常灵活。 它使您可以处理格式不正确的HTML,就像处理格式正确的XML一样
  • Web应用程序中的“静音”打印(“Silent” Printing in a Web Application)
    问题 我正在开发一个需要静默打印的Web应用程序-无需用户参与。 做到这一点的最佳方法是什么? 它不喜欢完全使用Javascript,Flash和/或AIR可以完成。 我所见过的最接近的是Java小程序。 我能理解为什么对于任何网站而言,这样做都是一个坏主意。 此特定实例用于内部应用程序,如果用户需要将URL添加到受信任的站点列表,安装插件等,则完全可以接受。 回答1 您需要执行以下操作来立即启用Firefox,而无需显示“打印首选项”对话框。 在Firefox的位置栏中键入about:config,然后按Enter。 右键单击页面上的任意位置,然后选择“新建”>“布尔值” 输入首选项名称作为print.always_print_silent,然后单击确定。 我在某个地方发现了它,对我有帮助 回答2 正如@Axel所写,Firefox具有print.always_print_silent选项。 对于Chrome,请使用--kiosk-printing选项跳过“打印预览”对话框: 编辑用于启动Chrome的快捷方式,然后添加“ --kiosk-printing”,然后重新启动Chrome。 注意:如果不起作用,很可能是因为您没有完全停止Chrome,因此注销并重新登录肯定可以解决问题。 回答3 您可以尝试以下两个代码示例: 1 : <script> function Print()
  • 如何把PDF文件中的图片一键提取出来?
    在我们日常工作和日常学习中,PDF格式是我们接触到的非常常用的一种文件格式。不知道小伙伴们有没有遇到过这样的情况,有时候PDF文件中的图片刚好是我们需要使用的,这时候我们该如何将图片提取出来呢?相信很多人都是采用截图的方式来获取图片,但是截图会伤害图片的清晰度,今天我来教教你如何把PDF文件中的图片一键提取出来?而且非常的高效哦! 软件:迅米PDF转换器 下载:https://www.xmisoft.com/download/XMPDF6.6.0.exe 具体步骤详解: 步骤1,打开迅米PDF转换器,在软件左侧找到“PDF的其他操作”列表下的【PDF图片获取】功能并点击,进行下一步的提取操作。 步骤2、如下图所示点击添加文件按钮,将需要提取的PDF文件添加到软件中。如果你需要将多个PDF文件中的图片提取出来,那么可以一起添加到软件,批量提取更省事。 步骤3,点击“开始转换”绿色按钮,软件则开始帮你从PDF文件中提取图片了,你只需要等待。 步骤4,稍等片刻之后,当状态栏下面的进度条变成100%的时候,说明图片提起完成了,点击“输出”图标按钮,就可以看到提取出来的图片了。 步骤5,如下图所示,文件夹中图片就是从小编的PDF案例中提取出来的。 好啦,这就是小编今天要分享的内容啦!你还有哪些更好的办法可以提取PDF文件的文字和图片吗?欢迎一起分享哦! 来源:https://blog
  • 如何正确使用jsPDF库(How to properly use jsPDF library)
    问题 我想将某些div转换为PDF,并且尝试了jsPDF库,但没有成功。 看来我不明白我需要导入什么才能使库正常工作。 我已经看过这些示例,但仍然无法弄清楚。 我尝试了以下方法: <script type="text/javascript" src="js/jspdf.min.js"></script> 在jQuery之后: $("#html2pdf").on('click', function(){ var doc = new jsPDF(); doc.fromHTML($('body').get(0), 15, 15, { 'width': 170 }); console.log(doc); }); 出于测试目的,但我收到: "Cannot read property '#smdadminbar' of undefined" 其中#smdadminbar是#smdadminbar的第一个div。 回答1 您可以按如下方式使用html中的pdf, 步骤1:将以下脚本添加到标题中 <script src="https://cdnjs.cloudflare.com/ajax/libs/jspdf/1.3.2/jspdf.min.js"></script> 或本地下载 步骤2:添加HTML脚本以执行jsPDF代码 对此进行自定义以传递标识符,或者只是将#content更改为所需的标识¬
  • 如何在pdfbox 2.0.0的truetype0font中添加unicode?(how to add unicode in truetype0font on pdfbox 2.0.0?)
    问题 我一直在Java项目中使用PDFBOX 2.0.0版将pdf转换为文本。 我的一些pdf缺少ToUnicode方法,因此在我导出它们时它们以乱码出现。 2016-09-14 10:44:55 WARN org.apache.pdfbox.pdmodel.font.PDSimpleFont(1):322 - No Unicode mapping for 694 (30) in font MPBAAA+F1 在上面的WARN中,提出了乱码(30),而不是真实字符。 我可以通过编辑来克服它additional.txt在PDFBOX文件,因为从尝试错误我了解,字符(694在这种情况下)的代码表示一定希伯来字母(צ)。 这是我在文件中编辑的内容的简短示例: -694;05E6 #HexaDecimal value for the letter צ -695;05E7 -696;05E8 后来我在不同的pdf上遇到了几乎相同的警告,但是我没有乱码,没有乱码。 关于此问题的更详细说明,请参见此处-通过Java中的pdfbox进行pdf阅读 2016-09-14 11:07:10 WARN org.apache.pdfbox.pdmodel.font.PDType0Font(1):431 - No Unicode mapping for CID+694 (694) in font
  • 攻防世界刷题记录
    题目 新手练习区1. this_is_flag2.pdf3.如来十三掌4.give_you_flag5.坚持60s6.gif7.掀桌子8.ext39.stegano10.SimpleRAR 新手练习区 1. this_is_flag 就Ctrl+C Ctrl+V 2.pdf 打开附件,这个玩意 在这里可以看的是有一串文本的Ctrl+C Ctrl+V 粘贴到记事本中就可以知道flag了 3.如来十三掌 打开附件一堆繁体字,一开始还以为是新佛曰密码,解码不出来 然后又发现一个与佛论禅的密码,解码果然对 十三掌应该是ROT13 最后再来个base64就可以了 4.give_you_flag 打开附件,一个gif图片 用StegSolve里的帧数提取器,第50帧出现了这个东西 用PS修复二维码就,然后扫一下就得到flag了 5.坚持60s 打开附件,打开后发现是个游戏,,如果你有那个耐心,你可以自己玩60秒,不过不是很容易。这里用了一个直接java的反编译工具 java decompiler,把文件拖进去 6.gif 打开附件,黑白黑白黑白。。。。不就是010101嘛 把白色变成0,黑色变成1
  • 用于从RTF字符串中提取文本的正则表达式(Regular Expression for extracting text from an RTF string)
    问题 我在寻找一种从RTF字符串中删除文本的方法,发现以下正则表达式: ({\\)(.+?)(})|(\\)(.+?)(\b) 但是,生成的字符串具有两个直角括号“}” 之前: {\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 MS Shell Dlg 2;}{\f1\fnil MS Shell Dlg 2;}} {\colortbl ;\red0\green0\blue0;} {\*\generator Msftedit 5.41.15.1507;}\viewkind4\uc1\pard\tx720\cf1\f0\fs20 can u send me info for the call pls\f1\par } 之后: } can u send me info for the call pls } 关于如何改善正则表达式有什么想法? 编辑:这样的更复杂的字符串不起作用: {\rtf1\ansi\ansicpg1252\deff0\deflang1033{\fonttbl{\f0\fnil\fcharset0 MS Shell Dlg 2;}} {\colortbl ;\red0\green0\blue0;} {\*\generator Msftedit 5.41.15.1507;}
  • 强制打开“另存为...”弹出窗口,该链接在文本链接处打开单击HTML中的PDF(Force to open “Save As…” popup open at text link click for PDF in HTML)
    问题 我的网站上有一些大尺寸的PDF目录,我需要将其链接为下载文件。 当我用谷歌搜索时,发现以下这样的事情。 单击链接时应打开“另存为... ”弹出窗口。 <head> <meta name="content-disposition" content="inline; filename=filename.pdf"> ... 但是它不起作用:/当我如下所示链接到文件时,它只是链接到文件并试图打开文件。 <a href="filename.pdf" title="Filie Name">File name</a> 更新(根据下面的答案): 如我所见,目前还没有100%可靠的跨浏览器解决方案。 最好的方法可能是使用下面列出的一种Web服务,并提供下载链接... http://box.net/ http://droplr.com/ http://getcloudapp.com/ 回答1 从单击链接后强制浏览器将文件保存为的答案: <a href="path/to/file" download>Click here to download</a> 回答2 使用download属性,但要考虑到它仅适用于与代码起源相同的文件。 这意味着用户只能下载来自同一主机的原始站点的文件。 使用原始文件名下载: <a href="file link" download target="_blank"