在同一页面中在 ColumnDocumentRenderer 和 DocumentRenderer 之间切换?

2023-11-30

我正在使用 iText7 测试一些东西,我有一个场景,我需要在顶部有 DocumentRenderer 段落,然后在同一页面上在其正下方启动 ColumnDocumentRender 2 列。我遇到的问题是,当我更改同一页面上的内容时,它会将 DocumentRenderer 中的内容与 ColumnDocumentRenderer 中的内容重叠。我相信这是因为一个渲染不知道另一个渲染,并且内容从页面顶部开始。我跟着本教程但它只显示如何将内容添加到下一页。它确实说

我们必须指示 iText 不要将内容刷新到 输出流

但谁能告诉我我们如何才能实现这一目标呢?

public void createPdf(String dest) throws IOException {
    PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
    Document document = new Document(pdf);
    Paragraph p = new Paragraph()
        .add("Be prepared to read a story about a London lawyer "
        + "named Gabriel John Utterson who investigates strange "
        + "occurrences between his old friend, Dr. Henry Jekyll, "
        + "and the evil Edward Hyde.");
    document.add(p);
    document.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
    ... // Define column areas
    document.setRenderer(new ColumnDocumentRenderer(document, columns));
    document.add(new AreaBreak(AreaBreakType.LAST_PAGE));   
    ... // Add novel in two columns
    document.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
    document.setRenderer(new DocumentRenderer(document)); 
    document.add(new AreaBreak(AreaBreakType.LAST_PAGE));
    p = new Paragraph()
        .add("This was the story about the London lawyer "
        + "named Gabriel John Utterson who investigates strange "
        + "occurrences between his old friend, Dr. Henry Jekyll, "
        + "and the evil Edward Hyde. THE END!");
    document.add(p);
    document.close();
}

我需要这样的东西:

iText7 列

每当你创建一个新的 DocumentRenderer 时,iText 就会开始返回到 文档的顶部——即:从第一页开始。这可以让你 在同一文档上彼此相邻地使用不同的渲染器 同一页面。如果需要的话,我们必须指示 iText 不要这样做 将内容刷新到OutputStream;否则我们将无法访问 到前几页。在这种情况下,我们不需要更改任何内容 前几页。我们只想在下一个渲染器上切换到另一个渲染器 页。引入转到最后一页的分页符将避免 新内容会覆盖旧内容。


我已经采取了这个代码:C02E08_JekyllHydeV4

我根据你的问题更新了它:

//Initialize PDF document
PdfDocument pdf = new PdfDocument(new PdfWriter(dest));
// Initialize document
Document document = new Document(pdf);
Paragraph p = new Paragraph()
    .add("Be prepared to read a story about a London lawyer "
       + "named Gabriel John Utterson who investigates strange "
       + "occurrences between his old friend, Dr. Henry Jekyll, "
       + "and the evil Edward Hyde.");
document.add(p);
document.add(new AreaBreak(AreaBreakType.NEXT_PAGE));

//Set column parameters
...
//Define column areas
...
document.setRenderer(new ColumnDocumentRenderer(document, columns)); 
document.add(new AreaBreak(AreaBreakType.LAST_PAGE));   
// Add the full Jekyl and Hyde text
document.add(new AreaBreak(AreaBreakType.NEXT_PAGE));
document.setRenderer(new DocumentRenderer(document)); 
document.add(new AreaBreak(AreaBreakType.LAST_PAGE));
p = new Paragraph()
    .add("This was the story about the London lawyer "
       + "named Gabriel John Utterson who investigates strange "
       + "occurrences between his old friend, Dr. Henry Jekyll, "
       + "and the evil Edward Hyde. THE END!");
document.add(p);
//Close document
document.close();

结果如下:

enter image description here

enter image description here

enter image description here

我认为这就是您正在寻找的行为。如果不是,请解释哪里出了问题。

UPDATE:

明确了问题后,显然上述答案并不能解决问题。这是实际问题的解决方案:

我们需要创建一个自定义的ParagraphRenderer确定 Y 位置: 类 MyParagraphRenderer 扩展 ParagraphRenderer {

    float y;

    public MyParagraphRenderer(Paragraph modelElement) {
        super(modelElement);
    }

    @Override
    public void drawBorder(DrawContext drawContext) {
        super.drawBorder(drawContext);
        y = getOccupiedAreaBBox().getBottom();
    }

    public float getY() {
        return y;
    }

}

当我们添加第一段的时候,我们需要使用这个自定义ParagraphRenderer:

Paragraph p = new Paragraph()
        .add("Be prepared to read a story about a London lawyer "
        + "named Gabriel John Utterson who investigates strange "
        + "occurrences between his old friend, Dr. Henry Jekyll, "
        + "and the evil Edward Hyde.");
