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

如何跟踪PDPageContentStream文本输出的位置?

钮誉
2023-03-14

我使用Java将输出写到PDDocument中,然后将该文档附加到现有文档中,然后将其提供给客户机。

// big try block
PDDocument doc = new PDDocument();
PDPage page = new PDPage();
doc.addPage(page);
PDPageContentStream content = new PDPageContentStream(doc, page);
int fontSize = 12;

content.beginText();
content.setFont(...);
content.moveTextPositionByAmount(margin, pageHeight-margin);
for ( each element in a collection of values ) {
    content.moveTextPositionByAmount(0, -fontSize); // only moves down in document

    // at this point, check if past the end of page, if so add a new page
    if (content.getTextYPosition(...) < margin) { // wishful thinking, doesn't exist
        content.endText();
        content.close();
        page = new PDPage();
        doc.addPage(page);
        content = new PDPageContentStream(doc, page);
        content.beginText();
        content.setFont(...);
        content.moveTextPositionByAmount(margin, pageHeight-(margin+fontSize));
    }
    content.drawString(...);
}
content.endText();
content.close();

共有1个答案

艾意蕴
2023-03-14

创建一个heightcounter变量,该变量跟踪文本位置移动了多远。它的初始值可以是你的起始Y位置。

        PDRectangle mediabox = page.findMediaBox();
        float margin = 72;
        float width = mediabox.getWidth() - 2 * margin;
        float startX = mediabox.getLowerLeftX() + margin;
        float startY = mediabox.getUpperRightY() - margin;
        float heightCounter = startY;

每次移动文本位置时,从heightcounter中减去该位置。当heightcounter小于移动文本位置时,创建一个新页面。

 类似资料:
  • 问题内容: 如果对http请求的响应是带有cookie的重定向(http代码302), 您如何指示Go客户使用收到的Cookie跟踪新位置? 在CURL中,可以通过以下方式轻松设置客户端: 您如何在Go中做到这一点? 问题答案: 使用Go 1.1,您可以使用。 这是一个工作示例:

  • 问题内容: 我希望每t毫秒定期跟踪一次鼠标光标的位置。因此,从本质上讲,当页面加载时- 该跟踪器应该启动,并且每(例如)每100毫秒启动一次,我应该获取posX和posY的新值并以表格形式打印出来。 我尝试了以下代码-但值没有刷新-表单框中仅显示posX和posY的初始值。关于如何启动和运行它的任何想法? 问题答案: 在事件处理程序接收到的对象上报告鼠标的位置,您可以将其附加到窗口(事件冒泡):

  • 尝试解决问题 http://www.hackerearth.com/problem/algorithm/sum-of-medians-1/ 并考虑使用多集来解决它,因为它可能包含重复的值。我尝试按如下方式编写代码:

  • 问题内容: 在程序快要结束时,我希望将类的所有实例中的特定变量加载到字典中。 例如: 假设实例数量会有所不同,我希望将Foo()的每个实例的x dict加载到新的dict中。我该怎么办? 我在SO中看到的示例假定一个已经具有实例列表。 问题答案: 跟踪实例的一种方法是使用类变量: 在程序结束时,您可以像下面这样创建字典: 只有一个列表:

  • 我做了很多年的Java开发人员,主要是使用spring开发MVC Web应用程序。我正在学习Kotlin和Android作为一个自我开发项目,并且大部分都很喜欢它。我通常只是把事情弄清楚,但我认为我在这里遗漏了一些重要的东西(因为我喜欢编写易于维护且不容易出现异常的代码)。我理解与Java的互操作性,我只是对我的Kotlin代码是如何编译的感到困惑,并且对Java方法调用抛出异常没有任何警告。 下

  • 跟踪行为控制着 Entity Framework Core 是否会在其变更跟踪器里维持实体实例的信息。如果实体是被跟踪的,任何检测到的该实体的变更都将在 SaveChanges() 时持久化到数据库中。Entity Framework Core 还会对已跟踪的、之前已加载到 DbContext 实例中的查询和实体进行相互的导航属性装配。 提示 你可以在 GitHub 上查阅当前文章涉及的代码样例。

  • 我正在用实时读取日志文件。这个效果很好。但每天都有一个日志循环,这意味着我的日志文件将被重命名,不再更改。将在同一位置创建新的日志文件。在我可以更改到新的日志文件之前,我需要完成当前日志文件的读取,使用没有问题,但是我如何才能发现文件名已更改? 我试着调用和,但这不起作用,因为-objects路径在创建后是固定的。 我还尝试使用WatchService,但附加到文件后也会导致ENTRY\u DEL

  • 问题内容: 根据我的经验, 事件通常仅在您离开()控件后才会发生。 有没有一种方法可以强制浏览器在每次内容更改时触发?如果没有,“手动”跟踪此问题的最优雅方法是什么? 使用事件并不可靠,因为您可以右键单击该字段并选择“粘贴”,这将更改该字段而无需任何键盘输入。 是唯一的方法吗?..丑陋的:-) 问题答案: 因此,您是否希望事件在按键,模糊 和 粘贴时触发?太神奇了。 如果您想跟踪键入的更改,请使用