【问题标题】:How to convert raw pdf from server to pdf document如何将原始pdf从服务器转换为pdf文档
【发布时间】:2018-11-22 17:55:45
【问题描述】:

这是我将 Retrofit HTTP ResponseBody 转换为原始字符串的代码:

方法一:

fun ByteArray.toHexString(): String {
    var cnt = ""
    var cnter = 0

    return this.joinToString(cnt) {
        if (cnter % 2 == 0)
            cnt = " "
        else
            cnt = ""
        cnter++
        String.format("%02x", it)
    }
}

fun convert() {
    val result = response.byteStream().readBytes(response.contentLength().toInt())
    val rawHtml = result.toHexString()
}

方法 1 结果 (sn-p)。它应该在每 4 个字节后有一个空格:

255044462d312e340d0a25aaabacad0d0a312030206f626a0d0a3c3c0d0a2f4e616d65732032203020520d0a2f4f7574707574496e74656e7473205b3c3c0d0a2f446573744f757470757450726f66696c652033203020520d0a2f53202f4754535f50444641310d0a2f496e666f202863850eea75051264315790c769f97999de290d0a2f52656769737472794e616d652028290d0a2f4f7574707574436f6e646974696f6e2028290d0a2f54797065202f4f7574707574496e74656e740d0a2f4f7574707574436f6e646974696f6e4964656e746966696572202853a23adc3a21290d0a3e3e0d0a5d0d0a2f5669657765725072...

方法二:

private fun getRawHTML(responseBody: ResponseBody): String {
    val bodyString = responseBody.byteStream()

    val reader = BufferedReader(InputStreamReader(bodyString, "iso-8859-1"), 16)
    val sb = StringBuilder()
    var line: String?

    line = reader.readLine()

    while (line != null) {
        sb.append(line + "\n")
        line = reader.readLine()
    }

    bodyString.close()

    return sb.toString()
}

方法2结果(sn-p):

%PDF-1.4
1 0 obj
<<
/Title (þÿ��M��i���n��p��e��n��s��o��v��e��r��z��i��c�.��n��l)
/Creator (þÿ��w�m��p��d��f�� ��0��1��2��.��1��.��2)
/Producer (þÿ�t�� ��4����6)
/CreationDate (D:20181122184902+01'00')
>>
endobj
3 0 obj
<<
/Type /ExtGState
/SA true
/SM 0.02
/ca 1.0
/CA 1.0
/AIS false
/SMask /None>>
/Filter /FlateDecode
>>
stream
xí]MGr½Ï¯èó*å÷` )Ñ  ðÁðÁàZ^,FË{ðß÷{YÕ]

在此 PDF 中向下滚动时,它显示编码为 /Identity-H:

/Name /FBUKTZ+Verdana
/Type /Font
/Subtype /Type0
/BaseFont /FBUKTZ+Verdana
/Encoding /Identity-H
/ToUnicode 28 0 R
/DescendantFonts [29 0 R]
>>

哪个字符集对应于此?

我想将其转换为可由 Adob​​e acrobat 阅读器打开并显示原始 PDF 的 PDF 文件。当我使用 sublime 编辑器打开正确的 PDF 文件时,我看到了:

2550 4446 2d31 2e37 0a25 e2e3 cfd3 0a31
2030 206f 626a 0a3c 3c2f 416c 7465 726e
6174 652f 4465 7669 6365 5247 422f 4e20
332f 4c65 6e67 7468 2032 3631 352f 4669

也许我可以将问题改写为如何将小 sn-p 转换为这种格式?我正在使用 Kotlin 和 Java。

【问题讨论】:

    标签: java pdf kotlin


    【解决方案1】:

    这是一个 Kotlin 程序,它从服务器下载 PDF 文件并以允许在 PDF 查看器中打开的方式保存它:

    import okhttp3.OkHttpClient
    import okhttp3.Request
    import okhttp3.ResponseBody
    import java.io.FileOutputStream
    
    fun savePDF(response: ResponseBody) {
        val fileOutputStream = FileOutputStream("my.pdf")
        val data = response.byteStream().readBytes()
        fileOutputStream.write(data)
    }
    
    fun main(args: Array<String>) {
        val request = Request.Builder()
            .url("http://www.oracle.com/events/global/en/java-outreach/resources/java-a-beginners-guide-1720064.pdf")
            .build()
        val client = OkHttpClient()
        val response = client.newCall(request).execute()
        val responseBody = response.body()
        if (responseBody != null) {
            savePDF(responseBody)
        }
    }
    

    【讨论】:

    • 使用此解决方案,我必须向 Android 用户请求写入权限,但我们不能这样做。
    • 这是一个程序,您可以在本地运行以了解下载 PDF 文件的工作原理。如果您确实需要将文件发送到另一台服务器,您也可以这样做,并且您不需要任何权限。
    • 是的,但是打开文件时它不是 PDF。这个解决方案不能解决问题。
    • 如果你运行这个程序并打开my.pdf,它就是一个PDF。在不了解您的服务器的情况下,我无法为您提供一个可以将数据上传到您的服务器的解决方案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-11-12
    • 2015-11-01
    • 1970-01-01
    • 2018-01-07
    相关资源
    最近更新 更多