TXTファイルをPDFファイルへ変換する(C++)
TXTファイルをPDFファイルへ変換する事のできるC++のソースコードです。クラスになっていますのでそのまま使用できます
ソースコード
10年以上前に作成した古いコードで私すら覚えていないのですが、何かのお役に立てると嬉しいです。
[main.cpp]
#include <stdio.h>
#include "txt2pdf.h"
int main(int argc,char *argv[])
{
try
{
if (argc >= 2)
{
CTxt2pdf hoge;
hoge.txt2pdf(argv[1],"C:\\test.pdf");
}
}
catch (char* S )
{
printf("ERROR : %s\n",S);
}
catch (...)
{
printf("ERROR : %s\n",PDF_ERROR_UNKNOWN);
}
return(0);
}
[txt2pdf.h]
/* -------------- Support Japanese charcode "ShiftJIS" Only! ---------------- */
#ifndef __TXT2PDF_H__
#define __TXT2PDF_H__
#include <stdio.h>
#include <malloc.h>
#include <string.h>
typedef int BOOL;
typedef unsigned char BYTE;
typedef unsigned short WORD;
typedef unsigned long DWORD;
#define FALSE 0
#define TRUE 1
#define PDF_ERROR_NOMEMORY "メモリを確保できませんでした。"
#define PDF_ERROR_ZERO "初期サイズは0にはできません。"
#define PDF_ERROR_INDEXOVER "インデックスの指定が不正です。"
#define PDF_ERROR_FILEREAD "ファイルの読み込みに失敗しました。"
#define PDF_ERROR_FILECREATE "ファイルの作成に失敗しました。"
#define PDF_ERROR_FILEPOINTER "ファイルポインタが無効です。"
#define PDF_ERROR_UNKNOWN "予期せぬ例外が発生しました。"
////////////////////////////////////////////////////////////////////////////////
// CPList (ポインタリスト)
////////////////////////////////////////////////////////////////////////////////
class CPList
{
private:
DWORD *FBuffer;
int FCount;
protected:
public:
CPList();
~CPList();
void* operator[]( int Index );
void* Get(int Index) const;
int Count() const;
void Add(void *P);
void Clear();
};
////////////////////////////////////////////////////////////////////////////////
// CPStringList (文字列リスト)
////////////////////////////////////////////////////////////////////////////////
class CPStringList
{
private:
CPList *FBuffer;
protected:
public:
CPStringList();
CPStringList(const CPStringList& Value);
~CPStringList();
const char* operator[]( int Index );
CPStringList& operator=(const CPStringList& Value);
CPStringList& Assign(const CPStringList &Source);
void Add(const char* S);
const char* Get(int Index) const;
int Count() const;
void Clear();
void LoadFromFile(FILE *AStream);
void LoadFromFile(const char* Filename);
void SaveToFile(FILE *AStream,const char* LineFeed="\r\n") const;
void SaveToFile(const char* Filename,const char* LineFeed="\r\n") const;
};
////////////////////////////////////////////////////////////////////////////////
// CPDFObjMemManager (相互参照テーブル) [ 内部用 ]
////////////////////////////////////////////////////////////////////////////////
class CPDFObjMemManager
{
private:
DWORD *FBuffer;
DWORD FObjectCount;
DWORD FReallocCount;
protected:
public:
DWORD ObjectIndex;
DWORD *ObjectPosArray;
CPDFObjMemManager(DWORD ObjectCount=1000, DWORD ReallocCount=1000);
~CPDFObjMemManager();
void MemoryCheck();
};
////////////////////////////////////////////////////////////////////////////////
// CTxt2pdf (テキストPDF変換)
////////////////////////////////////////////////////////////////////////////////
class CTxt2pdf
{
private:
WORD m_PageWidth;
WORD m_PageHeight;
BYTE m_MarginX ;
BYTE m_MarginY ;
BYTE m_FontSize;
char *m_FontEncoding;
char *m_FontWidth;
char *m_FontName;
void AsciiHexEncoding(FILE *AStream,const char *S);
void Write_CrossReferenceTable(FILE *AStream,DWORD ObjectPosArray[],DWORD Count);
void DrawText(FILE *AStream,int x,int y,CPStringList &Lines);
int GetTextWidth(const char* S);
void AutoLineFeed(CPStringList &Lines);
void Write_PageObject(FILE *AStream,CPDFObjMemManager &ObjectMem, CPStringList &Lines,CPStringList &PageList);
protected:
public:
void txt2pdf(FILE *Input,FILE *Output,WORD PageWidth = 595, // 用紙の横サイズ
WORD PageHeight= 842, // 用紙の縦サイズ
BYTE MarginX = 30, // 余白 (← →)
BYTE MarginY = 30, // 余白 (↑ ↓)
BYTE FontSize = 12); // フォントのサイズ (1-100ぐらいまで)
void txt2pdf(const char *OpenName,const char *SaveName,WORD PageWidth = 595, // 用紙の横サイズ
WORD PageHeight= 842, // 用紙の縦サイズ
BYTE MarginX = 30, // 余白 (← →)
BYTE MarginY = 30, // 余白 (↑ ↓)
BYTE FontSize = 12); // フォントのサイズ (1-100ぐらいまで)
};
// ---------------------------
// 用紙サイズとポイントの関係
// ---------------------------
// A3 842x1191 297x420mm
// A4 595x842 210x297mm
// A5 420x595 148x210mm
// B4 729x1032 257x364mm
// B5 516x729 182x257mm
// ---------------------------
#endif // __TXT2PDF_H__
[txt2pdf.cpp]
/* -------------- Support Japanese charcode "ShiftJIS" Only! ---------------- */
#include "txt2pdf.h"
////////////////////////////////////////////////////////////////////////////////
// CPList (ポインタリスト)
////////////////////////////////////////////////////////////////////////////////
// コンストラクタ
CPList::CPList()
{
FCount=0;
FBuffer=NULL;
}
// デストラクタ
CPList::~CPList()
{
this->Clear();
}
// オペレータ(添え字)
void* CPList::operator[](int Index)
{
return (this->Get(Index));
}
// リストにポインタを追加
void CPList::Add(void *P)
{
FBuffer = (DWORD *)realloc(FBuffer, sizeof(DWORD) * (FCount+1));
if (FBuffer!=NULL)
FBuffer[FCount++]=(DWORD)P;
else
throw (PDF_ERROR_NOMEMORY);
}
// ポインタを返す
void* CPList::Get(int Index) const
{
if (FCount==0)
return (NULL) ;
if ((Index >= 0) && (Index <=FCount-1))
return ((void *)FBuffer[Index]);
else
{
throw (PDF_ERROR_INDEXOVER);
return (NULL);
}
}
// カウントを返す
int CPList::Count() const
{
return (FCount);
}
// クリア
void CPList::Clear()
{
if (FBuffer!=NULL)
free(FBuffer);
FBuffer=NULL; FCount =0;
}
////////////////////////////////////////////////////////////////////////////////
// CPStringList (文字列リスト)
////////////////////////////////////////////////////////////////////////////////
// コンストラクタ
CPStringList::CPStringList()
{
FBuffer =new CPList;
if (FBuffer==0)
throw (PDF_ERROR_NOMEMORY);
}
// コンストラクタ(コピー)
CPStringList::CPStringList(const CPStringList& Value)
{
FBuffer =new CPList;
if (FBuffer==0)
throw (PDF_ERROR_NOMEMORY);
this->Assign(Value);
}
// デストラクタ
CPStringList::~CPStringList()
{
this->Clear();
delete FBuffer;
}
// オペレータ(添え字)
const char* CPStringList::operator[](int Index)
{
return (this->Get(Index));
}
// オペレータ(代入)
CPStringList& CPStringList::operator=(const CPStringList& Value)
{
if( this != &Value )
return (Assign(Value));
else
return (*this);
}
// アサイン
CPStringList& CPStringList::Assign(const CPStringList& Source)
{
int i;
this->Clear();
for (i=0;i < Source.Count();i++)
this->Add(Source.Get(i));
return (*this);
}
// リストに文字列を追加
void CPStringList::Add(const char *S)
{
char *str;
if ((S!=NULL) && (strlen(S)>0))
{
str=(char *)calloc(strlen(S)+1,1);
if (str!=NULL)
FBuffer->Add(strcpy(str,S));
else
throw (PDF_ERROR_NOMEMORY);
}
else
FBuffer->Add(NULL);
}
// 文字列を返す
const char* CPStringList::Get(int Index) const
{
return ((char *)FBuffer->Get(Index));
}
// 配列数を返す
int CPStringList::Count() const
{
return (FBuffer->Count());
}
// すべてクリア
void CPStringList::Clear()
{
int i;
for (i=0;i<FBuffer->Count();i++)
if (FBuffer->Get(i)!=NULL)
free(FBuffer->Get(i));
FBuffer->Clear();
}
// ファイルを読み込む
void CPStringList::LoadFromFile(FILE *AStream)
{
BYTE *Memory;
char *Str;
int FileSize,LineSize;
int i=0,S_Pos=0,E_Pos=FALSE;
if (AStream==NULL)
throw (PDF_ERROR_FILEPOINTER);
// ファイルサイズの取得
fseek(AStream, 0, SEEK_END );
FileSize = ftell(AStream);
fseek(AStream, 0, SEEK_SET );
// ダイレクトにメモリ確保 -);
Memory=(BYTE *)malloc(FileSize);
try
{
if (Memory==NULL)
throw (PDF_ERROR_NOMEMORY);
fread(Memory,1,FileSize,AStream);
FBuffer->Clear();
while (1)
{
switch (Memory[i])
{
case 0x0d:
if ((i+1) < FileSize)
{
// CR+LF ---------------------------------------------------
if (Memory[i+1]==0x0A)
{
i++;
E_Pos = i-strlen("\r\n");
LineSize = E_Pos-S_Pos+1;
if (LineSize > 0)
{
Str=(char *)calloc(LineSize+1,1);
if (Str!=NULL)
{
memcpy(Str,&Memory[S_Pos],LineSize);
strcat(Str,"");
FBuffer->Add(Str); E_Pos=TRUE;
}
else
throw (PDF_ERROR_NOMEMORY);
}
else
{
FBuffer->Add(NULL);
E_Pos=TRUE;
}
}
// CR -------------------------------------------------------
else
{
E_Pos = i-strlen("\r");
LineSize = E_Pos-S_Pos+1;
if (LineSize>0)
{
Str=(char *)calloc(LineSize+1,1);
if (Str!=NULL)
{
memcpy(Str,&Memory[S_Pos],LineSize);
strcat(Str,"");
FBuffer->Add(Str); E_Pos=TRUE;
}
else
throw (PDF_ERROR_NOMEMORY);
}
else
{
FBuffer->Add(NULL);
E_Pos=TRUE;
}
}
}
// CR ----------------------------------------------------------
else
{
E_Pos = i-strlen("\r");
LineSize = E_Pos-S_Pos+1;
if (LineSize>0)
{
Str=(char *)calloc(LineSize+1,1);
if (Str!=NULL)
{
memcpy(Str,&Memory[S_Pos],LineSize);
strcat(Str,"");
FBuffer->Add(Str); E_Pos=TRUE;
}
else
throw (PDF_ERROR_NOMEMORY);
}
else
{
FBuffer->Add(NULL);
E_Pos=TRUE;
}
}
S_Pos=i+1;
break;
case 0x0A:
// LF --------------------------------------------------------
E_Pos = i-strlen("\n");
LineSize = E_Pos-S_Pos+1;
if (LineSize>0)
{
Str=(char *)calloc(LineSize+1,1);
if (Str!=NULL)
{
memcpy(Str,&Memory[S_Pos],LineSize);
strcat(Str,"");
FBuffer->Add(Str); E_Pos=TRUE;
}
else
throw (PDF_ERROR_NOMEMORY);
}
else
{
FBuffer->Add(NULL);
E_Pos=TRUE;
}
S_Pos=i+1;
break;
default : E_Pos=FALSE;
} // end switch
if (i>=FileSize-1)
break;
i++;
} // end while
// 残りを格納
if (E_Pos==FALSE)
{
E_Pos =FileSize;
LineSize =E_Pos-S_Pos;
if (LineSize>0)
{
Str=(char *)calloc(LineSize+1,1);
if (Str!=NULL)
{
memcpy(Str,&Memory[S_Pos],LineSize);
strcat(Str,"");
FBuffer->Add(Str); E_Pos=TRUE;
}
else
throw (PDF_ERROR_NOMEMORY);
}
}
free(Memory);
}
catch (char * emsg)
{
if (Memory!=NULL) free(Memory);
throw (emsg);
}
catch (...)
{
if (Memory!=NULL) free(Memory);
throw (-1);
}
}
// ファイルを読み込む
void CPStringList::LoadFromFile(const char* Filename)
{
FILE *AStream;
AStream=fopen(Filename,"rb");
if(AStream!=NULL)
{
this->LoadFromFile(AStream);
fclose(AStream);
}
else
throw (PDF_ERROR_FILEREAD);
}
// ファイルに保存
void CPStringList::SaveToFile(FILE *AStream,const char* LineFeed) const
{
if (AStream==NULL)
throw (PDF_ERROR_FILEPOINTER);
int i;
for (i=0; i < this->Count();i++)
{
if (this->Get(i)!=NULL)
fwrite(this->Get(i),1,strlen(this->Get(i)),AStream);
fwrite(LineFeed,1,strlen(LineFeed),AStream);
}
}
// ファイルに保存
void CPStringList::SaveToFile(const char* Filename,const char* LineFeed) const
{
FILE *AStream;
AStream=fopen(Filename,"wb");
if(AStream!=NULL)
{
this->SaveToFile(AStream,LineFeed);
fclose(AStream);
}
else
throw (PDF_ERROR_FILECREATE);
}
////////////////////////////////////////////////////////////////////////////////
// CPDFObjMemManager (相互参照テーブル) [ 内部用 ]
////////////////////////////////////////////////////////////////////////////////
// コンストラクタ
CPDFObjMemManager::CPDFObjMemManager(DWORD ObjectCount, DWORD ReallocCount)
{
if ((ObjectCount==0) || (ReallocCount== 0))
throw (PDF_ERROR_ZERO);
ObjectIndex=0;
FObjectCount = ObjectCount;
FReallocCount = ReallocCount;
FBuffer=(DWORD *)malloc(FObjectCount * sizeof(DWORD));
if (FBuffer==NULL)
throw (PDF_ERROR_NOMEMORY);
ObjectPosArray=FBuffer;
}
// デストラクタ
CPDFObjMemManager::~CPDFObjMemManager()
{
free(FBuffer);
}
// メモリチェック
void CPDFObjMemManager::MemoryCheck()
{
if (ObjectIndex >= FObjectCount)
{
FObjectCount=FObjectCount+FReallocCount;
FBuffer = (DWORD *)realloc(FBuffer, sizeof(DWORD) * FObjectCount);
if (FBuffer==NULL)
throw (PDF_ERROR_NOMEMORY);
ObjectPosArray=FBuffer;
}
}
////////////////////////////////////////////////////////////////////////////////
// CTxt2pdf (テキストPDF変換)
////////////////////////////////////////////////////////////////////////////////
// クロスリファレンステーブルの書き込み
void CTxt2pdf::Write_CrossReferenceTable(FILE *AStream,DWORD ObjectPosArray[],DWORD Count)
{
DWORD i;
fprintf(AStream,"xref\n");
fprintf(AStream,"0 %d\n",Count+1);
fprintf(AStream,"0000000000 65535 f \n");
for (i= 0; i<=Count-1;i++)
fprintf(AStream,"%0.10d 00000 n \n",ObjectPosArray[i]);
}
// 文字列を16表記で書き込む
void CTxt2pdf::AsciiHexEncoding(FILE *AStream,const char *S)
{
int i;
fprintf(AStream,"<");
if (S!=NULL)
for (i=0;S[i]!='\0';i++)
fprintf(AStream,"%0.2x",(BYTE)S[i]);
fprintf(AStream,">");
}
// PDFのページにテキストを描画
void CTxt2pdf::DrawText(FILE *AStream,int x,int y,CPStringList &Lines)
{
int i;
double Matrix;
if (Lines.Count()==0)
return;
y = m_PageHeight - y;
Matrix =y - m_FontSize*0.87;
fprintf(AStream,"BT\n");
fprintf(AStream,"/%s %d Tf\n",m_FontName,m_FontSize);
fprintf(AStream,"0 0 0 rg %d TL %d %f Td ",m_FontSize,x,Matrix);
AsciiHexEncoding(AStream,Lines[0]);
fprintf(AStream," Tj\n");
if (Lines.Count()!=1)
{
for (i= 1 ;i < Lines.Count();i++)
{
fprintf(AStream,"T* ");
AsciiHexEncoding(AStream,Lines[i]);
fprintf(AStream," Tj\n");
}
fprintf(AStream,"ET\n");
}
}
// テキストの幅を取得
int CTxt2pdf::GetTextWidth(const char* S)
{
if (S!=NULL)
return ( strlen(S) * (m_FontSize / 2));
else
return (0);
}
// 文字列の自動改行
void CTxt2pdf::AutoLineFeed(CPStringList &Lines)
{
const char *P;
char *S;
int i,MaxWidth;
CPStringList StringList;
MaxWidth =m_PageWidth-m_MarginX*2;
S=(char *)malloc(MaxWidth*2);
try
{
if (S==NULL)
throw (PDF_ERROR_NOMEMORY);
for (i= 0;i< Lines.Count();i++)
{
// テキストがページの描画範囲を越える場合は改行する
if (GetTextWidth(Lines[i]) > MaxWidth )
{
memset(S,0,MaxWidth*2);
P = Lines[i];
while (*P!='\0')
{
// Sjis漢字コード
if ( (((BYTE)*P>=0x81) && ((BYTE)*P<=0x9F)) ||
(((BYTE)*P>=0xE0) && ((BYTE)*P<=0xFC)) )
{
strncat(S,P,2);P++;
if (GetTextWidth(S) > MaxWidth-(m_FontSize))
{
StringList.Add(S);
memset(S,0,MaxWidth*2);
}
if (*P=='\0') break;
}
// Ascii + 半角カタカナなど
else
{
strncat(S,P,1);
if (GetTextWidth(S) > MaxWidth-(m_FontSize / 2))
{
StringList.Add(S);
memset(S,0,MaxWidth*2);
}
}
P++;
}
if (strlen(S) >0 )
StringList.Add(S);
}
else
StringList.Add(Lines[i]);
}
free(S);
Lines = StringList;
}
catch (char * emsg)
{
if (S!=NULL) free(S);
throw (emsg);
}
catch (...)
{
if (S!=NULL) free(S);
throw (-1);
}
}
// ページオブジェクトの書き込み
void CTxt2pdf::Write_PageObject(FILE *AStream,CPDFObjMemManager &ObjectMem, CPStringList &Lines,CPStringList &PageList)
{
CPStringList PageText;
int i,j,k,Pages,Streamsize,MaxHeight,PageRows;
// テキストの自動整形
AutoLineFeed(Lines);
// 1ページで描画可能なサイズ
MaxHeight =m_PageHeight-m_MarginY*2;
// 1ページに入る配列数
PageRows =Lines.Count();
for (i=1 ;i < Lines.Count()+1;i++)
{
if( MaxHeight <= i * m_FontSize)
{
PageRows=i-1;
break;
}
}
// ページ数の計算
if (Lines.Count()!=0)
{
Pages = (Lines.Count() / PageRows);
if ((Lines.Count()-PageRows)!=0)
Pages++;
}
else
Pages=1;
k=0;
for (i=0;i<Pages;i++)
{
// 1ページ分の配列を受け取る
PageText.Clear();
for (j=0;j<PageRows;j++)
{
if (k >=Lines.Count()) break;
PageText.Add(Lines[k]);
k++;
}
// IntToStr
char *Str =(char *)malloc(20);
sprintf(Str,"%d",ObjectMem.ObjectIndex+1);
PageList.Add(Str);
free(Str);
// Kids Page
ObjectMem.ObjectPosArray[ObjectMem.ObjectIndex] =ftell(AStream);
fprintf(AStream,"%d 0 obj\n",ObjectMem.ObjectIndex+1);
fprintf(AStream,"<<\n");
fprintf(AStream,"/Type /Page\n");
fprintf(AStream,"/Parent 2 0 R\n");
fprintf(AStream,"/Resources\n");
fprintf(AStream,"<<\n");
fprintf(AStream,"/Font << /%s 3 0 R >>\n",m_FontName);
fprintf(AStream,"/ProcSet [ /PDF /Text ]\n");
fprintf(AStream,">>\n");
fprintf(AStream,"/MediaBox [ 0 0 %d %d ]\n",m_PageWidth,m_PageHeight);
fprintf(AStream,"/Contents %d 0 R\n",ObjectMem.ObjectIndex+2);
fprintf(AStream,">>\n");
fprintf(AStream,"endobj\n");
ObjectMem.ObjectIndex++;
ObjectMem.MemoryCheck();
// Contents Object
ObjectMem.ObjectPosArray[ObjectMem.ObjectIndex] =ftell(AStream);
fprintf(AStream,"%d 0 obj\n",ObjectMem.ObjectIndex+1);
fprintf(AStream,"<< /Length %d 0 R >>\n",ObjectMem.ObjectIndex+2);
fprintf(AStream,"stream\n");
// stream
Streamsize = ftell(AStream);
DrawText(AStream,m_MarginX,m_MarginY,PageText);
Streamsize = ftell(AStream)-Streamsize;
fprintf(AStream,"endstream\n");
fprintf(AStream,"endobj\n");
ObjectMem.ObjectIndex++;
ObjectMem.MemoryCheck();
// Length Object
ObjectMem.ObjectPosArray[ObjectMem.ObjectIndex] =ftell(AStream);
fprintf(AStream,"%d 0 obj\n",ObjectMem.ObjectIndex+1);
fprintf(AStream,"%d\n",Streamsize);
fprintf(AStream,"endobj\n");
ObjectMem.ObjectIndex++;
ObjectMem.MemoryCheck();
}
}
void CTxt2pdf::txt2pdf(const char *OpenName,const char *SaveName,WORD PageWidth,WORD PageHeight,BYTE MarginX,BYTE MarginY,BYTE FontSize)
{
FILE *fp,*op;
fp=fopen(OpenName,"rb");
if (fp!=NULL)
{
op=fopen(SaveName,"wb");
if (op!=NULL)
{
txt2pdf(fp,op,PageWidth,PageHeight,MarginX,MarginY,FontSize);
fclose(fp); fclose(op);
}
else
{
fclose(fp);
throw (PDF_ERROR_FILECREATE);
}
}
else
throw (PDF_ERROR_FILEREAD);
}
void CTxt2pdf::txt2pdf(FILE *Input,FILE *Output,WORD PageWidth,WORD PageHeight,BYTE MarginX,BYTE MarginY,BYTE FontSize)
{
if ((Input==NULL) || (Output==NULL))
throw (PDF_ERROR_FILEPOINTER);
m_FontName =new char[10];
if (m_FontName==0)
throw (PDF_ERROR_NOMEMORY);
m_FontEncoding =new char[50];
if (m_FontEncoding==0)
{
delete [] m_FontName;
throw (PDF_ERROR_NOMEMORY);
}
m_FontWidth =new char[50];
if (m_FontWidth==0)
{
delete [] m_FontName;
delete [] m_FontEncoding;
throw (PDF_ERROR_NOMEMORY);
}
try
{
int i;
CPDFObjMemManager ObjectMem;
CPStringList PageList,StringList;
memset(m_FontName,0,10);
memset(m_FontEncoding,0,50);
memset(m_FontEncoding,0,50);
// フォントの変数名
strcpy(m_FontName,"F0");
// フォントのエンコーディング
strcpy(m_FontEncoding,"90ms-RKSJ-H");
// 1byteフォントの幅
strcpy(m_FontWidth,"231 389 500 631 631 500");
m_PageWidth = PageWidth; // 用紙の横サイズ
m_PageHeight = PageHeight; // 用紙の縦サイズ
m_MarginX = MarginX; // 余白 (← →)
m_MarginY = MarginY; // 余白 (↑ ↓)
m_FontSize = FontSize; // フォントのサイズ (1-100ぐらいまで)
// ファイルの読み込み
StringList.LoadFromFile(Input);
// 最初のヘッダ部分は後で書き込む
ObjectMem.ObjectIndex =ObjectMem.ObjectIndex+2;
// PDF version
fprintf(Output,"%%PDF-1.2\n");
// Font Resource
ObjectMem.ObjectPosArray[ObjectMem.ObjectIndex] =ftell(Output);
fprintf(Output,"%d 0 obj\n",ObjectMem.ObjectIndex+1);
fprintf(Output,"<<\n");
fprintf(Output,"/Type /Font\n");
fprintf(Output,"/Name /%s\n",m_FontName);
fprintf(Output,"/BaseFont /HeiseiKakuGo-W5-%s\n",m_FontEncoding);
fprintf(Output,"/Subtype /Type0\n");
fprintf(Output,"/Encoding /%s\n",m_FontEncoding);
fprintf(Output,"/DescendantFonts [ << /Type /Font /Subtype /CIDFontType0 /BaseFont /HeiseiKakuGo-W5\n");
fprintf(Output,"/FontDescriptor << /Type /FontDescriptor /FontName /HeiseiKakuGo-W5 /ItalicAngle 0 /FontBBox [ -92 -250 1010 922 ]\n");
fprintf(Output,"/Style << /Panose <");
fprintf(Output,"0801020B0600000000000000");
fprintf(Output,">>> /Ascent 752 /CapHeight 737 /Descent -221\n");
fprintf(Output,"/Flags 4 /StemV 114 /XHeight 553 >>\n");
fprintf(Output,"/CIDSystemInfo << /Registry (Adobe)/Ordering (Japan1)/Supplement 2 >>\n");
fprintf(Output,"/DW 1000 /W [ %s ] >>\n",m_FontWidth);
fprintf(Output,"]\n");
fprintf(Output,">>\n");
fprintf(Output,"endobj\n");
ObjectMem.ObjectIndex++;
ObjectMem.MemoryCheck();
// Write Page
Write_PageObject(Output,ObjectMem,StringList,PageList);
// Catalog
ObjectMem.ObjectPosArray[0] =ftell(Output);
fprintf(Output,"1 0 obj\n");
fprintf(Output,"<<\n");
fprintf(Output,"/Type /Catalog\n");
fprintf(Output,"/Pages 2 0 R\n");
fprintf(Output,">>\n");
fprintf(Output,"endobj\n");
// Parent Pages
ObjectMem.ObjectPosArray[1] =ftell(Output);
fprintf(Output,"2 0 obj\n");
fprintf(Output,"<<\n");
fprintf(Output,"/Type /Pages\n");
// Kids Pages
fprintf(Output,"/Kids [\n");
for (i=0;i<PageList.Count();i++)
fprintf(Output," %s 0 R\n",PageList[i]);
fprintf(Output," ]\n");
fprintf(Output,"/Count %d\n",PageList.Count());
fprintf(Output,">>\n");
fprintf(Output,"endobj\n");
// CrossReferenceTable
ObjectMem.ObjectPosArray[ObjectMem.ObjectIndex] =ftell(Output);
Write_CrossReferenceTable(Output,ObjectMem.ObjectPosArray,ObjectMem.ObjectIndex);
// trailer
fprintf(Output,"trailer\n");
fprintf(Output,"<<\n");
fprintf(Output,"/Size %d\n",ObjectMem.ObjectIndex+1);
fprintf(Output,"/Root 1 0 R\n");
fprintf(Output,">>\n");
fprintf(Output,"startxref\n");
fprintf(Output,"%d\n",ObjectMem.ObjectPosArray[ObjectMem.ObjectIndex]);
fprintf(Output,"%%%%EOF\n");
}
catch (char * emsg)
{
delete [] m_FontEncoding;
delete [] m_FontWidth;
delete [] m_FontName;
throw (emsg);
}
catch (...)
{
delete [] m_FontEncoding;
delete [] m_FontWidth;
delete [] m_FontName;
throw (-1);
}
delete [] m_FontEncoding;
delete [] m_FontWidth;
delete [] m_FontName;
}
スポンサーリンク
関連記事
公開日:2015年01月08日 最終更新日:2015年02月18日
記事NO:00092
プチモンテ ※この記事を書いた人
![]() | |
![]() | 💻 ITスキル・経験 サーバー構築からWebアプリケーション開発。IoTをはじめとする電子工作、ロボット、人工知能やスマホ/OSアプリまで分野問わず経験。 画像処理/音声処理/アニメーション、3Dゲーム、会計ソフト、PDF作成/編集、逆アセンブラ、EXE/DLLファイルの書き換えなどのアプリを公開。詳しくは自己紹介へ |
| 🎵 音楽制作 BGMは楽器(音源)さえあれば、何でも制作可能。歌モノは主にロック、バラード、ポップスを制作。歌詞は抒情詩、抒情的な楽曲が多い。楽曲制作は🔰2023年12月中旬 ~ | |









