Получение значений (id, PurchaseOrderNumber и сумма) из файла PDF в Laravel?

Я пытаюсь получить значения из загруженного файла PDF. Поэтому, когда файл успешно загружен, я хочу получить некоторые данные, в частности, идентификатор, PurchaseOrderNo и сумму из этого PDF-файла.

До сих пор я обращался к spatie/pdf-to-text, и я могу загрузить и открыть файл PDF, но я не могу и не знаю, как мне получить необходимые данные и отобразить их в моем Blade View.

$name=$file->getClientOriginalName();
$file->move(public_path().'/pdftotext/', $name);
$data[] = $name;
$attachments = public_path().'/pdftotext/'. $name;


$path = public_path('/pdftotext/'. $name);
$text =  Pdf::getText ('Invoice 56569.pdf', $path);  

Приведенный выше код загрузит файл PDF и сохранит его в папке public/pdftotext, а после загрузки откроет загруженный файл PDF, но не получит никаких значений.

Пожалуйста, посоветуйте мне, как я могу это исправить. Спасибо за ваше время.


person Sarah Malik    schedule 04.03.2019    source источник
comment
второй аргумент - это путь к бинарному файлу pdftotext, а не путь к папке сохранения pdf, он должен быть просто Pdf::getText($path).. все в документах   -  person Lawrence Cherone    schedule 04.03.2019
comment
Почему бы не $text = Pdf::getText ($name); переменная $path не определена. Но, похоже, самое время изменить этот $file->move(public_path().'/pdftotext/', $name); на $file->move($path, $name); и выше этого $path = public_path().'/pdftotext/';, тогда вы можете все это почистить.   -  person ArtisticPhoenix    schedule 04.03.2019
comment
@LawrenceCherone, я не уверен, но у меня это работает. Я пробовал это с прошлой недели, и мне удалось это решить. Когда я загружаю файл, файлы загружаются в папку, и он открывает файл PDF в браузере.   -  person Sarah Malik    schedule 04.03.2019
comment
выдает ошибку: The command ""/usr/bin/pdftotext" "Invoice 56569.pdf" -" failed. Exit Code: 1(General error) Working directory:   -  person Sarah Malik    schedule 04.03.2019
comment
если мы хотим использовать собственный путь, он говорит на веб-сайте Spatie echo Pdf::getText('book.pdf', '/custom/path/to/pdftotext');   -  person Sarah Malik    schedule 04.03.2019
comment
Вы должны определить $path намного раньше, а затем использовать его вместо всех этих вызовов public_path().'/pdftotext/', также есть разница с тем и $path = public_path('/pdftotext/'. $name). Таким образом, это очистит все это и сделает его намного приятнее для чтения.   -  person ArtisticPhoenix    schedule 04.03.2019


Ответы (1)


Вместо этого:

   $name=$file->getClientOriginalName();
   $file->move(public_path().'/pdftotext/', $name);
   $data[] = $name;
   $attachments = public_path().'/pdftotext/'. $name;


   $path = public_path('/pdftotext/'. $name);
   $text =  Pdf::getText ('Invoice 56569.pdf', $path); 

Разумнее сделать так:

   $name = $file->getClientOriginalName();
   $path = public_path('/pdftotext/');
   $file->move($path, $name);
   $text =  Pdf::getText ($name, $path); 

   // -- these have no bearing on this code so do them a bit later (here I will just ignore them)
   //$data[] = $name;  
   //$attachments = $path.$name;

Хотя это может не «решить» вашу проблему, было бы слишком много писать в комментарии, и это сделает его намного чище, меньше ошибок и его будет приятнее читать.

Я не очень организованный человек, но отсутствие организации в коде вызовет у вас больше проблем, чем что-либо еще.

Самое главное в коде, который я разместил выше, это изменение:

 $path = public_path('/pdftotext/');

Вместо того, что у вас было изначально (с именем файла)

 $path = public_path('/pdftotext/'. $name);

Скорее всего, это «проблема», зависит от того, как они реализуют Pdf::getText, они могут использовать dirname() во втором аргументе, что было бы хорошо, поскольку это вернет имя папки {минус} - имя файла. Но если они проверят is_dir(), это не удастся.

После перемещения вещей мне стало ясно, как это использовалось.

  $path = public_path('/pdftotext/'.$name);
  $file->move($path, $name);  ///file->move(pdftotext/book.pdf, book.pdf) etc...

Что мне показалось неправильным. Кроме того, это сделает ваш вызов Pdf::getText таким (например)

  echo Pdf::getText('book.pdf', '/custom/path/to/pdftotext/book.pdf');

Когда то, что вы, вероятно, хотите, это:

 echo Pdf::getText('book.pdf', '/custom/path/to/pdftotext/');

Вот почему я сказал выше, что это зависит от того, как они реализуют Pdf::getText, потому что есть способы определить, является ли путь DIR или FILE. Таким образом, они могли обойти это внутри этого метода. Я понятия не имею, делают ли они это (может быть, я посмотрю источник и увижу). Я посмотрел {кратко} и, похоже, они вообще не проверяют.

Имеет смысл. Вот почему я сказал организовать его по мере того, как все становится яснее, чем легче читать код.

person ArtisticPhoenix    schedule 04.03.2019
comment
эй, я все еще получаю сообщение об ошибке, основанное на коде, который вы предоставили. Ошибка: «Невозможно создать каталог C:\xampp\htdocs\assignment_Sem2\public\pdftotext/Invoice 56569.pdf». - person Sarah Malik; 04.03.2019
comment
Проблема заключается в вышеупомянутом втором аргументе, взгляните на документы, github.com/spatie /pdf-to-text#использование - person Lawrence Cherone; 04.03.2019
comment
эта строка $path = public_path('/pdftotext/'. $name); не должна включать имя файла, что, вероятно, является причиной всех ваших проблем. Я обновил ответ. - person ArtisticPhoenix; 04.03.2019
comment
да, я читал это, но у вас было (см. мой последний комментарий) это echo Pdf::getText('book.pdf', '/custom/path/to/pdftotext/book.pdf'); с именем файла как частью второго аргумента... Теоретически они должны использовать dirname() во втором аргументе, но я понятия не имею, делают ли они это что. Если бы они просто сделали что-то вроде is_dir(), это было бы неправильно. - person ArtisticPhoenix; 04.03.2019
comment
@ArtisticPhoenix все еще есть ошибка. Я удалил и следовал коду. Ошибка, которую я получаю: The command ""C:\xampp\htdocs\assignment_Sem2\public\pdftotext/" "Invoice 56569.pdf" -" failed. Exit Code: 1(General error) Working directory: C:\xampp\htdocs\assignment_Sem2\public Output: ================ Error Output: ================ '"C:\xampp\htdocs\assignment_Sem2\public\pdftotext/"' is not recognized as an internal or external command, operable program or batch file. - person Sarah Malik; 04.03.2019
comment
@LawrenceCherone в любом случае, мне удалось открыть файл PDF, но моя основная проблема изложена в этом вопросе: как я могу получить значения из этого файла PDF? - person Sarah Malik; 04.03.2019
comment
@SarahMalik - для этого вам нужно посмотреть, что там написано в документации. похоже, что это может просто преобразовать PDF в текст в целом. - person ArtisticPhoenix; 04.03.2019