Как преобразовать большую таблицу в PDF с помощью летающей тарелки?

У меня есть html с большим количеством столбцов (вы можете найти образец по этой link< /а>)

Теперь, когда я пытаюсь преобразовать его в PDF с помощью летающей тарелки(ссылка на jar перекомпилирована для работы с iText 2.1.X), сгенерированный PDF содержит усеченные столбцы

Есть ли способ заставить Летающую тарелку либо сломать таблицу, либо увеличить ширину страницы в соответствии с html-содержимым?

Это код, который я использую

String doc = file.toURI().toURL().toString();
ITextRenderer renderer = new ITextRenderer();
renderer.setDocument(doc);
String outputFile = "test.pdf";
OutputStream os = new FileOutputStream(outputFile);
renderer.layout();
renderer.createPDF(os);
os.flush();
os.close();

Где файл — это html, который я пытаюсь преобразовать.


person Ankur    schedule 27.11.2012    source источник


Ответы (2)


Используйте библиотеку YAHP. Это лучшая библиотека, с которой я когда-либо работал, для преобразования HTML в PDF. Это написано на верхней части летающей тарелки, что является большим разочарованием по сравнению с его популярностью. Он даже не будет отображать простые текстовые поля ввода. Итак, я обратился к библиотеке YAHP, которая отлично подходит для вашего случая.

попробуйте этот код после того, как вы получите все банки, связанные с этой библиотекой.

import java.io.File;
import java.io.FileOutputStream;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.allcolor.yahp.converter.CYaHPConverter;
import org.allcolor.yahp.converter.IHtmlToPdfTransformer;
import org.htmlcleaner.CleanerProperties;
import org.htmlcleaner.HtmlCleaner;
import org.htmlcleaner.PrettyHtmlSerializer;
import org.htmlcleaner.TagNode;

public class YahpHtmlToPdf {

    @SuppressWarnings({ "unchecked", "rawtypes" })
    public static void main(String[] args) {
        try{
            CleanerProperties props = new CleanerProperties();
            props.setTranslateSpecialEntities(true);
            props.setTransResCharsToNCR(true);
            props.setOmitComments(true);
            TagNode tagNode = new HtmlCleaner(props).clean(new File("C:\\Users\\MyComputer\\Desktop\\aspose.html"));
            String newString=new PrettyHtmlSerializer(props).getAsString(tagNode, "ISO-8859-1");
            CYaHPConverter converter = new CYaHPConverter();
            File fout = new File("C:\\sample\\aspose.pdf");
            FileOutputStream out = new FileOutputStream(fout);
            Map properties = new HashMap();
            List headerFooterList = new ArrayList();
            properties.put(IHtmlToPdfTransformer.PDF_RENDERER_CLASS,IHtmlToPdfTransformer.FLYINGSAUCER_PDF_RENDERER);
            converter.convertToPdf(newString,IHtmlToPdfTransformer.A1P,headerFooterList, "file:///temp/",out,properties);
            out.flush();
            out.close();
        }catch(Exception e){
            e.printStackTrace();
        }
    }   

}

введите здесь описание изображенияЭто скриншот PDF-файла, сгенерированного с помощью вашего HTML. .Вы можете указать размер страницы следующим образом IHtmlToPdfTransformer.A1P.

person SRy    schedule 01.12.2012
comment
Но мне все равно нужно будет установить ширину страницы, которую я не знаю. Количество колонок может быть 2,3 или 20. HTML создается на лету - person Ankur; 03.12.2012
comment
В приведенном выше API вы можете установить ширину и высоту страницы в зависимости от размера таблицы. - person SRy; 04.12.2012
comment
Я не знаю размер таблицы, чтобы знать, что мне нужно будет разобрать html - person Ankur; 05.12.2012

Можно изменить размер страницы, если вы знаете, какой размер вам нужен.

Используйте для этого правило @page:
Обратите внимание: в этом примере я работаю над html с помощью Jsoup (см. комментарий).

/*
 * This part is optional - Jsoup is used for cleaning the html and inserting the style tag into the head.
 * You can use everything else for doing this.
 * 
 * If you will use Jsoup, make shure you set proper charset (2nd parameter).
 * 
 * Note: this is NOT a W3C Document but a Jsoup one.
 */
Document doc = Jsoup.parse(file, null);

/*
 * Here you specify the pagesize you need (size: with height).
 * Inserting this html is the key part!
 */
doc.head().append("<style type=\"text/css\"><!--@page { size:50.0cm 20.0cm; }--></style>");


ITextRenderer renderer = new ITextRenderer();

/*
 * This part ist jsoup related. 'doc.toString()' does nothing else than
 * returning the Html of 'doc' as a string.
 * 
 * You can set it like in your code too.
 */
renderer.setDocumentFromString(doc.toString());

final String outputFile = "test.pdf";
OutputStream os = new FileOutputStream(outputFile);
renderer.layout();
renderer.createPDF(os);
os.flush();
os.close();

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

person ollo    schedule 27.11.2012
comment
Эй, спасибо за ответ, но я не знаю размер страницы, так как контент html генерируется на лету, поэтому он может иметь 2 столбца или 20 столбцов, все зависит от типа сгенерированного отчета, а также содержимого внутри ячейка таблицы может увеличить ширину столбца - person Ankur; 28.11.2012
comment
Ясно... вы можете проверить, если разрыв страницы настройки или расширения FS может помочь вам здесь. Но я думаю, что FS не может рассчитывать размер страницы. Если все пошло не так, вы должны рассчитать ширину таблицы по ее содержимому (например, просуммировать длину текста всех ячеек и установить правильную ширину). Высота таблицы не должна быть проблемой, так как здесь вы можете использовать page-break (см. первую ссылку). - person ollo; 28.11.2012