Необходимо извлечь все заголовки, содержащие # символы, из файла PDF

Мне нужно извлечь заголовки моего PDF-файла, которые начинаются с символов #, с помощью PHP. Я не знаю, как это сделать. Вот ссылка на мой PDF-файл:

https://afxwebdesign.com/order.pdf

Я попробовал этот скрипт:

<?php
// Load the PDF file
$pdfFile = 'order.pdf';

// Use a PDF parsing library like TCPDF or FPDI to extract text
// Code snippet using TCPDF

require_once('tcpdf.php');
require_once('vendor/setasign/fpdi/src/autoload.php');

use setasign\Fpdi\Tcpdf\Fpdi;
$pdf = new Fpdi();
$pageCount = $pdf->setSourceFile($pdfFile);

for ($pageNo = 1; $pageNo <= $pageCount; $pageNo++) {
    $templateId = $pdf->importPage($pageNo);
    $text = $pdf->getPageContent($pageNo);

    preg_match_all('/^#[^#].*$/m', $text, $headings);

    foreach ($headings[0] as $heading) {
        echo $heading . "\n";
    }
}

$pdf->close();
?>

Но это не работает - выдает такую ​​ошибку:

Неустранимая ошибка: неперехваченная ошибка: вызов неопределенного метода setasign\Fpdi\Tcpdf\Fpdi::getPageContent() в C:\xampp\htdocs\pdfextract\index.php:17 Трассировка стека: выброшено #0 {main} в C:\xampp\htdocs\pdfextract\index.php в строке 17

Это сообщение об ошибке сообщает вам, что не существует метода под названием getPageContent(), о чем я уверен, что вы знаете. Я просмотрел документацию по fpdi, и там нет ссылки на этот метод. Где это определено?

droopsnoot 04.06.2024 11:53

Как и выше, почему вы ожидаете, что сможете использовать там функцию с именем getPageContent? Где вы прочитали, что такое существует? Возможно, вы перепутали его с кодом другой библиотеки PDF или, может быть, с другим классом в библиотеке fpdi?

ADyson 04.06.2024 11:57

Потенциально актуально: stackoverflow.com/questions/36809580/… , stackoverflow.com/questions/28959530/…

ADyson 04.06.2024 12:00
github.com/smalot/pdfparser/blob/master/README.md
dale landry 04.06.2024 22:02

Насколько мне известно, FPDI не предназначен для извлечения текста из PDF-файла.

Chris Haas 05.06.2024 05:56
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Symfony Station Communiqué - 7 июля 2023 г
Symfony Station Communiqué - 7 июля 2023 г
Это коммюнике первоначально появилось на Symfony Station .
Оживление вашего приложения Laravel: Понимание режима обслуживания
Оживление вашего приложения Laravel: Понимание режима обслуживания
Здравствуйте, разработчики! В сегодняшней статье мы рассмотрим важный аспект управления приложениями, который часто упускается из виду в суете...
Установка и настройка Nginx и PHP на Ubuntu-сервере
Установка и настройка Nginx и PHP на Ubuntu-сервере
В этот раз я сделаю руководство по установке и настройке nginx и php на Ubuntu OS.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
Как установить PHP на Mac
Как установить PHP на Mac
PHP - это популярный язык программирования, который используется для разработки веб-приложений. Если вы используете Mac и хотите разрабатывать...
1
5
76
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Я пропустил PHP, чтобы извлечь текст, где находится символ «#», но я использовал библиотеку javascript pdf.js, и она работает абсолютно нормально. вот полный код JavaScript. работает на 100% нормально.

<!DOCTYPE html>
<html lang = "en">
<head>
    <meta charset = "UTF-8">
    <meta name = "viewport" content = "width=device-width, initial-scale=1.0">
    <title>PDF Line Extractor with Screenshot</title>
    <script src = "https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.10.377/pdf.min.js"></script>
    <script src = "https://cdnjs.cloudflare.com/ajax/libs/html2canvas/1.4.1/html2canvas.min.js"></script>
</head>
<body>
    <input type = "file" id = "file-input" />
    <pre id = "output"></pre>
    <canvas id = "pdf-canvas"></canvas>
    <script>
        document.getElementById('file-input').addEventListener('change', function(event) {
            const file = event.target.files[0];
            if (file) {
                const reader = new FileReader();
                reader.onload = function(e) {
                    const typedarray = new Uint8Array(e.target.result);
                    extractLinesAndScreenshotsFromPDF(typedarray).then(lines => {
                        document.getElementById('output').textContent = lines.join('\n');
                    }).catch(error => {
                        console.error('Error extracting lines and screenshots:', error);
                    });
                };
                reader.readAsArrayBuffer(file);
            }
        });

        async function extractLinesAndScreenshotsFromPDF(data) {
            const pdf = await pdfjsLib.getDocument({ data }).promise;

            let extractedLines = [];

            for (let pageNum = 1; pageNum <= pdf.numPages; pageNum++) {
                const page = await pdf.getPage(pageNum);
                const textContent = await page.getTextContent();

                // Group text items by their y-coordinate
                const groupedText = {};
                textContent.items.forEach(item => {
                    const y = Math.floor(item.transform[5]);  // Use y-coordinate for grouping
                    if (!groupedText[y]) {
                        groupedText[y] = [];
                    }
                    groupedText[y].push(item.str);
                });

                // Concatenate items to form complete lines
                const pageTextLines = Object.values(groupedText).map(items => items.join(' '));
                const filteredLines = pageTextLines.filter(line => line.includes('#'));

                if (filteredLines.length > 0) {
                    extractedLines = extractedLines.concat(filteredLines);

                    // Render the page on canvas
                    const viewport = page.getViewport({ scale: 1.5 });
                    const canvas = document.getElementById('pdf-canvas');
                    const context = canvas.getContext('2d');
                    canvas.width = viewport.width;
                    canvas.height = viewport.height;

                    await page.render({ canvasContext: context, viewport }).promise;

                    // Take screenshot and send to server
                    html2canvas(canvas).then(canvas => {
                        const imgData = canvas.toDataURL('image/png');
                        const blob = dataURLToBlob(imgData);
                        const formData = new FormData();
                        const dt= "<?= date('MdyHis') ?>";
                        const randd = Math.floor(Math.random() * 9999990);
                        formData.append('screenshot', blob, `screenshot-${pageNum+dt+randd}.png`);
                        fetch('save_screenshot.php', {
                            method: 'POST',
                            body: formData
                        }).then(response => {
                            if (!response.ok) {
                                throw new Error('Network response was not ok');
                            }
                            return response.text();
                        }).then(data => {
                            console.info('Screenshot saved:', data);
                        }).catch(error => {
                            console.error('Error saving screenshot:', error);
                        });
                    });
                }
            }

            return extractedLines;
        }

        function dataURLToBlob(dataURL) {
            const byteString = atob(dataURL.split(',')[1]);
            const mimeString = dataURL.split(',')[0].split(':')[1].split(';')[0];
            const ab = new ArrayBuffer(byteString.length);
            const ia = new Uint8Array(ab);
            for (let i = 0; i < byteString.length; i++) {
                ia[i] = byteString.charCodeAt(i);
            }
            return new Blob([ab], { type: mimeString });
        }
    </script>
</body>
</html>

Другие вопросы по теме