【问题标题】:iText Java - add header to an existing pdfiText Java - 将标题添加到现有的 pdf
【发布时间】:2014-02-17 08:51:02
【问题描述】:

我想使用 iText 为现有 pdf 添加标题。

除了有时我的函数创建一个带有正确页眉和页脚但旋转现有 pdf 页面的 pdf 之外,我没有任何问题。

private static void print(Sldocuments item, String header, String footer) {
    try {
        String ftpFilename = item.getId()+"_"+item.getDocumentname();
        String newName= String.valueOf(item.getId())+".pdf";
        String path = (Global.SHARED_FOLDER_DEVELOPER);

        String smbUser = "**;"+"**" + ":" + "**";
        NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(smbUser);
        SmbFile sFile = new SmbFile(path+ftpFilename, auth);

        InputStream in = sFile.getInputStream();

        PdfReader reader = new PdfReader(in);

        // Create output PDF
        Document document = new Document(PageSize.A4);
        SmbFile sFileOut = new SmbFile(path+newName, auth);
        SmbFileOutputStream sfos = new SmbFileOutputStream(sFileOut);

        PdfWriter writer = PdfWriter.getInstance(document, sfos);
        document.open();
        PdfContentByte pdfContentByte = writer.getDirectContent();

        for (int i = 1; i <= reader.getNumberOfPages(); i++) {
            PdfImportedPage page = writer.getImportedPage(reader, i);
            document.newPage();
            pdfContentByte.add(page);
            // Write header
            writeText(headerPositionX, headerPositionY, header);

            // Write footer
            writeText(footerPositionX, footerPositionY, footer);

            // Write page number
            String pageNumber = "pagina "+ i +" di " + reader.getNumberOfPages();
            writeText(pageNumberPositionX, pageNumberPositionY, pageNumber);
        }
        document.close();
        reader.close();
    } catch (DocumentException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

我尝试使用

解决我的问题
AffineTransform af = new AffineTransform();
af.setToRotation(Math.toRadians(page.getRotation()));
pdfContentByte.addTemplate(page, af);

简单的头脑

pdfContentByte.add(page);

但是通过这种转换,我的新 pdf 中完全缺少导入的页面(可能是因为我使用错误的锚点旋转页面)。

我怎样才能实现我的目标?

【问题讨论】:

  • 如果您有 PDF 并且只想在现有页面中添加一些内容,您最好使用PdfStamper。查看 iText 示例TwoPasses.java;你基本上只需要做第二遍,搜索SECOND PASS, ADD THE HEADER
  • 我会试试的。这段代码是另一个人写的,我只是想解决这个问题。但现在我将尝试重新编写整个函数,就像链接示例中一样。谢谢!
  • 完美,成功了!谢谢

标签: java pdf itext jcifs


【解决方案1】:

根据 mkl,我使用了 PdfStamper:

private static void print(Sldocuments item, String header, String footer) {
try {
String ftpFilename = item.getId()+"_"+item.getDocumentname();
    String newName= String.valueOf(item.getId())+".pdf";
    String path = (Global.SHARED_FOLDER_DEVELOPER);

    String smbUser = "**;"+"**" + ":" + "**";
    NtlmPasswordAuthentication auth = new NtlmPasswordAuthentication(smbUser);
    SmbFile sFile = new SmbFile(path+ftpFilename, auth);

    InputStream in = sFile.getInputStream();

    PdfReader reader = new PdfReader(in);

    // Create output PDF
        SmbFile sFileOut = new SmbFile(path+newName, auth);
        SmbFileOutputStream sfos = new SmbFileOutputStream(sFileOut);

        PdfStamper stamper  = new PdfStamper(reader, sfos);
        // Loop over the pages and add a header to each page
        int n = reader.getNumberOfPages();
        for (int i = 1; i <= n; i++) {
            //add header
            PdfPTable table = new PdfPTable(1);
            table.setTotalWidth(PDF_PAGE_SIZE.getWidth()-(headerPositionX*2));
            table.setLockedWidth(true);
            table.getDefaultCell().setFixedHeight(20);
            table.getDefaultCell().setBorder(Rectangle.NO_BORDER);
            table.addCell(header);
            table.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
            table.addCell("");
            table.writeSelectedRows(0, -1, headerPositionX, headerPositionY, stamper.getOverContent(i));

            //add footer
            PdfPTable tableFooter = new PdfPTable(2);
            tableFooter.setTotalWidth(PDF_PAGE_SIZE.getWidth()-(footerPositionX*2));
            tableFooter.setLockedWidth(true);
            tableFooter.getDefaultCell().setFixedHeight(20);
            tableFooter.getDefaultCell().setBorder(Rectangle.NO_BORDER);
            tableFooter.addCell(footer);
            tableFooter.getDefaultCell().setHorizontalAlignment(Element.ALIGN_RIGHT);
            tableFooter.addCell(String.format("pagina %d of %d", i, n));
            tableFooter.writeSelectedRows(0, -1, footerPositionX, footerPositionY*4, stamper.getOverContent(i));
        }

        // Close the stamper
        stamper.close();
        reader.close();

    } catch (DocumentException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }

}

【讨论】:

  • 正在旋转的页面的所有边缘情况在哪里?我发现,如果页面已旋转,即使是获取页面大小或裁剪框等基本操作也会在 iText 中给出错误的结果。
  • close 使用 try/catch/finally !
猜你喜欢
  • 2018-03-31
  • 2022-07-31
  • 2011-03-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-01
相关资源
最近更新 更多