如何在 iText 中获取新页面

2024-05-07

去新页面有点问题pdfContentByte.我使用下面的代码将数据放在第一页之后到下一页,但不幸的是iText不生成新页面。

//step1
    itextDocument = new com.itextpdf.text.Document(PageSize.A4, 50, 50, 30, 65);
    writer = PdfWriter.getInstance(itextDocument, new FileOutputStream(RESULT));
    itextDocument.open();
    writer.setPageEmpty(true);
    itextDocument.newPage();


    // step 2 == design and set the postions


    // Measuring a String in Helvetica
    Font font = new Font(FontFamily.TIMES_ROMAN, 10);
    BaseFont romanFont = font.getCalculatedBaseFont(false);


    // Drawing lines to see where the text is added
    PdfContentByte canvas = writer.getDirectContent();
    canvas.saveState();




     canvas.stroke();
        canvas.restoreState();
        // Adding text with PdfContentByte.showTextAligned()
        canvas.beginText();
        canvas.setFontAndSize(romanFont, 10);

        //===================  get data from xml and put in pdf 
        createPDF(xmlDoc, canvas);



        createPDF(xmlDoc, canvas){
             for(int i=0;i<300;i++){
                contentByte.showTextAligned(Element.ALIGN_LEFT, "sample value", flotX, flotY, 0); 
             }
         }

    static int flotX = 50;
    static int flotY = 800;

如何生成新页面?任何建议。


关于使用writer.setPageEmpty

You use

writer.setPageEmpty(true);

你应该使用

writer.setPageEmpty(false);

相反,指示当前页面不应被视为空白。只要它被认为是空的,newPage就不会改变任何东西。

手动将内容添加到多个页面

如果您确实想使用低级方法创建 PDF 内容(即直接将文本定位在PdfContentBytecanvas 而不是将布局留给 iText),您必须意识到每个页面都有自己的内容画布,其中显示一个矩形(默认为媒体框的裁剪框),而其余部分保持隐藏。

The PdfContentByte由返回writer.getDirectContent当新页面开始时自动切换。

因此,对于跨页面传播的内容,您必须调用itextDocument.newPage恰好当您想要进入下一页时,然后再次开始填充裁剪框。

沿着示例代码行:

    Document itextDocument = new Document(PageSize.A4, 50, 50, 30, 65);
    PdfWriter writer = PdfWriter.getInstance(itextDocument, new FileOutputStream(RESULT));
    itextDocument.open();

    PdfContentByte canvas = writer.getDirectContent();
    BaseFont romanFont = BaseFont.createFont(BaseFont.TIMES_ROMAN, BaseFont.WINANSI, BaseFont.NOT_EMBEDDED);

    // first page content
    canvas.setFontAndSize(romanFont, 10);
    canvas.beginText();
    canvas.showTextAligned(Element.ALIGN_LEFT, "Line 1 on page 1", 50, 800, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "Line 2 on page 1", 50, 785, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "Line 3 on page 1", 50, 770, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "................", 50, 755, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "................", 50, 740, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "................", 50, 725, 0);
    canvas.setFontAndSize(romanFont, 800);
    canvas.showTextAligned(Element.ALIGN_LEFT, "1", 0, 100, 0); 
    canvas.endText();

    itextDocument.newPage();

    // first page content
    canvas.setFontAndSize(romanFont, 10);
    canvas.beginText();
    canvas.showTextAligned(Element.ALIGN_LEFT, "Line 1 on page 2", 50, 800, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "Line 2 on page 2", 50, 785, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "Line 3 on page 2", 50, 770, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "................", 50, 755, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "................", 50, 740, 0); 
    canvas.showTextAligned(Element.ALIGN_LEFT, "................", 50, 725, 0); 
    canvas.setFontAndSize(romanFont, 800);
    canvas.showTextAligned(Element.ALIGN_LEFT, "2", 0, 100, 0); 
    canvas.endText();

    itextDocument.close();

这会产生以下两个页面:

或者,您也可以创建一个独立的、更大的PdfTemplate(源自PdfContentByte),在其上绘制所有内容,然后在不同页面上显示其部分内容:

    Document document = new Document(PageSize.A4);

    PdfWriter writer = PdfWriter.getInstance(document, new FileOutputStream("big-panel.pdf"));
    document.open();
    PdfContentByte cb = writer.getDirectContent();
    PdfTemplate tp = cb.createTemplate(PageSize.A4.getWidth(), 3 * PageSize.A4.getHeight());

    // draw all your content on tp

    cb.addTemplate(tp, 0, -2 * PageSize.A4.getHeight());
    document.newPage();
    cb.addTemplate(tp, 0, -PageSize.A4.getHeight());
    document.newPage();
    cb.addTemplate(tp, 0, 0);
    document.newPage();
    cb.addTemplate(tp, 0.3333f, 0, 0, 0.3333f, PageSize.A4.getWidth() / 3, 0);
    document.close();
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 iText 中获取新页面 的相关文章

