【问题标题】:Split one PDF page into two将一个 PDF 页面一分为二
【发布时间】:2011-05-01 07:07:06
【问题描述】:

我想将一个宽 PDF 页面拆分为两个 PDF 页面。我的原始页面宽为两个 A4 页面大小,但高度正常(对于 A4)。我尝试使用 IText 但没有效果。感谢关注。

【问题讨论】:

    标签: java pdf itext


    【解决方案1】:

    我不知道 iText API,但您可以按照以下步骤进行操作:

    为现有页面创建两个新副本。这意味着您拥有相同的资源、相同的 ContentStream 等。

    获取第一页的 MediaBox,它是一个布局为 [llx lly urx ury] 的数组。

    if MediaBox[2] - MediaBox[0] == long edge of A4 page then
        HalfPageWidth = MediaBox[2] - MediaBox[0];
        PageCopy1.CropBox = [MediaBox[0] MediaBox[1] (MediaBox[0] + HalfPageWidth) MediaBox[3]]
        PageCopy2.CropBox = [(MediaBox[0] + HalfPageWidth) MediaBox[1] MediaBox[2] MediaBox[3]]
    else
        HalfPageHeight = MediaBox[3] - MediaBox[1];
        PageCopy1.CropBox = [MediaBox[0] MediaBox[1] MediaBox[2] (MediaBox[1] + HalfPageHeight)]
        PageCopy2.CropBox = [MediaBox[0] (MediaBox[1] + HalfPageHeight)] MediaBox[2] MediaBox[3]]
    

    删除原始页面并保存这两个页面。基本上,您制作了两个相同的页面副本,并将每个副本裁剪为页面的一半。您可能还需要设置页面旋转。

    【讨论】:

    • 我不明白你的回答。
    【解决方案2】:

    您也可以为此使用 Ghostscript(在调用中添加 PostScript 代码 sn-p)。需要命令行:

    输出左侧:

     gs \
       -o left-half.pdf \
       -sDEVICE=pdfwrite \
       -g5950x8420 \
       -dFIXEDMEDIA \
       -PDFFitPage \
       -dAutoRotatePages=/None \
       -c "<</PageOffset [0 0]>> setpagedevice" \
        doubleup.pdf
    

    输出右侧:

     gs \
       -o left-half.pdf \
       -sDEVICE=pdfwrite \
       -g5950x8420 \
       -dFIXEDMEDIA \
       -PDFFitPage \
       -dAutoRotatePages=/None \
       -c "<</PageOffset [-595 0]>> setpagedevice" \
        doubleup.pdf
    

    这些命令行可以很容易地翻译成 Java 或任何代码以使用适当的 GS API 调用...

    【讨论】:

      【解决方案3】:

      我希望使用更改的页面创建原始 PDF 的副本,而不是更新现有的,这样在 iText 中工作会更容易,并且您可以随时重命名文件 aftwarads。

      查看 HelloWorldCopy 示例 here

      您唯一需要更改的是将宽页面拆分为两页的调用。因此,对所有页面执行与 HelloWorldCopy 示例相同的操作,但要拆分的页面除外 - 对于此页面,请查看替代的 PDfCopy.addPage() 方法,该方法允许您指定定义新创建页面大小的矩形。

      这样您就可以将宽页面拆分为两个大小合适的新页面。现在您需要确保宽页面的左侧部分进入第一个新页面,而右侧部分进入第二个新页面。为此,您应该查看 PdfImportedPage.setMatrix 方法(在示例中,PdfImportedPage 是从 copy.getImportedPage() 返回的对象。

      【讨论】:

      • 我无法获取原始页面的内容来填充由 PDfCopy.addPage() 创建的新页面。还有 PdfImportedPage.setMatrix 我不明白。
      • 你想做的事情并不简单。查看 PDF 规范以更好地理解矩阵。 HelloWorld 示例展示了如何从一个页面复制到另一个页面。
      【解决方案4】:

      示例代码在 c# 中,但非常相似。 我用它把一个 A3 页面拆分为 2 个 A4 页面,你只需要使用 x,y 值。

          private void CreatePdf(string saveLocation, string bigPageSource)
          {
              Document document = new Document(PageSize.A4);
              PdfWriter writer = PdfWriter.GetInstance(document, new FileStream(saveLocation, FileMode.Create));
      
              document.Open();
      
              PdfContentByte cb = writer.DirectContent;
      
              PdfReader reader = new PdfReader(bigPageSource);
              PdfImportedPage page = writer.GetImportedPage(reader, 1);
      
              document.NewPage();
              cb.AddTemplate(page, 0, 0);
      
              document.NewPage();
              cb.AddTemplate(page, -PageSize.A4.Width, 0);
      
              document.Close();
          }
      

      【讨论】:

        【解决方案5】:

        试试Briss

        一个简单的用户界面让您可以通过在视觉重叠的页面上放置一个矩形来准确定义裁剪区域。

        它将均匀和不均匀的页面配对,并将用户选择的页面分开。您可以计算准确的 A4 比例并手动输入值,而不是绘制矩形和/或对齐裁剪区域。

        【讨论】:

          猜你喜欢
          • 2012-10-31
          • 2013-07-20
          • 1970-01-01
          • 2021-12-08
          • 2013-06-13
          • 2011-09-20
          • 1970-01-01
          • 2018-07-22
          • 1970-01-01
          相关资源
          最近更新 更多