How to replace a string in a PDF file using NodeJS?

I have a PDF template file and I want to replace some marker lines in order to generate new PDF files and save them. What is the best / easiest way to do this? I donโ€™t need to add graphics or anything unusual, just replace the text, so I donโ€™t want anything too complicated.

Thank!

Change: Just found HummusJS , I will see if I can make progress and publish it here.

+7
source share
2 answers

I found this question by searching, so I think it deserves an answer. I found the answer from BrighTide here: https://github.com/galkahana/HummusJS/issues/71#issuecomment-275956347

In fact, there is a very powerful Hummus package that uses a library written in C ++ (cross-platform, of course). I think the answer given in this GitHub comment can be functionalized like this:

var hummus = require('hummus');

/**
 * Returns a byteArray string
 * 
 * @param {string} str - input string
 */
function strToByteArray(str) {
  var myBuffer = [];
  var buffer = new Buffer(str);
  for (var i = 0; i < buffer.length; i++) {
      myBuffer.push(buffer[i]);
  }
  return myBuffer;
}

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('source.pdf', 'output.pdf', 0, /REPLACEME/g, 'My New Custom Text');

UPDATE:
While writing the example, the version was used 1.0.83, lately everything can change.

2: PDF . - , QWERTYUIOPASDFGHJKLZXCVBNM1234567890- -286(Q)9(WER)24(T)-8(YUIOP)116(ASDF)19(GHJKLZX)15(CVBNM1234567890-) , , , ... , :

var string = new Buffer(data).toString().replace(findText, replaceText);

- :

var string = Buffer.from(data).toString();

var characters = REPLACE_ME;
var match = [];
for (var a = 0; a < characters.length; a++) {
    match.push('(-?[0-9]+)?(\\()?' + characters[a] + '(\\))?');
}

string = string.replace(new RegExp(match.join('')), function(m, m1) {
    // m1 holds the first item which is a space
    return m1 + '( ' + REPLACE_WITH_THIS + ')';
});
+6

, .

PDF , . CSS @page , PDF; PDF, .

@Alex-K : ,

new Buffer(data).toString()

, PDF. :

