Граница в PDF-файле неправильно выровнена [фрагмент прилагается]

Я делаю очень простое приложение для реагирования с минимумом контента.

index.js:

<div className="App">
  <div id="printable-div">
    <h1>Generate PDF</h1>
    <p>Create a screenshot from the page, and put it in a PDF file.</p>
    <p style={{ color: "red" }}>
      *Open this page in new window and press the button.
    </p>
  </div>
  <br />
  <button id="print" onClick={printPDF}>
    PRINT
  </button>
</div>

Где здесь будет напечатан div с идентификатором printable-div.

Я также применил CSS для этого, например,

#printable-div {
  border: 2px solid #000;
  padding: 20px;
}

Но при нажатии на кнопку происходит загрузка PDF-файла, тогда как при открытии PDF-файла граница не выравнивается должным образом.

введите описание изображения здесь

Также здесь порядок должен быть на странице, но тогда как он применяется только к div.

Используемые библиотеки:

- ›jsPdf

- ›html2canvas

И код, выполняемый при нажатии на кнопку печати, выглядит следующим образом:

  const printPDF = () => {
    const domElement = document.getElementById("printable-div");
    html2canvas(domElement).then((canvas) => {
      const imgData = canvas.toDataURL("image/png");
      const pdf = new jsPdf();
      pdf.addImage(imgData, "JPEG", 0, 0);
      pdf.save(`${new Date().toISOString()}.pdf`);
    });
  };

Полный рабочий пример:

 Редактировать html2canvas-jspdf (разветвленный)

Может ли кто-нибудь смиренно помочь мне добиться результата, когда граница будет правильно выровнена по всей странице? Ничего страшного, если используемые библиотеки нужно заменить на другие альтернативы ..

Требование:

Вся страница должна иметь видимую границу со всеми сторонами равными интервалами, а содержимое должно находиться внутри границы.

введите описание изображения здесь


person Undefined    schedule 12.03.2021    source источник
comment
Я предлагаю вам создать макет вручную, используя метод doc.rect, вы можете использовать онлайн-редактор, чтобы помочь вашей работе mrrio.github.io/jsPDF   -  person Ihsan Fajar Ramadhan    schedule 12.03.2021


Ответы (2)


Я проверил ваш код и ящик, и мне кажется, что вы уже применили решение @Ihsan, но, опираясь на это решение, я обнаружил, что jsPDF имеет функцию fromHMTL, поэтому вы можете сначала пропустить рендеринг на холст.

const printPDF = () => {
  const domElement = document.getElementById("printable-div");
  const doc = new jsPdf();
  doc.fromHTML(domElement, 10, 5); // position within rectangle
  doc.rect(5, 5, 200, 0.3);
  doc.rect(5, 5, 0.3, 285);
  doc.rect(5, 290, 200, 0.3);
  // doc.rect(5, 30, 200, 0.3); // this is the "middle" horizontal bar
  doc.rect(205, 5, 0.3, 285);
  doc.save(`${new Date().toISOString()}.pdf`);
};

Я закомментировал среднюю горизонтальную полосу, так как ее вертикальное положение просто нужно настроить в соответствии с тем, где вы хотите / нуждаетесь.

Редактировать

Вместо группы прямоугольников вы можете нарисовать один прямоугольник и обвести его, чтобы создать внешнюю границу, и использовать линию для заполнения горизонтальной полосы. ИМО это читается немного более чисто.

const printPDF = () => {
  const domElement = document.getElementById("printable-div");
  const doc = new jsPdf();

  // Create border
  doc.rect(5, 5, 200, 285, "S").line(5, 45, 205, 45, "S");

  // Inject HTML
  doc.fromHTML(domElement, 10, 5);

  // Save out to PDF
  doc.save(`${new Date().toISOString()}.pdf`);
};

введите описание изображения здесь

Честно говоря, я думаю, что Ихсан должен получить основную благодарность, так как это в основном их ответ. Я просто добавил туда контент другим способом и разместил скопированный HTML.

 Изменить границы-не-выровнены-правильно-в-pdf-сниппете-прикрепленном