MyParagraphRenderer renderer = new MyParagraphRenderer(p);
p.setNextRenderer(renderer);
document.add(p);

现在我们可以得到我们需要的 Y 位置,如下所示:renderer.getY();我们使用这个 Y 位置来定义第一组列:

float offSet = 36;
float gutter = 23;
float columnWidth = (PageSize.A4.getWidth() - offSet * 2) / 2 - gutter;
float columnHeight1 = renderer.getY() - offSet * 2;
Rectangle[] columns1 = {
    new Rectangle(offSet, offSet, columnWidth, columnHeight1),
    new Rectangle(offSet + columnWidth + gutter, offSet, columnWidth, columnHeight1)};

我们可以使用这组列来创建一个ColumnDocumentRenderer,但是如果需要多个页面来渲染所有内容,那么第二页上的列的偏移量将会是错误的,因此我们还创建了一个自定义ColumnDocumentRenderer:

class MyColumnDocumentRenderer extends ColumnDocumentRenderer {

    Rectangle[] columns2;

    public MyColumnDocumentRenderer(Document document, Rectangle[] columns1, Rectangle[] columns2) {
        super(document, columns1);
        this.columns2 = columns2;
    }

    @Override
    protected PageSize addNewPage(PageSize customPageSize) {
        PageSize size = super.addNewPage(customPageSize);
        columns = columns2;
        return size;
    }
}

This ColumnDocumentRenderer接受两组列,一组将在第一页上使用,第二组将在所有后续页面上使用。这就是我们定义和应用自定义的方式ColumnDocumentRenderer:

float columnHeight2 = PageSize.A4.getHeight() - offSet * 2;
Rectangle[] columns2 = {
    new Rectangle(offSet, offSet, columnWidth, columnHeight2),
    new Rectangle(offSet + columnWidth + gutter, offSet, columnWidth, columnHeight2)};
document.setRenderer(new MyColumnDocumentRenderer(document, columns1, columns2));  

现在结果如下所示:

enter image description here