.23999999 0 0 -.23999999 0 792 cm
q
154.166641 154.166641 2245.8328 2993.4011 re
W* n
q
3.1279011 0 0 3.1279011 154.166641 -5832.6362 cm
1 1 1 RG 1 1 1 rg
/G3 gs
0 0 718 2580 re
f
0 0 0 RG 0 0 0 rg
BT
/F4 14 Tf
1 0 0 -1 25 1930 Tm
<0062> Tj
ET
/Pattern CS/Pattern cs/P14 SCN/P14 scn
25 1009 668 1509 re
f
0 0 0 RG 0 0 0 rg
BT
/F4 14 Tf
1 0 0 -1 25 1981 Tm
<0057004800560057004400570052005500030056004C004A00510056000300440051004700030048005B00480046005800570048005600030057004B004C00560003004C0051005600570055005800500048005100570003004400560003000B004B004C0056000C000B004B00480055000C0003004F0044005600570003005A004C004F004F0003004400510047000300570048005600570044005000480051005700030057004B004400570003000B004B0048000C000B0056004B0048000C00030056004C004A005100560003004C0057> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2000 Tm
<005A004C004F004F004C0051004A004F005C0003000B005200550003005A004C004F004F004C0051004A004F005C00030047004C0055004800460057005600030044005100520057004B0048005500030057005200030056004C004A005100030049005200550003000B004B004C0056000C000B004B00480055000C000C000F000300440051004700030057004B004400570003004800440046004B000300520049000300580056000F0003004C005100030057004B00480003005300550048005600480051004600480003004400510047> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2019 Tm
<004B004800440055004C0051004A00030052004900030057004B0048000300570048005600570044005700520055000F0003004B0048005500480045> Tj
194.43457 0 Td <005C00030056004C004A0051005600030057004B004C00560003005A004C004F004F0003004400560003005A004C0057005100480056005600030057005200030057004B0048000300570048005600570044005700520055> Tj
271.22266 0 Td <00CB> Tj
2.8027344 0 Td <005600030056004C004A0051004C0051004A000F000300440051004700030057004B0044005700030057005200030057004B004800030045004800560057> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2038 Tm
<0052004900030052005800550003004E00510052005A004F00480047004A004800030057004B00480003005700480056005700440057005200550003004C00560003003E0014001B00400003005C004800440055005600030052004900030044004A004800030052005500030052004F004700480055000F00030052004900030056005200580051004700030050004C00510047000F00030044005100470003005800510047004800550003005100520003004600520051005600570055> Tj
627.46387 0 Td <0044004C00510057> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2057 Tm
<005200550003005800510047005800480003004C00510049004F005800480051004600480011> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2111 Tm
<0042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2130 Tm
<003A004C00570051004800560056> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2165 Tm
<0042> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 31.421875 2165 Tm
<004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2184 Tm
<003A004C00570051004800560056> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2238 Tm
<0036> Tj
7.3349609 0 Td <0037> Tj
7.7382813 0 Td <0024> Tj
9.0302734 0 Td <0037002800030032002900030035002B0032002700280003002C0036002F002400310027> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2273 Tm
<0026> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 33.578125 2273 Tm
<0032003800310037003C000300320029000300420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2308 Tm
<002C> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 30.140625 2308 Tm
<005100030042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200030052005100030057004B004C005600030042004200420042004200420042004200420042000300470044> Tj
316.45605 0 Td <005C000300520049000300420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042000F000300150013004200420042004200420042000F0003004500480049005200550048000300500048> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2327 Tm
<0053004800550056005200510044004F004F005C00030044005300530048004400550048004700030057004B00480003005800510047004800550056004C004A005100480047000F0003005A004B0052000F000300450048004C0051004A000300470058004F005C00030056005A005200550051000F00030047004800530052005600480003004400510047000300560044> Tj
509.88574 0 Td <005C00030057004B00440057001D00030057004B0048005C0003005A004C0057005100480056005600480047> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2346 Tm
<0057004B004800030048005B0048004600580057004C0052005100030052004900030057004B00480003005A004C004F004F000300520049000300420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042004200420042001E00030057004B0044005700030057004B004800030056004C004A00510044005700580055004800030057005200030057004B00480003005A004C004F004F0003004C00560003004C005100030057004B0048> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2365 Tm
<004B004400510047005A0055004C0057004C0051004A00030052004900030057004B00480003005700480056005700440057005200550003005200550003005A004400560003005000440047004800030045> Tj
281.11426 0 Td <005C00030056005200500048000300520057004B004800550003005300480055005600520051000300490052005500030057004B0048000300570048005600570044005700520055000F0003004C005100030057004B0048000300570048005600570044005700520055000A0056> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2384 Tm
<00530055004800560048005100460048000300440051004700030045> Tj
100.994141 0 Td <005C00030057004B0048000300570048005600570044005700520055000A005600030048005B0053005500480056005600030047004C0055004800460057004C00520051001E00030057004B0044005700030057004B00480003005700480056005700440057005200550003005600520003005600580045005600460055004C00450048004700030057004B00480003005A004C004F004F0003004400510047> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2403 Tm
<004700480046004F004400550048004700030057004B0048000300560044005000480003005700520003004500480003004B004C00560003004F0044005600570003005A004C004F004F0003004C005100030057004B0048004C0055000300530055004800560048005100460048001E00030057004B0044005700030057004B0048005C00030057004B004800550048004400490057004800550003005600580045005600460055004C00450048004700030057004B004800030056004400500048000300440056> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2422 Tm
<005A004C00570051004800560056004800560003004C005100030057004B004800030053005500480056004800510046004800030052004900030057004B004800030057004800560057004400570052005500030044005100470003004C005100030057004B00480003005300550048005600480051004600480003005200490003004800440046004B000300520057004B00480055001E00030057004B0044005700030044005700030057004B004800030057004C00500048000300520049> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2441 Tm
<0048005B0048004600580057004C0052005100030052004900030057004B00480003005A004C004F004F00030057004B004800030057004800560057004400570052005500030044005300530048004400550048004700030057005200030045004800030052004900030056005200580051004700030050004C00510047000300440051004700030048004C004A004B00570048004800510003000B0014001B000C0003005C004800440055005600030052004900030044004A0048000300520055> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2460 Tm
<0052005900480055001E000300440051004700030057004B0044005700030057004B004800030056004C004A005100440057005800550048005600030052004900030057004B00480003005A004C005700510048005600560048005600030052005100030057004B00480003005A004C004F004F00030044005500480003004A004800510058004C005100480011> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2514 Tm
<003600580045005600460055004C004500480047000300440051004700030056005A005200550051000300570052000300450048004900520055004800030050004800030052005100030057004B0048000300470044> Tj
302.50391 0 Td <005C00030044005100470003004700440057004800030049004C0055005600570003004400450052005900480003005A0055004C0057005700480051000F> Tj
ET
BT
/F4 14 Tf
1 0 0 -1 25 2551 Tm
<0062> Tj
ET
Q
Q
q
229.23627 154.166641 1801.6709 156.394882 re
W* n
q
3.1279011 0 0 3.1279011 154.166641 -5832.6362 cm
1 1 1 RG 1 1 1 rg
/G3 gs
24 1914 576 50 re
f
Q
Q
q
154.166641 154.166641 2245.8328 2993.4011 re
W* n
q
3.1279011 0 0 3.1279011 154.166641 -5832.6362 cm
.749 .1176 .1765 RG .749 .1176 .1765 rg
/G3 gs
BT
/F6 16 Tf
1 0 0 -1 36 1942 Tm
<002A> Tj
ET
BT
/F6 16 Tf
1 0 0 -1 49.953125 1942 Tm
<002800310037003500280032> Tj
ET
Q
Q
q
2030.9072 154.166641 200.18579 156.394882 re
W* n
q
3.1279011 0 0 3.1279011 154.166641 -5832.6362 cm
1 1 1 RG 1 1 1 rg
/G3 gs
600 1914 64 50 re
f
Q
Q
q
154.166641 154.166641 2245.8328 2993.4011 re
W* n
q
3.1279011 0 0 3.1279011 154.166641 -5832.6362 cm
/G3 gs
BT
/F4 10 Tf
1 0 0 -1 612 1937 Tm
<0033> Tj
ET
BT
/F4 10 Tf
1 0 0 -1 618.03125 1937 Tm
<0044004A00480003001300120013> Tj
ET
Q
Q

PDF, , - , , . ( )

, , , github HummusJS, , . , - , C++, , HummusJS, .

- , ?

0

All Articles