草庐IT

java - 如何垂直填充表格?

coder 2024-07-05 原文

这是 this question 的后续问题我刚才发过。

我有以下 xsl 样式表:

<?xml version="1.0" encoding="UTF-8"?>
<xsl:stylesheet version="2.0" xmlns:xsl="http://www.w3.org/1999/XSL/Transform" xmlns:fo="http://www.w3.org/1999/XSL/Format" exclude-result-prefixes="fo">
  <xsl:template match="barcode-list">
    <fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
      <fo:layout-master-set>
        <fo:simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm">
          <fo:region-body/>
        </fo:simple-page-master>
      </fo:layout-master-set>
      <fo:page-sequence master-reference="simpleA4">
        <fo:flow flow-name="xsl-region-body">
          <fo:block font-size="14pt">
          <fo:table table-layout="fixed" width="100%" border-collapse="separate" border-separation="3pt">    
            <fo:table-column column-width="50%"/>
            <fo:table-column column-width="50%"/>
            <fo:table-body>
              <xsl:apply-templates select="item"/>
            </fo:table-body>
          </fo:table>
          </fo:block>
        </fo:flow>
      </fo:page-sequence>
     </fo:root>
  </xsl:template>
  <xsl:template match="item">
    <fo:table-cell text-align="center">
      <xsl:if test="position() mod 2 = 1">
        <xsl:attribute name="starts-row">true</xsl:attribute>
      </xsl:if>
      <fo:block>
        <fo:external-graphic height="scale-to-fit" width="100%" content-height="scale-to-fit" content-width="scale-to-fit">
          <xsl:attribute name="src">url('<xsl:value-of select="image"/>')</xsl:attribute>
        </fo:external-graphic>
      </fo:block>
      <fo:block>
        <fo:external-graphic height="scale-to-fit" width="100%" content-height="scale-to-fit" content-width="scale-to-fit">
          <xsl:attribute name="src">url('<xsl:value-of select="barcode"/>')</xsl:attribute>
        </fo:external-graphic>
      </fo:block>
      <fo:block wrap-option="wrap">
        <xsl:value-of select="name"/>
      </fo:block>
    </fo:table-cell> 
  </xsl:template>
</xsl:stylesheet>

这很好用,因为它用我的数据填充了一个包含两列的表格。

这会“水平”填充表格,就像左边的表格一样。

我重新评估了我的要求并意识到我希望它像右边的表格一样“垂直”填充:

 ---------------     -----------------
|   1   |   2   |   |   1   | (n/2)+1 |
|   3   |   4   |   |   2   | (n/2)+2 | 
|  ...  |  ...  |   |  ...  |   ...   |
|  n-1  |   n   |   |  n/2  |    n    |
 ---------------     -----------------

理想情况下,我想移动到页面末尾的下一栏并在下一页的第一栏重新开始,但我认为这是不可能的。

这是我的 xml 的示例:

<barcode-list>
   <item>
      <name>the-barcode</name>
      <barcode>file:///d:/pdf/barcode.png</barcode>
      <image>file:///d:/test.png</image>
      <format>CODE_128</format>
   </item>
   ...
</barcode-list>

我找到了 this似乎建议解决方案的留言板条目,但我无法理解它的作用。

任何人都可以给我任何关于如何开始的指示吗?

最佳答案

使用双栏文档布局,您的内容 block (带有两个图像和一个标签)将在页面中向下流动,然后到下一栏。这将在后续页面上继续。以下是示例 FO 和结果。需要注意的几点:

  • 通过在region-body中添加column-count实现两列
  • 每个包含重复内容的容器都在一个 block 容器中,keep-together.within-column 设置为“always”,以确保您的两个图像和一个标签都在一起,而不是跨列或跨页拆分。
  • 我确实更改了您的图形规范,因为宽度/高度的比例不正确

示例 FO 代码(请注意,我在这里只显示了前几个 block ,我给它们编号以显示顺序):

<fo:root xmlns:fo="http://www.w3.org/1999/XSL/Format">
<fo:layout-master-set>
    <fo:simple-page-master master-name="simpleA4" page-height="29.7cm" page-width="21cm" margin-top="2cm" margin-bottom="2cm" margin-left="2cm" margin-right="2cm">
        <fo:region-body column-count="2"/>
    </fo:simple-page-master>
</fo:layout-master-set>
<fo:page-sequence master-reference="simpleA4">
    <fo:flow flow-name="xsl-region-body">
        <fo:block-container font-size="14pt"  text-align="center" keep-together.within-column="always">
            <fo:block>
                <fo:external-graphic src="url('box.jpg')" height="100%" width="100%" content-height="scale-to-fit" content-width="scale-to-fit"/>                   
            </fo:block>
            <fo:block>
                <fo:external-graphic src="url('brick.jpg')" height="100%" width="100%" content-height="scale-to-fit" content-width="scale-to-fit"/>
            </fo:block>
            <fo:block wrap-option="wrap">
                Object Name 1
            </fo:block>
        </fo:block-container>

        <fo:block-container font-size="14pt"  text-align="center" keep-together.within-column="always">
            <fo:block>
                <fo:external-graphic src="url('box.jpg')" height="100%" width="100%" content-height="scale-to-fit" content-width="scale-to-fit"/>                   
            </fo:block>
            <fo:block>
                <fo:external-graphic src="url('brick.jpg')" height="100%" width="100%" content-height="scale-to-fit" content-width="scale-to-fit"/>
            </fo:block>
            <fo:block wrap-option="wrap">
                Object Name 2
            </fo:block>
        </fo:block-container>

