java pdf设置页面大小,使用iText pdfHTML的PDF页面大小和格式

I am trying to export 3 HTML pages (all with same content) into a PDF using iText7.1.0 and pdfHTML2.0.0 using this example. For some reason, the pages have formatting issue at the footer. The jsFiddle link to my HTML code that is being used by PDF renderer.

Below is the Java code used for rendering the PDF (Test.html is the same HTML code in the fiddle):

package com.itextpdf.htmlsamples.chapter01;

import java.io.ByteArrayInputStream;

import java.io.ByteArrayOutputStream;

import java.io.File;

import java.io.FileInputStream;

import java.io.IOException;

import com.itextpdf.html2pdf.ConverterProperties;

import com.itextpdf.html2pdf.HtmlConverter;

import com.itextpdf.kernel.pdf.PdfDocument;

import com.itextpdf.kernel.pdf.PdfReader;

import com.itextpdf.kernel.pdf.PdfWriter;

import com.itextpdf.kernel.geom.PageSize;

import com.itextpdf.kernel.utils.PdfMerger;

import com.itextpdf.licensekey.LicenseKey;

/**

* Can we parse different HTML files and combine them into one PDF?

* Yes, this can be done in different ways. This example shows how

* to create a PDF in memory for each HTML, then use PdfMerger to

* merge the different PDFs into one, on a page per page basis.

*/

public class C07E01_CombineHtml {

/** The Base URI of the HTML page. */

public static final String BASEURI = "src/main/resources/html/";

/** An array containing the paths to different HTML files. */

public static final String[] SRC = {

String.format("%sTest.html", BASEURI),

String.format("%sTest.html", BASEURI),

String.format("%sTest.html", BASEURI)

};

/** The target folder for the result. */

public static final String TARGET = "target/results/ch07/";

/** The path to the resulting PDF file. */

public static final String DEST = String.format("%sbundle.pdf", TARGET);

protected PageSize A4;

/**

* The main method of this example.

*

* @param args no arguments are needed to run this example.

* @throws IOException Signals that an I/O exception has occurred.

*/

public static void main(String[] args) throws IOException {

LicenseKey.loadLicenseFile("C://Users//Sparks//Desktop//itextkey-0.xml");

File file = new File(TARGET);

file.mkdirs();

new C07E01_CombineHtml().createPdf(BASEURI, SRC, DEST);

}

/**

* Creates the PDF file.

*

* @param baseUri the base URI

* @param src an array with the paths to different source HTML files

* @param dest the path to the resulting PDF

* @throws IOException Signals that an I/O exception has occurred.

*/

public void createPdf(String baseUri, String[] src, String dest) throws IOException {

ConverterProperties properties = new ConverterProperties();

properties.setBaseUri(baseUri);

PdfWriter writer = new PdfWriter(dest);

PdfDocument pdf = new PdfDocument(writer);

PdfMerger merger = new PdfMerger(pdf);

for (String html : src) {

ByteArrayOutputStream baos = new ByteArrayOutputStream();

PdfDocument temp = new PdfDocument(new PdfWriter(baos));

PageSize pageSize = PageSize.A4;

temp.setDefaultPageSize(pageSize);

HtmlConverter.convertToPdf(new FileInputStream(html), temp, properties);

temp = new PdfDocument(new PdfReader(new ByteArrayInputStream(baos.toByteArray())));

merger.merge(temp, 1, temp.getNumberOfPages());

temp.close();

}

pdf.close();

}

}

The output PDF file has 6 pages without footer. It should have 3 pages each of 'A4' size.

Any suggestions would be helpful.

解决方案

Changing the PageSize to one that is larger should solve this specific issue.

Afterward you can scale the page down in order to get a PDF with A4 pages.

Take a look at the code sample below to get an idea about how you can do this.

public static void main(String[] args) throws IOException {

ByteArrayOutputStream pdf = createPdf("src/main/resources/SO47869248/html.html");

// To get from A3 to A4 the size has to shrink 71%

new SO47869248().scalePdf(DEST, new ByteArrayInputStream(pdf.toByteArray()), 0.7071f);

}

public static ByteArrayOutputStream createPdf(String htmlSrc) throws IOException {

ByteArrayOutputStream output = new ByteArrayOutputStream();

ConverterProperties converterProperties = new ConverterProperties();

converterProperties.setBaseUri(new File(htmlSrc).getParent());

PdfWriter writer = new PdfWriter(output);

PdfDocument pdfDocument = new PdfDocument(writer);

PdfMerger merger = new PdfMerger(pdfDocument);

for(int x=0; x < 3; x++){

ByteArrayOutputStream baos = new ByteArrayOutputStream();

PdfDocument temp = new PdfDocument(new PdfWriter(baos));

temp.setDefaultPageSize(PageSize.A3);

HtmlConverter.convertToPdf(new FileInputStream(htmlSrc), temp, converterProperties);

temp = new PdfDocument(new PdfReader(new ByteArrayInputStream(baos.toByteArray())));

merger.merge(temp, 1, temp.getNumberOfPages());

temp.close();

}

pdfDocument.close();

return output;

}

public void scalePdf(String dest, ByteArrayInputStream input, float scale) throws IOException {

// Create the source document

PdfDocument srcDoc = new PdfDocument(new PdfReader(input));

PdfDocument pdfDoc = new PdfDocument(new PdfWriter(dest));

ScaleDownEventHandler eventHandler = new ScaleDownEventHandler(scale);

int n = srcDoc.getNumberOfPages();

pdfDoc.addEventHandler(PdfDocumentEvent.START_PAGE, eventHandler);

PdfCanvas canvas;

PdfFormXObject page;

for (int p = 1; p <= n; p++) {

eventHandler.setPageDict(srcDoc.getPage(p).getPdfObject());

canvas = new PdfCanvas(pdfDoc.addNewPage());

page = srcDoc.getPage(p).copyAsFormXObject(pdfDoc);

canvas.addXObject(page, scale, 0f, 0f, scale, 0f, 0f);

}

pdfDoc.close();

srcDoc.close();

}

protected class ScaleDownEventHandler implements IEventHandler {

protected float scale = 1;

protected PdfDictionary pageDict;

public ScaleDownEventHandler(float scale) {

this.scale = scale;

}

public void setPageDict(PdfDictionary pageDict) {

this.pageDict = pageDict;

}

@Override

public void handleEvent(Event event) {

PdfDocumentEvent docEvent = (PdfDocumentEvent) event;

PdfPage page = docEvent.getPage();

page.put(PdfName.Rotate, pageDict.getAsNumber(PdfName.Rotate));

scaleDown(page, pageDict, PdfName.MediaBox, scale);

scaleDown(page, pageDict, PdfName.CropBox, scale);

}

protected void scaleDown(PdfPage destPage, PdfDictionary pageDictSrc, PdfName box, float scale) {

PdfArray original = pageDictSrc.getAsArray(box);

if (original != null) {

float width = original.getAsNumber(2).floatValue() - original.getAsNumber(0).floatValue();

float height = original.getAsNumber(3).floatValue() - original.getAsNumber(1).floatValue();

PdfArray result = new PdfArray();

result.add(new PdfNumber(0));

result.add(new PdfNumber(0));

result.add(new PdfNumber(width * scale));

result.add(new PdfNumber(height * scale));

destPage.put(box, result);

}

}

}

For this example I picked the A3 pagesize constant. You can also create a PageSize object using specific measurements. As shown below:

Constructor:

public PageSize(float width, float height)

Example:

PageSize pageSize = new PageSize(750, 1000);

PdfDocument temp = new PdfDocument(pageSize);

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值