Hummusjs: كيف تعمل مع المخزن المؤقت / ReadableStream؟

تم إنشاؤها على ١٧ نوفمبر ٢٠١٦  ·  7تعليقات  ·  مصدر: galkahana/HummusJS

أهلا! لا بد لي من العمل مع بعض ملفات pdf القادمة من Amazon S3 كمخزن مؤقت. أنا أستخدم طريقة S3 getObject ، والتي تُرجع الملف كمخزن مؤقت في خاصية body:

http://docs.aws.amazon.com/AWSJavaScriptSDK/latest/AWS/S3.html#getObject -property
نص - (Buffer ، Typed Array ، Blob ، String ، ReadableStream) بيانات الكائن.

كيف يمكنني تحليلها؟ أرغب في الحصول على العدد الإجمالي للصفحات ثم تقسيم ملف pdf بالكامل إلى صفحات منفصلة.

شكرا!

التعليق الأكثر فائدة

"" var fs = تتطلب ('fs') ؛

/ *
PDFRStreamForBuffer هو تنفيذ لدفق القراءة باستخدام مصفوفة متوفرة

<strong i="8">@author</strong> Luciano Júnior

* /

وظيفة PDFRStreamForBuffer (المخزن المؤقت) {
this.innerBuffer = المخزن المؤقت ؛
this.rposition = 0 ؛
this.fileSize = buffer.byteLength ؛
}

PDFRStreamForBuffer.prototype.read = وظيفة (inAmount) {
var arr = [] ؛

for(var i = 0; i < inAmount; i++){
    arr.push(this.innerBuffer[this.rposition+i]);
}

this.rposition += inAmount;
return arr;

}

PDFRStreamForBuffer.prototype.notEnded = الوظيفة () {
إرجاع this.rposition <this.fileSize؛
}

PDFRStreamForBuffer.prototype.setPosition = الوظيفة (في الموضع) {
this.rposition = inPosition ؛
}

PDFRStreamForBuffer.prototype.setPositionFromEnd = وظيفة (في الموضع) {
this.rposition = this.fileSize-inPosition ؛
}

PDFRStreamForBuffer.prototype.skip = الوظيفة (inAmount) {
this.rposition + = inAmount ؛
}

PDFRStreamForBuffer.prototype.getCurrentPosition = function () {
إعادة هذا.
}

module.exports = PDFRStreamForBuffer ؛
""

أدخل هذا الرمز في ملف واستخدمه مثل PDFRStreamForFile

ال 7 كومينتر

أسئلة كثيرة هنا. بعضها يتعلق بالحمص ، لكني أعتقد أنه يمكنني المساعدة في كل منهم:

أمازون يتدفقون ، ويحملون ، ويستخدمون ، ويكتبون شيئًا يمكن أن يستخدمه الحمص

لتنزيل تدفق من أمازون ، يمكنك استخدام طريقة getObject ثم بناءً على ذلك إنشاء دفق قراءة يمكنك استخدامه كما هو أو توجيهه إلى شيء آخر (مثل دفق كتابة ملف).
مثله:

 var s3 = new aws.S3({
        params: {
            Bucket: myBucket,
        }
       });
  var readStream = s3.getObject({Key:remoteData.data.remoteKey}).createReadStream();

// use as is or pipe to a writable stream like this:
readStream.pipe(targetStream);

// can use 'end' event to know when the writing is finished
readStream.on('end', function(){
 // writing done
    })

بالنسبة للحمص ، نظرًا لمتطلبات الوصول العشوائي ، لا يمكنك استخدام التدفقات القابلة للقراءة مباشرةً وسيتعين عليك إما توجيه هذا إلى ملف ، أو إلى ذاكرة تخزين مؤقت يمكن استخدامها الآن كمدخل للحمص.

إليك كيفية توجيه مسار القراءة إلى ملف:

