Files
Dokumenten-Check/dc-backend/target/classes/de/frigosped/dc/service/DocumentProcessingService.class

125 lines
16 KiB
Plaintext
Raw Normal View History

<EFBFBD><EFBFBD><EFBFBD><EFBFBD>A<02>
2026-04-27 14:57:33 +02:00
 java/lang/Object<init>()V
 
2026-06-01 14:21:42 +02:00
1de/frigosped/dc/service/DocumentProcessingService extractTextJ([BLjava/lang/String;Ljava/lang/String;Ljava/lang/Long;)Ljava/lang/String;
 resolveMimeType8(Ljava/lang/String;Ljava/lang/String;)Ljava/lang/String;  LOGLorg/jboss/logging/Logger;Extrahiere Text: %s (%s)
 org/jboss/logging/Loggerdebugf9(Ljava/lang/String;Ljava/lang/Object;Ljava/lang/Object;)V
 !"java/lang/StringhashCode()I$application/pdf
& '(equals(Ljava/lang/Object;)Z*Gapplication/vnd.openxmlformats-officedocument.wordprocessingml.document,application/msword.'application/vnd.oasis.opendocument.text0
text/plain2 text/markdown
4 56extractFromPdf&([BLjava/lang/Long;)Ljava/lang/String;
8 9:extractFromDocx([B)Ljava/lang/String;
< =:extractFromOdt ?@A BC!java/nio/charset/StandardCharsetsUTF_8Ljava/nio/charset/Charset;
E F([BLjava/nio/charset/Charset;)VH/Unbekannter MIME-Typ '%s' versuche als Text
J KLwarnf'(Ljava/lang/String;Ljava/lang/Object;)VNjava/lang/ExceptionPFehler bei Textextraktion (%s)
R STerrorf<(Ljava/lang/Throwable;Ljava/lang/String;Ljava/lang/Object;)VVjava/lang/RuntimeException
MX YZ
getMessage()Ljava/lang/String;\ ]^makeConcatWithConstants&(Ljava/lang/String;)Ljava/lang/String;
U` a*(Ljava/lang/String;Ljava/lang/Throwable;)V
cde fgorg/apache/pdfbox/LoaderloadPDF*([B)Lorg/apache/pdfbox/pdmodel/PDDocument;
ijk l"$org/apache/pdfbox/pdmodel/PDDocumentgetNumberOfPagesnPDF hat %d Seite(n)
p q(Ljava/lang/String;I)Vs&org/apache/pdfbox/text/PDFTextStripper
r
rv wxgetText:(Lorg/apache/pdfbox/pdmodel/PDDocument;)Ljava/lang/String;
z {Ztrim
} ~"length<00>PDF-Textextraktion: %d Zeichen
i<00> <00>close<00>EPDF hat wenig eingebetteten Text (%d Zeichen) verwende Vision-OCR<00>mistral <00> <00><00>
aiProviderLjava/lang/String;
<00> <00><00>equalsIgnoreCase(Ljava/lang/String;)Z
<00> <00>:
mistralOcr<00>'org/apache/pdfbox/rendering/PDFRenderer
<00><00> <00>)(Lorg/apache/pdfbox/pdmodel/PDDocument;)V<00>java/lang/StringBuilder
<00><00>OCR Seite %d/%d
<00> <00>(Ljava/lang/String;II)VCH <00><00><00> <00><00>%org/apache/pdfbox/rendering/ImageTypeRGB'Lorg/apache/pdfbox/rendering/ImageType;
<00><00> <00><00>renderImageWithDPII(IFLorg/apache/pdfbox/rendering/ImageType;)Ljava/awt/image/BufferedImage;<00>java/io/ByteArrayOutputStream
<00><00>PNG
<00><00><00> <00><00>javax/imageio/ImageIOwriteI(Ljava/awt/image/RenderedImage;Ljava/lang/String;Ljava/io/OutputStream;)Z
<00><00><00> <00><00>java/util/Base64
2026-04-27 14:57:33 +02:00
getEncoder()Ljava/util/Base64$Encoder;
<00><00> <00><00> toByteArray()[B
<00><00><00> <00>:java/util/Base64$EncoderencodeToString
<00> <00><00>ocrPage8(Ljava/lang/String;IILjava/lang/Long;)Ljava/lang/String;
<00><00> <00><00>append-(Ljava/lang/String;)Ljava/lang/StringBuilder;<00>
2026-04-27 14:57:33 +02:00
<00><00> <00>ZtoString<00>java/lang/Throwable
<00><00> <00><00> addSuppressed(Ljava/lang/Throwable;)V<00>$dev/langchain4j/data/message/Content<00> image/png
<00><00><00> <00><00>)dev/langchain4j/data/message/ImageContentfromQ(Ljava/lang/String;Ljava/lang/String;)Ldev/langchain4j/data/message/ImageContent;<00> ]<00>(II)Ljava/lang/String;
<00><00><00> <00><00>(dev/langchain4j/data/message/TextContent>(Ljava/lang/String;)Ldev/langchain4j/data/message/TextContent;
<00><00><00> <00><00>(dev/langchain4j/data/message/UserMessageS([Ldev/langchain4j/data/message/Content;)Ldev/langchain4j/data/message/UserMessage; <00> <00><00>ocrModel.Ldev/langchain4j/model/chat/ChatLanguageModel; <00><00><00> <00><00>java/util/Listof$(Ljava/lang/Object;)Ljava/util/List; <00><00><00> <00><00>,dev/langchain4j/model/chat/ChatLanguageModelgenerate9(Ljava/util/List;)Ldev/langchain4j/model/output/Response;   costTracker.Lde/frigosped/dc/service/AiCostTrackerService;ocrOCR
 
  %dev/langchain4j/model/output/Response
2026-06-01 14:21:42 +02:00
tokenUsage+()Ldev/langchain4j/model/output/TokenUsage;
 ,de/frigosped/dc/service/AiCostTrackerServicetrackp(Ljava/lang/String;Ljava/lang/String;Ljava/lang/Long;Ljava/lang/Long;Ldev/langchain4j/model/output/TokenUsage;)V
 content()Ljava/lang/Object;&dev/langchain4j/data/message/AiMessage
 Ztext'Mistral OCR API sende PDF direkt...
  !debug(Ljava/lang/Object;)V\$'de/frigosped/dc/model/MistralOcrRequest&mistral-ocr-latest(0de/frigosped/dc/model/MistralOcrRequest$Document* document_url
', -'(Ljava/lang/String;Ljava/lang/String;)V
#/ 0G(Ljava/lang/String;Lde/frigosped/dc/model/MistralOcrRequest$Document;)V 2 34mistralOcrClient)Lde/frigosped/dc/client/MistralOcrClient; 6 7<00> mistralApiKey\ :;< ='de/frigosped/dc/client/MistralOcrClientg(Ljava/lang/String;Lde/frigosped/dc/model/MistralOcrRequest;)Lde/frigosped/dc/model/MistralOcrResponse;
?@A BC(de/frigosped/dc/model/MistralOcrResponsegetPages()Ljava/util/List; <00>E FGstream()Ljava/util/stream/Stream;I JK
applyAsInt$()Ljava/util/function/ToIntFunction; MNO PQjava/util/Comparator comparingInt:(Ljava/util/function/ToIntFunction;)Ljava/util/Comparator; STU VWjava/util/stream/Streamsorted1(Ljava/util/Comparator;)Ljava/util/stream/Stream; SY ZCtoList <00>\ ]^iterator()Ljava/util/Iterator; `ab cdjava/util/IteratorhasNext()Z `f gnexti-de/frigosped/dc/model/MistralOcrResponse$Page
hk lZ getMarkdown
n odisBlankq2Mistral OCR abgeschlossen: %d Seite(n), %d Zeichen <00>s t"size
<00>}w Konvertiere DOCX → Markdown...y*org/apache/poi/xwpf/usermodel/XWPFDocument{java/io/ByteArrayInputStream
z} ~([B)V
x<01> <01>(Ljava/io/InputStream;)V
x<01> <01>CgetBodyElements<01>*org/apache/poi/xwpf/usermodel/IBodyElement<01>+org/apache/poi/xwpf/usermodel/XWPFParagraph
<01> <01><01>paragraphToMarkdownA(Lorg/apache/poi/xwpf/usermodel/XWPFParagraph;)Ljava/lang/String;<01>
<01>'org/apache/poi/xwpf/usermodel/XWPFTable
<01> <01><01>tableToMarkdown=(Lorg/apache/poi/xwpf/usermodel/XWPFTable;)Ljava/lang/String;
x<00>
<01><01> wZ<01>
<01><01> <01>ZgetStyle<01>Heading1<01> berschrift1\<01>Heading2<01> berschrift2\<01>Heading3<01> berschrift3\<01>Heading4<01> berschrift4\
<01><01> <01><01>
getNumIlvl()Ljava/math/BigInteger; \
<01><01> <01>CgetRows <00><01> <01>disEmpty <00><01> <01><01>get(I)Ljava/lang/Object;<01>*org/apache/poi/xwpf/usermodel/XWPFTableRow<01>|
<01><01> <01>C getTableCells
<01> <01><01>accept8(Ljava/lang/StringBuilder;)Ljava/util/function/Consumer; <00><01> <01><01>forEach (Ljava/util/function/Consumer;)V<01>
| <01> <01><01>Konvertiere ODT → Markdown...
<01><01><01> <01><01>)org/odftoolkit/odfdom/doc/OdfTextDocument loadDocumentB(Ljava/io/InputStream;)Lorg/odftoolkit/odfdom/doc/OdfTextDocument;
<01><01> <01><01> getContentDom+()Lorg/odftoolkit/odfdom/dom/OdfContentDom;<01>text:p
<01><01><01> <01><01>'org/odftoolkit/odfdom/dom/OdfContentDomgetElementsByTagName*(Ljava/lang/String;)Lorg/w3c/dom/NodeList; <01><01><01> <01>"org/w3c/dom/NodeList getLength <01><01> <01><01>item(I)Lorg/w3c/dom/Node; <01><01><01> <01>Zorg/w3c/dom/NodegetTextContent <01><01> <01><01> getAttributes()Lorg/w3c/dom/NamedNodeMap;<01>text:style-name <01><01><01> <01>org/w3c/dom/NamedNodeMap getNamedItem&(Ljava/lang/String;)Lorg/w3c/dom/Node; <01> Z getNodeValue Heading_20_1
 <00>
startsWith
#   Heading_20_2##  Heading_20_3###
<01><00>application/octet-stream
 Z toLowerCase.pdf
 <00>endsWith.docx!.doc#.odt%.txt'.md
)<01>*+org/apache/poi/xwpf/usermodel/XWPFTableCell, | .---|
0 12 getLogger-(Ljava/lang/Class;)Lorg/jboss/logging/Logger;OCR_DPIF ConstantValueMIN_CHARS_PER_PAGEI2RuntimeVisibleAnnotationsLjakarta/inject/Inject;Ljakarta/inject/Named;value8Lorg/eclipse/microprofile/rest/client/inject/RestClient;7Lorg/eclipse/microprofile/config/inject/ConfigProperty;namedc.ai.provider defaultValueollamadc.ai.mistral.api-keyCodeLineNumberTableLocalVariableTablethis3Lde/frigosped/dc/service/DocumentProcessingService;:([BLjava/lang/String;Ljava/lang/String;)Ljava/lang/String; fileBytes[BmimeTypefilenameMethodParameterseLjava/lang/Exception; projectIdLjava/lang/Long; effectiveMime StackMapTableKWjava/lang/LongimageLjava/awt/image/BufferedImage;baosLjava/io/ByteArrayOutputStream; base64Imagei pageCount extractedrenderer)Lorg/apache/pdfbox/rendering/PDFRenderer;resultLjava/lang/StringBuilder;pdf&Lorg/apache/pdfbox/pdmodel/PDDocument;
2026-04-27 14:57:33 +02:00
ExceptionspageNum
totalPagesmessage*Ldev/langchain4j/data/message/UserMessage;response'Ldev/langchain4j/model/output/Response;LocalVariableTypeTableQLdev/langchain4j/model/output/Response<Ldev/langchain4j/data/message/AiMessage;>;page/Lde/frigosped/dc/model/MistralOcrResponse$Page;base64dataUrlrequest)Lde/frigosped/dc/model/MistralOcrRequest;*Lde/frigosped/dc/model/MistralOcrResponse;para-Lorg/apache/poi/xwpf/usermodel/XWPFParagraph;table)Lorg/apache/poi/xwpf/usermodel/XWPFTable;element,Lorg/apache/poi/xwpf/usermodel/IBodyElement;doc,Lorg/apache/poi/xwpf/usermodel/XWPFDocument;mdstylesbrowsLjava/util/List;header,Lorg/apache/poi/xwpf/usermodel/XWPFTableRow;>Ljava/util/List<Lorg/apache/poi/xwpf/usermodel/XWPFTableRow;>; styleAttrLorg/w3c/dom/Node;node
2026-04-27 14:57:33 +02:00
paragraphsLorg/w3c/dom/NodeList;odfDoc+Lorg/odftoolkit/odfdom/doc/OdfTextDocument;lowerlambda$tableToMarkdown$2I(Ljava/lang/StringBuilder;Lorg/apache/poi/xwpf/usermodel/XWPFTableCell;)Vc-Lorg/apache/poi/xwpf/usermodel/XWPFTableCell;lambda$tableToMarkdown$1lambda$tableToMarkdown$0<clinit>
SourceFileDocumentProcessingService.java.Ljakarta/enterprise/context/ApplicationScoped;BootstrapMethods<02> Textextraktion fehlgeschlagen: <02>yDu bist ein OCR-Spezialist. Extrahiere den gesamten Text aus diesem Dokument-Bild (Seite  von ).
2026-04-27 14:57:33 +02:00
Regeln:
- Formatiere den Text als Markdown
- Überschriften als # / ## / ###
- Tabellen als Markdown-Tabellen
- Listen als - oder 1. 2. 3.
- Behalte den Originaltext exakt (keine Korrekturen, keine Zusammenfassungen)
- Antworte NUR mit dem extrahierten Markdown, ohne Präambel<02>data:application/pdf;base64,<02>Bearer <02>(Ljava/lang/Object;)I<02>
h<02> <02>"getIndex<02>2(Lde/frigosped/dc/model/MistralOcrResponse$Page;)I<02># <02>## <02>### <02>#### <02>- !<02>
<02> <02><02><02>0(Lorg/apache/poi/xwpf/usermodel/XWPFTableCell;)V<02>
<02> <02><02><02>
<02> <02><02><02>
<02><02><02> ]<02>$java/lang/invoke/StringConcatFactory<00>(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/String;[Ljava/lang/Object;)Ljava/lang/invoke/CallSite;<02>
<02><02><02> <02><02>"java/lang/invoke/LambdaMetafactory metafactory<00>(Ljava/lang/invoke/MethodHandles$Lookup;Ljava/lang/String;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodType;Ljava/lang/invoke/MethodHandle;Ljava/lang/invoke/MethodType;)Ljava/lang/invoke/CallSite; InnerClassesEncoderDocumentPage<02>%java/lang/invoke/MethodHandles$Lookup<02>java/lang/invoke/MethodHandlesLookup!345<00>6758<00><00>9:;<s349
:=9:<00><00>9>?s@AsB7<00>9>?sCAs<01>D/*<2A><01>E,F GH IDQ *+,-<01><07>ETF* GH JK L<00> M<00>N JLM D;*,-<2D> :<05>-<05>:6<06><1D><00><06><>k2i<><69><EFBFBD><EFBFBD>9<>\<5C><>I<>8<EFBFBD><38><00>0<EFBFBD><30>hy5<79><35>OY#<23>%<25>V6<07>P)<29>%<25>F6<07>@+<2B>%<25>66<07>0-<2D>%<25>&6<07> /<2F>%<25>6<07>1<>%<25>6<07>M%//7??*+<04>3<>6*+<2B>7<>.*+<2B>;<3B>&<26>Y+<2B>><3E>D<><18>G<05>I<>Y+<2B>><3E>D<>:<06>O-<2D>Q<>UY<06>W<>[<06>_<>ME6 XY\<00>^<00>a<00>c<00>egh\kl'mFHOP;GH;JK;L<00>;M<00>;QR3S<00>T7<0E>X &  <0A>UV@MNJLMQ56D<02> +<2B>bN-<2D>h6<04>m<04>o<>rY<72>t-<2D>u<>y:<05>|2h<32><1F><05>|<7C>o:-<2D>-<2D><00><06><><12><05>|<7C>o<12>*<2A><00><><00><>*+<2B><00>:-<2D>-<2D><00><06><><00>Y-<2D><00>:<06><00>Y<EFBFBD><00>:6<04>]<5D><12>`<04><00><12><><00><><00>: <09><00>Y<EFBFBD><00>:
 <12>
<EFBFBD><00>W<EFBFBD><00>
<EFBFBD><00><><00>: * `,<2C>Ŷ<00>Ͷ<00>W<EFBFBD><01><><EFBFBD><07>϶y:-<2D>-<2D><00><08>:-<2D>-<2D><00><> :<05><00><04>C<00>Nn<00>y<00><00> <00>Ervw xz%{2|?}C<00>K}N<00>[<00>g<00>n<00>v<00>y<00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00><00>vFz <00>8XY <00>/Z[
<00>\<00> <00>a]7 <00>^7%<00>_<00><00><00>`a<00>ybcdeGHJKQRTk
<EFBFBD>KUVi<00><02>'<1E><02><00><00><01>`<60><1E>UVi<00><> UVi<00><00>fMN JQ<00><00>D<00>P<05><00>Y+ڸ<00>SY<1D><00><00><00>S<EFBFBD><00>:*<2A><00><05><00><><00>:*<2A><00><06><07> <06><13><17><19>E"<00> <00><00><00><00>%<00>/<00>D<00>FHPGHP\<00>Pg7Ph7PQR1ij/!klm /!knN\ghQ<00>:D<01> β<1C><1E><00>+<2B><00>M,<2C>"N<>#Y%<25>'Y)-<2D>+<2B>.:*<2A>1*<2A>5<>8<04>9:<05><00>Y<EFBFBD><00>:<05>><3E>D<00>H<00>L<>R<00>X<00>[:<07>_<00>5<07>e<00>h:<08>j<><08>j<>m<><08>j<><00>Ͷ<00>W<EFBFBD><57>Dzp<05>><3E>r<06>u<><00><06>϶y<>EF<00> <00><00><00>/<00>E<00>N<00>]<00>e<00>j<00><00><00><00><00><00><00><00><00><00><00><00><00><00><00>FR<00>#op<00>GH<00>JK<00>q<00><00>r<00>/<00>stE<00>kuN<00>bcT%<03>qU#?<00>`8<>NJ9:D<01><00><>v<><1E><00>Y<EFBFBD><00>M<EFBFBD>xY<78>zY+<2B>|<7C>N-<2D><01><>[:<04>_<00>U<04>e<00><01>:<05><01><><05><01>:,*<06><01><><00><01><><00>W<EFBFBD>#<05><01><><05><01>:,*<07><01><><00><01><><00>W<EFBFBD><57><EFBFBD>-<2D><01><>:-<2D><01><> :<05><00><04>,<2C>϶y<>!<00><00><00><00><00><00><00>E2 <00> <00><00>!<00>B<00>Q<00>e<00>t<00><00><00><00><00><00><00><00><00>FHQvwtxyBCz{!<00>|}<00>GH<00>JK<00>~cT;<08>,<00>x`<60>8<01><><1F>F<00><>U<00>x<00><00><08>fMNJ<01><01>D9<00>+<2B><01>M,<2C>
,<2C>m<><01><>+<2B><01>N-<2D>,<2C>-<01><><00><> -<01><><00><>
,<2C><01><00>-<01><><00><> -<01><><00><>
,<2C><01><00>-<01><><00><> -<01><><00><>
,<2C><01><00>-<01><><00><> -<01><><00><>
,<2C><01><00>+<2B><01><>
,<2C><01><00>,<2C>E><00><00><00><00><00>3<00>:<00>N<00>U<00>i<00>p<00><00><00><00><00><00><00><00><00>F*<00>GH<00>vw<00><00><00><00>T <0C><03>
 Nv<01><01>Da<00><><00>Y<EFBFBD><00>M+<2B><01>N-<2D><01><00><01><>-<03><01><00><01>:,<00>W<04><01>,<2C><01><00><01>,϶<00>W<04><01>,<2C><01><00><01>,<01><><00>W6-<2D>r<00>2,<00>W-<05><01><00><01><><01>,<2C><01><00><01>,<01><><00>W<EFBFBD><01><><EFBFBD>,<2C>ϰE><00><00> <00><00>&<00>.<00>><00>F<00>V<00>^<00>l<00>t<00><00><00><00>F>a:]7<00>GH<00>xy<00><02>c <00><02><02>&z<02><02>m  <00><02><02>T<03><00><00><>F<01><01>9Nx=:D<02>
A<>Ӷ<1E><00>Y<EFBFBD><00>M<EFBFBD>zY+<2B>|<7C><01>N-<2D><01>߶<01>:6<04><01><00><00><05><01>:<06><01>:<07><00><07>m<><00><06><01><01><><01>:<08> <08><00><01>:  <04><06> <01><><06>, <09><00><07><00><01><><00>W<EFBFBD>h  <0B><06> <01><><06>, <0A><00><07><00><01><><00>W<EFBFBD>< <0F><06> <01><><06>,<11><00><07><00><01><><00>W<EFBFBD>,<07><00><01><><00>W<EFBFBD><01><>-<2D>#-<2D><13>:-<2D>-<2D><13> :<05><00><04>,<2C>϶y<> <00>&*-<00>E^  $)8CLYcj~<00><00> <00>!<00>"<00>#%( 9*Ff
j<00><02><02>~<00><00> C<00><02><02>L<00><00>,<00>]7)<00><02><02><02><02>AGHAJK0~cTo<0F>,U<00><01><01><00>L<01><01>B<1E><15> U<00><01><01><00>J<00><> U<00><01><00><00><08>fMNJD<00>v+<2B>+<2B>m<>+<14>%<25>+<2B>,<2C><14>,<2C>N-<19><1B>#<23>-<1E><1B>)<29>- <20><1B>+<2B>-"<22><1B>-<2D>-$<24><1B>/<2F>-&<26><1B>1<><14>E2 678:;$<1=>>K?X@eArBF*vGHvL<00>vM<00>$R<02><00>T<07> N LM
<02><02>DD*+<2B>(<28><00>+<2B><00>W<EFBFBD>EF<02>c<02><02>
<02><02>D= *-<2D><00>W<EFBFBD>E<00>F <02>c <02><02>
<02><02>DD*+<2B>(<28><00>+<2B><00>W<EFBFBD>E<00>F<02>c<02><02><02>D! <08>/<2F><11>E.<02><02>9<02><02>` <02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02><02>"<00><00><02> '#<02> h?<02> <02><02><02>