2

有没有一种方法可以使用 itext 将大型 jgraph 图形 2d 文档拆分为 pdf 中的多个页面。我有一个使用 jgraph 创建的大型流程图。我需要把这个流程图写成一个多页的pdf。我需要确保每个 pdf 页面高度限制为 5000.SO 如果图形对象高度超过 5000,它将跨越 pdf 中的多个页面。有没有办法我可以读取块中的图形对象(每次迭代的高度为 5000),继续将其写入新的 pdf 页面并迭代直到我完全读取对象。任何输入/指示都会有所帮助。

以下是我到目前为止所拥有的 -

float imageIdealHeight = 5000;
float imageIdealWidth = 5000;
float imageActualWidth=0;
float imageActualHeight=0;
mxRectangle imageBounds = ((mxGraph) graph).getGraphBounds();
imageActualWidth= (float) imageBounds.getWidth();
imageActualHeight = (float) imageBounds.getHeight();

System.out.println("Actual Width = "+imageActualWidth);
System.out.println("Actual Height = "+imageActualHeight);

numPages = (int) Math.ceil(imageActualHeight/imageIdealHeight);

Rectangle actualRectangle = new Rectangle(imageActualWidth, imageActualHeight);

//Custom Rectangle
Rectangle idealRectangle = new Rectangle(imageIdealWidth, imageIdealHeight);
Document document = new Document(idealRectangle );

//Create Pdf Writer
PdfWriter writer = PdfWriter.getInstance(document, fos);

//Open Document
document.open();

//Create huge template with actual image dimensions 
PdfContentByte canvas = writer.getDirectContent();
PdfTemplate template = canvas.createTemplate(imageActualWidth, imageActualHeight);
PdfCanvasFactory pdfCanvasFactory = new PdfCanvasFactory(canvas);

//Draw graphics to this template 
Graphics2D g2=template.createGraphics(imageActualWidth, imageActualHeight);
mxGraphics2DCanvas mxcanvas = new mxGraphics2DCanvas( g2);

mxcanvas = (mxGraphics2DCanvas) mxCellRenderer.drawCells((mxGraph) graph, null, 1, null, pdfCanvasFactory);
mxcanvas.getGraphics().dispose();

g2.dispose();

//Add template now...      
canvas.addTemplate(template,0, -15000);
document.newPage();
canvas.addTemplate(template, 0, -10000);
document.newPage();
canvas.addTemplate(template,0 , -5000);
document.newPage();
canvas.addTemplate(template, 0, 0);
document.newPage();

document.close();
4

2 回答 2

1

您需要一个包含 5000 x 5000 个用户单位的页面的 PDF。这意味着您将创建一个带有自定义矩形的文档,如下所示:

Rectangle rect = new Rectangle(5000, 5000);
Document document = new Document(rect);

显然,您还将创建一个这样的作家:

PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("my_file.pdf"));

您将打开文档:

document.open();

假设您的 Graphics2D“图像”为 10000 x 10000 点。这意味着您需要将该图像分布在 4 页上。

诀窍是创建一个PdfTemplate尺寸为 10000 x 10000 的对象。

PdfContentByte canvas = writer.getDirectContent();
PdfTemplate template = canvas.createTemplate(10000, 10000);

现在我们将图形绘制到这个模板:

Graphics2D gd2d = new PdfGraphics2D(template, 10000, 10000);
// draw stuff to gd2d
gd2d.dispose();

您现在已经创建了一个大型的 Form XObject,其内容不适合页面。此内容将仅作为外部对象出现在 PDF 文件中一次(因此称为 XObject)。您所要做的就是根据需要多次添加文档。

例如:

canvas.addTemplate(template, 0, 0);
document.newPage();

我希望您对坐标系有一个概念: (0, -5000), (-5000, -5000), (0, 0) 和 (-5000, 0) 是将 10000 除以所需的 x、y 偏移量10000 个对象超过 4 个页面,大小仅为 5000 x 5000。

剩下的唯一一行代码是:

document.close();

你完成了。

有关完整示例,请参阅LargeTemplate

public void createPdf(String dest) throws IOException, DocumentException {
    float width = 602;
    float height = 15872;
    float maxHeight = 5000;
    Document document = new Document(new Rectangle(width, maxHeight));
    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream(DEST));
    document.open();
    PdfContentByte canvas = writer.getDirectContent();
    PdfTemplate template = canvas.createTemplate(width, height);
    Graphics2D g2d = new PdfGraphics2D(template, width, height);
    for (int x = 10; x < width; x += 100) {
        for (int y = 10; y < height; y += 100) {
            g2d.drawString(String.format("(%s,%s)", x, y), x, y);
        }
    }
    g2d.dispose();
    int pages = ((int)height / (int)maxHeight) + 1;
    for (int p = 0; p < pages; ) {
        p++;
        canvas.addTemplate(template, 0, (p * maxHeight) - height);
        document.newPage();
    }
    document.close();
}

如您所见,我使用了您在评论中提到的尺寸:

float width = 602;
float height = 15872;

我还介绍了一个最大高度:

float maxHeight = 5000;

我创建了一个尺寸宽度 x maxHeight 的页面和一个尺寸宽度 x 高度的 Graphics2D 模板。出于测试目的,我使用drawString()每 100 个点绘制一次坐标信息。

我计算我需要多少页:

int pages = ((int)height / (int)maxHeight) + 1;

现在我添加模板的次数与页面数一样多,使用一些基本数学来计算偏移量:

for (int p = 0; p < pages; ) {
    p++;
    canvas.addTemplate(template, 0, (p * maxHeight) - height);
    document.newPage();
}

我不知道您使用的是哪个 Math,但生成的 PDF 看起来完全符合我的预期:large_template.pdf

于 2014-07-17T15:41:13.263 回答
0
    int numPages; 
    float imageIdealHeight = 5000;
    float imageIdealWidth = 5000;
    float imageActualWidth=0;
    float imageActualHeight=0;
    mxRectangle imageBounds = ((mxGraph) graph).getGraphBounds();
    imageActualWidth= (float) imageBounds.getWidth();
    imageActualHeight = (float) imageBounds.getHeight();

    System.out.println("Actual Width = "+imageActualWidth);
    System.out.println("Actual Height = "+imageActualHeight);

    numPages = (int) Math.ceil(imageActualHeight/imageIdealHeight);

    Rectangle actualRectangle = new Rectangle(imageActualWidth, imageActualHeight);

    //Custom Rectangle
    Rectangle idealRectangle = new Rectangle(imageActualWidth, imageIdealHeight);
    Document document = new Document(idealRectangle);

    //Create Pdf Writer
    PdfWriter writer = PdfWriter.getInstance(document, fos);

    //Open Document
    document.open();

    //Create huge template with actual image dimensions 
    PdfContentByte canvas = writer.getDirectContent();
    PdfTemplate template = canvas.createTemplate(imageActualWidth, imageActualHeight);


    //Draw graphics to this template 
   Graphics2D g2=template.createGraphics(imageActualWidth, imageActualHeight);
   g2.drawImage(img, null, 0, 0);
   g2.dispose();  
   for (int p = numPages; p > 0; ) {
   p--;
        canvas.addTemplate(template, 0, -  ((p-1) *imageIdealHeight  + (imageActualHeight  % imageIdealHeight))  );            
        document.newPage();
    }


    document.close();
于 2014-07-18T14:40:32.887 回答