أهلا! لا بد لي من العمل مع بعض ملفات 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 بالكامل إلى صفحات منفصلة.
شكرا!
أسئلة كثيرة هنا. بعضها يتعلق بالحمص ، لكني أعتقد أنه يمكنني المساعدة في كل منهم:
لتنزيل تدفق من أمازون ، يمكنك استخدام طريقة 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
قد يكون هذا مفيدًا لشخص ما: http://stackoverflow.com/questions/42512982/node-js-get-the-first-page-of-pdf-buffer
لمعلوماتك ، واجهت بعض مشكلات الأداء مع المثال المقدم. يبدو أن 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(); }
شكرا جزيلا لهذا الرمز أنقذ يومي! بارك الله
التعليق الأكثر فائدة
"" var fs = تتطلب ('fs') ؛
/ *
PDFRStreamForBuffer هو تنفيذ لدفق القراءة باستخدام مصفوفة متوفرة
* /
وظيفة PDFRStreamForBuffer (المخزن المؤقت) {
this.innerBuffer = المخزن المؤقت ؛
this.rposition = 0 ؛
this.fileSize = buffer.byteLength ؛
}
PDFRStreamForBuffer.prototype.read = وظيفة (inAmount) {
var 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