iText:将SVG图块作为页面添加到新的PDF文件中

时间:2013-06-14 14:42:29

标签: svg itext

我正在尝试使用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);
    }

}

0 个答案:

没有答案