有没有一种方法可以获取单词文档的页数?

时间:2018-10-24 03:20:47

标签: javascript ms-word docx

最好,我想在浏览器中使用javascript做到这一点。我已经能够解压缩doc文件并读取xml文件,但是似乎找不到找到页数的方法。我希望该属性存在于我只需要找到的xml文件中。

编辑:我不会说它是Is there a way to count doc, docx, pdf pages with only js (without Node.js)?的副本,我的问题是针对Word doc / docx文件的,这个问题从未解决。

3 个答案:

答案 0 :(得分:0)

理论上,以下属性可以使用Open XML SDK从Word Open XML文件返回该信息:

int pageCount = (int) document.ExtendedFilePropertiesPart.Properties.Pages.Text;

但是,在实践中,这是不可靠的。它可能行得通,但又可能不行,这完全取决于:1)Word在关闭文件之前设法保存在文件中的内容; 2)对关闭的文件进行了什么样的编辑。

获取页码或页数的唯一确定的方法是在Word应用程序界面中打开文档。页数和页数是在Word编辑过程中动态计算的。关闭文档时,此信息是静态的,不一定是打开或打印文档时的信息。

另请参见https://github.com/OfficeDev/Open-XML-SDK/issues/22进行确认。

答案 1 :(得分:0)

通过 docx4js 找到了一种方法

这是一个来自输入元素的小样本解析文件

import docx4js from 'docx4js';

docx4js.load(file).then(doc => {
  const propsAppRaw = doc.parts['docProps/app.xml']._data.getContent();
  const propsApp = new TextDecoder('utf-8').decode(propsAppRaw);
  const match = propsApp.match(/<Pages>(\d+)<\/Pages>/);
  if (match && match[1]) {
    const count = Number(match[1]);
    console.log(count);
  }
});

答案 2 :(得分:-2)

当您说“在浏览器中执行此操作”时,我假设您正在使用LAMP或同等功能的Web服务器运行。在PHP中,.docx文件有一个非常有用的选项。一个示例php函数将是:

#include <jni.h>
#include <string.h>
#include <libavcodec/avcodec.h>
#include <libavformat/avformat.h>
#include <libswscale/swscale.h>
#include <libavutil/imgutils.h>
void SaveFrame(AVFrame *pFrame, int width, int height, int iFrame);
JNICALL
JNIEXPORT jstring
Java_com_viralsam_root_tester_MainActivity_trtest(JNIEnv *env, jobject obj , jint argc,
                                                  jstring argv_){
    const char *name;
    int i,videostream;
    name= (*env)->GetStringUTFChars(env, argv_,0);
    AVFormatContext *pFormatctx=NULL;
    if (avformat_open_input(&pFormatctx,name,NULL,NULL)!=0){
        return (*env)->NewStringUTF(env,"a");
    }
    if(pFormatctx==NULL){
        return (*env)->NewStringUTF(env,"b");
    }
    if(avformat_find_stream_info(pFormatctx,NULL)<0){
        return (*env)->NewStringUTF(env,"c");
    }
    av_dump_format(pFormatctx, 0, name, 0);
    videostream=-1;
    AVCodecContext *pCodecCtxOrig = NULL;
    AVCodecContext *pCodecCtx = NULL;
    for (i=0;i<pFormatctx->nb_streams;i++){
        if((pFormatctx->streams[i]->codecpar->codec_type)==AVMEDIA_TYPE_VIDEO){
            videostream=i;
            break;
        }
    }
    if(videostream==-1){
        return (*env)->NewStringUTF(env,"d");
    }
    pCodecCtx=pFormatctx->streams[videostream]->codecpar;
    AVCodec *pCodec = NULL;
    pCodec=avcodec_find_decoder(pCodecCtx->codec_id);
    if(pCodec==NULL){
        return (*env)->NewStringUTF(env,"e");
    }
    pCodecCtx=avcodec_alloc_context3(pCodec);
    if(avcodec_open2(pCodecCtx,pCodec,NULL)<0){
        return (*env)->NewStringUTF(env,"g");
    }
    AVFrame *pFrame = NULL,*pFrameRBG=NULL;

    pFrame=av_frame_alloc();
    pFrameRBG=av_frame_alloc();
    if(pFrameRBG==NULL){
        return (*env)->NewStringUTF(env,"h");
    }
    uint8_t *buffer=NULL;
    int numBytes;
    numBytes=av_image_get_buffer_size(AV_PIX_FMT_RGB24,pCodecCtx->width,pCodecCtx->height,1);
    buffer=(uint8_t *)av_malloc(numBytes* sizeof(uint8_t));
    av_image_fill_arrays(pFrameRBG->data,pFrameRBG->linesize,buffer,AV_PIX_FMT_RGB24,pCodecCtx->width,pCodecCtx->height,1);
    struct SwsContext *sws_ctx = NULL;
    int frameFinished;
    AVPacket *packet=av_packet_alloc();
    sws_ctx=sws_getContext(pCodecCtx->width,pCodecCtx->height,pCodecCtx->pix_fmt,pCodecCtx->width,pCodecCtx->height,AV_PIX_FMT_RGB24,SWS_BILINEAR,NULL,NULL,NULL);
    i=0;
    while(av_read_frame(pFormatctx,&packet)>=0){

        if(packet->stream_index==videostream){
            int used=avcodec_send_packet(pCodecCtx,&packet);
            used=avcodec_receive_frame(pCodecCtx,pFrame);
            if (used < 0 && used != AVERROR(EAGAIN) && used != AVERROR_EOF){
                break;

            } else{

                if (used == AVERROR(EAGAIN) || used == AVERROR_EOF){
                    break;
                }
            }

            sws_scale(sws_ctx,(uint8_t const * const *)pFrame->data,pFrame->linesize,0,pCodecCtx->height,pFrameRBG->data,pFrameRBG->linesize);
            if(++i<=5){
                SaveFrame(pFrameRBG,pCodecCtx->width,pCodecCtx->height,i);
            }


        }
        av_packet_free(&packet);

    }
    char blubuk[50];
    sprintf(blubuk,"%d",buffer);
    av_free(buffer);
    av_frame_free(&pFrameRBG);
    av_frame_free(&pFrame);
    avcodec_close(pCodecCtx);
    avcodec_close(pCodecCtxOrig);
    avformat_close_input(&pFormatctx);

    return (*env)->NewStringUTF(env,blubuk);

}
void SaveFrame(AVFrame *pFrame, int width, int height, int iFrame){
    FILE *pFile;
    char szFilename[32];
    int  y;
    sprintf(szFilename, "frame%d.ppm", iFrame);
    pFile=fopen(szFilename,"wb");
    if(pFile==NULL){
        return;
    }
    fprintf(pFile, "P6\n%d %d\n255\n", width, height);
    for(y=0; y<height; y++){
        fwrite(pFrame->data[0]+y*pFrame->linesize[0], 1, width*3, pFile);
    }
    fclose(pFile);

}