【问题标题】:OpenPDF columnText.go creating corrupt documentOpenPDF columnText.go 创建损坏的文档
【发布时间】:2021-09-13 03:25:33
【问题描述】:

我不断收到错误

当我尝试使用 columnText 写入 PDF 时。 setSimpleColumn() 以前可以正常工作,但现在这段代码抛出错误,当我尝试使用 setColumns() 时,它也抛出错误。我想不出是什么导致了错误。我应该以某种方式关闭 columnText 吗?

直接相关的代码是:

fun testBox(content: List, font: List, page: Int, leftLimit: Float, rightLimit: Float, topLimit: Float, bottomLimit: Float){
val columnText = ColumnText(setCanvas("$filepath$name.pdf",page))
columnText.alignment = ALIGN_JUSTIFIED
columnText.runDirection = RUN_DIRECTION_RTL
columnText.setSimpleColumn(leftLimit, bottomLimit, rightLimit, getRectangle("LETTER").top-topLimit)
var i = 0

while (i < content.size) {
    columnText.addText(Chunk(content[i], font[i]))
    columnText.go()
    i++
}
}

如果需要,我会显示更多代码,但我认为其余部分与问题无关。

我真的很难过,在这个问题上我找不到太多信息。

这是生成的文件: https://drive.google.com/file/d/135EhLyiyDj6iAexUJ0upRdG6eXHYXVdw/view?usp=sharing

编辑: 我忘记了我为了节省一堆代码而创建了函数setCanvas,这里是函数:

fun setCanvas(file: String, page: Int): PdfContentByte? {
    val reader = PdfReader(file)
    val stamper = PdfStamper(reader, FileOutputStream(File(file)))
    if(reader.numberOfPages < page){ stamper.insertPage(reader.numberOfPages + (page-reader.numberOfPages), reader.getPageSize(1) ?: getRectangle("LETTER")); if (page - reader.numberOfPages != 1){throw Error("EMPTY PAGE!")}}
    return stamper.getOverContent(page)
}

编辑2:[结合两个功能]

    testBox(listOf(content1,content2,content3), listOf(font,fontBold,font), 1, document.left(), document.right(), document.bottom(),document.top())


fun testBox(content: List<String>, font: List<Font>, page: Int, leftLimit: Float, rightLimit: Float, topLimit: Float, bottomLimit: Float){
    val reader = PdfReader("$filepath$name.pdf")
    val stamper = PdfStamper(reader, FileOutputStream(File("$filepath$name - edit.pdf")))
    if(reader.numberOfPages < page){ stamper.insertPage(reader.numberOfPages + (page-reader.numberOfPages), reader.getPageSize(1) ?: getRectangle("LETTER")); if (page - reader.numberOfPages > 0){throw Error("EMPTY PAGE!")}}
    val columnText = ColumnText(stamper.getOverContent(page))

    columnText.alignment = ALIGN_JUSTIFIED
    columnText.runDirection = RUN_DIRECTION_RTL
    columnText.setSimpleColumn(leftLimit, bottomLimit, getRectangle("LETTER").right - rightLimit, getRectangle("LETTER").top- topLimit)
    var i = 0
    while (i<content.size) {
        columnText.addText(Chunk(content[i], font[i]))
        columnText.go()
        i++
    }
}

链接: https://drive.google.com/file/d/1ybvDVSxKOJdbnA2fSRjEmxlDszIktWTL/view?usp=sharing

【问题讨论】:

  • 你说代码抛出错误。您的意思是在运行代码时发生异常吗?还是您的意思是稍后查看器在显示代码输出时会显示错误对话框?
  • 请分享您的代码的示例结果 PDF。
  • 请提供您的代码示例结果 PDF 以供下载,以便我们重现该问题。
  • 是的,例如谷歌驱动器或投递箱作为公共共享,并在此处发布 URL。
  • 您的共享文件正好是 0 字节长。所以难怪。考虑到您的方法setCanvas,但是:这不能正常工作,您必须防止stamper 过早完成,最终,在应用所有更改后,您必须明确关闭它。

标签: itext openpdf


【解决方案1】:

您的原始代码中有两个错误:

  • 您使用相同的源文件和目标文件进行标记。
  • 在处理 PDF 之后,您不会保留对 PdfStamper 的引用来关闭它。

第一个问题导致文件在被完全读取之前被截断。这是您在编辑中修复的。

第二个可能会导致您的输出 PDF 未完成,缺少必要的预告片。

在修复了第二个问题之后,您的代码终于停止生成损坏的文件

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-30
    • 2019-05-01
    • 2017-03-29
    • 1970-01-01
    相关资源
    最近更新 更多