将一个PDF页面拆分为两个

时间:2010-10-27 12:32:34

标签: java pdf itext

我想将一个宽PDF页面分成两个PDF页面。我的原始页面宽两个A4页面大小但高度正常(A4)。我试图使用IText但没有效果。谢谢你的关注。

5 个答案:

答案 0 :(得分:2)

我不知道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]]

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

答案 1 :(得分:2)

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

输出左侧:

 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调用...

答案 2 :(得分:1)

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

查看HelloWorldCopy示例here

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

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

答案 3 :(得分:1)

示例代码在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();
    }

答案 4 :(得分:1)

试试Briss

  

简单的用户界面允许您通过在视觉上重叠的页面上拟合矩形来精确定义裁剪区域。

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