Как создать PDF на лету с тем же макетом, что и HTML-код в C # - PullRequest
3 голосов
/ 12 июля 2011

Я генерирую HTML-код на лету для каталога, и я хотел бы также создать PDF.Я подумал о том, чтобы просто напечатать HTML-страницу в PDF-документ, но я теряю некоторую затененность фона и другие вещи, и это распределяет контент по страницам.

Я немного читал об iText, но я этого не сделалвыяснил, как правильно отформатировать его, и я не знаю, как сделать так, чтобы он не разбивал мой контент по страницам.

Это начало моей HTML-страницы, я включил несколько элементов, чтобы выможно увидеть, как содержание разбито.Я прошу прощения за уродливый HTML, я не могу на самом деле получить таблицу div, чтобы выглядеть правильно!

<style type="text/css">
<!--
tr#odd {
    background-color:#e2e2e2;
    vertical-align:top;
}

tr#even {
    vertical-align:top;
}
div#title {
    font-size:16px;
    font-weight:bold;
}

div#mpaa {
    font-size:10px;
}

div#genre {
    font-size:12px;
    font-style:italic;
}

div#plot {
    height: 63px;
    font-size:12px;
    overflow:hidden;
}
-->
</style>

<html>
    <title>Movie Catalog</title>
    <body>
718 Movies
<br />
<br />
        <table>
            <tr id="odd">
                <td>
                    <img src=".\images\10,000BCDVDrip.jpg" width="75" height="110">
                </td>
                <td>
                    <div id="title">10,000 BC</div>
                    <div id="mpaa"> </div>
                    <div id="genre">Adventure, Drama</div>
                    <div id="plot">A prehistoric epic that follows a young mammoth hunter's journey through uncharted territory to secure the future of his tribe.</div>
                </td>
            </tr>

            <tr id="even">
                <td>
                    <img src=".\images\101Dalmatians1961PlatinumEditionDVDRipXviD.jpg" width="75" height="110">
                </td>
                <td>
                    <div id="title">101 Dalmatians (Platinum Edition)</div>
                    <div id="mpaa">G </div>
                    <div id="genre">Comedy, Family, Disney</div>
                    <div id="plot">The Live action adaptation of a Disney Classic. When a litter of dalmatian puppies are abducted by the minions of Cruella De Vil, the parents must find them before she uses them for a diabolical fashion statement.</div>
                </td>
            </tr>

            <tr id="odd">
                <td>
                    <img src=".\images\102DalmationsDVDrip.jpg" width="75" height="110">
                </td>
                <td>
                    <div id="title">102 Dalmations</div>
                    <div id="mpaa">G </div>
                    <div id="genre">Family</div>
                    <div id="plot">After a spot of therapy Cruella De Vil is released from prison a changed woman. Devoted to dogs and good causes, she is delighted that Chloe, her parole officer, has a dalmatian family and connections with a dog charity. But the sound of Big Ben can reverse the treatment so it is only a matter of time before Ms De Vil is back to her incredibly ghastly ways, using her new-found connections with Chloe and friends</div>
                </td>
            </tr>

            <tr id="even">
                <td>
                    <img src=".\images\127Hours2010720pBluRayx264.jpg" width="75" height="110">
                </td>
                <td>
                    <div id="title">127 Hours</div>
                    <div id="mpaa">R Rated R for language and some disturbing violent content/bloody images.</div>
                    <div id="genre">Action, Adventure, Drama, Suspense, Thriller</div>
                    <div id="plot">127 Hours is the true story of mountain climber Aron Ralston's (James Franco) remarkable adventure to save himself after a fallen boulder crashes on his arm and traps him in an isolated canyon in Utah. Over the next five days Ralston examines his life and survives the elements to finally discover he has the courage and the wherewithal to extricate himself by any means necessary, scale a 65 foot wall and hike over eight miles before he is finally rescued. Throughout his journey, Ralston recalls friends, lovers (Clemence Poesy), family, and the two hikers (Amber Tamblyn and Kate Mara) he met before his accident. Will they be the last two people he ever had the chance to meet?</div>
                </td>
            </tr>

            <tr id="odd">
                <td>
                    <img src=".\images\13GoingOn30DVDrip.jpg" width="75" height="110">
                </td>
                <td>
                    <div id="title">13 Going On 30</div>
                    <div id="mpaa">PG-13 for some sexual content and brief drug references</div>
                    <div id="genre">Comedy, Fantasy, Romance</div>
                    <div id="plot">After total humiliation at her thirteenth birthday party, Jenna Rink wants to just hide until she's thirty. Thanks to some wishing dust, Jenna's prayer has been answered. With a knockout body, a dream apartment, a fabulous wardrobe, an athlete boyfriend, a dream job, and superstar friends, this can't be a better life. Unfortunetly, Jenna realizes that this is not what she wanted. The only one that she needs is her childhood best friend, Matt, a boy that she thought destroyed her party. But when she finds him, he's a grown up, and not the same person that she knew.</div>
                </td>
            </tr>
            ...
            ...
        </table>
    </body>
