Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Node.js 无效字符“�&引用;对节点JS使用Hummus(PDF)时_Node.js_Pdf_Utf 8 - Fatal编程技术网

Node.js 无效字符“�&引用;对节点JS使用Hummus(PDF)时

Node.js 无效字符“�&引用;对节点JS使用Hummus(PDF)时,node.js,pdf,utf-8,Node.js,Pdf,Utf 8,我正在尝试使用节点JS上的Hummus来打开pdf,替换字符串并保存一个新的pdf。 问题是当我保存一个新的pdf时。它不保存像“ã”、“õ”、“ê”(UTF-8)这样的字符。我在互联网上找不到任何解决方案,在NodeJS上关于Hummus的话题太少了 有人能帮我吗 我的代码(取自): const hummus=require('hummus'); 常数fs=要求('fs'); /** *返回byteArray字符串 * *@param{string}str-输入字符串 */ 函数stroby

我正在尝试使用节点JS上的Hummus来打开pdf,替换字符串并保存一个新的pdf。 问题是当我保存一个新的pdf时。它不保存像“ã”、“õ”、“ê”(UTF-8)这样的字符。我在互联网上找不到任何解决方案,在NodeJS上关于Hummus的话题太少了

有人能帮我吗

我的代码(取自):

const hummus=require('hummus');
常数fs=要求('fs');
/**
*返回byteArray字符串
* 
*@param{string}str-输入字符串
*/
函数strobytearray(str){
var utf8=[];
对于(变量i=0;i>6),
0x80 |(字符码&0x3f));
}
否则如果(字符码<0xd800 | |字符码>=0xe000){
utf8.按下(0xe0 |(字符码>>12),
0x80 |((字符码>>6)和0x3f),
0x80 |(字符码&0x3f));
}
//代理对
否则{
i++;
//UTF-16通过以下方式对0x10000-0x10FFFF进行编码:
//减去0x10000并拆分
//0x0-0xFFFFF的20位分成两半
charcode=0x10000+((charcode&0x3ff)18),
0x80 |((字符码>>12)和0x3f),
0x80 |((字符码>>6)和0x3f),
0x80 |(字符码&0x3f));
}
}
返回utf8;
}
函数replaceText(sourceFile、targetFile、pageNumber、findText、replaceText){
var writer=hummus.createWriterToModify(源文件{
modifiedFilePath:targetFile
});
var修饰符=新的hummus.PDFPageModifier(writer,pageNumber);
var sourceParser=writer.createPDFCopingContextFormodifiedFile().getSourceDocumentParser();
var pageObject=sourceParser.parsePage(页码);
var textObjectId=pageObject.getDictionary().toJSObject().Contents.getObjectID();
var textStream=sourceParser.queryDictionaryObject(pageObject.getDictionary(),'Contents');
//读取原始文本数据块
var数据=[];
var readStream=sourceParser.startReadingFromStream(textStream);
while(readStream.notEnded()){
Array.prototype.push.apply(data,readStream.read(10000));
}
var string=new Buffer(data).toString().replace(findText,replaceText);
//创建并编写新的文本对象
var objectsContext=writer.getObjectsContext();
objectsContext.startModifiedIndirectObject(textObjectId);
var stream=objectsContext.startUnfilteredPDFStream();
stream.getWriteStream().write(strToByteArray(string));
objectsContext.endPDFStream(流);
objectsContext.endIndirectObject();
writer.end();
}
replaceText('file.pdf','output.pdf',0,/replacetme/g,'My New Custom Text');

对不起,我的英语不好

