2015-03-18 2 views
4

Я пытаюсь заполнить поле PDF китайскими иероглифами из fdf или xfdf.Заполнение полей PDF с искаженными китайскими иероглифами

До сих пор я пробовал, pdftk, mcpdf, pdfbox и fpdm.

Все они могут получить символы в поле, но они не отображаются. Когда я нажимаю на редактируемое поле, символы отображаются так, как ожидалось, но когда я выхожу из поля снова, они исчезают. При вводе на английский язык они отображаются неправильно, например, «привет» становится «IFMMP».

Это все заставило меня подозревать, что это проблема с картами шрифтов и символов, я попытался внедрить полный шрифт в pdf, и это не имело никакого значения. Я установил шрифты на машине безрезультатно.

Если я отредактировал pdf-файл и заполнил поле в Acrobat, он без проблем примет китайские символы, и я могу просмотреть PDF-документ в читателе. Я попытался использовать pdftk из командной строки на той же машине Windows, и у меня такая же проблема.

Мне нужно это для работы в среде Linux, желательно в python или через скрипт командной строки, но на самом деле я просто хотел бы, чтобы это вообще работало! Я приложил пример pdf, fdf, xfdf и вывод, который он создает, любая помощь будет очень признательна, поскольку у меня закончились идеи. Я использую команду:

"pdftk test_form.pdf fill_form test.xfdf output output.pdf verbose" 

https://drive.google.com/folderview?id=0B6ExNaWGFzvnfnJHSC1ZdXhSU2RQVENjYW56UkZyYWJMdWhZTkpQYkZBcUs0Tjhjb0NITVE&usp=sharing

+0

Вы экспортировали из правильно заполненной формы и сравнили это (X) FDF с тем, что у вас есть? –

+0

Я экспортировал правильно заполненную форму в fdf, а затем попытался использовать это, чтобы заполнить ту же форму и имел тот же отказ. –

+0

ОК, я попросил, чтобы убедиться, что FDF действительно правильный, что, по-видимому, есть. Если ничего свободного/ОС не работает, и это оправдывает некоторые инвестиции, вы можете посмотреть на FDFMerge от Appligent (возможно, сначала свяжитесь с ними о специфике). –

ответ

4

Когда поле формы заполняется значение поля заполняется и (по желанию) визуальный внешний вид для поля формы генерируются отражающим новый заданное значение. Поэтому причина, по которой вы видите значение при нажатии в поле формы, заключается в том, что будет отображаться значение поля, но пока поле не активируется, используется внешний вид полей.

Если вы попытались установить значение с помощью PDFBox 1.8, вы можете попробовать использовать PDFBox 2.0, так как теперь он поддерживает юникод, и создание внешнего вида переделано.

Вы также должны убедиться, что шрифт, который вы используете в форме, доступен в системе, в которой вы заполняете форму. В противном случае с PDFBox 2.0 вы можете получить сообщение об ошибке, подобное

Warning: Using fallback font 'TimesNewRomanPSMT' for 'MingLiU' 
Exception in thread "main" java.lang.IllegalArgumentException: No glyph for U+5185 in font MingLiU 

которое как MingLiu не доступен в системе он был заменен TimesNewRomanPSMT, который не имеет характера необходимо.

В качестве другого решения вы можете также направить Adobe Reader, чтобы вычислить внешний вид для вас, когда форма открыта с помощью

PDAcroForm form = doc.getDocumentCatalog().getAcroForm(); 
form.setNeedAppearances(true); 

снова используя PDFBox 2.0

Я создал небольшую выборку, используя PDFBox 2, но создавая форму с нуля, чтобы проверить, может ли она обрабатывать китайский текст

// create a new PDF document 
PDDocument doc = new PDDocument(); 
PDPage page = new PDPage(); 

// add a new AcroForm and add that to the document 
PDAcroForm form = new PDAcroForm(doc); 
doc.getDocumentCatalog().setAcroForm(form); 

// Add and set the resources and default appearance at the form level 
PDFont font = PDType0Font.load(doc, new File("/Library/Fonts/Arial Unicode.ttf")); 
PDResources res = new PDResources(); 
COSName fontName = res.add(font); 
form.setDefaultResources(res); 
String da = "/" + fontName.getName() + " 12 Tf 0 g"; 
form.setDefaultAppearance(da); 

// add a page to the document 
doc.addPage(page); 

// add a form field to the form 
PDTextField textBox = new PDTextField(form); 
textBox.setPartialName("Chinese"); 
form.getFields().add(textBox); 

// specify the annotation associated with the field 
// and add it to the page 
PDAnnotationWidget widget = textBox.getWidget(); 
PDRectangle rect = new PDRectangle(100f,300f,120f,350f); 
widget.setRectangle(rect); 
page.getAnnotations().add(widget); 

// set the field value 
textBox.setValue("木兰辞"); 
doc.save("ChineseOut.pdf"); 

который отлично работает. Я также тестировал шрифт, который вы используете, к сожалению, это имело ошибку, поскольку MingLiU - это коллекция TrueType, которую PDFBox не может обрабатывать в этот момент времени.

+1

Наслаждайтесь вашей помощью, вы меня очень много искали. Я рассмотрю это, ваш комментарий о внешности заставил меня обнаружить флаг need_appearances в pdftk, который до сих пор не заполняет форму для просмотра в Linux, но заполняет ее, поэтому я могу загрузить ее в Adobe Reader в Windows. Также не сглаживает его должным образом, я надеюсь, что существует жизнеспособный способ сгладить PDF-файл с помощью PDFBox или другой программы. Еще раз спасибо. –

+1

сглаживание формы - это другая проблема, так как это означало бы удалить поля формы и виджетов из документа и сделать поля видимыми частью содержимого страницы. На этот вопрос ответили http://stackoverflow.com/questions/14454387/pdfbox-how-to-flatten-a-pdf-form –

+0

Отлично, в настоящее время я использую pdfbox-приложение из https://repository.jboss.org/nexus/content/groups/public/org/apache/pdfbox /pdfbox-app/2.0.0-SNAPSHOT/, поскольку он содержит соответствующие зависимости. Я пытаюсь использовать сценарий, который вы предоставили как доказательство концепции, но я получаю исключение NullPointerException, когда оно попадает в textBox.setValue: at org.apache.pdfbox.pdmodel.interactive.form.PDVariableText.getDefaultAppearance (PDVariableText. java: 86) есть ли еще одна банка, которую вы бы порекомендовали? Прошло некоторое время с тех пор, как я написал код Java, поэтому извиняюсь, если я пропустил что-то очевидное. –

Смежные вопросы