Как сгенерировать PDF-файл в ландшафтном режиме из HTML-вывода с помощью itext 5.1.1

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

1) Получите xml-контент из исходной системы.

2) Используйте xsl для генерации вывода html из xml.

3) Передайте вывод html в качестве входных данных в java-класс pdf, в дальнейшем класс будет генерировать pdf-файл в ландшафтном режиме.

образец XML-файла: http://www.filedropper.com/resettsample

образец файла xsl: http://www.filedropper.com/resettcopy

код Java

          package testproject;


          import java.io.File;
          import java.io.FileOutputStream;
          import java.io.StringReader;
          import java.io.StringWriter;

          import java.text.SimpleDateFormat;

          import java.util.Date;

          import javax.xml.transform.Result;
          import javax.xml.transform.Transformer;
          import javax.xml.transform.TransformerFactory;
          import javax.xml.transform.stream.StreamResult;
          import javax.xml.transform.stream.StreamSource;

          import com.itextpdf.text.Document;
          import com.itextpdf.text.PageSize;
          import com.itextpdf.text.RectangleReadOnly;
          import com.itextpdf.text.pdf.PdfWriter;
          import com.itextpdf.tool.xml.XMLWorkerHelper;

          public class PDFTest {
          public static void main(String[] args) {
          try {

          new PDFTest().PDFCreateRequest();

          } catch (Exception ex) {
          ex.printStackTrace();
          }
          }


          public static void PDFCreateRequest() throws Exception {

          StringWriter stringWriter = null;
          Result result = null;
          TransformerFactory tFactory = null;
          Transformer transformer = null;
          String strXMLFile = null;
          String strXSLFile = null;
          String strHTMLString = null;
          String strFeedFolderPath = null;
          String strPDFFileName = null;
          String strPDFFileNameWithExtension = null;
          String strPDFFile = null;
          Document document = null;
          PdfWriter pdfWriter = null;

          strXMLFile = "C:\\RESETT_sample.xml";
          String timeStamp =
          new SimpleDateFormat("yyyy.MM.dd.HH.mm.ss").format(new Date());


          strXSLFile = "C:\\RESETT_Copy.xsl";
          stringWriter = new StringWriter();
          result = new StreamResult(stringWriter);
          tFactory = TransformerFactory.newInstance();

          transformer = tFactory.newTransformer(new StreamSource(strXSLFile));

          transformer.transform(new StreamSource(strXMLFile), result);

          strHTMLString = stringWriter.toString();
          System.out.println("###### [HTML output " + strHTMLString);

          strPDFFileName = "RESETT_" + timeStamp;
          strFeedFolderPath = "C:\\pdfdocuments";

          strPDFFileNameWithExtension = strPDFFileName + ".pdf";
          strPDFFile =
          strFeedFolderPath + File.separator + strPDFFileNameWithExtension;

          // This is for PDF Landscape output
          document =
          new Document(new RectangleReadOnly(842, 595), 10, 10, 75, 20);


          // This is for PDF Portrait output
          document = new Document(PageSize.A4, 10, 10, 75, 20);

          pdfWriter =
          PdfWriter.getInstance(document, new FileOutputStream(strPDFFile));
          document.open();
          XMLWorkerHelper.getInstance().parseXHtml(pdfWriter, document,
          new StringReader(strHTMLString));
          document.close();
          }   
          }

Приветствуются любые предложения о том, как достичь требуемого результата.

Спасибо Сандип


person Sandeep Singh    schedule 06.04.2015    source источник
comment
включите то, что вы пробовали до сих пор?   -  person HaveNoDisplayName    schedule 06.04.2015
comment
Привет, Пиюш, я добавил в пост дополнительную информацию.   -  person Sandeep Singh    schedule 16.04.2015


Ответы (1)


Перейдите к примерам XML Worker и возьмите любой пример, который хотите, но измените следующую строку:

Document document = new Document();

На что-то вроде этого:

Document document = new Document(PageSize.A4.rotate());

Это приведет к тому, что документ будет в альбомной ориентации, а не в портретной.

Возможно, вам потребуется обновить свою версию iText / XML Worker (убедитесь, что вы всегда используете соответствующие версии iText и XML Worker).

person Bruno Lowagie    schedule 06.04.2015
comment
Спасибо, Бруно. Я выбрал ParseHTMLTable1, пример java и реализовал то, что вы упомянули выше. Я заметил, что PDF-документ изменился с книжной на альбомную. Однако содержимое таблицы HTML остается в том же месте. Я бы хотел, чтобы содержимое (расширение / сжатие) корректировалось вместе с ориентацией документа. Пожалуйста, дайте мне знать, как этого добиться, или если я где-то неправильно понимаю. Спасибо. Сандип - person Sandeep Singh; 06.04.2015
comment
Ваше понимание неверно. PDF - это не HTML: у всего есть фиксированная позиция на странице. Если ваша таблица имеет одинаковые размеры независимо от ориентации страницы, ваша таблица может содержать информацию о ширине таблицы и столбцов. Более того, вы так и не ответили на вопрос @Piyush: что вы пробовали? Продемонстрируйте использование простого HTML-файла, воспроизводящего проблему. - person Bruno Lowagie; 09.04.2015
comment
Я понял вашу точку зрения о ширине таблицы и столбцов. Я над этим работаю. Тем временем я обновил сообщение образцом сценария. Спасибо. - person Sandeep Singh; 16.04.2015
comment
Я смог добиться желаемого результата в формате pdf в формате pdf, используя тот же код выше, только обновив версии jar XMLWorker и Itextpdf. Спасибо - person Sandeep Singh; 23.04.2015
comment
@SandeepSingh Отлично! Я обновлю свой ответ, и, возможно, вы примете его, чтобы люди увидели, что проблема решена. - person Bruno Lowagie; 23.04.2015