当前位置: 首页 > 知识库问答 >
问题:

在itext7中的行之间添加画布而不重叠页面

柴修筠
2023-03-14

是否可以将画布和addParagraph一起添加到文档中?我有长文本(1000页)。

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

例如,如果文本中有一个单词“graph\u 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();

共有1个答案

颜均
2023-03-14

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

/**
 * This class is used for adding content directly onto a specified {@link PdfCanvas}.
 * {@link Canvas} does not know the concept of a page, so it can't reflow to a 'next' {@link Canvas}.
 *
 * This class effectively acts as a bridge between the high-level <em>layout</em>
 * API and the low-level <em>kernel</em> API.
 */
public class Canvas extends RootElement<Canvas>

出于类似的原因,您不能添加PdfCanvas,因为它也只是一个帮助器,可以将内容直接添加到页面或表单XObject的内容流中:

/**
 * PdfCanvas class represents an algorithm for writing data into content stream.
 * To write into page content, create PdfCanvas from a page instance.
 * To write into form XObject, create PdfCanvas from a form XObject instance.
 * Make sure to call PdfCanvas.release() after you finished writing to the canvas.
 * It will save some memory.
 */
public class PdfCanvas implements Serializable

不过,在将表单XObject包装到图像中之后,您可以向其中添加表单XObject。

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

PdfFormXObject pdfFormXObject = new PdfFormXObject(XOBJECT_SIZE);
PdfCanvas pdfCanvas = new PdfCanvas(pdfFormXObject, pdfDoc);
try (Canvas canvas = new Canvas(pdfCanvas, pdfDoc, pdfFormXObject.getBBox().toRectangle())) {
    ADD CONTENT TO canvas AS REQUIRED FOR THE USE CASE IN QUESTION
}

然后您可以将表单XObject包装在Image中并将其添加到文档中:

java prettyprint-override">doc.add(new Image(pdfFormXObject));

我使用了您的示例文本和图形图像(存储为“Graph.png”):

String text = "Until recently, increasing dividend yields grabbed the headlines. However, increasing\n" + 
        "yields were actually more a reflection of the market capitalisation challenge than of the\n" + 
        "fortunes of mining shareholders. The yields mask a complete u-turn from boom-time\n" + 
        "dividend policies. More companies have now announced clear percentages of profit\n" + 
        "distribution policies. The big story today is the abandonment of progressive dividends\n" + 
        "by the majors, confirming that no miner was immune from a sustained commodity\n" + 
        "cycle downturn, however diversified their portfolio. \n" +
        "\ngraph_add\n\n" +
        "Shareholders were not fully rewarded for the high commodity prices and huge\n" + 
        "profits experienced in the boom, as management ploughed cash and profits into\n" + 
        "bigger and more marginal assets. During those times, production was the main\n" + 
        "game and shareholders were rewarded through soaring stock prices. However,\n" + 
        "this investment proposition relied on prices remaining high. ";

final Image img;
try (InputStream imageResource = getClass().getResourceAsStream("Graph.png")) {
    ImageData data = ImageDataFactory.create(StreamUtil.inputStreamToArray(imageResource));
    img = new Image(data);
}

PdfDocument pdfDoc = new PdfDocument(new PdfWriter(DEST));
PageSize ps = PageSize.A4;;
Document doc = new Document(pdfDoc, ps);

Rectangle effectivePageSize = doc.getPageEffectiveArea(ps);
img.scaleToFit(effectivePageSize.getWidth(), effectivePageSize.getHeight());
PdfFormXObject pdfFormXObject = new PdfFormXObject(new Rectangle(img.getImageScaledWidth(), img.getImageScaledHeight()));
PdfCanvas pdfCanvas = new PdfCanvas(pdfFormXObject, pdfDoc);
try (Canvas canvas = new Canvas(pdfCanvas, pdfDoc, pdfFormXObject.getBBox().toRectangle())) {
    canvas.add(img);
}

BufferedReader br = new BufferedReader(new StringReader(text));
String line;
while ((line = br.readLine()) != null) {
    if("graph_add".equals(line)) {
        doc.add(new Image(pdfFormXObject));
    } else {
        doc.add(new Paragraph(line));
    }
}
doc.close();

(添加CanvasToDocument测试

结果:

顺便说一句:如果像本例中一样只向Canvas添加一个位图,显然可以将Image img直接添加到Document doc而不是通过表单XObject...

 类似资料:
  • 问题内容: 我有一个格式如下的文件(频率,文件名,代码行): 我希望输出为: 基本上,文件包含来自文件的文件名和代码行,第一个字段是频率,即文件中的代码行数。 我应该明智地阅读这些代码行。我发现这很乏味,并且如果不同文件的条目之间存在行距,那么对我来说将更容易,因此需要输出。 问题答案: Awk可以做到: 是文件名。

  • 我目前正在开发一个图像编辑器应用程序。我试图在我的应用程序中提供一个选项来处理不同的层,比如GIMP或Photoshop。我的方法是为用户添加的每个层添加一个。一切都很好,但不知怎么的,我动态添加的画布没有出现。 在我的类构造函数中,我添加了1个通用画布,它包含一个背景图像,不能编辑。这个画布(它是全球性的)确实显示出来并正常工作。所有可以编辑的层都存储在

  • 我在运行时用一个模板文件在itext7.pdfhtml中构建一个PDF。我想在生成的PDF中的每一页都添加一个页脚,该PDF有两页,但出于某种原因,页脚只出现在第二页。

  • 在我的项目中,我必须使用画布在另一个相同大小和图案的图像上实现一个不同的颜色图像,并且图像不是圆形或矩形形状。所有这些都是波浪形状,它将应用于单个主背景图像,用于在每个函数上显示多个图形。 重叠图像应更改为另一种选定颜色。我的问题是,使用canvas有什么方法,我们可以改变canvas绘制的图像颜色,或者我们需要始终使用不同的图像,并应用CSS/jQuery。 我读过关于画布图像掩蔽和重叠的文章。

  • 我需要添加一个HTML块作为使用iText7的所有页面的标题。标题包含一个图像徽标和一些文本。 在关闭文档对象之前,我现在有这样一个问题: 页脚工作正常,但页眉工作正常。 标题是这样加载的: 其中,的定义如下: 当我使用方法,效果很好,但只适用于第一页。所有其他内容都遵循它。 当我尝试使用方法添加它时,所有页面中只呈现图像。 顺便问一下,有没有办法得到标题段落的实际高度?我想,一旦解决了标题定位,

  • 我当前正试图添加一个链接到pdf文档的页脚页眉,但是库给出了以下错误System.IndexoutOfrangeException:“请求的页码0已超出范围。”当使用IText7库将链接添加到标头时。 我在IText7中找不到任何关于这个问题的在线代码示例,ITextSharp中的解决方案不再适用。 我的问题是我如何添加一个链接到一个外部网站到PDF的标题?当前的行为是库中的bug还是有意的? 包