pdfm.ru Ads.txt file


<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8" />
<title>Удалить страницы из PDF онлайн бесплатно — Удаление страниц из ПДФ без регистрации</title>

<!-- Мета-описание для SEO -->
<meta name="description" content="Удалите страницы из PDF онлайн бесплатно без регистрации. Удобный инструмент для быстрого удаления ненужных страниц из ПДФ-документов прямо в браузере.">
<meta name="keywords" content="удалить страницы из pdf онлайн, удалить страницу из пдф онлайн, удалить страницы из пдф, удалить страницу из pdf, удаление страниц pdf онлайн, убрать страницу из pdf, редактировать pdf, обрезать pdf">
<meta name="robots" content="index, follow">
<meta name="author" content="PDFM.ru">
<meta name="copyright" content="PDFM.ru">
<meta name="application-name" content="Удалить страницы из PDF онлайн">
<meta name="subject" content="Удаление страниц из PDF бесплатно">
<meta name="url" content="https://pdfm.ru/">
<meta name="identifier-URL" content="https://pdfm.ru/">

<!-- Open Graph для соцсетей -->
<meta property="og:type" content="website">
<meta property="og:title" content="Удалить страницы из PDF онлайн бесплатно — Удаление страниц из ПДФ">
<meta property="og:description" content="Простой и бесплатный инструмент для удаления страниц из PDF онлайн. Удалите ненужные страницы за секунды! Без установки и регистрации.">
<meta property="og:url" content="https://pdfm.ru/">
<meta property="og:site_name" content="PDFM.ru">
<meta property="og:image" content="https://pdfm.ru/apple-touch-icon.png">

<!-- Twitter Card -->
<meta name="twitter:card" content="summary_large_image">
<meta name="twitter:title" content="Удалить страницы из PDF онлайн бесплатно — Быстро и Безопасно">
<meta name="twitter:description" content="Бесплатное онлайн-редактирование PDF: удаляйте ненужные страницы прямо в браузере. Безопасно и без потери качества.">
<meta name="twitter:image" content="https://pdfm.ru/apple-touch-icon.png">
<meta name="twitter:site" content="@pdfm_ru">

<!-- Mobile optimization -->
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<meta name="theme-color" content="#4CAF50">

<!-- Canonical (основной URL) -->
<link rel="canonical" href="https://pdfm.ru/">

<!-- Favicon и иконки -->
<link rel="icon" type="image/png" href="/favicon-96x96.png" sizes="96x96">
<link rel="icon" type="image/svg+xml" href="/favicon.svg">
<link rel="shortcut icon" href="/favicon.ico">
<link rel="apple-touch-icon" sizes="180x180" href="/apple-touch-icon.png">
<meta name="apple-mobile-web-app-title" content="pdfm.ru">
<link rel="manifest" href="/site.webmanifest">

<!-- Schema.org (структурированные данные JSON-LD) -->
<script type="application/ld+json">
{
"@context": "https://schema.org",
"@type": "SoftwareApplication",
"name": "Удалить страницы из PDF онлайн",
"operatingSystem": "All",
"applicationCategory": "WebApplication",
"description": "Бесплатный инструмент для удаления страниц из PDF онлайн без регистрации. Удаляйте ненужные страницы быстро и легко прямо в браузере.",
"url": "https://pdfm.ru/",
"image": "https://pdfm.ru/apple-touch-icon.png",
"offers": {
"@type": "Offer",
"price": "0",
"priceCurrency": "RUB"
}
}
</script>
<!-- PDF.js (используем CDN) -->
<script src="https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.14.305/pdf.min.js"></script>
<!-- Укажем воркер PDF.js (важно!) -->
<script>
pdfjsLib.GlobalWorkerOptions.workerSrc = 'https://cdnjs.cloudflare.com/ajax/libs/pdf.js/2.14.305/pdf.worker.min.js';
</script>