9 个 block 的示例输出:

关于java - 如何垂直填充表格?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37884423/

有关java - 如何垂直填充表格?的更多相关文章

  1. ruby - 如何使用 Nokogiri 的 xpath 和 at_xpath 方法 - 2

    我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div

  2. ruby - 如何从 ruby​​ 中的字符串运行任意对象方法? - 2

    总的来说,我对ruby​​还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用

  3. python - 如何使用 Ruby 或 Python 创建一系列高音调和低音调的蜂鸣声? - 2

    关闭。这个问题是opinion-based.它目前不接受答案。想要改进这个问题?更新问题,以便editingthispost可以用事实和引用来回答它.关闭4年前。Improvethisquestion我想在固定时间创建一系列低音和高音调的哔哔声。例如:在150毫秒时发出高音调的蜂鸣声在151毫秒时发出低音调的蜂鸣声200毫秒时发出低音调的蜂鸣声250毫秒的高音调蜂鸣声有没有办法在Ruby或Python中做到这一点?我真的不在乎输出编码是什么(.wav、.mp3、.ogg等等),但我确实想创建一个输出文件。

  4. ruby-on-rails - 如何验证 update_all 是否实际在 Rails 中更新 - 2

    给定这段代码defcreate@upgrades=User.update_all(["role=?","upgraded"],:id=>params[:upgrade])redirect_toadmin_upgrades_path,:notice=>"Successfullyupgradeduser."end我如何在该操作中实际验证它们是否已保存或未重定向到适当的页面和消息? 最佳答案 在Rails3中,update_all不返回任何有意义的信息,除了已更新的记录数(这可能取决于您的DBMS是否返回该信息)。http://ar.ru

  5. ruby-on-rails - 'compass watch' 是如何工作的/它是如何与 rails 一起使用的 - 2

    我在我的项目目录中完成了compasscreate.和compassinitrails。几个问题:我已将我的.sass文件放在public/stylesheets中。这是放置它们的正确位置吗?当我运行compasswatch时,它不会自动编译这些.sass文件。我必须手动指定文件:compasswatchpublic/stylesheets/myfile.sass等。如何让它自动运行?文件ie.css、print.css和screen.css已放在stylesheets/compiled。如何在编译后不让它们重新出现的情况下删除它们?我自己编译的.sass文件编译成compiled/t

  6. ruby - 如何将脚本文件的末尾读取为数据文件(Perl 或任何其他语言) - 2

    我正在寻找执行以下操作的正确语法(在Perl、Shell或Ruby中):#variabletoaccessthedatalinesappendedasafileEND_OF_SCRIPT_MARKERrawdatastartshereanditcontinues. 最佳答案 Perl用__DATA__做这个:#!/usr/bin/perlusestrict;usewarnings;while(){print;}__DATA__Texttoprintgoeshere 关于ruby-如何将脚

  7. ruby - 什么是填充的 Base64 编码字符串以及如何在 ruby​​ 中生成它们? - 2

    我正在使用的第三方API的文档状态:"[O]urAPIonlyacceptspaddedBase64encodedstrings."什么是“填充的Base64编码字符串”以及如何在Ruby中生成它们。下面的代码是我第一次尝试创建转换为Base64的JSON格式数据。xa=Base64.encode64(a.to_json) 最佳答案 他们说的padding其实就是Base64本身的一部分。它是末尾的“=”和“==”。Base64将3个字节的数据包编码为4个编码字符。所以如果你的输入数据有长度n和n%3=1=>"=="末尾用于填充n%

  8. ruby - 如何指定 Rack 处理程序 - 2

    Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack

  9. ruby - 如何每月在 Heroku 运行一次 Scheduler 插件? - 2

    在选择我想要运行操作的频率时,唯一的选项是“每天”、“每小时”和“每10分钟”。谢谢!我想为我的Rails3.1应用程序运行调度程序。 最佳答案 这不是一个优雅的解决方案,但您可以安排它每天运行,并在实际开始工作之前检查日期是否为当月的第一天。 关于ruby-如何每月在Heroku运行一次Scheduler插件?,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/8692687/

  10. ruby-on-rails - 如何从 format.xml 中删除 <hash></hash> - 2

    我有一个对象has_many应呈现为xml的子对象。这不是问题。我的问题是我创建了一个Hash包含此数据,就像解析器需要它一样。但是rails自动将整个文件包含在.........我需要摆脱type="array"和我该如何处理?我没有在文档中找到任何内容。 最佳答案 我遇到了同样的问题;这是我的XML:我在用这个:entries.to_xml将散列数据转换为XML,但这会将条目的数据包装到中所以我修改了:entries.to_xml(root:"Contacts")但这仍然将转换后的XML包装在“联系人”中,将我的XML代码修改为

随机推荐