You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

PDF生成中如何获取Writer已写入的字节长度

问题:PDF生成中写入字节长度的计算需求

我要基于相关方案生成高质量PDF文档,需要在执行w.write("%%EOF\n")之前计算已写入的字节长度。例如,如何在示例代码中w.write("xref\n")语句之前读取该字节长度?

编辑补充

以下代码可计算xref长度并生成Test15.pdf:

private void createPdf15() {
    try {
        //Image image = Image.createImage("/Logo.jpg");
        Image image = Image.createImage("/android_logo.png");
        //Image image = Image.createImage("/ios_logo.png");

        //create a jpeg encoded image
        EncodedImage encodedImage = EncodedImage.createFromImage(image, true);
        byte[] imageData = encodedImage.getImageData();

        int imageWidth = encodedImage.getWidth();
        int imageHeight = encodedImage.getHeight();
        int imageLength = imageData.length;

        //create ByteArrayInputStream from image byte array
        ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(imageData);

        FileSystemStorage fss = FileSystemStorage.getInstance();
        String pdfPath = fss.getAppHomePath() + "Test15.pdf";
        StreamCounter streamCount = new StreamCounter(fss.openOutputStream(pdfPath));
        try (Writer w = new OutputStreamWriter(streamCount, "ISO-8859-1")) {
            w.write("%PDF-1.7\n");
            w.write("1 0 obj<<Type/Catalog/Pages 2 0 R>>endobj\n");
            w.write("2 0 obj<<Type/Pages/Kids [3 0 R]/Count 1>>endobj\n");
            w.write("3 0 obj<<Type/Page/Parent 2 0 R/Resources 4 0 R/MediaBox [0 0 520 800]/Contents 6 0 R>>endobj\n");
            w.write("4 0 obj<<Font<<F1 5 0 R>>/XObject<<Im0 7 0 R>>>>endobj\n");
            w.write("5 0 obj<<Type/Font/Subtype/Type1/BaseFont/Helvetica>>endobj\n");
            w.write("6 0 obj<<Length 219>>stream\n");
            w.write("q\n");
            w.write("BT /F1 24 Tf 175 720 Td (Codename One)Tj ET\n");
            w.write("BT /F1 20 Tf 100 700 Td (Using one codebase, build)Tj ET\n");
            w.write("BT /F1 20 Tf 0 660 Td (Android apps)Tj ET\n");
            w.write("BT /F1 20 Tf 0 640 Td (iOS apps)Tj ET\n");
            w.write("BT /F1 20 Tf 0 600 Td (UWP apps)Tj ET\n");
            w.write("q 50 0 0 50 4 540 cm /Im0 Do Q\n");
            w.write("Q\n");
            w.write("endstream\n");
            w.write("endobj\n");

            int bytesWritten = streamCount.getWritten();
            Log.p("1bytesWritten: " + bytesWritten); // Total1 = 0 -> Text1Length = 0

            w.write("7 0 obj<<Type/XObject/Subtype/Image/Width " + imageWidth + "/Height " + imageHeight + "/ColorSpace/DeviceRGB/BitsPerComponent 8/Filter/DCTDecode/Length " + imageLength + ">>stream\n");

            //read the next byte of data from ByteArrayInputStream in int range 0 - 255
            int nextChar = byteArrayInputStream.read();
            while (nextChar > -1) {
                //convert int to char and add it to char array
                char[] charArray = {(char) nextChar};
                //write char array
                w.write(charArray);
                nextChar = byteArrayInputStream.read();
            }
            w.write("\nendstream\n");
            w.write("endobj\n");


            bytesWritten = streamCount.getWritten();
            Log.p("2bytesWritten: " + bytesWritten); //Total2 = 16384 -> Image1Length = 7732 Text2Length = 8652 ??

            w.write("xref\n");
            w.write("0 8\n");
            w.write("0000000000 65535 f \n");
            w.write("0000000009 00000 n \n");
            w.write("0000000052 00000 n \n");
            w.write("0000000102 00000 n \n");
            w.write("0000000197 00000 n \n");
            w.write("0000000255 00000 n \n");
            w.write("0000000316 00000 n \n");
            w.write("0000000609 00000 n \n");
            w.write("trailer\n");
            w.write("<<Size 9/Root 1 0 R>>\n");
            w.write("startxref\n");
            //w.write("133724\n");
            w.write(bytesWritten + "\n");
            w.write("%%EOF\n");

            w.flush();

            bytesWritten = streamCount.getWritten();
            Log.p("3bytesWritten: " + bytesWritten);//Total3 = 17466

        } catch (Exception e) {
            Log.p("Error " + e);
        }
    } catch (Exception e) {
        Log.p("Error " + e);
    }
}

内容的提问来源于stack exchange,提问作者Eric

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.20 14:07:04