<style>
/* Общий сброс и стилизация */
* {
box-sizing: border-box;
}
body, h1, h2, h3, h4, h5, p, ul, li, figure, figcaption {
margin: 0;
padding: 0;
}
body {
font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", Roboto, Oxygen, Ubuntu, Cantarell, "Open Sans", "Helvetica Neue", sans-serif;
background: linear-gradient(120deg, #f9f9f9, #ffffff);
color: #333;
line-height: 1.6;
}
a {
text-decoration: none;
color: inherit;
}

/* Заголовки */
h1, h2 {
text-align: center;
margin-bottom: 10px;
font-weight: 600;
}
h1 {
margin-top: 20px;
font-size: 2rem;
color: #444;
}
h2 {
font-size: 1.4rem;
color: #555;
}

/* Зона загрузки (Drag&Drop) */
#uploadArea {
width: 320px;
max-width: 90%;
margin: 20px auto;
padding: 30px;
border: 2px dashed #aaa;
border-radius: 8px;
text-align: center;
cursor: pointer;
background-color: #fafafa;
transition: background-color 0.3s ease;
}
#uploadArea:hover {
background-color: #f2f2f2;
}
#uploadArea.dragover {
background: #e6ffe6;
border-color: #66bb66;
}
#fileInput {
display: none;
}

/* Превью страниц */
#thumbnails {
display: flex;
flex-wrap: wrap;
justify-content: center;
margin: 20px auto;
max-width: 1200px;
}
.pageThumbnail {
margin: 10px;
position: relative;
display: inline-block;
cursor: pointer;
transition: transform 0.2s, box-shadow 0.2s;
border-radius: 6px;
overflow: hidden;
background-color: #fff;
}
.pageThumbnail:hover {
transform: scale(1.02);
box-shadow: 0 4px 10px rgba(0,0,0,0.12);
}
.pageCanvas {
border: none;
display: block;
width: 100%;
height: auto;
}

/* Выделенная страница */
.pageThumbnail.selected {
box-shadow: 0 0 0 3px #f25353;
}
.pageThumbnail.disabled {
opacity: 0.5;
cursor: not-allowed;
}

/* Кнопки управления */
#controls {
text-align: center;
margin: 20px;
}
#controls button {
margin: 5px;
padding: 12px 30px;
font-size: 16px;
cursor: pointer;
border: none;
border-radius: 4px;
background-color: #4CAF50;
color: #fff;
transition: background-color 0.2s ease;
}
#controls button:hover {
background-color: #43a047;
}
#controls button:active {
background-color: #388e3c;
}

/* Ссылка на скачивание итогового файла */
#downloadLink {
display: none;
text-align: center;
margin: 30px auto 20px auto;
}
#downloadLink a {
display: inline-block;
background: #007bff;
color: #fff;
padding: 12px 30px;
border-radius: 4px;
font-size: 16px;
transition: background-color 0.2s ease;
}
#downloadLink a:hover {
background-color: #0069d9;
}

/* Индикатор загрузки/обработки */
#loadingIndicator {
text-align: center;
display: none;
margin: 20px;
font-size: 18px;
color: #555;
}

/* Блок преимуществ */
.features-grid {
display: flex;
flex-wrap: wrap;
justify-content: center;
margin: 40px auto;
max-width: 1200px;
gap: 20px;
padding: 0 15px;
}
.feature-card {
flex: 1 1 280px;
background: #fff;
border-radius: 8px;
box-shadow: 0 3px 8px rgba(0,0,0,0.1);
padding: 20px;
text-align: center;
min-width: 280px;
transition: transform 0.3s, box-shadow 0.3s;
}
.feature-card:hover {
transform: translateY(-4px);
box-shadow: 0 8px 16px rgba(0,0,0,0.12);
}
.feature-icon {
font-size: 2rem;
margin-bottom: 10px;
color: #4caf50;
}
.feature-card h3 {
font-size: 1.2rem;
margin-bottom: 10px;
color: #333;
}
.feature-card p {
color: #666;
font-size: 0.95rem;
line-height: 1.4;
}

