Java 在itext 7中的行之间添加画布,不重叠页面

Java 在itext 7中的行之间添加画布,不重叠页面,java,pdf,itext,itext7,Java,Pdf,Itext,Itext7,是否可以在文档中添加画布和add段落?我有长文本(1000页) 我需要在特定位置(图形、形状等)的文本之间添加画布 例如,如果文本中有一个单词“graph_add” PdfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST)); PageSize ps = PageSize.A4;; Document doc = new Document(pdfDoc, ps); BufferedReader br = new BufferedReader(

是否可以在文档中添加画布和add段落?我有长文本(1000页)

我需要在特定位置(图形、形状等)的文本之间添加画布

例如,如果文本中有一个单词“graph_add”

PdfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST));
PageSize ps = PageSize.A4;;
Document doc = new Document(pdfDoc, ps);
BufferedReader br = new BufferedReader(new FileReader("bigfileWithText.txt"));
while ((line = br.readLine()) != null) {
if("graph_add".equals(line))
//Add canvas in document in this place!!doc.add(Canvas)
doc.add(new Paragraph(line)
}
doc.close();
以下是示例文件:

本文 不适合,这里我需要在单独的页面上创建。我在文本后的某个时刻添加一个图形(画布),然后再次添加一个文本。 类似这样的内容:

要添加什么 首先,您不能简单地将
Canvas
添加到某个对象,因为
Canvas
仅仅是将内容直接添加到指定的
PdfCanvas
的助手,它是不同API级别之间的桥梁,参见其JavaDoc:

/**
*此类用于将内容直接添加到指定的{@link PdfCanvas}上。
*{@link Canvas}不知道页面的概念,因此它不能回流到“下一个”{@link Canvas}。
*
*这个类有效地充当了高层布局之间的桥梁
*API和底层内核API。
*/
公共类画布扩展了根元素
出于类似原因,您不能添加
PdfCanvas
,因为它也仅仅是一个帮助器,用于将内容直接添加到页面或表单XObject的内容流中:

/**
*PdfCanvas类表示将数据写入内容流的算法。
*要写入页面内容,请从页面实例创建PdfCanvas。
*要写入表单XObject,请从表单XObject实例创建PdfCanvas。
*确保在完成对画布的写入后调用PdfCanvas.release()。
*这将节省一些内存。
*/
公共类PdfCanvas实现可序列化
不过,在将表单XObject包装到
图像中之后,您可以向其中添加表单XObject

因此,您应该首先创建一个表单XObject,然后创建一个
PdfCanvas
,然后创建一个
Canvas
,并用您的内容填充
Canvas

PdfFormXObject PdfFormXObject=新的PdfFormXObject(XOBJECT\u大小);
PdfCanvas PdfCanvas=新的PdfCanvas(pdfFormXObject,pdfDoc);
try(Canvas Canvas=newcanvas(pdfCanvas、pdfDoc、pdfFormXObject.getBBox().toRectangle())){
根据相关用例的需要向画布添加内容
}
然后,您可以将表单XObject包装在
图像中
,并将其添加到文档中:

doc.add(新图像(pdfFormXObject));
一个例子 我使用了您的示例文本和图形图像(存储为“graph.png”):

String text=“直到最近,不断增加的股息收益率还是头条新闻。然而,不断增加的\n”+
“收益率实际上更多地反映了市场资本化的挑战,而不是\n”+
“矿业股东的财富。收益率掩盖了繁荣时期的一个彻底的u形转弯\n”+
“股息政策。现在有更多的公司公布了明确的利润百分比\n”+
“分配政策。今天的大新闻是放弃累进股息\n”+
“由各大矿业公司发布,确认没有一家矿业公司免受持续商品的影响\n”+
周期性衰退,无论其投资组合如何多样化。\n+
“\n图形\u添加\n\n”+
“股东并未因商品价格高和利润巨大而获得充分回报”\n+
“管理层将现金和利润投入到\n+
“更大、更边缘的资产。在这些时期,生产是主要的\n”+
“游戏和股东通过飙升的股价获得了回报。然而,\n”+
“这一投资主张依赖于价格居高不下。”;
最终图像img;
试试(InputStream imageResource=getClass().getResourceAsStream(“Graph.png”)){
ImageData data=ImageDataFactory.create(StreamUtil.inputStreamToArray(imageResource));
img=新图像(数据);
}
PdfDocument pdfDoc=新PdfDocument(新PdfWriter(DEST));
PageSize ps=PageSize.A4;;
文件文件=新文件(pdfDoc,ps);
矩形有效页面大小=doc.getPageEffectiveArea(ps);
img.scaleToFit(effectivePageSize.getWidth(),effectivePageSize.getHeight());
PdfFormXObject PdfFormXObject=新的PdfFormXObject(新矩形(img.getImageScaledWidth(),img.getImageScaledHeight());
PdfCanvas PdfCanvas=新的PdfCanvas(pdfFormXObject,pdfDoc);
try(Canvas Canvas=newcanvas(pdfCanvas、pdfDoc、pdfFormXObject.getBBox().toRectangle())){
canvas.add(img);
}
BufferedReader br=新的BufferedReader(新的StringReader(文本));
弦线;
而((line=br.readLine())!=null){
如果(“图加”。等于(线)){
文档添加(新图像(pdfFormXObject));
}否则{
添加文件(新段落(行));
}
}
doc.close();
(测试
testadcanvasforruslan

结果是:


旁白:如果像本例中那样只向
画布添加一个位图,显然可以将
图像img
直接添加到
文档文档
,而不是通过表单XObject…

添加内容 首先,您不能简单地将
Canvas
添加到某个对象,因为
Canvas
仅仅是将内容直接添加到指定的
PdfCanvas
的助手,它是不同API级别之间的桥梁,参见其JavaDoc:

/**
*此类用于将内容直接添加到指定的{@link PdfCanvas}上。
*{@link Canvas}不知道页面的概念,因此它不能回流到“下一个”{@link Canvas}。
*
*这个类有效地充当了高层布局之间的桥梁
*API和底层内核API。
*/
公共类画布扩展了根元素
出于类似原因,您不能添加
PdfCanvas
,因为它也仅仅是一个帮助器,用于将内容直接添加到页面或表单XObject的内容流中:

/**
*PdfCanvas类表示将数据写入内容流的算法。
*要写入页面内容,请创建Pd