我正在尝试使用 iText 创建一个新的 PDF 文件,新文件应该由从 SVG 文件(平铺)内的区域生成的页面组成。并且每个生成的页面都需要在其上叠加一个“绘图边框”,使其显示为每个生成页面的顶层。我认为可以使用 iText 压模实现叠加,但我看到的示例仅适用于现有的 PDF,我没有,因为我想即时执行所有这些操作以减少生成结果所需的时间PDF格式。我有一个代表 PDF 层的单页 PDF 文件,可以叠加在 PDF 中生成的每一页上。
我在网上找到了一个示例,它将 SVG 画布划分为图块并从每个图块创建单独的 PDF 文件。但是,创建中间 PDF 文件会浪费时间,因为我需要再次读取它们以创建我正在尝试创建的文件(每个页面都有叠加层)。
我不想在这里转储大量代码,但这里是我用来为每个 SVG 磁贴生成一页 PDF 文件的代码示例:http: //people.apache.org/~clay/batik/rasterizerTutorial.pdf (参见第 5 页:SaveAsJPEGTiles.java)
由于我是 iText 新手,也许这里有人已经取得了类似的成就,或者知道如何做到这一点?
谢谢。
我使用的是 ByteArrayOutputStream 而不是 FileOutputStream,但是当我尝试将其与 iText 的 Document 类型结合使用时,我不断收到一个异常,说文档中没有页面 - 请参见下面的代码。我想我需要将每个图块的 ByteArrayOutputStream 添加到 iText 文档中,以便它为每个图块创建一个新页面,但我无法从 iText API 中看到如何做到这一点。到目前为止,这是我的代码,但不太有效:
package examples.aoi;
import java.io.*;
import java.awt.*;
import org.apache.batik.transcoder.TranscoderInput;
import org.apache.batik.transcoder.TranscoderOutput;
import org.apache.fop.svg.PDFTranscoder;
import com.itextpdf.text.Document;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.pdf.PdfWriter;
public class FromCanvasToPDFPages {
PDFTranscoder trans = new PDFTranscoder();
public FromCanvasToPDFPages() {
}
public void tile(TranscoderInput input, TranscoderOutput output, Rectangle aoi) throws Exception {
trans.addTranscodingHint(PDFTranscoder.KEY_WIDTH, new Float(aoi.width));
trans.addTranscodingHint(PDFTranscoder.KEY_HEIGHT, new Float(aoi.height));
trans.addTranscodingHint(PDFTranscoder.KEY_AOI, aoi);
trans.transcode(input, output);
}
public static void main(String [] args) throws Exception {
FromCanvasToPDFPages p = new FromCanvasToPDFPages();
String in = "C:\\Documents and Settings/krell/My Documents/1.svg";
String svgURI = new File(in).toURL().toString();
TranscoderInput input = new TranscoderInput(svgURI);
String outputFilename = "canvasPages.pdf";
ByteArrayOutputStream baos = new ByteArrayOutputStream();
TranscoderOutput output = new TranscoderOutput(baos);
int A4_landscape_width = 1103; // use proper dimensions from class when found
int A4_landscape_height = 780; // use proper dimensions from class when found
int documentWidth = 3309; // read this directly from canvas file (svg)
int documentHeight = 1560; // read this directly from canvas file (svg)
int columns = documentWidth / A4_landscape_width;
int rows = documentHeight / A4_landscape_height;
int tile_width = A4_landscape_width;
int tile_height = A4_landscape_height;
System.err.println(">>> Canvas document width = "+documentWidth);
System.err.println(">>> Canvas document height = "+documentHeight);
System.err.println(">>> A4 width = "+A4_landscape_width);
System.err.println(">>> A4 height = "+A4_landscape_height);
System.err.println(">>> canvas columns = "+columns);
System.err.println(">>> canvas rows = "+rows);
System.err.println(">>> tile_width = "+tile_width);
System.err.println(">>> tile_height = "+tile_height);
// Create A4 document to write tile data into
Document document = new Document(PageSize.A4_LANDSCAPE, 10, 10, 10, 10);
PdfWriter writer = PdfWriter.getInstance(document, baos);
// open the document
document.open();
// now process each tile, row by row, column by column until done
for (int row = 0; row < rows; row++) {
for (int column = 0; column < columns; column++) {
// get tile coordinates
Rectangle tile = new Rectangle(column*tile_width, row*tile_height, (column+1)*tile_width, (row+1)*tile_height);
p.tile(input, output, tile);
}
}
// now write the baos to disk:
OutputStream fileOutputStream = new FileOutputStream(outputFilename);
baos.writeTo(fileOutputStream);
// close stuff
fileOutputStream.flush();
fileOutputStream.close();
document.close();
baos.close();
System.exit(0);
}
}