这是一个莫吉贝克。此文件可能保存在ANSI中。您的代码假定PDF页面内容流是UTF-8编码的,并且易于编辑。这种假设是错误的。内容流中的指令和数字参数确实是ASCII编码的,但是显示操作的文本的字符串参数是根据当前字体的编码编码的。因此,这样的内容流中的每个字符串参数可能具有不同的编码!西欧语言中的简单PDF通常使用WinAnsienceODing定义字体,这类似于ISO 8859-1,因此使用这种编码可能会更成功。虽然你是对的,但里面可能没有你的角色!编码就像WinAnsiencecoding,但我不知道从现在起如何做。。。是在我将字符串转换为字节数组时吗?或者之前?我编码为windows1252,现在:
var string=windows1252.encode(新缓冲区.from(data).toString('binary').replace(findText,replaceText))但我得到的是pdf格式的字符:“ÇÕ”、“Ô。。。我认为问题在于字符串到字节数组。。。有什么建议吗?这是莫吉贝克。此文件可能保存在ANSI中。您的代码假定PDF页面内容流是UTF-8编码的,并且易于编辑。这种假设是错误的。内容流中的指令和数字参数确实是ASCII编码的,但是显示操作的文本的字符串参数是根据当前字体的编码编码的。因此,这样的内容流中的每个字符串参数可能具有不同的编码!西欧语言中的简单PDF通常使用WinAnsienceODing定义字体,这类似于ISO 8859-1,因此使用这种编码可能会更成功。虽然你是对的,但里面可能没有你的角色!编码就像WinAnsiencecoding,但我不知道从现在起如何做。。。是在我将字符串转换为字节数组时吗?或者之前?我编码为windows1252,现在:
var string=windows1252.encode(新缓冲区.from(data).toString('binary').replace(findText,replaceText))但我得到的是pdf格式的字符:“ÇÕ”、“Ô。。。我认为问题在于字符串到字节数组。。。有什么建议吗?
const hummus = require('hummus');
const fs = require('fs');

/**
 * Returns a byteArray string
 * 
 * @param {string} str - input string
 */
function strToByteArray(str) {
var utf8 = [];
    for (var i=0; i < str.length; i++) {
        var charcode = str.charCodeAt(i);
        if (charcode < 0x80) utf8.push(charcode);
        else if (charcode < 0x800) {
            utf8.push(0xc0 | (charcode >> 6), 
                      0x80 | (charcode & 0x3f));
        }
        else if (charcode < 0xd800 || charcode >= 0xe000) {
            utf8.push(0xe0 | (charcode >> 12), 
                      0x80 | ((charcode>>6) & 0x3f), 
                      0x80 | (charcode & 0x3f));
        }
        // surrogate pair
        else {
            i++;
            // UTF-16 encodes 0x10000-0x10FFFF by
            // subtracting 0x10000 and splitting the
            // 20 bits of 0x0-0xFFFFF into two halves
            charcode = 0x10000 + (((charcode & 0x3ff)<<10)
                      | (str.charCodeAt(i) & 0x3ff));
            utf8.push(0xf0 | (charcode >>18), 
                      0x80 | ((charcode>>12) & 0x3f), 
                      0x80 | ((charcode>>6) & 0x3f), 
                      0x80 | (charcode & 0x3f));
        }
    }
    return utf8;
}

function replaceText(sourceFile, targetFile, pageNumber, findText, replaceText) {  
    var writer = hummus.createWriterToModify(sourceFile, {
        modifiedFilePath: targetFile
    });
    var modifier = new hummus.PDFPageModifier(writer, pageNumber);
    var sourceParser = writer.createPDFCopyingContextForModifiedFile().getSourceDocumentParser();
    var pageObject = sourceParser.parsePage(pageNumber);
    var textObjectId = pageObject.getDictionary().toJSObject().Contents.getObjectID();
    var textStream = sourceParser.queryDictionaryObject(pageObject.getDictionary(), 'Contents');
    //read the original block of text data
    var data = [];
    var readStream = sourceParser.startReadingFromStream(textStream);
    while(readStream.notEnded()){
        Array.prototype.push.apply(data, readStream.read(10000));
    }
    var string = new Buffer(data).toString().replace(findText, replaceText);

    //Create and write our new text object
    var objectsContext = writer.getObjectsContext();
    objectsContext.startModifiedIndirectObject(textObjectId);

    var stream = objectsContext.startUnfilteredPDFStream();
    stream.getWriteStream().write(strToByteArray(string));
    objectsContext.endPDFStream(stream);

    objectsContext.endIndirectObject();

    writer.end();
}

replaceText('file.pdf', 'output.pdf', 0, /REPLACEME/g, 'My New Custom Text');