var file = fs.createWriteStream(inTargetFilePath);
readStream.pipe(file);
file.on('finish', function() {
      file.close(function() {/* now do whatever you want with the file*/}
 }); 

الاعراب بالحمص الحصول على عدد الصفحات

شرح التحليل بالحمص والحصول على أشياء مثل عدد الصفحات هنا .

على سبيل المثال:

var pdfReader = hummus.createReader('./TestMaterials/XObjectContent.PDF');
pdfReader.getPageCount();

شق

يتم التقسيم ببساطة عن طريق إنشاء ملف PDF جديد لكل صفحة في ملف PDF الأصلي ونسخ محتوى الصفحة الأصلي إلى كائن الصفحة الجديد في الملف الجديد. إليك نموذج نصي يمكنك استخدامه مع ملف عادي:

var hummus = require('hummus');
pdfReader = hummus.createReader('myfile.pdf');
for(var i=0;i<pdfReader.getPagesCount();++i){
    pdfWriter = hummus.createWriter('./output/output' + i + '.pdf')
    pdfWriter.createPDFCopyingContext(pdfReader).appendPDFPageFromPDF(i);
    pdfWriter.end();
}

"" var fs = تتطلب ('fs') ؛

/ *
PDFRStreamForBuffer هو تنفيذ لدفق القراءة باستخدام مصفوفة متوفرة

<strong i="8">@author</strong> Luciano Júnior

* /

وظيفة PDFRStreamForBuffer (المخزن المؤقت) {
this.innerBuffer = المخزن المؤقت ؛
this.rposition = 0 ؛
this.fileSize = buffer.byteLength ؛
}

PDFRStreamForBuffer.prototype.read = وظيفة (inAmount) {
var arr = [] ؛

for(var i = 0; i < inAmount; i++){
    arr.push(this.innerBuffer[this.rposition+i]);
}

this.rposition += inAmount;
return arr;

}

PDFRStreamForBuffer.prototype.notEnded = الوظيفة () {
إرجاع this.rposition <this.fileSize؛
}

PDFRStreamForBuffer.prototype.setPosition = الوظيفة (في الموضع) {
this.rposition = inPosition ؛
}

PDFRStreamForBuffer.prototype.setPositionFromEnd = وظيفة (في الموضع) {
this.rposition = this.fileSize-inPosition ؛
}

PDFRStreamForBuffer.prototype.skip = الوظيفة (inAmount) {
this.rposition + = inAmount ؛
}

PDFRStreamForBuffer.prototype.getCurrentPosition = function () {
إعادة هذا.
}

module.exports = PDFRStreamForBuffer ؛
""

أدخل هذا الرمز في ملف واستخدمه مثل PDFRStreamForFile

galkahana هل يمكنك إعطاء مثال من فضلك كيف يمكنني استخدام "ذاكرة عازلة" التي ذكرتها بدلاً من ملف؟ لقد أجريت الكثير من البحث على googling / ولكن ما زلت لا أستطيع العثور على أي مُنشئ تم تصديره من HummusJs.

حصلت عليه هنا - PDFRStreamForBuffer

لمعلوماتك ، واجهت بعض مشكلات الأداء مع المثال المقدم. يبدو أن Hummus سيقرأ بايت خارج المخزن المؤقت ، لذلك انتهى بي الأمر بفعل هذا بدلاً من ذلك:

read() {
    const previousPosition = this.position;
    this.position += inAmount;
    return [...this.innerBuffer.slice(previousPosition, this.position)];
}

(إذا كنت لا تستخدم أحدث إصدارات Nodejs أو Babel ، فما عليك سوى استخدام [].concat(this.innerBuffer.slice(previousPosition, this.position)) . لا تُرجع الشريحة مصفوفة "true" ، لذلك سينفجر Hummus.)

أسئلة كثيرة هنا. بعضها يتعلق بالحمص ، لكني أعتقد أنه يمكنني المساعدة في كل منهم:

أمازون يتدفقون ، ويحملون ، ويستخدمون ، ويكتبون شيئًا يمكن أن يستخدمه الحمص

لتنزيل تدفق من أمازون ، يمكنك استخدام طريقة getObject ثم بناءً على ذلك إنشاء دفق قراءة يمكنك استخدامه كما هو أو توجيهه إلى شيء آخر (مثل دفق كتابة ملف).
مثله:

 var s3 = new aws.S3({
        params: {
            Bucket: myBucket,
        }
       });
  var readStream = s3.getObject({Key:remoteData.data.remoteKey}).createReadStream();

// use as is or pipe to a writable stream like this:
readStream.pipe(targetStream);

// can use 'end' event to know when the writing is finished
readStream.on('end', function(){
 // writing done
    })

بالنسبة للحمص ، نظرًا لمتطلبات الوصول العشوائي ، لا يمكنك استخدام التدفقات القابلة للقراءة مباشرةً وسيتعين عليك إما توجيه هذا إلى ملف ، أو إلى ذاكرة تخزين مؤقت يمكن استخدامها الآن كمدخل للحمص.

إليك كيفية توجيه مسار القراءة إلى ملف:

var file = fs.createWriteStream(inTargetFilePath);
readStream.pipe(file);
file.on('finish', function() {
      file.close(function() {/* now do whatever you want with the file*/}
 }); 

الاعراب بالحمص الحصول على عدد الصفحات

شرح التحليل بالحمص والحصول على أشياء مثل عدد الصفحات هنا .

على سبيل المثال:

var pdfReader = hummus.createReader('./TestMaterials/XObjectContent.PDF');
pdfReader.getPageCount();

شق

يتم التقسيم ببساطة عن طريق إنشاء ملف PDF جديد لكل صفحة في ملف PDF الأصلي ونسخ محتوى الصفحة الأصلي إلى كائن الصفحة الجديد في الملف الجديد. إليك نموذج نصي يمكنك استخدامه مع ملف عادي:

var hummus = require('hummus');
pdfReader = hummus.createReader('myfile.pdf');
for(var i=0;i<pdfReader.getPagesCount();++i){
    pdfWriter = hummus.createWriter('./output/output' + i + '.pdf')
    pdfWriter.createPDFCopyingContext(pdfReader).appendPDFPageFromPDF(i);
    pdfWriter.end();
}

شكرا جزيلا لهذا الرمز أنقذ يومي! بارك الله

هل كانت هذه الصفحة مفيدة؟
0 / 5 - 0 التقييمات

القضايا ذات الصلة

talhaanees picture talhaanees  ·  5تعليقات

andrejkaurin picture andrejkaurin  ·  5تعليقات

Barnie picture Barnie  ·  8تعليقات

richard-kurtosys picture richard-kurtosys  ·  5تعليقات

JensWinter picture JensWinter  ·  5تعليقات