XHTML в PDF с использованием IText — требуется эксперт

Я использую iText для преобразования XHTML в PDF. Я создал XHTML с помощью конвертера XLSX в HTML и очистил его. Здесь вы можете увидеть HTML-страницу. Дело в том, что я не могу преобразовать его в эквивалентный PDF на страницах формата А4. Я пробовал новые и старые библиотеки iText, использовал ITextRenderer, XMLWorkerHelper и HTMLWorker, но никто не создал PDF правильно. Следите за моими попытками.

Пример с внешним CSS (HTML и CSS — это пути):

com.itextpdf.text.Document document = new com.itextpdf.text.Document(PageSize.A4);
          PdfWriter pdfWriter = PdfWriter.getInstance
               (document, new FileOutputStream(PDF));
          document.open();
          document.addAuthor("Real Gagnon");
          document.addCreator("Real's HowTo");
          document.addSubject("Thanks for your support");
          document.addCreationDate();
          document.addTitle("Please read this");

          XMLWorkerHelper worker = XMLWorkerHelper.getInstance();

          String str = readHtml();
          worker.parseXHtml(pdfWriter, document,  new FileInputStream(HTML), new FileInputStream(CSS));
          document.close();

Пример с ITextRenderer и внутренним CSS, но поскольку он не учитывает теги шрифта, я добавил шрифт программно:

DocumentBuilder builder = DocumentBuilderFactory.newInstance().newDocumentBuilder();
        Document doc = builder.parse(new ByteArrayInputStream(readHtml().getBytes("UTF-8")));

        ITextRenderer renderer = new ITextRenderer();
        File tmpFontFile = new File(
                "C:\\Android\\workspace\\GestioneCommesse\\WebContent\\resources\\font\\arial_narrow.ttf");
        renderer.getFontResolver().addFont(tmpFontFile.getAbsolutePath(), BaseFont.IDENTITY_H, BaseFont.EMBEDDED);
        renderer.setDocument(doc, null);

        FileOutputStream os = new FileOutputStream(PDF);
        Transformer tf = TransformerFactory.newInstance().newTransformer();
        tf.setOutputProperty(OutputKeys.ENCODING, "UTF-8");
        tf.setOutputProperty(OutputKeys.INDENT, "yes");
        tf.transform(new DOMSource(doc), new StreamResult(os));
        os.close();

        File file = new File("c:\\temp.pdf");
        file.createNewFile();
        OutputStream os2 = new FileOutputStream(file);
        renderer.layout();
        renderer.createPDF(os2);
        os.close();

Здесь вы можете увидеть два результата, которые я получаю. В одном pdf отсутствует весь css, а в другом я не могу изменить ширину и стиль шрифта:

Example1 создан с помощью XmlWorkerHelper и Пример2 с использованием iTextRenderer

В ЭТОМ примере я получаю результат 2


person Emaborsa    schedule 23.05.2014    source источник
comment
Можете ли вы показать пример несовершенного PDF? HTML и PDF — это два совершенно разных языка, которые на самом деле не имеют никакого отношения друг к другу и существуют для совершенно разных целей, поэтому между ними нет 100% перевода.   -  person Chris Haas    schedule 24.05.2014
comment
Добавил результаты в pdf...   -  person Emaborsa    schedule 24.05.2014
comment
Пример 2 выглядит довольно хорошо для меня. Я бы удалил или уменьшил поля вашего документа, чтобы освободить место. Возможно, вам также придется использовать более широкую бумагу. Что касается перерывов, iTextSharp понятия не имеет, где вы хотите что-то сломать, вам нужно будет помочь ему. Если вы можете разбить свою единую гигантскую таблицу на несколько подтаблиц, это поможет. На самом деле, это полностью визуальная вещь, и нет никакого способа автоматизировать эту часть.   -  person Chris Haas    schedule 24.05.2014


Ответы (2)


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

Вот мой до:

‹ div style="font-family: 'Кисть MT';" >‹ /дел >

(обратите внимание на размещение одинарных и двойных кавычек, это не сработало), затем я попытался

‹ div style='font-family : "Кисть MT";'>

(сначала не работало само по себе)

но затем я зарегистрировал шрифт с помощью FontFactory и дал ему псевдоним с тем же именем.

FontFactory.RegisterDirectories();
var fontPath = Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\BRUSHSCI.TTF";
FontFactory.Register(fontPath, "Brush Script MT");

Надеюсь это поможет

person Jose Gomez    schedule 25.05.2014

Я работаю с iText в похожем проекте, и пока я просто сдался, пытаясь полностью понять, как это работает :P

Но в этом случае все, что вам нужно, это добавить поля страницы в ваш css для печати. Что-то типа:

@page {  
margin-left: 10px;  
margin-right: 10px;  
margin-top: 10px;  
margin-bottom: 10px;  
} 

Я попытался преобразовать ваш исходный код html с помощью собственного веб-приложения, и он отлично работает. Это должно сработать и у вас (используя пример № 2).

Небольшой совет: я никогда не объявляю ширину в пикселях, потому что это то, что происходит (контент выходит за пределы страницы из-за преобразования iText). Если вы удалите все свои теги width="", вы получите тот же результат даже без полей страницы.

Чао!

person bs_    schedule 24.05.2014