/* Инструкция */
.instruction-steps {
max-width: 900px;
margin: 40px auto 20px auto;
text-align: left;
padding: 0 20px;
}
.instruction-steps h2 {
text-align: center;
margin-bottom: 20px;
font-weight: 600;
color: #444;
}
.step-item {
background: #fff;
border-radius: 8px;
box-shadow: 0 3px 8px rgba(0,0,0,0.1);
padding: 20px;
margin-bottom: 20px;
transition: transform 0.3s, box-shadow 0.3s;
}
.step-item:hover {
transform: translateY(-4px);
box-shadow: 0 8px 16px rgba(0,0,0,0.12);
}
.step-item p {
margin: 0;
font-size: 1rem;
color: #444;
}

/* SEO блок + доп контент */
.seo-content {
max-width: 900px;
margin: 40px auto;
background: #fff;
border-radius: 8px;
box-shadow: 0 3px 8px rgba(0,0,0,0.1);
padding: 20px;
line-height: 1.5;
}
.seo-content h2 {
text-align: center;
margin-bottom: 20px;
font-size: 1.6rem;
color: #444;
}
.seo-content h3 {
margin-top: 15px;
margin-bottom: 10px;
color: #444;
font-size: 1.2rem;
}
.seo-content p, .seo-content li {
color: #555;
}
.seo-content ul {
list-style-type: disc;
padding-left: 20px;
margin-bottom: 20px;
}
.seo-content .use-case {
background: #f9f9f9;
border-left: 4px solid #4CAF50;
padding: 10px;
margin-bottom: 15px;
}
.seo-content .use-case h4 {
font-weight: 600;
margin-bottom: 5px;
color: #333;
}

/* Новый блок с подробным описанием и примерами */
.detailed-description {
max-width: 900px;
margin: 40px auto 60px auto;
padding: 20px;
background: #fff;
border-radius: 8px;
box-shadow: 0 3px 8px rgba(0,0,0,0.1);
}
.detailed-description h2 {
text-align: center;
margin-bottom: 20px;
color: #444;
font-size: 1.6rem;
}
.detailed-description p {
margin-bottom: 15px;
color: #555;
}
.example-case {
background: #f3f9f3;
border-left: 4px solid #3cbb3c;
padding: 15px;
margin-bottom: 20px;
}
.example-case h4 {
margin-bottom: 5px;
color: #333;
font-size: 1.1rem;
font-weight: 600;
}
.example-case p {
margin: 0;
color: #555;
}

/* Адаптив */
@media (max-width: 600px) {
#thumbnails {
width: 100%;
}
.pageThumbnail {
margin: 5px;
}
.feature-card {
margin-bottom: 20px;
}
}

</style>
</head>
<body>
<!-- Заголовки страницы -->
<h1>Удалить страницы из PDF онлайн</h1>
<h2>Простой и быстрый способ избавления от ненужных листов</h2>

<!-- Зона для загрузки (Drag&Drop) -->
<div id="uploadArea">
Перетащите PDF сюда или нажмите, чтобы выбрать файл
<input type="file" id="fileInput" accept="application/pdf" />
</div>

<!-- Превью страниц -->
<div id="thumbnails"></div>

<!-- Кнопки управления выбором и удалением (появляются после загрузки) -->
<div id="controls" style="display: none;">
<button id="selectAllBtn">Выбрать все</button>
<button id="clearSelectionBtn">Сбросить выбор</button>
<button id="removePagesBtn">Удалить выбранные</button>
</div>

<!-- Индикатор загрузки/обработки -->
<div id="loadingIndicator">Подождите, идёт обработка...</div>

<!-- Ссылка на скачивание итогового файла -->
<div id="downloadLink">
<p>Готово! Скачайте файл:</p>
<a href="#" download>Скачать результат</a>
</div>

<!-- Блок преимуществ -->
<section class="features-grid">
<article class="feature-card">
<i class="fas fa-shield-alt feature-icon"></i>
<h3>Безопасность данных</h3>
<p>Все файлы обрабатываются локально в вашем браузере и автоматически удаляются с сервера через 1 час.</p>
</article>