</html>

Вы можете увидеть, как это выглядит: http://timelessdesigncafe.com/movies/catalog.html Обратите внимание, что фонзатенение чередуется.Когда я печатаю в PDF, я теряю затенение, и что еще более важно, он разбивает «строку» / фильм на две страницы, и мне нужно этого избегать.

Заранее спасибо !!

Ответы [ 7 ]

6 голосов
/ 13 июля 2011

Никто не упомянул wkhtmltopdf ? :)

0 голосов
/ 12 июля 2011

Взгляните на WebToPDF.NET , который является компонентом .NET, написанным на C # и преобразующим HTML в PDF. Вы получите PDF-файл, который выглядит точно так же, как ваш HTML-файл. Я верю, что есть возможность указать размер страницы, который вы можете использовать для указания очень длинной страницы, чтобы получить все на одной странице.

Конвертер поддерживает HTML 4.01, XHTML 1.0, XHTML 1.1 и CSS 2.1, включая разрывы страниц, формы и ссылки. Он проходит все тесты W3C (кроме BIDI).

0 голосов
/ 12 июля 2011

Если вы не возражаете потратить немного денег, вы можете инвестировать в PrinceXML , который форматирует любой XML-документ (включая XHtml) в PDF-документ, применяя полные правила макета к HTML-контенту. На самом деле Prince более соответствует веб-стандартам при выполнении своего макета, чем многие веб-браузеры:)

0 голосов
/ 12 июля 2011

Правильное размещение HTML-кода - нетривиальная задача.По моим оценкам, вероятно, мне понадобится один или два года, чтобы сделать это правильно.

Так что это не тот путь.Вместо этого вам следует отфильтровать HTML-код для данных, а затем написать небольшой специализированный форматтер PDF, который делает именно то, что вам нужно, и который ломается даже при самых маленьких изменениях входного HTML.

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

0 голосов
/ 12 июля 2011

Если вы в состоянии использовать WPF, вы можете рассмотреть возможность использования FixedDocument и создания макета для печати в XAML. Затем вы можете растеризовать XAML (при необходимости используя привязку данных) в XPS, Microsoft Paper Paper Standard для макета документа (по сути, их версия PDF).

Преимущество этого подхода заключается в возможности использовать привязку данных и превосходную функциональность компоновки XAML (IMHO). Я уже давно использую этот стек в качестве упрощенного решения для создания отчетов. (Вам необходимо сгенерировать отчет в потоке STA).

Следующим шагом (да, возможно, это немного усложняется) было бы затем передать поток XPS через какой-то конвертер в формат PDF, однако не уверен, что такая вещь существует. В противном случае вы бы полагались на то, что ваши клиенты имеют программу чтения XPS (хотя она встроена в последнюю версию Windows & Office).

0 голосов
/ 12 июля 2011

Есть слишком много способов сделать это. Пожалуйста, отметьте эту тему. Если вы хотите использовать бесплатную библиотеку или инструмент, вы можете использовать iTextSharp , но бесплатная версия не покрывает все требования. Таким образом, вы можете использовать некоторые другие инструменты, такие как ABCPdf

0 голосов
/ 12 июля 2011

Вы можете использовать API OpenOffice для выполнения этого преобразования, выполнив следующие шаги в своем коде:

  • Загрузить API OpenOffice
  • Открыть нужный HTML-файл
  • Сохраните его как PDF

Я знаю, что он работает для VB (уже использовал его в VBScripts), C ++ и Java, вы должны быть в состоянии сделать то же самое с C #.

Ссылки:
http://www.kalitech.fr/clients/doc/VB_APIOOo_en.html http://wiki.services.openoffice.org/wiki/API/Tutorials/PDF_export

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...