随机推荐

  • 如何将谓词作为参数传递#

    如何将谓词传递到方法中 但在没有传递谓词的情况下仍使其工作 我想也许是这样的 但似乎并不正确 private bool NoFilter return true private List
  • 如果存在 sqlite 则重命名列?

    我创建了一个最初未使用的列 但现在我们正在设置和获取值 我发现列名不正确 以及我想要更改列名称但想要保留设备中现有数据库的数据 有任何疑问吗检查并重命名sqlite 列 像这样的东西 Alter Table MyTable RENAME C
  • 在oracle sql中创建日期差异的自定义函数,排除周末和节假日

    我需要计算两个日期之间的天数decimal 不包括周末和节假日 by 使用自定义函数在 Oracle SQL 中 网站上也有类似的问题 然而 正如我所看到的 它们都没有要求使用自定义函数将输出作为十进制 我需要小数的原因是为了之后能够使用
  • 如何在位置中使用 Nginx Regexp

    Web 项目将静态内容放入 some content img 文件夹中 url规则为 img some md5 但文件夹中的位置 content img 前两位数字 Example url example com img fe5afe048
  • Rails——自我与@

    我正在关注 Michael Hartl 的 RoR 教程 它涵盖了密码加密的基础知识 这是当前的用户模型 class User lt ActiveRecord Base attr accessor password attr accessi
  • 实现用户定义的算术函数

    如何添加函数 例如汉明权重 并在右侧出现的表达式中使用它是一些 is 2 goal 像 goal expansion 或 term expansion 这样的东西可以帮助这里吗 我承认这不是一个大功能 但它可以提高我的一些 Prolog 程
  • 如何从 dll 导出 C++ 类? [复制]

    这个问题在这里已经有答案了 我有一个有两个重载函数的类 如何从 dll 导出它以及如何由其他 C 类使用它 我的班级是这样的 define DECLDIREXP declspec dllexport define DECLDIRIMP de
  • 如何在 Spring RestTemplate 中禁用 URL 编码?

    String url serverUrl metadata getUri response restTemplate exchange url metadata getAction requestEntity metadata getRes
  • MySQL GROUP 通过还是使用 PHP?

    我有一个看起来很简单的问题 但我只是想问你如何解决它 在 MySQL 表中有以下结构 provider artist a 1 a 2 a 3 b 4 现在需要在 HTML 中回显一个列表 例如 provider a 1 2 3 provid
  • Python 调度一个作业,每个工作日开始,每小时运行一次

    我目前有一个示例代码定义为 import schedule import time def job t print I m working t return schedule every day at 01 00 do job It is
  • 如何替换cloudinary中的图像并保持相同的URL?

    我在 cloudinary 中有一个图像 我想替换它但保留原始 URL 可能吗 是的 可以更新图像并保持相同的 URL 当您上传新图像时 您希望使其 public id 与您尝试替换的现有图像相同 然后您的 Cloudinary 帐户将被更
  • 如何在 Azure 中调试测试发送?

    I am trying to setup a successfull push notifications between my Net backend and ios client in azure I followed this htt
  • MonoDevelop - 代码窗口颜色方案

    MonoDevelop 中有没有办法自定义代码窗口配色方案 我想要类似的东西黑曜石之子 http studiostyl es schemes son of obsidian如果可能的话 是的 转到 MonoDevelop 语法突出显示选项面
  • 继承模板的排序顺序

    使用 Sitecore 6 6 我们正在构建一些继承许多基本模板的模板 这对于重用和标准化我们的代码非常有用 因为所有字段都存储在常量文件中以便于引用 然而 我们似乎无法定义这些继承模板的显示顺序 无论如何 模板似乎都遵循它们添加的原始顺序
  • 如何在cxf-maven-plugin中定义wsdl的密码

    我想使用 cxf maven plugin 根据此文档从 WSDL 生成 Java 代码 http cxf apache org docs maven cxf codegen plugin wsdl to java html http cx
  • Dingo API 删除“数据”信封

    有没有一种简单的方法可以从 Dingo API 响应中删除 数据 信封 当我使用这个 Transformer 来转换用户模型时 class UserTransformer extends EloquentModelTransformer L
  • 尝试 SSH 时设备的 ioctl 不合适

    我正在尝试通过 SSH 连接几台服务器并尝试获取sudo l每个服务器的输出 下面是我正在执行的脚本 bin bash serverlist tmp servers while IFS read r server netgroup user
  • unity 3d 根据加速度计旋转游戏对象

    我想做一款类似 神庙逃亡 的游戏 我需要根据设备倾斜的程度来旋转播放器的平台 我正在尝试加速计 但无法使游戏对象倾斜 请指导我 谢谢 这是我的代码 我之前在注释中使用了代码 现在我尝试使用注释中的代码 public class tilt M
  • 如何将 Enzyme Shallow 与 Jest 快照结合使用

    我正在尝试使用shallow https github com airbnb enzyme blob master docs api shallow md from enzyme https github com airbnb enzyme
  • 如何在 iText 中获取新页面

    去新页面有点问题pdfContentByte 我使用下面的代码将数据放在第一页之后到下一页 但不幸的是iText不生成新页面 step1 itextDocument new com itextpdf text Document PageSi