person Drew Reese    schedule 13.03.2021
comment
Спасибо за ваше решение с примером, братан. Но требование в этой конкретной странице pdf, где вы разместили контент, будет действовать как заголовок, и для этого контент будет другим (может быть логотип компании с названием компании) ... Принимая во внимание основное содержимое, которое вы разместили вверху, будет после границы (после границы заголовка в верхнем поле). Надеюсь, вы уловили мое требование .. Я также могу предоставить более подробную информацию, если это необходимо сверх требования .. - person Undefined; 13.03.2021
comment
Под вопросом, я наконец приложил снимок экрана с номером страницы справа, который будет действовать как заголовок в реальном приложении, после этого раздела вместе с рамкой будет размещено основное содержимое. - person Undefined; 13.03.2021
comment
@Undefined Это действительно простой вопрос настройки координаты, используемой при присоединении элемента dom к документу (doc.fromHTML(domElement, 10, 5);), просто добавьте больше к координате y, чтобы переместить ее ниже, где должен был бы занимать заголовок. В качестве альтернативы вы можете включить заголовок как часть JSX, который хотите отправить в PDF. - person Drew Reese; 14.03.2021
comment
Спасибо за помощь, братан. Теперь я понял, о чем вы говорите, и спасибо за вашу помощь. - person Undefined; 14.03.2021
comment
Привет, братан, я добавил сюда верхний и нижний колонтитулы codesandbox.io/s/, но на этот раз я получаю сообщение об ошибке. Не могли бы вы помочь мне с причиной этого? Я искал много решений, но не смог найти правильного решения. - person Undefined; 15.03.2021
comment
Привет, братан, я добавил сюда верхний и нижний колонтитулы codesandbox.io/s/, но на этот раз я получаю сообщение об ошибке. Не могли бы вы помочь мне с причиной этого? Я искал много решений, но не смог найти правильного решения. - person Undefined; 15.03.2021
comment
Привет, @Undefined, я не знаю точной причины и не понимаю, почему это происходит, но похоже, что использование только элементов header и / или footer вызывает эту проблему. Я заметил, что DOM также копируется в неправильном порядке в получившийся PDF-файл. Если я помещаю содержимое заголовка в h1 и содержимое нижнего колонтитула в div, создается впечатление, что PDF-файл создается без проблем. Я вижу, вы используете более старую версию jsPDF, а v2, похоже, имеет другую поддержку html. У меня сейчас нет времени углубляться в это, но, возможно, позже сегодня. - person Drew Reese; 15.03.2021
comment
Спасибо за ваш вклад, брат ... Я полностью застрял в этой задаче ... Если бы вы могли помочь мне изменить ваше решение так, чтобы оно имело верхний и нижний колонтитулы, тогда мне было бы намного выгоднее продолжить ... Как вы сказали, вы можете помочь мне сегодня позже, в ваше время .. Еще раз спасибо .. - person Undefined; 15.03.2021
comment
@Undefined В свободное время я читал проблемы Github и смотрел разные версии jsPDF, чтобы обойти проблему с элементом _1 _ / _ 2_, и пока это выглядит не очень хорошо. Кажется, что версии v1.x не очень хорошо обрабатывают HTML, но, как я уже сказал, использование HTML-элемента, отличного от этих двух, похоже, поддерживает порядок в DOM. Когда у меня было немного больше времени, я собирался исследовать v2.x, если они лучше справляются с HTML. - person Drew Reese; 16.03.2021
comment
Хорошо, братан, спасибо за ваш вклад ... Если бы вы могли помочь мне с какой-либо другой библиотекой, которая будет обрабатывать верхний / нижний колонтитул вместе с границей страницы, это также было бы намного полезнее .. - person Undefined; 17.03.2021
comment
@DrewReese, не могли бы вы помочь мне решить эту проблему? stackoverflow.com/q/66950166/7785337 - person Maniraj Murugan; 05.04.2021

Следуя моему комментарию, это пример, который вы можете использовать для настройки макета PDF. вы можете попробовать это в онлайн-редакторе

var doc = new jsPDF();

  doc.setFillColor("#000000")
  doc.rect(5, 5, 200, 0.3)
  doc.rect(5, 5, 0.3, 285)
  doc.rect(5, 290, 200, 0.3)
  doc.rect(5, 30, 200, 0.3)
  doc.rect(205, 5, 0.3, 285)
person Ihsan Fajar Ramadhan    schedule 12.03.2021
comment
Я внедрил ваш код здесь codesandbox.io/s / html2canvas-jspdf-forked-40kjj? file = / src /, но при этом содержимое перекрывается над границей. Требование: содержимое должно быть внутри границы. На прилагаемом снимке экрана, о котором идет речь, мы будет размещен заголовок так, чтобы сверху была граница .. И после этого необходимо разместить контент .. - person Undefined; 12.03.2021
comment
в jspdf вы должны обратить внимание на порядок, вы помещаете мой код перед вашим addImage методом, конечно, он будет выше моего кода. что касается позиционирования, вы должны обратиться к документации artskydj.github.io/jsPDF/docs /jsPDF.html - person Ihsan Fajar Ramadhan; 12.03.2021
comment
@IhsanFajarRamadhan, не могли бы вы помочь мне решить эту проблему? stackoverflow.com/q/66950166/7785337 - person Maniraj Murugan; 05.04.2021