Скажите «Летающей тарелке» или BIRT, чтобы масштабировать HTML, чтобы он поместился на одной странице PDF. - PullRequest
4 голосов
/ 15 сентября 2011

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

В настоящее время они визуализируют страницу в Internet Explorer 8 и вручную задают настраиваемый уровень масштабирования в окне предварительного просмотра, затем печатают страницу в PDF. Мне нужно выполнить эту операцию автоматически. Как этого добиться?

Отчеты фактически создаются BIRT, поэтому решение на основе BIRT тоже подойдет. Используя параметры масштабирования BIRT, масштабируйте документ, чтобы он соответствовал высоте, но он не соответствует ширине (потому что сначала он отображает HTML, а затем применяет масштаб).

Теперь я пытаюсь использовать Flying Saucer для преобразования в PDF HTML-кода, сгенерированного BIRT.

Я видел похожие вопросы, связанные с abcPDF (.NET) и CF8 (см. Ниже), но мне нужно решение на основе Java, и я не смог использовать те же методы с Flying Saucer или BIRT.

Скажите abcPdf, чтобы масштабировать HTML-файл для размещения на одной странице PDF

масштабирование PDF на одной странице

Ответы [ 3 ]

3 голосов
/ 01 октября 2013

Мы добавили запрос на извлечение в проект Flying Saucer для исправления, чтобы разрешить «использование itextrenderer под ширину страницы» .

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

1 голос
/ 23 сентября 2011

Это решение, которое я нашел, основанное на Flying Saucer / iText:

// A4 paper size = 297x210 mm
int PAGE_WIDTH = 2100;
int PAGE_LENGTH = 2970;
float MARGIN = 19.05f; // 0.75 inch

int width = PAGE_WIDTH; 

// Java2DRenderer.NO_HEIGHT = -1 (it's private)
// if used the required height is computed
Java2DRenderer renderer = new Java2DRenderer(dom, width, -1); 
BufferedImage img = renderer.getImage();

// Adjusts width based on required height
int height = img.getHeight(); 
width = (int) Math.round(height * PAGE_WIDTH / PAGE_LENGTH);

// Render same document again, now with the right dimensions
renderer = new Java2DRenderer(dom, width, height);
img = renderer.getImage();

com.lowagie.text.Document pdf = new com.lowagie.text.Document(PageSize.A4);
pdf.setMargins(MARGIN,MARGIN,MARGIN,MARGIN); 
PdfWriter.getInstance(pdf, new FileOutputStream(args[0]+".pdf"));
pdf.open();
com.lowagie.text.Image pdfImage = com.lowagie.text.Image.getInstance(img,Color.WHITE);
Rectangle ps = pdf.getPageSize();
pdfImage.scaleAbsolute(
    ps.getWidth()-pdf.leftMargin()-pdf.rightMargin(),
    ps.getHeight()-pdf.topMargin()-pdf.bottomMargin()
);
pdf.add(pdfImage);
pdf.close();
0 голосов
/ 08 марта 2017

Во-первых, я не использовал Летающую тарелку.

Однако, возможно, другие читают ваш вопрос и нуждаются в другом решении.

Если вы используете Java BIRT Engine и настраиваете параметры рендеринга самостоятельно, вы можете применить:

[PAGE_OVERFLOW = FIT_TO_PAGE_SIZE]

...