根据您想要的第一个页面宽度段落与列中后续内容之间的距离,您可以调整renderer.getY() - offSet * 2.

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在同一页面中在 ColumnDocumentRenderer 和 DocumentRenderer 之间切换? 的相关文章

  • Android - 如何访问 onResume 中 onCreate 中实例化的 View 对象?

    In my onCreate 方法 我正在实例化一个ImageButton View public void onCreate Bundle savedInstanceState super onCreate savedInstanceSt
  • java中的csv到pdf文件

    我正在尝试获得一个csv文件解析为pdf 到目前为止我所拥有的内容附在下面 我的问题是这段代码最终出现在 pdf 中的文件在 csv 文件的第一行被截断 我不明白为什么 附示例 本质上我想要一个没有任何操作的 csv 文件的 pdf 版本
  • 用 @DataJpaTest 注释的测试不是用 @Autowired 注释的自动装配字段

    我有一个 Spring Boot 应用程序 其中包含 Spring Data Jpa 存储库 我需要围绕这个存储库运行单元 或组件 测试 我对 Spring Data Jpa 没有太多经验 这是我的测试 这很简单 我无法让它通过 impor
  • 使用 Spring 时实例化对象,用于测试与生产

    使用 Spring 时 应该使用 Spring 配置 xml 来实例化生产对象 并在测试时直接实例化对象 这样的理解是否正确 Eg MyMain java package org world hello import org springf
  • 方法断点可能会大大减慢调试速度

    每当向方法声明行添加断点 在 Intellij IDEA 或 Android Studio 中 时 都会出现一个弹出窗口 方法断点可能会大大减慢调试速度 为什么会这样戏剧性地减慢调试速度 是我的问题吗 将断点放在函数的第一行有什么不同 Th
  • 如何将 Spotlight for Help 插入本地化的 macOS 应用程序?

    我正在 macOS 上使用 Swing GUI 框架实现 Java 应用程序 当使用system外观和感觉以及screen菜单栏 Swing 自动插入一个搜索栏 called 聚光灯寻求帮助 https developer apple co
  • Java 变量的作用域

    我不明白为什么这段代码的输出是10 package uno public class A int x 10 A int x 12 new B public static void main String args int x 11 new
  • Spring Stomp over Websocket:流式传输大文件

    我的SockJs客户端在网页中 发送帧大小为16K的消息 消息大小限制决定了我可以传输的文件的最大大小 以下是我在文档中找到的内容 Configure the maximum size for an incoming sub protoco
  • spring - 强制 @Autowired 字段的 cglib 代理

    我有混合堆栈 EJB 和 Spring 为了将 Spring 自动装配到 EJB 我使用SpringBeanAutowiringInterceptor 不确定这是否会影响我遇到的问题 在尝试通过以下方式自动装配 bean 时 Scope p
  • 使用 Guava 联合两个 ImmutableEnumSets

    我想联合两个ImmutableEnumSets来自番石榴 这是我的尝试 public final class OurColors public enum Colors RED GREEN BLUE YELLOW PINK BLACK pub
  • 打印包含 JBIG2 图像的 PDF

    请推荐一些库 帮助我打印包含 JBIG2 编码图像的 PDF 文件 PDFRenderer PDFBox别帮我 这些库可以打印简单的 PDF 但不能打印包含 JBIG2 图像的 PDF PDFRenderer尝试修复它 根据 PDFRedn
  • tomcat 过滤所有 web 应用程序

    问题 我想对所有网络应用程序进行过滤 我创建了一个过滤器来监视对 apache tomcat 服务器的请求 举例来说 它称为 MyFilter 我在 netbeans 中创建了它 它创建了 2 个独立的目录 webpages contain
  • 如何使用 Mockito 和 Junit 模拟 ZonedDateTime

    我需要模拟一个ZonedDateTime ofInstant 方法 我知道SO中有很多建议 但对于我的具体问题 到目前为止我还没有找到任何简单的解决办法 这是我的代码 public ZonedDateTime myMethodToTest
  • OpenJDK 版本控制

    上下文 我想确保我们系统上安装的 Java 不受 CVE 2022 21449 的影响 java version 给出 openjdk version 11 0 7 2020 04 14 LTS OpenJDK Runtime Enviro
  • 如何在keycloak中动态编辑standalone.xml文件

    我正在尝试通过 docker 编辑standalone xml 并尝试添加 但 keycloak 正在使用它standalone xml 但我可以看到standalone xml 文件中的更改 我需要在standalone xml 文件中添
  • ExceptionHandler 不适用于 Throwable

    我们的应用程序是基于 Spring MVC 的 REST 应用程序 我正在尝试使用 ExceptionHandler 注释来处理所有错误和异常 I have ExceptionHandler Throwable class public R
  • 使用 Java 从 S3 上的文件在 S3 上创建 zip 文件

    我在 S3 上有很多文件 需要对其进行压缩 然后通过 S3 提供压缩文件 目前 我将它们从流压缩到本地文件 然后再次上传该文件 这会占用大量磁盘空间 因为每个文件大约有 3 10MB 而且我必须压缩多达 100 000 个文件 所以一个 z
  • 如何在android sdk上使用PowerMock

    我想为我的 android 项目编写一些单元测试和仪器测试 然而 我遇到了一个困扰我一段时间的问题 我需要模拟静态方法并伪造返回值来测试项目 经过一些论坛的调查 唯一的方法是使用PowerMock来模拟静态方法 这是我的 gradle 的一
  • 重写Object类的finalize()方法有什么用?

    据我所知 在java中如果我们想手动调用垃圾收集器 我们可以执行System gc 1 我们在重写的finalize 方法中做了哪些操作 2 如果我们想手动调用JVM垃圾收集器 是否需要重写finalize 方法 我们在重写的 Finali
  • java中如何找到class文件的包

    我正在编写一个使用 class 文件的 java 程序 我希望能够读取文件系统上的 class 文件 使用 InputStream 并确定它所在的包 该 class 文件可能不在一个好的包目录结构中 它可能位于某个随机位置 我怎样才能做到这