<article class="feature-card">
<i class="fas fa-clock feature-icon"></i>
<h3>Мгновенная обработка</h3>
<p>Удаление страниц происходит за секунды, обеспечивая высокую скорость работы даже на мобильных устройствах.</p>
</article>

<article class="feature-card">
<i class="fas fa-mobile-alt feature-icon"></i>
<h3>Полная совместимость</h3>
<p>Работает на компьютерах, планшетах и смартфонах без установки дополнительных программ.</p>
</article>
</section>

<!-- Инструкция -->
<section class="instruction-steps">
<h2>Как удалить страницы из PDF онлайн:</h2>
<div class="step-item">
<p>1. Загрузите PDF-файл с помощью кнопки выше или перетащите его в выделенную область.</p>
</div>
<div class="step-item">
<p>2. Выберите страницы для удаления кликом мыши (используйте Ctrl/Shift для множественного выбора).</p>
</div>
<div class="step-item">
<p>3. Нажмите «Удалить выбранные» и скачайте готовый файл через несколько секунд.</p>
</div>
</section>

<!-- SEO-оптимизированная секция (улучшенная) -->
<section class="seo-content">
<h2>Удалить страницы из PDF онлайн: быстро и бесплатно</h2>
<p>Добро пожаловать в наш сервис, который позволяет в считанные секунды <strong>удалить страницы из PDF</strong>, оптимизировать документ и подготовить его к печати или отправке. Мы специализируемся на обработке PDF-файлов любых размеров и конфигураций.</p>

<h3>Ключевые возможности:</h3>
<ul>
<li>Удобный выбор страниц для удаления;</li>
<li>Работа полностью в браузере и полная безопасность данных;</li>
<li>Моментальное сохранение результата и высокое качество без потери;</li>
<li>Поддержка всех распространённых операционных систем и устройств;</li>
<li>Интуитивно понятный интерфейс без лишних шагов.</li>
</ul>

<h3>Примеры использования:</h3>
<div class="use-case">
<h4>Подготовка договора</h4>
<p>Удалите титульные страницы и приложения перед отправкой контрагенту.</p>
</div>
<div class="use-case">
<h4>Оптимизация больших документов</h4>
<p>Сделайте файл компактнее и удалите ненужные разделы перед рассылкой.</p>
</div>
<div class="use-case">
<h4>Разделение многотомной инструкции</h4>
<p>Убирайте дублированные страницы, чтобы упростить чтение и уменьшить вес файла.</p>
</div>
</section>

<!-- Дополнительный блок подробного описания инструмента с примерами -->
<div class="detailed-description">
<h2>Подробное описание инструмента «Удалить страницы из PDF онлайн»</h2>
<p>Наш онлайн-сервис — это профессиональное решение для тех, кто хочет быстро <strong>удалить страницу из PDF онлайн</strong>. Вам не нужно устанавливать дополнительное программное обеспечение или беспокоиться о совместимости — всё происходит напрямую в вашем браузере.</p>
<p>Сервис идеально подходит для студентов, юристов, бухгалтеров и всех, кто регулярно работает с электронными документами. Простое и понятное управление позволяет удалять сразу несколько страниц или даже целые блоки информации, не затрагивая структуру оставшихся.</p>

<div class="example-case">
<h4>Пример: Удаление конфиденциальных данных</h4>
<p>Если вы готовите презентацию или отчёт, и в конце файла есть служебная информация, вы можете легко вырезать её перед отправкой.</p>
</div>

<div class="example-case">
<h4>Пример: Выделение ключевых разделов в учебнике</h4>
<p>Удалите лишние главы и оставьте только то, что нужно для подготовки к экзамену или конференции.</p>
</div>
</div>

<!-- Повторные превью страниц (не удаляем, т.к. JS завязан) -->
<div id="thumbnails"></div>
<div id="controls" style="display: none;">
<button id="selectAllBtn">Выбрать все</button>
<button id="clearSelectionBtn">Сбросить выбор</button>
<button id="removePagesBtn">Удалить выбранные</button>
</div>

