Hello, I've found the reason for the missing UTF-8 filename support: The filenames are converted in the C++-Code from Latin1 (to java-intern encoding). The right way is converting from UTF-8.
Because the standard filename encoding is UTF-8 since Debian Etch, the appended patch should solve the filename problem on almost all current systems. Bye, Johann Felix
diff -upNr pdftk-1.41/debian/patches/series pdftk-1.41patched/debian/patches/series --- pdftk-1.41/debian/patches/series 2009-08-06 22:58:29.000000000 +0200 +++ pdftk-1.41patched/debian/patches/series 2009-08-06 22:54:56.000000000 +0200 @@ -1,2 +1,3 @@ build_with_gcc-4.2 no_embedded_libs +support_utf8_filenames diff -upNr pdftk-1.41/debian/patches/support_utf8_filenames pdftk-1.41patched/debian/patches/support_utf8_filenames --- pdftk-1.41/debian/patches/support_utf8_filenames 1970-01-01 01:00:00.000000000 +0100 +++ pdftk-1.41patched/debian/patches/support_utf8_filenames 2009-08-06 22:53:54.000000000 +0200 @@ -0,0 +1,183 @@ +--- a/pdftk/attachments.cc ++++ b/pdftk/attachments.cc +@@ -204,10 +204,10 @@ + itext::PdfAnnotation::createFileAttachment + ( writer_p, + annot_bbox_p, +- JvNewStringLatin1( filename.c_str() ), // contents ++ JvNewStringUTF( filename.c_str() ), // contents + 0, +- JvNewStringLatin1( vit->c_str() ), // the file path +- JvNewStringLatin1( filename.c_str() ) ); // display name ++ JvNewStringUTF( vit->c_str() ), // the file path ++ JvNewStringUTF( filename.c_str() ) ); // display name + + itext::PdfIndirectReference* ref_p= + writer_p->addToBody( annot_p )->getIndirectReference(); +@@ -280,8 +280,8 @@ + filespec_p= + itext::PdfFileSpecification::fileEmbedded + ( writer_p, +- JvNewStringLatin1( vit->c_str() ), // the file path +- JvNewStringLatin1( filename.c_str() ), // the display name ++ JvNewStringUTF( vit->c_str() ), // the file path ++ JvNewStringUTF( filename.c_str() ), // the display name + 0 ); + } + catch( java::io::IOException* ioe_p ) { // file open error +@@ -297,14 +297,14 @@ + + // contruct a name, if necessary, to prevent possible key collision on the name tree + java::String* key_p= +- JvNewStringLatin1( vit->c_str() ); ++ JvNewStringUTF( vit->c_str() ); + { + int counter= 1; + while( emb_files_map_p->containsKey( key_p ) ) { // append a unique suffix + char buff[256]; + sprintf( buff, "-%d", counter++ ); + key_p= +- JvNewStringLatin1( (*vit + buff ).c_str() ); ++ JvNewStringUTF( (*vit + buff ).c_str() ); + } + } + +--- a/pdftk/pdftk.cc ++++ b/pdftk/pdftk.cc +@@ -163,7 +163,7 @@ + } + if( input_pdf_p->m_password.empty() ) { + reader= +- new itext::PdfReader( JvNewStringLatin1( input_pdf_p->m_filename.c_str() ) ); ++ new itext::PdfReader( JvNewStringUTF( input_pdf_p->m_filename.c_str() ) ); + } + else { + if( input_pdf_p->m_password== "PROMPT" ) { +@@ -175,7 +175,7 @@ + input_pdf_p->m_password.size() ); + + reader= +- new itext::PdfReader( JvNewStringLatin1( input_pdf_p->m_filename.c_str() ), ++ new itext::PdfReader( JvNewStringUTF( input_pdf_p->m_filename.c_str() ), + password ); + } + reader->consolidateNamedDestinations(); +@@ -197,7 +197,7 @@ + } + } + catch( java::io::IOException* ioe_p ) { // file open error +- if( ioe_p->getMessage()->equals( JvNewStringLatin1( "Bad password" ) ) ) { ++ if( ioe_p->getMessage()->equals( JvNewStringUTF( "Bad password" ) ) ) { + input_pdf_p->m_authorized_b= false; + } + open_success_b= false; +@@ -1893,7 +1893,7 @@ + + // attempt to open the stream + java::String* jv_output_filename_p= +- JvNewStringLatin1( output_filename.c_str() ); ++ JvNewStringUTF( output_filename.c_str() ); + try { + os_p= new java::FileOutputStream( jv_output_filename_p ); + } +@@ -1920,7 +1920,7 @@ + jint page_num ) + { + itext::PdfName* page_marker_p= +- new itext::PdfName( JvNewStringLatin1(g_page_marker) ); ++ new itext::PdfName( JvNewStringUTF(g_page_marker) ); + itext::PdfDictionary* page_p= reader_p->getPageN( page_index ); + if( page_p && page_p->isDictionary() ) { + page_p->put( page_marker_p, new itext::PdfNumber( page_num ) ); +@@ -1939,7 +1939,7 @@ + jint page_num ) + { + itext::PdfName* page_marker_p= +- new itext::PdfName( JvNewStringLatin1(g_page_marker) ); ++ new itext::PdfName( JvNewStringUTF(g_page_marker) ); + itext::PdfDictionary* page_p= reader_p->getPageN( page_num ); + if( page_p && page_p->isDictionary() ) { + page_p->remove( page_marker_p ); +@@ -1981,7 +1981,7 @@ + + string creator= "pdftk "+ string(PDFTK_VER)+ " - www.pdftk.com"; + java::String* jv_creator_p= +- JvNewStringLatin1( creator.c_str() ); ++ JvNewStringUTF( creator.c_str() ); + + if( m_output_owner_pw== "PROMPT" ) { + prompt_for_password( "owner", "the output PDF", m_output_owner_pw ); +@@ -2158,7 +2158,7 @@ + char buff[4096]= ""; + sprintf( buff, m_output_filename.c_str(), ii+ 1 ); + +- java::String* jv_output_filename_p= JvNewStringLatin1( buff ); ++ java::String* jv_output_filename_p= JvNewStringUTF( buff ); + + itext::Document* output_doc_p= new itext::Document(); + java::FileOutputStream* ofs_p= new java::FileOutputStream( jv_output_filename_p ); +@@ -2263,13 +2263,13 @@ + // first try fdf + try { + fdf_reader_p= +- new itext::FdfReader( JvNewStringLatin1( m_form_data_filename.c_str() ) ); ++ new itext::FdfReader( JvNewStringUTF( m_form_data_filename.c_str() ) ); + } + catch( java::io::IOException* ioe_p ) { // file open error + // maybe it's xfdf? + try { + xfdf_reader_p= +- new itext::XfdfReader( JvNewStringLatin1( m_form_data_filename.c_str() ) ); ++ new itext::XfdfReader( JvNewStringUTF( m_form_data_filename.c_str() ) ); + } + catch( java::io::IOException* ioe_p ) { // file open error + cerr << "Error: Failed to open form data file: " << endl; +@@ -2294,7 +2294,7 @@ + m_background_filename ); + } + try { +- mark_p= new itext::PdfReader( JvNewStringLatin1( m_background_filename.c_str() ) ); ++ mark_p= new itext::PdfReader( JvNewStringUTF( m_background_filename.c_str() ) ); + mark_p->removeUnusedObjects(); + mark_p->shuffleSubsetNames(); + } +@@ -2312,7 +2312,7 @@ + m_stamp_filename ); + } + try { +- mark_p= new itext::PdfReader( JvNewStringLatin1( m_stamp_filename.c_str() ) ); ++ mark_p= new itext::PdfReader( JvNewStringUTF( m_stamp_filename.c_str() ) ); + mark_p->removeUnusedObjects(); + mark_p->shuffleSubsetNames(); + } +--- a/pdftk/report.cc ++++ b/pdftk/report.cc +@@ -477,8 +477,8 @@ + } + + { // PageLabelNumStyle +- itext::PdfName* r_p= new itext::PdfName(JvNewStringLatin1("r")); +- itext::PdfName* a_p= new itext::PdfName(JvNewStringLatin1("a")); ++ itext::PdfName* r_p= new itext::PdfName(JvNewStringUTF("r")); ++ itext::PdfName* a_p= new itext::PdfName(JvNewStringUTF("a")); + + itext::PdfName* style_p= (itext::PdfName*) + reader_p->getPdfObject( label_p->get( itext::PdfName::S ) ); +@@ -1219,7 +1219,7 @@ + it!= info_map.end(); ++it ) + { + if( it->second.empty() ) { +- info_p->remove( new itext::PdfName( JvNewStringLatin1(it->first.c_str()) ) ); ++ info_p->remove( new itext::PdfName( JvNewStringUTF(it->first.c_str()) ) ); + } + else { + const jsize jvs_size= 4096; +@@ -1227,7 +1227,7 @@ + jsize jvs_len= 0; + string_to_jcharstring( jvs, jvs_size, &jvs_len, it->second ); + +- info_p->put( new itext::PdfName( JvNewStringLatin1(it->first.c_str()) ), ++ info_p->put( new itext::PdfName( JvNewStringUTF(it->first.c_str()) ), + new itext::PdfString( JvNewString(jvs, jvs_len), itext::PdfObject::TEXT_UNICODE ) ); + } + }