随机推荐

  • 按字母顺序对逗号分隔列表进行排序 PHP [重复]

    这个问题在这里已经有答案了 我将 PHP 变量中的数据放在逗号分隔的列表中 这是数据 其中一部分是为了节省空间 xyz Europe France Italy Spain UK US Nordic West Europe Belgium L
  • jquery.d.ts 编译失败:TsLint:超出最大行长度

    我正在使用 VS 2013 和 TypeScript 0 95 版本 但 linter 无法进行 TS 编译并出现以下错误 TsLint 已检查 app ts TsLint jquery d ts 编译失败 TsLint 超过最大行长度 1
  • 如何从数据表更新面板[重复]

    这个问题在这里已经有答案了 带有 id myButtonId2 的命令按钮工作正常 我的意思是它更新 myOutputPanel 但数据表内的命令按钮不会更新outputPanel 数据表有特定的更新样式吗
  • Stripe Connect Firebase 功能

    仔细查看后 尝试通过 swift 捕获代码 但仍然需要一个函数来触发代码以获取 Express 帐户进行连接 不会在代码尝试上浪费您的时间 因此寻找 Firebase 函数来设置 Stripe Connect 端点以进行重定向并发回代码以完
  • 提高请求的下载速度

    我正在编写一个从 Dropbox 下载一些视频的脚本 通常我的下载速度约为 150 kb 秒 这是在 Firefox 或 IDM 上使用普通下载器时的情况 但使用此 Python 脚本时 速度变得太慢 不到 10 kb 秒 这是我正在使用的
  • 在 Xcode 中禁用“/* inside block comment”警告

    我在开发时经常需要多个嵌套的多行 或 部分行 注释 Xcode 最近引入了可能是世界上最烦人的警告 它迫使我禁用 警告作为错误 我猜这个警告是为了捕获一种极其罕见的情况 即某人打字错误并导致块 注释没有结束 但 IME 还有许多其他问题会导
  • shebang/hashbang 是做什么用的?

    除了使 AJAX 内容可供 Google 抓取外 shebangs hashbangs 是否还有其他用途 或者就是这样 在 URL 中使用的哈希早在 Ajax 发明之前就已经存在了 它最初的目的是作为页面内子部分的引用 在这种情况下 例如
  • 批量更新xml文件

    我已经搜索了一个小时但没有成功 我的老板希望它是一个批处理文件 我有一个 xml 文件 其中包含以下内容
  • PowerShell 的 Invoke-RestMethod 相当于curl -u(基本身份验证)

    相当于什么 curl u username password 在 PowerShell 中Invoke RestMethod 我试过这个 securePwd ConvertTo SecureString password AsPlainTe
  • iOS 8.1 自动旋转

    在我的项目中 我检查了我需要的所有方向类型 这在 iOS 7 1 上工作正常 但在 iOS 8 1 上无法正常工作 在 iOS 8 1 中 当我以纵向或横向模式打开应用程序时 它工作正常 但在使用过程中我旋转设备时 只有状态栏会更改旋转 我
  • Rails 3/delayed_job - Wanted:延迟邮件的基本示例

    我一直在试图弄清楚如何使用elasted job和rails 3发送延迟邮件 我已经尝试了几乎所有我能想到的可行可能性的组合 我可以让邮件在后台运行 我就是可以 不要让它延迟发送到未来的时间 数据库中的delayed jobs表清除任务 日
  • 如何自动检测Excel中的表格

    我有一本工作簿 其中包含大约 40 个表格 每个文件中的表格都非常混乱 因此您永远不知道表格可能位于工作表中的位置 在某些工作表中 您甚至可能有 2 个或 3 个表 此外 这些表非常非结构化 因此您无法知道行索引或列索引总是在哪里 我确实需
  • 在 DOS 中获取没有回显的键盘输入

    我正在制作游戏 Connect Four 玩家必须输入 1 4 之间的数字 以便圆盘落入其中一列 我目前正在研究第一专栏 问题是你可以输入任何字符并且它会起作用 它只需要在你按 1 时起作用 并且我不知道如何修复它 此外 该数字出现在屏幕左
  • 使用 crontab 执行 php

    我正在尝试按计划运行 php 脚本 所以我认为 crontab 是个好主意 我使用的服务器是Linux 我不太熟悉 所以我遇到的问题是 我不知道如何使脚本从 php 可执行 我需要引用该脚本 或者将其放入可以从命令行运行 php 的文件夹中
  • Jquery - 单击外部或单击另一个下拉列表时关闭下拉列表/删除活动类

    我刚刚创建了自己的 jquery 插件 并且有一个下拉菜单 可以在单击自身时切换 活动 类 我只想在单击元素外部或单击其他下拉列表时删除 活动 类 每个下拉菜单都有不同的标记 但具有相同的类 我通过调用以下命令通过 jquery 初始化了它
  • 如何将“打印”输出重定向到文件?

    我想使用 Python 将打印重定向到 txt 文件 我有一个for循环 这将print我想要重定向时每个 bam 文件的输出all输出到一个文件 所以我尝试输入 f open output txt w sys stdout f 在我的脚本
  • 如何转义正则表达式中所有具有特殊含义的字符

    我只是偶然发现了以下内容 但我无法完全理解 当你在 Ruby 中创建一个新的正则表达式时 如下所示 Regexp new http www example com 它将输出以下内容 http www example com 这是正确的 但没
  • 这里地图位置指针罗盘头?

    这里地图追随者确实可以将指南针头应用于map getPositionIndicator setVisible true 如果是 请分享我的答案 理论上 您可以更改位置指示器的图像 但不支持旋转图像 因此您需要永久替换图像 总而言之 我想说
  • 在工具提示格式化程序中创建图表

    我尝试创建一个内部格式化程序 工具提示配置 在其中我尝试动态创建图表 但未能实现 有什么好主意吗 在工具提示内创建新容器formatter 并且还创建新图表 重要的部分是创建图表after渲染工具提示 例如使用setTimeout Also
  • 在同一页面中在 ColumnDocumentRenderer 和 DocumentRenderer 之间切换?

    我正在使用 iText7 测试一些东西 我有一个场景 我需要在顶部有 DocumentRenderer 段落 然后在同一页面上在其正下方启动 ColumnDocumentRender 2 列 我遇到的问题是 当我更改同一页面上的内容时 它会