<!-- Оригинальный JS (НЕ МЕНЯТЬ) -->
<script>
// Глобальные переменные
let uploadedFileName = ''; // имя PDF на сервере (временное)
let originalFileName = ''; // исходное название, чтобы формировать красивое выходное
let pdfDoc = null; // объект PDF.js
let totalPages = 0;

const uploadArea = document.getElementById('uploadArea');
const fileInput = document.getElementById('fileInput');
const thumbnails = document.getElementById('thumbnails');
const removePagesBtn = document.getElementById('removePagesBtn');
const selectAllBtn = document.getElementById('selectAllBtn');
const clearSelectionBtn = document.getElementById('clearSelectionBtn');
const controls = document.getElementById('controls');
const downloadLink = document.getElementById('downloadLink');
const downloadLinkA = downloadLink.querySelector('a');
const loadingIndicator = document.getElementById('loadingIndicator');

// При клике по div-обёртке -> открыть диалог выбора
uploadArea.addEventListener('click', () => fileInput.click());

// Drag&Drop события
['dragenter', 'dragover', 'dragleave', 'drop'].forEach(eventName => {
uploadArea.addEventListener(eventName, (e) => {
e.preventDefault();
e.stopPropagation();
}, false);
});
['dragenter', 'dragover'].forEach(eventName => {
uploadArea.addEventListener(eventName, () => {
uploadArea.classList.add('dragover');
}, false);
});
['dragleave', 'drop'].forEach(eventName => {
uploadArea.addEventListener(eventName, () => {
uploadArea.classList.remove('dragover');
}, false);
});

// Обработка "drop"
uploadArea.addEventListener('drop', (e) => {
const file = e.dataTransfer.files[0];
if (file) {
handleFile(file);
}
});

// Обработка выбора файла
fileInput.addEventListener('change', () => {
if (fileInput.files[0]) {
handleFile(fileInput.files[0]);
}
});

// Загрузка файла на сервер
async function handleFile(file) {
if (file.type !== 'application/pdf') {
alert('Пожалуйста, выберите PDF-файл');
return;
}
const formData = new FormData();
formData.append('pdfFile', file);

showLoading(true, 'Загрузка файла...');
try {
const response = await fetch('?action=upload', {
method: 'POST',
body: formData
});
const result = await response.json();
if (!response.ok || !result.success) {
throw new Error(result.error || 'Ошибка загрузки');
}
uploadedFileName = result.fileName;
originalFileName = result.originalName;

// Рендерим миниатюры
await loadPdfAndRender(`uploads/${uploadedFileName}`);
} catch (err) {
alert(err.message);
} finally {
showLoading(false);
}
}

// Загрузка PDF через PDF.js и генерация миниатюр
async function loadPdfAndRender(url) {
try {
pdfDoc = await pdfjsLib.getDocument(url).promise;
totalPages = pdfDoc.numPages;
} catch (err) {
alert('Не удалось прочитать PDF. Возможно, файл повреждён.');
return;
}

thumbnails.innerHTML = '';
downloadLink.style.display = 'none';
controls.style.display = 'block';

for (let pageNum = 1; pageNum <= totalPages; pageNum++) {
await renderThumbnail(pageNum);
}
updateThumbnailStates();
}

// Создание миниатюры
async function renderThumbnail(pageNum) {
const page = await pdfDoc.getPage(pageNum);

const viewport = page.getViewport({ scale: 0.2 });
const canvas = document.createElement('canvas');
canvas.width = viewport.width;
canvas.height = viewport.height;
const ctx = canvas.getContext('2d');

const renderTask = page.render({ canvasContext: ctx, viewport });
await renderTask.promise;

const wrapper = document.createElement('div');
wrapper.className = 'pageThumbnail';
wrapper.dataset.pageNum = pageNum;

canvas.className = 'pageCanvas';
wrapper.appendChild(canvas);
thumbnails.appendChild(wrapper);

// При клике - переключать selected (если не disabled)
wrapper.addEventListener('click', () => {
if (wrapper.classList.contains('disabled')) {
return; // не даём выбрать
}
wrapper.classList.toggle('selected');
updateThumbnailStates();
});
}

// "Выбрать все" (кроме заблокированных)
selectAllBtn.addEventListener('click', () => {
const allThumbs = thumbnails.querySelectorAll('.pageThumbnail:not(.disabled)');
allThumbs.forEach(thumb => thumb.classList.add('selected'));
});

// "Сбросить выбор"
clearSelectionBtn.addEventListener('click', () => {
const allThumbs = thumbnails.querySelectorAll('.pageThumbnail.selected');
allThumbs.forEach(thumb => thumb.classList.remove('selected'));
updateThumbnailStates();
});

// Удалить выбранные страницы
removePagesBtn.addEventListener('click', async () => {
const selectedThumbs = thumbnails.querySelectorAll('.pageThumbnail.selected');
if (selectedThumbs.length === 0) {
alert('Не выбрано ни одной страницы для удаления.');
return;
}

// Формируем массив номеров
const pagesToRemove = Array.from(selectedThumbs).map(el => el.dataset.pageNum);

showLoading(true, 'Удаляем страницы...');
try {
const response = await fetch('?action=removePages', {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({
fileName: uploadedFileName,
originalName: originalFileName,
pagesToRemove
})
});
const result = await response.json();
if (!response.ok || !result.success) {
throw new Error(result.error || 'Ошибка при удалении страниц.');
}

downloadLinkA.href = result.downloadUrl;
downloadLink.style.display = 'block';
controls.style.display = 'none';
thumbnails.innerHTML = '';
} catch (err) {
alert(err.message);
} finally {
showLoading(false);
}
});

// Показ/Скрытие индикатора загрузки
function showLoading(show, text) {
if (show) {
loadingIndicator.innerText = text || 'Обработка...';
loadingIndicator.style.display = 'block';
} else {
loadingIndicator.style.display = 'none';
}
}

// Обновляет состояния миниатюр (блокировка, если останется единственная страница)
function updateThumbnailStates() {
const allThumbnails = thumbnails.querySelectorAll('.pageThumbnail');
const selectedThumbnails = thumbnails.querySelectorAll('.pageThumbnail.selected');

const selectedCount = selectedThumbnails.length;
const totalCount = allThumbnails.length;

// Считаем, сколько страниц останется после удаления
const remainingPages = totalCount - selectedCount;

// Если останется только одна страница, её нужно заблокировать
if (remainingPages === 1) {
allThumbnails.forEach(thumb => {
if (!thumb.classList.contains('selected')) {
thumb.classList.add('disabled');
} else {
thumb.classList.remove('disabled');
}
});
} else {
// Если страниц больше 1, убираем disabled у всех
allThumbnails.forEach(thumb => thumb.classList.remove('disabled'));
}
}
</script>


<!-- Yandex.Metrika counter -->
<script type="text/javascript" >
(function(m,e,t,r,i,k,a){m[i]=m[i]||function(){(m[i].a=m[i].a||[]).push(arguments)};
m[i].l=1*new Date();
for (var j = 0; j < document.scripts.length; j++) {if (document.scripts[j].src === r) { return; }}
k=e.createElement(t),a=e.getElementsByTagName(t)[0],k.async=1,k.src=r,a.parentNode.insertBefore(k,a)})
(window, document, "script", "https://mc.yandex.ru/metrika/tag.js", "ym");

ym(100361131, "init", {
clickmap:true,
trackLinks:true,
accurateTrackBounce:true
});
</script>
<noscript><div><img src="https://mc.yandex.ru/watch/100361131" style="position:absolute; left:-9999px;" alt="" /></div></noscript>
<!-- /Yandex.Metrika counter -->

</body>
</html>

Ads.Txt Alerts - A trading name of Red Volcano Limited

Waterloo Buildings, Second Floor Rear, 53 London Road, Southampton, Hampshire, United Kingdom, SO15 2AD

© Red Volcano 2020. All Rights Reserved.